pay_helper.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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. 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 OnNotify($param,$payment)
  114. {
  115. $pay = $this->gen_payment($payment);
  116. if($pay == null) {
  117. return false;
  118. }
  119. $result = $pay->on_notify($param);
  120. if($result != false)
  121. {
  122. $pay_sn = $result['pay_sn'];
  123. $trade_no = $result['trade_no'];
  124. $cb_info = $this->update_order($pay_sn,$trade_no,$payment);
  125. if ($cb_info['state'] == false) {
  126. Log::record("update_order fail: pay_sn={$pay_sn},trade_no={$trade_no}", Log::DEBUG);
  127. return false;
  128. }
  129. else
  130. {
  131. if(is_pushoms()) {
  132. $logic_delivery = Logic('delivery');
  133. $logic_delivery->putOrder($pay_sn, $trade_no);
  134. Log::record("update_order success: pay_sn={$pay_sn}", Log::DEBUG);
  135. }
  136. $this->OnSuccess($pay_sn);
  137. return true;
  138. }
  139. } else {
  140. return false;
  141. }
  142. }
  143. private function gen_payment($payment)
  144. {
  145. if($payment == "wxpay") {
  146. return new Pay\wxpay();
  147. }
  148. else if($payment == "alipay") {
  149. return new Pay\alipay();
  150. }
  151. else if($payment == "cmbpay") {
  152. return new Pay\cmbpay();
  153. }
  154. else {
  155. return null;
  156. }
  157. }
  158. public function OnSuccess($pay_sn)
  159. {
  160. $logic_payment = Logic('payment');
  161. $result = $logic_payment->getRealOrderInfo($pay_sn);
  162. if($result['state'] != true) {
  163. return false;
  164. }
  165. $data = &$result['data'];
  166. $order_amount = 0.0;
  167. $goods_amount = 0.0;
  168. if(is_array($data['order_list']))
  169. {
  170. foreach($data['order_list'] as $key => $order) {
  171. $order_amount += doubleval($order['order_amount']);
  172. $goods_amount += doubleval($order['goods_amount']);
  173. }
  174. $mod = Model('order');
  175. $info = $mod->getOrderInfo(array('pay_sn' => $pay_sn));
  176. $buyer_id = intval($info['buyer_id']);
  177. $goods_amount = intval($info['goods_amount']);
  178. $ret = account_helper::paysuccess_bonus($buyer_id,$goods_amount);
  179. if($ret == false) {
  180. Log::record("向用户发送购物后分享红包失败",log::ERR);
  181. return false;
  182. } else {
  183. return true;
  184. }
  185. }
  186. else {
  187. return false;
  188. }
  189. }
  190. public function update_order($paysn, $trade_no, $payment)
  191. {
  192. $logic_payment = Logic('payment');
  193. $tmp = explode('|', $paysn);
  194. $paysn = $tmp[0];
  195. if (!empty($tmp[1])) {
  196. $order_type = $tmp[1];
  197. } else {
  198. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $paysn));
  199. if (empty($order_pay_info)) {
  200. $order_type = 'v';
  201. } else {
  202. $order_type = 'r';
  203. }
  204. }
  205. if ($order_type == 'r')
  206. {
  207. $result = $logic_payment->getRealOrderInfo($paysn);
  208. if (intval($result['data']['api_pay_state'])) {
  209. return array('state' => true);
  210. }
  211. $order_list = $result['data']['order_list'];
  212. $result = $logic_payment->updateRealOrder($paysn, $payment, $order_list, $trade_no);
  213. }
  214. elseif ($order_type == 'v')
  215. {
  216. $result = $logic_payment->getVrOrderInfo($paysn, null, true);
  217. if ($result['data']['order_state'] != ORDER_STATE_NEW) {
  218. return array('state' => true);
  219. }
  220. $result = $logic_payment->updateVrOrder($paysn, $payment, $result['data'], $trade_no);
  221. }
  222. return $result;
  223. }
  224. }