pay_helper.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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/pay/IPay.php');
  11. require_once (BASE_ROOT_PATH . '/helper/pay/alipay.php');
  12. require_once (BASE_ROOT_PATH . '/helper/pay/wxpay.php');
  13. require_once (BASE_ROOT_PATH . '/helper/pay/cmbpay.php');
  14. class pay_helper
  15. {
  16. const WX_PAYMENT = "wxpay";
  17. const ALI_PAYMENT = "alipay";
  18. const CMB_PAYMENT = "cmbpay";
  19. const store_user_id = 36429;
  20. const period_hour = 5 * 24;
  21. const total_number = 10;
  22. const send_type = 1;
  23. const def_bless = '熊猫美妆与你分享美丽的秘密~';
  24. public function __construct() {
  25. }
  26. static public function pay_types()
  27. {
  28. //支付宝,微信,招商银行,各自的描述语
  29. $types = [];
  30. $types[] = array("payment" => "wxpay","desc" => "");
  31. $types[] = array("payment" => "alipay","desc" => "");
  32. $types[] = array("payment" => "cmbpay","desc" => "首付最高减99");
  33. return $types;
  34. }
  35. static public function pay_bonus($pay_sn)
  36. {
  37. $member_info = array('member_id' => $_SESSION['member_id'], 'member_name' => $_SESSION['member_name']);
  38. $logic_payment = Logic('payment');
  39. $logic_payment->payPredepositEx($pay_sn,$member_info);
  40. }
  41. static public function pay($pay_sn, $payment,$usebonus,&$err)
  42. {
  43. if($usebonus) {
  44. self::pay_bonus($pay_sn);
  45. }
  46. $logic_payment = Logic('payment');
  47. $payinfo = $logic_payment->getRealOrderInfo($pay_sn, $_SESSION['member_id']);
  48. if (intval($payinfo['data']['api_pay_state']) != 0) {
  49. $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']);
  50. return false;
  51. }
  52. $left_cents = intval(floatval($payinfo['data']['api_pay_amount']) * 100 + 0.5);
  53. if($left_cents == 0)
  54. {
  55. $output['need_pay'] = false;
  56. $output['tips'] = "已经用红包支付完成";
  57. $payinfo = self::update_order($pay_sn, $pay_sn, 'bonus'); // 更新订单
  58. // 推送到oms
  59. if (isset($payinfo) && $payinfo['state'])
  60. {
  61. if(is_pushoms())
  62. {
  63. $logic_delivery = Logic('delivery');
  64. $ret = $logic_delivery->putOrder($pay_sn, $pay_sn);
  65. if(empty($ret)) { //todo must add to 定时任务
  66. Log::record("Put order to oms error: pay_sn={$pay_sn},bonus pay.",Log::ERR);
  67. }
  68. }
  69. }
  70. return $output;
  71. }
  72. else
  73. {
  74. $pay = null;
  75. if($payment == "wxpay") {
  76. $pay = new Pay\wxpay();
  77. }
  78. else if($payment == "alipay") {
  79. $pay = new Pay\alipay();
  80. }
  81. else if($payment == "cmbpay") {
  82. $pay = new Pay\cmbpay();
  83. }
  84. else {
  85. $err = array('code' => errcode::ErrPayment, 'msg' => $payinfo['msg']);
  86. return false;
  87. }
  88. $subject = $payinfo['data']['subject'];
  89. $pay_sn = $payinfo['data']['pay_sn'];
  90. $order_sn = $payinfo['data']['order_list'][0]['order_sn'];
  91. $output['need_pay'] = true;
  92. $output['tips'] = "";
  93. $third_param = $pay->gen_pay($pay_sn,$left_cents,$order_sn,$subject);
  94. $output['param'] = $third_param;
  95. return $output;
  96. }
  97. }
  98. public static function check_fee($pay_sn,$total_fee,&$need_pay)
  99. {
  100. $logic_payment = Logic('payment');
  101. $result = $logic_payment->getRealOrderInfo($pay_sn);
  102. if (intval($result['data']['api_pay_state']) != 0) {
  103. return false;
  104. }
  105. $need_pay = intval($result['data']['api_pay_amount'] * 100 + 0.5);
  106. $total_fee = intval($total_fee * 100 + 0.5);
  107. return ($need_pay === $total_fee);
  108. }
  109. public function OnNotify($param,$payment)
  110. {
  111. $pay = $this->gen_payment($payment);
  112. if($pay == null) {
  113. return false;
  114. }
  115. $result = $pay->on_notify($param);
  116. if($result != false)
  117. {
  118. $pay_sn = $result['pay_sn'];
  119. $trade_no = $result['trade_no'];
  120. $cb_info = $this->update_order($pay_sn,$trade_no,$payment);
  121. if ($cb_info['state'] == false) {
  122. Log::record("update_order fail: pay_sn={$pay_sn},trade_no={$trade_no}", Log::DEBUG);
  123. return false;
  124. }
  125. else
  126. {
  127. if(is_pushoms()) {
  128. $logic_delivery = Logic('delivery');
  129. $logic_delivery->putOrder($pay_sn, $trade_no);
  130. Log::record("update_order success: pay_sn={$pay_sn}", Log::DEBUG);
  131. }
  132. $this->OnSuccess($pay_sn);
  133. return true;
  134. }
  135. } else {
  136. return false;
  137. }
  138. }
  139. private function gen_payment($payment)
  140. {
  141. if($payment == "wxpay") {
  142. return new Pay\wxpay();
  143. }
  144. else if($payment == "alipay") {
  145. return new Pay\alipay();
  146. }
  147. else if($payment == "cmbpay") {
  148. return new Pay\cmbpay();
  149. }
  150. else {
  151. return null;
  152. }
  153. }
  154. public function OnSuccess($pay_sn)
  155. {
  156. $logic_payment = Logic('payment');
  157. $result = $logic_payment->getRealOrderInfo($pay_sn);
  158. if($result['state'] != true) {
  159. return false;
  160. }
  161. $data = &$result['data'];
  162. $buyer_id = intval($data['buyer_id']);
  163. $order_amount = 0.0;
  164. $goods_amount = 0.0;
  165. if(is_array($data['order_list']))
  166. {
  167. foreach($data['order_list'] as $key => $order) {
  168. $order_amount += floatval($order['order_amount']);
  169. $goods_amount += floatval($order['goods_amount']);
  170. }
  171. $ret = self::send_share_bonus(36429,$buyer_id,$order_amount);
  172. if($ret == false) {
  173. Log::record("向用户发送购物后分享红包失败",log::ERR);
  174. return false;
  175. } else {
  176. return true;
  177. }
  178. }
  179. else {
  180. return false;
  181. }
  182. }
  183. private function calc_amount($total_amount,$total_num)
  184. {
  185. $money = $total_num * predeposit_helper::scale() * $total_amount;
  186. $money = (intval((intval($money) / 10 )) + 1) * 10;
  187. return $money;
  188. }
  189. static private function is_enough($memer_id,$total_amount)
  190. {
  191. $member = Model('member');
  192. $relay_array = $member->getMemberPdInfo($memer_id);
  193. $total = floatval($relay_array['available_predeposit']);
  194. $total = intval($total*100 + 0.5);
  195. $total_amount = intval($total_amount * 100 + 0.5);
  196. return ($total_amount <= $total);
  197. }
  198. private function send_share_bonus($sender_id,$relayer_id,$total_amount)
  199. {
  200. $minfo = new member_info($relayer_id);
  201. $param['sender_id'] = $sender_id;
  202. $param['relayer_id'] = $relayer_id;
  203. $param['sender_mobile'] = $minfo->mobile();
  204. $param['sender_name'] = $minfo->nickname();
  205. $param['send_start_date'] = time();
  206. if(is_publish()) {
  207. $param['send_end_date'] = $param['send_start_date'] + self::period_hour * 3600;
  208. } else {
  209. $param['send_end_date'] = $param['send_start_date'] + 600; //测试服务器用10分钟就退款
  210. }
  211. $param['total_num'] = self::total_number;
  212. $param['total_amount'] = $this->calc_amount($total_amount,self::total_number);
  213. $param['use_type'] = 1;
  214. $param['user_type'] = 2;
  215. $param['send_type'] = self::send_type;
  216. $param['type_bless'] = self::def_bless;
  217. $param['make_type'] = bonus\type::MakePayType;
  218. if(self::is_enough($sender_id,$param['total_amount']) == false) {
  219. Log::record("系统账户余额不够给用户发送分享红包",Log::ERR);
  220. return false;
  221. }
  222. $ret = bonus_helper::make_bonus($param);
  223. if($ret === false) {
  224. return false;
  225. } else {
  226. $type_sn = $ret['type_sn'];
  227. $money = $ret['money'];
  228. $pre_helper = new predeposit_helper($sender_id);
  229. $pre_helper->handout_relaybonus($money,$minfo->nickname(),$type_sn,$relayer_id,"发送了{$money}元的转发红包.");
  230. $push_param = array();
  231. $push_param['member_id'] = $relayer_id;
  232. $push_param['text'] = "熊猫美妆向您派发了{$money}元的购物分享红包,您自己可以抢一份哦~.";
  233. $push_param['go_type'] = 'bonus';
  234. QueueClient::push('upushSendMsg',$push_param);
  235. return array('money' => $money,'total_num' => self::total_number,'sender_name' => '熊猫美妆');
  236. }
  237. }
  238. public function update_order($paysn, $trade_no, $payment)
  239. {
  240. $logic_payment = Logic('payment');
  241. $tmp = explode('|', $paysn);
  242. $paysn = $tmp[0];
  243. if (!empty($tmp[1])) {
  244. $order_type = $tmp[1];
  245. } else {
  246. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $paysn));
  247. if (empty($order_pay_info)) {
  248. $order_type = 'v';
  249. } else {
  250. $order_type = 'r';
  251. }
  252. }
  253. if ($order_type == 'r') {
  254. $result = $logic_payment->getRealOrderInfo($paysn);
  255. if (intval($result['data']['api_pay_state'])) {
  256. return array('state' => true);
  257. }
  258. $order_list = $result['data']['order_list'];
  259. $result = $logic_payment->updateRealOrder($paysn, $payment, $order_list, $trade_no);
  260. } elseif ($order_type == 'v') {
  261. $result = $logic_payment->getVrOrderInfo($paysn, null, true);
  262. if ($result['data']['order_state'] != ORDER_STATE_NEW) {
  263. return array('state' => true);
  264. }
  265. $result = $logic_payment->updateVrOrder($paysn, $payment, $result['data'], $trade_no);
  266. }
  267. return $result;
  268. }
  269. }