pay_helper.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/6/4
  6. * Time: 上午11:12
  7. */
  8. require_once (BASE_ROOT_PATH . "/helper/session_helper.php");
  9. require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
  10. require_once (BASE_ROOT_PATH . '/helper/account_helper.php');
  11. require_once (BASE_ROOT_PATH . '/helper/pay/IPay.php');
  12. require_once (BASE_ROOT_PATH . '/helper/pay/alipay.php');
  13. require_once (BASE_ROOT_PATH . '/helper/pay/wxpay.php');
  14. require_once (BASE_ROOT_PATH . '/helper/pay/cmbpay.php');
  15. class pay_helper
  16. {
  17. const WX_PAYMENT = "wxpay";
  18. const ALI_PAYMENT = "alipay";
  19. const CMB_PAYMENT = "cmbpay";
  20. public function __construct() {
  21. }
  22. static public function pay_types()
  23. {
  24. //支付宝,微信,招商银行,各自的描述语
  25. $types = [];
  26. $types[] = array("payment" => "wxpay","desc" => "");
  27. $types[] = array("payment" => "alipay","desc" => "");
  28. $types[] = array("payment" => "cmbpay","desc" => "首付最高减99");
  29. return $types;
  30. }
  31. static public function pay_bonus($pay_sn)
  32. {
  33. $member_info = array('member_id' => $_SESSION['member_id'], 'member_name' => $_SESSION['member_name']);
  34. $logic_payment = Logic('payment');
  35. $logic_payment->payPredepositEx($pay_sn,$member_info);
  36. }
  37. static public function pay($pay_sn, $payment,$usebonus,&$err)
  38. {
  39. if($usebonus) {
  40. self::pay_bonus($pay_sn);
  41. }
  42. $logic_payment = Logic('payment');
  43. $payinfo = $logic_payment->getRealOrderInfo($pay_sn, $_SESSION['member_id']);
  44. if (intval($payinfo['data']['api_pay_state']) != 0) {
  45. $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']);
  46. return false;
  47. }
  48. $left_cents = intval(doubleval($payinfo['data']['api_pay_amount']) * 100 + 0.5);
  49. if($left_cents == 0)
  50. {
  51. $output['need_pay'] = false;
  52. $output['tips'] = "已经用红包支付完成";
  53. $payinfo = self::update_order($pay_sn, $pay_sn, 'bonus'); // 更新订单
  54. if (isset($payinfo) && $payinfo['state'])
  55. {
  56. if(is_pushoms())
  57. {
  58. $logic_delivery = Logic('delivery');
  59. $ret = $logic_delivery->putOrder($pay_sn, $pay_sn);
  60. if(empty($ret)) { //todo must add to 定时任务
  61. Log::record("Put order to oms error: pay_sn={$pay_sn},bonus pay.",Log::ERR);
  62. }
  63. }
  64. }
  65. return $output;
  66. }
  67. else
  68. {
  69. $pay = null;
  70. if($payment == "wxpay") {
  71. $pay = new Pay\wxpay();
  72. }
  73. else if($payment == "alipay") {
  74. $pay = new Pay\alipay();
  75. }
  76. else if($payment == "cmbpay") {
  77. $pay = new Pay\cmbpay();
  78. }
  79. else {
  80. $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']);
  81. return false;
  82. }
  83. $subject = $payinfo['data']['subject'];
  84. $pay_sn = $payinfo['data']['pay_sn'];
  85. $order_sn = $payinfo['data']['order_list'][0]['order_sn'];
  86. $output['need_pay'] = true;
  87. $output['tips'] = "";
  88. $third_param = $pay->gen_pay($pay_sn,$left_cents,$order_sn,$subject);
  89. $output['param'] = $third_param;
  90. return $output;
  91. }
  92. }
  93. public static function check_fee($pay_sn,$total_fee,&$need_pay)
  94. {
  95. $logic_payment = Logic('payment');
  96. $result = $logic_payment->getRealOrderInfo($pay_sn);
  97. if (intval($result['data']['api_pay_state']) != 0) {
  98. return false;
  99. }
  100. $need_pay = intval($result['data']['api_pay_amount'] * 100 + 0.5);
  101. $total_fee = intval($total_fee * 100 + 0.5);
  102. return ($need_pay === $total_fee);
  103. }
  104. public function OnNotify($param,$payment)
  105. {
  106. $pay = $this->gen_payment($payment);
  107. if($pay == null) {
  108. return false;
  109. }
  110. $result = $pay->on_notify($param);
  111. if($result != false)
  112. {
  113. $pay_sn = $result['pay_sn'];
  114. $trade_no = $result['trade_no'];
  115. $cb_info = $this->update_order($pay_sn,$trade_no,$payment);
  116. if ($cb_info['state'] == false) {
  117. Log::record("update_order fail: pay_sn={$pay_sn},trade_no={$trade_no}", Log::DEBUG);
  118. return false;
  119. }
  120. else
  121. {
  122. if(is_pushoms()) {
  123. $logic_delivery = Logic('delivery');
  124. $logic_delivery->putOrder($pay_sn, $trade_no);
  125. Log::record("update_order success: pay_sn={$pay_sn}", Log::DEBUG);
  126. }
  127. $this->OnSuccess($pay_sn);
  128. return true;
  129. }
  130. } else {
  131. return false;
  132. }
  133. }
  134. private function gen_payment($payment)
  135. {
  136. if($payment == "wxpay") {
  137. return new Pay\wxpay();
  138. }
  139. else if($payment == "alipay") {
  140. return new Pay\alipay();
  141. }
  142. else if($payment == "cmbpay") {
  143. return new Pay\cmbpay();
  144. }
  145. else {
  146. return null;
  147. }
  148. }
  149. public function OnSuccess($pay_sn)
  150. {
  151. $logic_payment = Logic('payment');
  152. $result = $logic_payment->getRealOrderInfo($pay_sn);
  153. if($result['state'] != true) {
  154. return false;
  155. }
  156. $data = &$result['data'];
  157. $order_amount = 0.0;
  158. $goods_amount = 0.0;
  159. if(is_array($data['order_list']))
  160. {
  161. foreach($data['order_list'] as $key => $order) {
  162. $order_amount += doubleval($order['order_amount']);
  163. $goods_amount += doubleval($order['goods_amount']);
  164. }
  165. $mod = Model('order');
  166. $info = $mod->getOrderInfo(array('pay_sn' => $pay_sn));
  167. $buyer_id = intval($info['buyer_id']);
  168. $goods_amount = intval($info['goods_amount']);
  169. $ret = account_helper::paysuccess_bonus($buyer_id,$goods_amount);
  170. if($ret == false) {
  171. Log::record("向用户发送购物后分享红包失败",log::ERR);
  172. return false;
  173. } else {
  174. return true;
  175. }
  176. }
  177. else {
  178. return false;
  179. }
  180. }
  181. public function update_order($paysn, $trade_no, $payment)
  182. {
  183. $logic_payment = Logic('payment');
  184. $tmp = explode('|', $paysn);
  185. $paysn = $tmp[0];
  186. if (!empty($tmp[1])) {
  187. $order_type = $tmp[1];
  188. } else {
  189. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $paysn));
  190. if (empty($order_pay_info)) {
  191. $order_type = 'v';
  192. } else {
  193. $order_type = 'r';
  194. }
  195. }
  196. if ($order_type == 'r')
  197. {
  198. $result = $logic_payment->getRealOrderInfo($paysn);
  199. if (intval($result['data']['api_pay_state'])) {
  200. return array('state' => true);
  201. }
  202. $order_list = $result['data']['order_list'];
  203. $result = $logic_payment->updateRealOrder($paysn, $payment, $order_list, $trade_no);
  204. }
  205. elseif ($order_type == 'v')
  206. {
  207. $result = $logic_payment->getVrOrderInfo($paysn, null, true);
  208. if ($result['data']['order_state'] != ORDER_STATE_NEW) {
  209. return array('state' => true);
  210. }
  211. $result = $logic_payment->updateVrOrder($paysn, $payment, $result['data'], $trade_no);
  212. }
  213. return $result;
  214. }
  215. }