pay_helper.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  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. require_once (BASE_ROOT_PATH . '/helper/pay/jspay.php');
  16. class pay_helper
  17. {
  18. const WX_PAYMENT = "wxpay";
  19. const ALI_PAYMENT = "alipay";
  20. const CMB_PAYMENT = "cmbpay";
  21. const PUBWX_PAYMENT = "jspay";
  22. public function __construct() {
  23. }
  24. static public function pay_types()
  25. {
  26. //支付宝,微信,招商银行,各自的描述语
  27. $types = [];
  28. $types[] = array("payment" => "wxpay","desc" => "");
  29. $types[] = array("payment" => "alipay","desc" => "");
  30. $types[] = array("payment" => "cmbpay","desc" => "");
  31. return $types;
  32. }
  33. static public function pay_bonus($pay_sn)
  34. {
  35. $member_info = array('member_id' => $_SESSION['member_id'], 'member_name' => $_SESSION['member_name']);
  36. $logic_payment = Logic('payment');
  37. $logic_payment->payPredepositEx($pay_sn,$member_info);
  38. }
  39. static public function pay($pay_sn, $payment,$usebonus,&$err)
  40. {
  41. if($usebonus) {
  42. self::pay_bonus($pay_sn);
  43. }
  44. $logic_payment = Logic('payment');
  45. $payinfo = $logic_payment->getRealOrderInfo($pay_sn, $_SESSION['member_id'],true);
  46. if (intval($payinfo['data']['api_pay_state']) != 0) {
  47. $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']);
  48. return false;
  49. }
  50. $left_cents = intval(doubleval($payinfo['data']['api_pay_amount']) * 100 + 0.5);
  51. if($left_cents == 0)
  52. {
  53. $output['need_pay'] = false;
  54. $output['tips'] = "已经用红包支付完成";
  55. $payinfo = self::update_order($pay_sn, $pay_sn, 'bonus'); // 更新订单
  56. if (isset($payinfo) && $payinfo['state'])
  57. {
  58. if(is_pushoms())
  59. {
  60. $logic_delivery = Logic('delivery');
  61. $ret = $logic_delivery->putOrder($pay_sn, $pay_sn);
  62. if(empty($ret)) { //todo must add to 定时任务
  63. Log::record("Put order to oms error: pay_sn={$pay_sn},bonus pay.",Log::ERR);
  64. }
  65. }
  66. $pay_helper = new pay_helper();
  67. $pay_helper->OnSuccess($pay_sn);
  68. }
  69. return $output;
  70. }
  71. else
  72. {
  73. $pay = null;
  74. if($payment == "wxpay") {
  75. $pay = new Pay\wxpay();
  76. }
  77. else if($payment == "jspay")
  78. {
  79. $openid = session_helper::pub_openid();
  80. Log::record("openid = {$openid}",Log::DEBUG);
  81. if(empty($openid)) {
  82. $err = array('code' => errcode::ErrPayment, 'msg' => '微信未授权,不可以进行网页支付.');
  83. return false;
  84. }
  85. else {
  86. $pay = new Pay\jspay($openid);
  87. }
  88. }
  89. else if($payment == "alipay") {
  90. $pay = new Pay\alipay();
  91. }
  92. else if($payment == "cmbpay") {
  93. $pay = new Pay\cmbpay();
  94. }
  95. else {
  96. $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']);
  97. return false;
  98. }
  99. $subject = $payinfo['data']['subject'];
  100. $pay_sn = $payinfo['data']['pay_sn'];
  101. $order_sn = $payinfo['data']['order_list'][0]['order_sn'];
  102. $output['need_pay'] = true;
  103. $output['tips'] = "";
  104. $third_param = $pay->gen_pay($pay_sn,$left_cents,$order_sn,$subject);
  105. $output['param'] = $third_param;
  106. return $output;
  107. }
  108. }
  109. public static function confirm($pay_sn,&$err,&$amount,&$fcode_state)
  110. {
  111. $logic_payment = Logic('payment');
  112. $result = $logic_payment->getRealOrderInfo($pay_sn,null,true);
  113. if(empty($result)) {
  114. $err = ['code'=> errcode::ErrOrder,'msg' => '无此订单.'];
  115. return false;
  116. }
  117. $amount = $result['data']['api_pay_amount'];
  118. $fcode_state = intval($result['data']['fcode_state']);
  119. if (intval($result['data']['api_pay_state']) == 0) {
  120. $err = ['code'=> errcode::ErrOrder,'msg' => '此订单未完成支付.'];
  121. return false;
  122. }
  123. else {
  124. return true;
  125. }
  126. }
  127. public static function check_fee($pay_sn,$total_fee,&$need_pay)
  128. {
  129. $logic_payment = Logic('payment');
  130. $result = $logic_payment->getRealOrderInfo($pay_sn,null,true);
  131. if (intval($result['data']['api_pay_state']) != 0) {
  132. return false;
  133. }
  134. $need_pay = intval($result['data']['api_pay_amount'] * 100 + 0.5);
  135. $total_fee = intval($total_fee * 100 + 0.5);
  136. return ($need_pay === $total_fee);
  137. }
  138. static public function paied($pay_sn)
  139. {
  140. $logic_payment = Logic('payment');
  141. $result = $logic_payment->getRealOrderInfo($pay_sn,null,true);
  142. if (intval($result['data']['api_pay_state']) != 0) {
  143. return true;
  144. }
  145. return false;
  146. }
  147. public function OnOmsNotify($order_sn, $express_id, $logistics_no,$logistics_company)
  148. {
  149. $model_order = Model('order');
  150. $order_info = $model_order->getOrderInfo(array('order_sn' => $order_sn),array('order_common','order_goods'));
  151. $data['reciver_name'] = $order_info['extend_order_common']['reciver_name'];
  152. $data['reciver_info'] = $order_info['extend_order_common']['reciver_info'];
  153. $data['deliver_explain'] = $order_info['extend_order_common']['deliver_explain'];
  154. $data['daddress_id'] = intval($order_info['extend_order_common']['daddress_id']);
  155. $data['shipping_express_id'] =intval($express_id);
  156. $data['shipping_code'] = $logistics_no;
  157. $data['store_id'] = 6;
  158. $logic_order = Logic('order');
  159. $result = $logic_order->changeOrderSend($order_info, 'system', $order_info['buyer_name'], $data);
  160. QueueClient::push('onAsyncOrderSended',
  161. ['pay_sn' => $order_info['pay_sn'],
  162. 'logistics_company' => $logistics_company,
  163. 'logistics_no' => $logistics_no]);
  164. return $result['state'];
  165. }
  166. public function OnNotify($param,$payment)
  167. {
  168. $pay = $this->gen_payment($payment);
  169. if($pay == null) {
  170. return false;
  171. }
  172. $result = $pay->on_notify($param);
  173. if($result != false)
  174. {
  175. $pay_sn = $result['pay_sn'];
  176. $trade_no = $result['trade_no'];
  177. $cb_info = self::update_order($pay_sn,$trade_no,$payment);
  178. if ($cb_info['state'] == false) {
  179. Log::record("update_order fail: pay_sn={$pay_sn},trade_no={$trade_no}", Log::DEBUG);
  180. return false;
  181. }
  182. else
  183. {
  184. if(is_pushoms()) {
  185. $logic_delivery = Logic('delivery');
  186. $logic_delivery->putOrder($pay_sn, $trade_no);
  187. Log::record("update_order success: pay_sn={$pay_sn}", Log::DEBUG);
  188. }
  189. $this->OnSuccess($pay_sn);
  190. return true;
  191. }
  192. } else {
  193. return false;
  194. }
  195. }
  196. private function gen_payment($payment)
  197. {
  198. if($payment == "wxpay") {
  199. return new Pay\wxpay();
  200. }
  201. else if($payment == "jspay")
  202. {
  203. return new Pay\jspay("");
  204. }
  205. else if($payment == "alipay") {
  206. return new Pay\alipay();
  207. }
  208. else if($payment == "cmbpay") {
  209. return new Pay\cmbpay();
  210. }
  211. else {
  212. return null;
  213. }
  214. }
  215. public function OnSuccess($pay_sn)
  216. {
  217. $logic_payment = Logic('payment');
  218. $result = $logic_payment->getRealOrderInfo($pay_sn,null,true);
  219. if($result['state'] != true) {
  220. return false;
  221. } else {
  222. QueueClient::push('onAsyncOrderPaied',['pay_sn' => $pay_sn]);
  223. return true;
  224. }
  225. }
  226. public static function update_order($paysn, $trade_no, $payment)
  227. {
  228. $logic_payment = Logic('payment');
  229. $tmp = explode('|', $paysn);
  230. $paysn = $tmp[0];
  231. if (!empty($tmp[1])) {
  232. $order_type = $tmp[1];
  233. } else {
  234. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $paysn),true);
  235. if (empty($order_pay_info)) {
  236. $order_type = 'v';
  237. } else {
  238. $order_type = 'r';
  239. }
  240. }
  241. if ($order_type == 'r')
  242. {
  243. $result = $logic_payment->getRealOrderInfo($paysn,null,true);
  244. if (intval($result['data']['api_pay_state'])) {
  245. return array('state' => true);
  246. }
  247. $order_list = $result['data']['order_list'];
  248. $result = $logic_payment->updateRealOrder($paysn, $payment, $order_list, $trade_no);
  249. }
  250. elseif ($order_type == 'v')
  251. {
  252. $result = $logic_payment->getVrOrderInfo($paysn);
  253. if ($result['data']['order_state'] != ORDER_STATE_NEW) {
  254. return array('state' => true);
  255. }
  256. $result = $logic_payment->updateVrOrder($paysn, $payment, $result['data'], $trade_no);
  257. }
  258. return $result;
  259. }
  260. }