app_pay.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 15/12/9
  6. * Time: 上午12:25
  7. */
  8. define(WXPAY_PATH, BASE_DATA_PATH . '/api/wxpay');
  9. require_once(WXPAY_PATH . '/lib/WxPay.Api.php');
  10. require_once(WXPAY_PATH . '/lib/WxPay.Config.php');
  11. require_once(WXPAY_PATH . '/lib/WxPay.Data.php');
  12. require_once(WXPAY_PATH . '/lib/WxPay.Exception.php');
  13. require_once(WXPAY_PATH . '/lib/WxPay.Notify.php');
  14. class app_payControl extends mobileHomeControl
  15. {
  16. private static $pay_types = array('wxpay', 'alipay');
  17. const wx_notifyurl = 'http://a.lrlz.com/mobile/wxnotify.php';
  18. const wx_orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';
  19. const alipay_rsa_private = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL+I5/3VVhfpc3TmsUjuwc8mrZycavjuE4MV9Z+EXDvPy55PAYjDvKfMtRMCsJYgO4R0fyyb1OhvglyXUKLFajxOhUm/4K2hnI1E/+8zPbY0CU5Osr4C9sxWHtY66ugTx+O4W3e4CxYTfHn+C6EuiYJ2DWJig+Obphd8CPFYFzLxAgMBAAECgYA+og9zEytXIHEv/ixlNCZOjlBhkUjt5DSfPjQXGNpseLQWLbHLvm5X1Po1oECMpzevRcU8mizSYXyYuKaWw8XMJ7/CC6A8fSBdlUeLEfTfisurEnzeUsal2K/n+WAAFj+TUncnqYtEqCCT+9c4jVkfik7FNxjbcio9p27QKDzYwQJBAOlWs593knByuSFOVnIiphhKlZy+6MUxquxhP+3NlXVaTCHHbBl8xt3fLqLmrXPUHvAt39wJ8fAvLDuNUQgP2gkCQQDSIt7bZi2hmzqfXK9rqVyJ16o0Hwqa8Z6PYhodSSsf61h3+wxdEpDFxIV9JnPWBPhCxcX+d1VddyLZacXbKuupAkBpwFesID8II5Zv19cp5zYrsDHaVlOce4QhmXmlxxTDmOcEMCN38asXhzzVq4JVCn/zDnd0fDVgS6DaZJOi+bwxAkAJg2iheCvCsDtkMZcDgcRdvTTIbUtWnm+2QBO8la5tIIN90xDJOejx+yar9syxuMHgjAGdtptXwugB/cbmWDgZAkEAiRoMv6p7WKNU34kZqpvXMIhN6hUihquVFZDJ7wiBr1tCLw/kW3uhciCViM68FgLStuefTfssgr9+oHVw/o4GjA==";
  20. /*
  21. * 微信获取支付数据
  22. */
  23. public function uniorderOp()
  24. {
  25. $pay_sn = $_GET['paysn'];
  26. $payment = $_GET['payment'];
  27. if (in_array($payment, self::$pay_types) == false) {
  28. return joutput_error(errcode::ErrPayment, "err paytype {$payment}: only for wxpay,alipay");
  29. }
  30. $logic_payment = Logic('payment');
  31. //重新计算所需支付金额
  32. $result = $logic_payment->getRealOrderInfo($pay_sn, $this->member_info['member_id']);
  33. if (!$result['state']) {
  34. return joutput_error(errcode::ErrPayment, $result['msg']);
  35. }
  36. $ret = $this->api_pay($result['data'], $payment);
  37. joutput_data($ret);
  38. }
  39. //订单查询借口
  40. public function orderqueryOp()
  41. {
  42. $pay_sn = $_GET['paysn'];
  43. $payment = $_GET['payment'];
  44. $tractid = $_GET['transaction_id'];
  45. if ($payment == 'wxpay') {
  46. $input = new WxPayOrderQuery();
  47. $input->SetOut_trade_no($pay_sn);
  48. $input->SetTransaction_id($tractid);
  49. $result = WxPayApi::orderQuery($input);
  50. if (array_key_exists("return_code", $result)
  51. && array_key_exists("result_code", $result)
  52. && $result["return_code"] == "SUCCESS"
  53. && $result["result_code"] == "SUCCESS")
  54. {
  55. return joutput_data($result);
  56. }
  57. return joutput_error(errcode::ErrPayment, '支付失败.');
  58. } else {
  59. return joutput_error(errcode::ErrPayment, "错误的参数:payment = {$payment}");
  60. }
  61. }
  62. /**
  63. * app端获取支付请求内容
  64. */
  65. private function api_pay($pay_info, $payment)
  66. {
  67. $subject = $pay_info['subject'];
  68. $pay_sn = $pay_info['pay_sn'];
  69. $fee = $pay_info['pay_amount'];
  70. if ($payment == 'wxpay') {
  71. return $this->uniorder($subject, $pay_sn, 1);
  72. }
  73. else if ($payment === 'alipay')
  74. {
  75. $ret = array();
  76. $ret['rsa_private'] = self::alipay_rsa_private; // 私钥
  77. $ret['partner'] = '2088121219613123'; // 合作者身份ID
  78. $ret['seller_id'] = 'napheir.ao@lrlz.com'; // 签约卖家支付宝账号
  79. $ret['out_trade_no'] = $pay_info['order_list'][0]['pay_sn']; // 商户网站唯一订单号
  80. $ret['subject'] = $subject; // 商品名称
  81. $ret['body'] = '商品详情'; // 商品详情
  82. $ret['total_fee'] = $pay_info['order_list'][0]['order_amount']; // 商品金额
  83. $ret['notify_url'] = 'http://121.43.114.153/mobile/alipay_notify_url.php'; // 服务器异步通知页面路径
  84. $ret['service'] = 'mobile.securitypay.pay'; // 服务器接口名称,固定值
  85. $ret['payment_type'] = '1'; // 支付类型,固定值
  86. $ret['_input_charset'] = 'utf-8'; // 参数编码,固定值
  87. $ret['it_b_pay'] = '30m'; // 设置未付款交易的超时时间 30min
  88. $ret['return_url'] = 'http://'; // 支付宝完成请求后,当前页面跳转到商户指定页面的路径,可空
  89. return array('payment' => $payment, 'content' => $ret);
  90. }
  91. }
  92. /**
  93. * 更新静默用户
  94. */
  95. public function updateMember($pay_sn)
  96. {
  97. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $pay_sn));
  98. return Model('member')->where(array('member_id' => $order_pay_info['buyer_id']))->update(array('member_type' => 0));
  99. }
  100. /**
  101. * 格式化参数格式化成url参数
  102. */
  103. private function to_url_params($values)
  104. {
  105. $buff = "";
  106. foreach ($values as $k => $v) {
  107. if ($k != "sign" && $v != "" && !is_array($v)) {
  108. $buff .= $k . "=" . $v . "&";
  109. }
  110. }
  111. $buff = trim($buff, "&");
  112. return $buff;
  113. }
  114. private function make_sign($values)
  115. {
  116. //签名步骤一:按字典序排序参数
  117. ksort($values);
  118. $string = $this->to_url_params($values);
  119. //签名步骤二:在string后加入KEY
  120. $string = $string . "&key=" . WxPayConfig::KEY;
  121. //签名步骤三:MD5加密
  122. $string = md5($string);
  123. //签名步骤四:所有字符转为大写
  124. $result = strtoupper($string);
  125. return $result;
  126. }
  127. public static function alipay_check()
  128. {
  129. $out_trade_no = $_POST['out_trade_no']; //商户订单号
  130. $trade_no = $_POST['trade_no']; //支付宝交易号
  131. $trade_status = $_POST['trade_status']; //交易状态
  132. $total_fee = $_POST['total_fee']; // 交易金额
  133. $quantity = $_POST['quantity']; // 购买数量
  134. $price = $_POST['price']; // 商品单价
  135. }
  136. /**
  137. * 更新订单状态
  138. */
  139. public static function update_order($out_trade_no, $trade_no, $payment)
  140. {
  141. $logic_payment = Logic('payment');
  142. $tmp = explode('|', $out_trade_no);
  143. $out_trade_no = $tmp[0];
  144. if (!empty($tmp[1])) {
  145. $order_type = $tmp[1];
  146. } else {
  147. $order_pay_info = Model('order')->getOrderPayInfo(array('pay_sn' => $out_trade_no));
  148. if (empty($order_pay_info)) {
  149. $order_type = 'v';
  150. } else {
  151. $order_type = 'r';
  152. }
  153. }
  154. if ($order_type == 'r') {
  155. $result = $logic_payment->getRealOrderInfo($out_trade_no);
  156. if (intval($result['data']['api_pay_state'])) {
  157. return array('state' => true);
  158. }
  159. $order_list = $result['data']['order_list'];
  160. $result = $logic_payment->updateRealOrder($out_trade_no, $payment, $order_list, $trade_no);
  161. } elseif ($order_type == 'v') {
  162. $result = $logic_payment->getVrOrderInfo($out_trade_no);
  163. if ($result['data']['order_state'] != ORDER_STATE_NEW) {
  164. return array('state' => true);
  165. }
  166. $result = $logic_payment->updateVrOrder($out_trade_no, $payment, $result['data'], $trade_no);
  167. }
  168. return $result;
  169. }
  170. /**
  171. * @return array
  172. * @throws WxPayException
  173. */
  174. private function uniorder($body, $paysn, $fee)
  175. {
  176. $input = new WxPayUnifiedOrder();
  177. $input->SetBody($body); //商品或支付单简要描述
  178. $input->SetAttach($paysn); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
  179. $input->SetOut_trade_no($paysn);//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
  180. $input->SetTotal_fee("$fee");//订单总金额,单位为分,详见支付金额
  181. $input->SetTime_start(date("YmdHis")); //订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
  182. $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
  183. $input->SetNotify_url(self::wx_notifyurl);
  184. $input->SetTrade_type("APP");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里,MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口
  185. $order = WxPayApi::unifiedOrder($input);
  186. $ret = array();
  187. $ret['appid'] = $order["appid"];
  188. $ret['noncestr'] = WxPayApi::getNonceStr();
  189. $ret['package'] = 'Sign=WXPay';
  190. $ret['partnerid'] = WxPayConfig::MCHID;
  191. $ret['prepayid'] = $order['prepay_id'];
  192. $timeStamp = time();
  193. $ret['timestamp'] = "$timeStamp";
  194. $sign = $this->make_sign($ret);
  195. $ret['sign'] = $sign;
  196. return $ret;
  197. }
  198. }