Xiaoxiaopay.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. namespace App\Libs\Pay\Merchants;
  3. use GuzzleHttp\Client;
  4. class XiaoxiaoPay {
  5. private $merchant_key;
  6. private $merchant_id;
  7. private $appId;
  8. function __construct()
  9. {
  10. $this->merchant_key = '5wMfGYxF92XN7cL';
  11. $this->merchant_id = '10001034';
  12. }
  13. //生成订单
  14. function send($trade_no,$fee=1,$ip="192.168.1.21",$return_url)
  15. {
  16. global $orderUrl, $appkey, $platpkey,$merchantID,$md5key;
  17. #请求参数
  18. $SignArr = array(
  19. 'merchantID'=> $this->merchant_id, //商户号
  20. 'waresname' => '充值', //商品名称
  21. 'cporderid' => $trade_no, //商家订单号,请确保订单号唯一
  22. 'price' => $fee/100, //订单金额,单位:元
  23. 'returnurl' => $return_url, //同步通知地址,支付成功之后跳转地址
  24. 'notifyurl' => 'http://pay.iycdm.com/callback/xiaoxiaoPay', //异步通知地址,请保证为完整链接,通知地址后不带任何参数
  25. 'paytype' => 10003, //支付方式
  26. //'ext' => $openid, //授权登录获取的openid
  27. 'ip' => $ip //用户ip
  28. );
  29. //组装请求报文 对数据签名
  30. $reqData = composeMd5($SignArr, $md5key); //生成含md5签名的请求数据
  31. //$reqData = composeRsa($SignArr, $appkey); //生成含rsa签名的请求数据
  32. $reqData .= '&iscashier=1';//公众号独立通道需添加此参数
  33. //发送到小小贝服务后台请求调起支付
  34. $paymentData = HttpPost($orderUrl,$reqData);
  35. //验签数据并且解析返回报文
  36. if(!parseRespRsa($paymentData,$platpkey)) {
  37. echo $paymentData;
  38. }else{
  39. //解析返回报文
  40. $callback = json_decode($paymentData);
  41. //支付调起成功之后获取 支付链接
  42. $url = $callback->info->payurl;
  43. //此页面必须在申请时填写的支付授权目录下
  44. echo '<script>
  45. function onBridgeReady(){
  46. WeixinJSBridge.invoke(
  47. "getBrandWCPayRequest",'.$url.',
  48. function(res){
  49. if(res.err_msg == "get_brand_wcpay_request:ok" ) {
  50. alert("支付成功");
  51. }
  52. }
  53. );
  54. }
  55. if (typeof WeixinJSBridge == "undefined"){
  56. if( document.addEventListener ){
  57. document.addEventListener("WeixinJSBridgeReady", onBridgeReady, false);
  58. }else if (document.attachEvent){
  59. document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
  60. document.attachEvent("onWeixinJSBridgeReady", onBridgeReady);
  61. }
  62. }else{
  63. onBridgeReady();
  64. }
  65. document.ontouchstart = function(){onBridgeReady();};
  66. </script>';
  67. }
  68. $client = new client(['base_uri'=>'http://api.ulopay.com/','timeout'=>20]);
  69. $data = [
  70. 'trade_type'=>'trade.weixin.jspay',
  71. 'mch_id'=>$this->merchant_id,
  72. 'out_trade_no'=>$trade_no,
  73. 'body'=>'充值',
  74. 'total_fee'=>1,
  75. 'spbill_create_ip'=>$ip,
  76. 'notify_url'=>env('PAY_NOFITY_URL'),
  77. 'nonce_str'=>md5(time()),
  78. 'return_url'=>$return_url
  79. ];
  80. $data['sign'] = $this->sign($data);
  81. $response = $client->request('POST',"pay/unifiedorder",['body'=>arrayToXml($data)])->getBody()->getContents();
  82. return $this->getPayInfo($response);
  83. }
  84. function sign($params)
  85. {
  86. $signPars = "";
  87. ksort($params);
  88. foreach($params as $k => $v) {
  89. if("" != $v && "sign" != $k) {
  90. $signPars .= $k . "=" . $v . "&";
  91. }
  92. }
  93. $signPars .= "key=".$this->merchant_key;
  94. $sign = strtoupper(md5($signPars));
  95. return $sign;
  96. }
  97. function composeMd5($para, $md5key) {
  98. ksort($para);
  99. $arg = "";
  100. while (list ($key, $val) = each ($para)) {
  101. $arg.=$key."=".$val."&";
  102. }
  103. $arg = substr($arg,0,count($arg)-2);
  104. if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  105. $content = $arg;
  106. $content .= '&key='.$this->merchant_key;
  107. $sign = md5($content);
  108. if(isset($reqJson['psw'])) unset($reqJson['psw']);
  109. $content = json_encode($reqJson);
  110. $reqData = "transdata=".urlencode(trim($content))."&sign=".$sign."&signtype=MD5";
  111. return $reqData;
  112. }
  113. function getPayInfo($response)
  114. {
  115. $return_info = (array)simplexml_load_string($response, null, LIBXML_NOCDATA);
  116. $nonceStr = md5(time());
  117. $timeStamp = time();
  118. $pay_info = [
  119. 'appId' => $this->appId,
  120. 'package' => 'prepay_id='.$return_info['prepay_id'],
  121. 'nonceStr' => $nonceStr,
  122. 'timeStamp' => $timeStamp,
  123. 'signType' => 'MD5'
  124. ];
  125. $pay_info['paySign'] = $this->sign($pay_info);
  126. $pay_info['prepay_url'] = $return_info['prepay_url'];
  127. return $pay_info;
  128. }
  129. }