pay_helper.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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" => "");
  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. static public function paied($pay_sn)
  105. {
  106. $logic_payment = Logic('payment');
  107. $result = $logic_payment->getRealOrderInfo($pay_sn);
  108. if (intval($result['data']['api_pay_state']) != 0) {
  109. return true;
  110. }
  111. return false;
  112. }
  113. public function OnOmsNotify($order_sn, $express_id, $logistics_no)
  114. {
  115. $model_order = Model('order');
  116. $order_info = $model_order->getOrderInfo(array('order_sn' => $order_sn),array('order_common','order_goods'));
  117. $data['reciver_name'] = $order_info['extend_order_common']['reciver_name'];
  118. $data['reciver_info'] = $order_info['extend_order_common']['reciver_info'];
  119. $data['deliver_explain'] = $order_info['extend_order_common']['deliver_explain'];
  120. $data['daddress_id'] = intval($order_info['extend_order_common']['daddress_id']);
  121. $data['shipping_express_id'] =intval($express_id);
  122. $data['shipping_code'] = $logistics_no;
  123. $data['store_id'] = 6;
  124. $logic_order = Logic('order');
  125. $result = $logic_order->changeOrderSend($order_info, 'system', $order_info['buyer_name'], $data);
  126. return $result['state'];
  127. }
  128. public function OnNotify($param,$payment)
  129. {
  130. $pay = $this->gen_payment($payment);
  131. if($pay == null) {
  132. return false;
  133. }
  134. $result = $pay->on_notify($param);
  135. if($result != false)
  136. {
  137. $pay_sn = $result['pay_sn'];
  138. $trade_no = $result['trade_no'];
  139. $cb_info = $this->update_order($pay_sn,$trade_no,$payment);
  140. if ($cb_info['state'] == false) {
  141. Log::record("update_order fail: pay_sn={$pay_sn},trade_no={$trade_no}", Log::DEBUG);
  142. return false;
  143. }
  144. else
  145. {
  146. if(is_pushoms()) {
  147. $logic_delivery = Logic('delivery');
  148. $logic_delivery->putOrder($pay_sn, $trade_no);
  149. Log::record("update_order success: pay_sn={$pay_sn}", Log::DEBUG);
  150. }
  151. $this->OnSuccess($pay_sn);
  152. return true;
  153. }
  154. } else {
  155. return false;
  156. }
  157. }
  158. private function gen_payment($payment)
  159. {
  160. if($payment == "wxpay") {
  161. return new Pay\wxpay();
  162. }
  163. else if($payment == "alipay") {
  164. return new Pay\alipay();
  165. }
  166. else if($payment == "cmbpay") {
  167. return new Pay\cmbpay();
  168. }
  169. else {
  170. return null;
  171. }
  172. }
  173. public function OnSuccess($pay_sn)
  174. {
  175. $logic_payment = Logic('payment');
  176. $result = $logic_payment->getRealOrderInfo($pay_sn);
  177. if($result['state'] != true) {
  178. return false;
  179. } else {
  180. account_helper::onPaySuccess($pay_sn);
  181. return true;
  182. }
  183. }
  184. public function update_order($paysn, $trade_no, $payment)
  185. {
  186. $logic_payment = Logic('payment');
  187. $tmp = explode('|', $paysn);
  188. $paysn = $tmp[0];
  189. if (!empty($tmp[1])) {
  190. $order_type = $tmp[1];
  191. } else {
  192. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $paysn));
  193. if (empty($order_pay_info)) {
  194. $order_type = 'v';
  195. } else {
  196. $order_type = 'r';
  197. }
  198. }
  199. if ($order_type == 'r')
  200. {
  201. $result = $logic_payment->getRealOrderInfo($paysn);
  202. if (intval($result['data']['api_pay_state'])) {
  203. return array('state' => true);
  204. }
  205. $order_list = $result['data']['order_list'];
  206. $result = $logic_payment->updateRealOrder($paysn, $payment, $order_list, $trade_no);
  207. }
  208. elseif ($order_type == 'v')
  209. {
  210. $result = $logic_payment->getVrOrderInfo($paysn, null, true);
  211. if ($result['data']['order_state'] != ORDER_STATE_NEW) {
  212. return array('state' => true);
  213. }
  214. $result = $logic_payment->updateVrOrder($paysn, $payment, $result['data'], $trade_no);
  215. }
  216. return $result;
  217. }
  218. }