PHP实现微信小程序支付
<p>本文仅记录了微信小程序支付开发的基本流程和代码,具体业务需自行修改。tp5框架下演示:</p><h2>参考:</h2>
<p>微信小程序支付:业务流程</p>
<p>SDK与DEMO: 下载页</p>
<p>PHPPayDemo: demo</p>
<h2>小程序端:</h2>
<div class="cnblogs_code">
<p><span>goPay(e){ </span></p>
<p><span> var that = this<span>;</span></span></p>
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发起预支付,获取所需参数</span>
<span style="color: rgba(0, 0, 0, 1)">wx.request({
url: app.globalData.host </span>+ '/api/wx_pay/createOrder'<span style="color: rgba(0, 0, 0, 1)">, //请求地址
data: {</span><span style="color: rgba(0, 0, 0, 1)">
openid: wx.getStorageSync(</span>'openid'<span style="color: rgba(0, 0, 0, 1)">),
total_fee: that.data.totalPrice,</span><span style="color: rgba(0, 0, 0, 1)">
goods: JSON.stringify(that.data.goods)
},
method: </span>'POST'<span style="color: rgba(0, 0, 0, 1)">,
success(res){<br> console.log(res)<br></span><span style="color: rgba(0, 0, 255, 1)"> if</span>(res.data.code == 1<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">发起微信支付</span>
<span style="color: rgba(0, 0, 0, 1)"> wx.requestPayment({
timeStamp: res.data.data.timeStamp,
nonceStr: res.data.data.nonceStr,
package: res.data.data.package,
signType: res.data.data.signType,
paySign: res.data.data.paySign,
success(r) {<br> console.log(r)
//do something</span><span style="color: rgba(0, 0, 0, 1)">
//比如回调,修改状态等操作</span><span style="color: rgba(0, 0, 0, 1)">
},
fail() {</span><span style="color: rgba(0, 0, 0, 1)">
wx.showToast({
title: </span>'支付失败'<span style="color: rgba(0, 0, 0, 1)">,
icon: </span>'none'<span style="color: rgba(0, 0, 0, 1)">
})
}
})
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
wx.showToast({
title: res.data.data,
icon: </span>'none'<span style="color: rgba(0, 0, 0, 1)">
})
}
}
})
},</span></pre>
</div>
<p> </p>
<h2>PHP端:</h2>
<p>WxPay.php</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
namespace app\api\controller;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> app\api\controller\Common;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> think\Db;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 微信支付
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span> WxPay <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Common
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成订单</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> createOrder(){
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (request()-><span style="color: rgba(0, 0, 0, 1)">isPost()) {<br></span><span style="color: rgba(128, 0, 128, 1)"> $openid</span> = input('openid'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$total_fee</span> = input('total_fee'<span style="color: rgba(0, 0, 0, 1)">);</span><span style="color: rgba(128, 0, 128, 1)">$orderid</span> =<span style="color: rgba(0, 0, 0, 1)"> get_order_sn(); //生成订单号
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> json(<span style="color: rgba(0, 0, 255, 1)">array</span>('code'=>3, 'data'=>'no openid'<span style="color: rgba(0, 0, 0, 1)">));
}
</span><span style="color: rgba(128, 0, 128, 1)">$goods</span> = json_decode(input('goods'), <span style="color: rgba(0, 0, 255, 1)">TRUE</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)"> 添加订单,自行添加</span>
<span style="color: rgba(128, 0, 128, 1)">$insert_order_id</span> = Db::name('order'<span style="color: rgba(0, 0, 0, 1)">)
</span>->insertGetId(<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(</span>
'pay_price' =><span style="color: rgba(128, 0, 128, 1)">$total_fee</span>,
'orderid' => <span style="color: rgba(128, 0, 128, 1)">$orderid</span><span style="color: rgba(0, 0, 0, 1)">
));
if($</span>insert_order_id<em><span>){<br> </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 调用微信【统一下单】 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <br> <span style="color: rgba(128, 0, 128, 1)">$res</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>->pay($</em><em id="__mceDel">total_fee<em id="__mceDel"><em id="__mceDel">, <span style="color: rgba(128, 0, 128, 1)">$openid</span>, <span style="color: rgba(128, 0, 128, 1)">$orderid</span><span>); </span></em></em></em></pre>
<pre><em id="__mceDel"><em id="__mceDel"><span style="color: rgba(0, 0, 255, 1)"> return</span> json(<span style="color: rgba(0, 0, 255, 1)">array</span>('code'=>1, 'data'=><span style="color: rgba(128, 0, 128, 1)">$res</span>, 'oid'=><span style="color: rgba(128, 0, 128, 1)">$insert_order_id</span><span>));</span><span> <br> } <br> } <br>}<br></span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 首先在服务器端调用微信【统一下单】接口,返回prepay_id和sign签名等信息给前端,前端调用微信支付接口 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <br><span style="color: rgba(0, 0, 255, 1)"> private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> Pay(<span style="color: rgba(128, 0, 128, 1)">$total_fee</span>, <span style="color: rgba(128, 0, 128, 1)">$openid</span>, <span style="color: rgba(128, 0, 128, 1)">$order_id</span>, <span style="color: rgba(128, 0, 128, 1)">$body=''</span><span>){ <br></span><span style="color: rgba(128, 0, 128, 1)">$appid</span> = config('myapp.appid');<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">小程序的appid</span> <br><span style="color: rgba(128, 0, 128, 1)"> $body</span> = config('site.title').'-'.<span style="color: rgba(128, 0, 128, 1)">$body</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $mch_id</span> = config('myapp.pay_mchid'<span>); <br></span><span style="color: rgba(128, 0, 128, 1)"> $KEY</span> = config('myapp.pay_apikey'<span>); <br></span><span style="color: rgba(128, 0, 128, 1)"> $nonce_str</span> = (<span style="color: rgba(0, 0, 255, 1)">string</span>)<span style="color: rgba(0, 128, 128, 1)">mt_rand</span>(10000, 99999).<span style="color: rgba(0, 128, 128, 1)">time</span>();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机字符串</span> <br><span style="color: rgba(128, 0, 128, 1)"> $notify_url</span> = request()->domain().'api/wx_pay/notify'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">支付完成回调地址url,不能带参数</span> <br><span style="color: rgba(128, 0, 128, 1)"> $out_trade_no</span> = <span style="color: rgba(128, 0, 128, 1)">$order_id</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">商户订单号</span> <br><span style="color: rgba(128, 0, 128, 1)"> $spbill_create_ip</span> = <span style="color: rgba(128, 0, 128, 1)">$_SERVER</span>['SERVER_ADDR'<span>]; <br></span><span style="color: rgba(128, 0, 128, 1)"> $trade_type</span> = 'JSAPI';<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">交易类型 默认JSAPI <br> //这里是按照顺序的 因为下面的签名是按照(字典序)顺序 排序错误 肯定出错</span> <br><span style="color: rgba(128, 0, 128, 1)"> $post</span>['appid'] = <span style="color: rgba(128, 0, 128, 1)">$appid</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $post</span>['body'] = <span style="color: rgba(128, 0, 128, 1)">$body</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $post</span>['mch_id'] = <span style="color: rgba(128, 0, 128, 1)">$mch_id</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $post</span>['nonce_str'] = <span style="color: rgba(128, 0, 128, 1)">$nonce_str</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机字符串</span> <br><span style="color: rgba(128, 0, 128, 1)"> $post</span>['notify_url'] = <span style="color: rgba(128, 0, 128, 1)">$notify_url</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $post</span>['openid'] = <span style="color: rgba(128, 0, 128, 1)">$openid</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $post</span>['out_trade_no'] = <span style="color: rgba(128, 0, 128, 1)">$out_trade_no</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $post</span>['spbill_create_ip'] = <span style="color: rgba(128, 0, 128, 1)">$spbill_create_ip</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">服务器终端的ip</span> <br><span style="color: rgba(128, 0, 128, 1)"> $post</span>['total_fee'] = <span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$total_fee</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">总金额 最低为一分钱 必须是整数</span> <br><span style="color: rgba(128, 0, 128, 1)"> $post</span>['trade_type'] = <span style="color: rgba(128, 0, 128, 1)">$trade_type</span><span>;<br></span><span style="color: rgba(128, 0, 128, 1)"> $sign</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>->MakeSign(<span style="color: rgba(128, 0, 128, 1)">$post</span>, <span style="color: rgba(128, 0, 128, 1)">$KEY</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">签名</span> <br><span style="color: rgba(128, 0, 128, 1)"> $post_xml</span> = '<span><xml> <appid></span>'.<span style="color: rgba(128, 0, 128, 1)">$appid</span>.'<span></appid><br> <body></span>'.<span style="color: rgba(128, 0, 128, 1)">$body</span>.'<span></body><br> <mch_id></span>'.<span style="color: rgba(128, 0, 128, 1)">$mch_id</span>.'<span></mch_id><br> <nonce_str></span>'.<span style="color: rgba(128, 0, 128, 1)">$nonce_str</span>.'<span></nonce_str><br> <notify_url></span>'.<span style="color: rgba(128, 0, 128, 1)">$notify_url</span>.'<span></notify_url><br> <openid></span>'.<span style="color: rgba(128, 0, 128, 1)">$openid</span>.'<span></openid><br> <out_trade_no></span>'.<span style="color: rgba(128, 0, 128, 1)">$out_trade_no</span>.'<span></out_trade_no><br> <spbill_create_ip></span>'.<span style="color: rgba(128, 0, 128, 1)">$spbill_create_ip</span>.'<span></spbill_create_ip><br> <total_fee></span>'.<span style="color: rgba(128, 0, 128, 1)">$total_fee</span>.'<span></total_fee><br> <trade_type></span>'.<span style="color: rgba(128, 0, 128, 1)">$trade_type</span>.'<span></trade_type><br> <sign></span>'.<span style="color: rgba(128, 0, 128, 1)">$sign</span>.'<span></sign></xml> </span>'<span>; <br><br></span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">统一下单接口prepay_id</span> <br><span style="color: rgba(128, 0, 128, 1)"> $url</span> = 'https://api.mch.weixin.qq.com/pay/unifiedorder'<span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $xml</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>->http_request(<span style="color: rgba(128, 0, 128, 1)">$url</span>,<span style="color: rgba(128, 0, 128, 1)">$post_xml</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">POST方式请求http</span> <br><br><span style="color: rgba(128, 0, 128, 1)"> $array</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>->xml2array(<span style="color: rgba(128, 0, 128, 1)">$xml</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将【统一下单】api返回xml数据转换成数组,全要大写</span> <br><br><span style="color: rgba(0, 0, 255, 1)"> if</span>(<span style="color: rgba(128, 0, 128, 1)">$array</span>['RETURN_CODE'] == 'SUCCESS' && <span style="color: rgba(128, 0, 128, 1)">$array</span>['RESULT_CODE'] == 'SUCCESS'<span>){ <br></span><span style="color: rgba(128, 0, 128, 1)"> $time</span> = <span style="color: rgba(0, 128, 128, 1)">time</span><span>(); <br></span><span style="color: rgba(128, 0, 128, 1)"> $tmp</span>=''; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">临时数组用于签名</span> <br><span style="color: rgba(128, 0, 128, 1)"> $tmp</span>['appId'] = <span style="color: rgba(128, 0, 128, 1)">$appid</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $tmp</span>['nonceStr'] = <span style="color: rgba(128, 0, 128, 1)">$nonce_str</span><span>;<br></span><span style="color: rgba(128, 0, 128, 1)"> $tmp</span>['package'] = 'prepay_id='.<span style="color: rgba(128, 0, 128, 1)">$array</span>['PREPAY_ID'<span>]; <br></span><span style="color: rgba(128, 0, 128, 1)"> $tmp</span>['signType'] = 'MD5'<span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $tmp</span>['timeStamp'] = "<span style="color: rgba(128, 0, 128, 1)">$time</span>"<span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['code'] = 1<span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['timeStamp'] = "<span style="color: rgba(128, 0, 128, 1)">$time</span>"; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">时间戳</span> <br><span style="color: rgba(128, 0, 128, 1)"> $data</span>['nonceStr'] = <span style="color: rgba(128, 0, 128, 1)">$nonce_str</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">随机字符串</span> <br><span style="color: rgba(128, 0, 128, 1)"> $data</span>['signType'] = 'MD5'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">签名算法,暂支持 MD5</span> <br><span style="color: rgba(128, 0, 128, 1)"> $data</span>['package'] = 'prepay_id='.<span style="color: rgba(128, 0, 128, 1)">$array</span>['PREPAY_ID']; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*</span> <br><span style="color: rgba(128, 0, 128, 1)"> $data</span>['paySign'] = <span style="color: rgba(128, 0, 128, 1)">$this</span>->MakeSign(<span style="color: rgba(128, 0, 128, 1)">$tmp</span>,<span style="color: rgba(128, 0, 128, 1)">$KEY</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">签名,具体签名方案参见微信公众号支付帮助文档;</span> <br><span style="color: rgba(128, 0, 128, 1)"> $data</span>['out_trade_no'] = <span style="color: rgba(128, 0, 128, 1)">$out_trade_no</span><span>;<br> }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span>{ <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['code'] = 0<span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['msg'] = "错误"<span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['RETURN_CODE'] = <span style="color: rgba(128, 0, 128, 1)">$array</span>['RETURN_CODE'<span>]; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['RETURN_MSG'] = <span style="color: rgba(128, 0, 128, 1)">$array</span>['RETURN_MSG'<span>]; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>['ERR_CODE_DES'] = <span style="color: rgba(128, 0, 128, 1)">$array</span>['ERR_CODE_DES'<span>]; <br> } <br></span><span style="color: rgba(0, 0, 255, 1)"> return</span> <span style="color: rgba(128, 0, 128, 1)">$data</span><span>; <br>} <br><br></span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* * 生成签名, $KEY就是支付key * @return 签名 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <br><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> MakeSign(<span style="color: rgba(128, 0, 128, 1)">$params</span>,<span style="color: rgba(128, 0, 128, 1)">$KEY</span><span>){<br></span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">签名步骤一:按字典序排序数组参数</span> <br><span style="color: rgba(0, 128, 128, 1)"> ksort</span>(<span style="color: rgba(128, 0, 128, 1)">$params</span><span>); <br></span><span style="color: rgba(128, 0, 128, 1)"> $string</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>->ToUrlParams(<span style="color: rgba(128, 0, 128, 1)">$params</span>); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">参数进行拼接key=value&k=v <br> //签名步骤二:在string后加入KEY</span> <br><span style="color: rgba(128, 0, 128, 1)"> $string</span> = <span style="color: rgba(128, 0, 128, 1)">$string</span> . "&key=".<span style="color: rgba(128, 0, 128, 1)">$KEY</span><span>; <br></span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">签名步骤三:MD5加密</span> <br> <span style="color: rgba(128, 0, 128, 1)">$string</span> = <span style="color: rgba(0, 128, 128, 1)">md5</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span><span>); <br></span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">签名步骤四:所有字符转为大写</span> <br><span style="color: rgba(128, 0, 128, 1)"> $result</span> = <span style="color: rgba(0, 128, 128, 1)">strtoupper</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span><span>); <br></span><span style="color: rgba(0, 0, 255, 1)"> return</span> <span style="color: rgba(128, 0, 128, 1)">$result</span><span>; <br>} <br><br></span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* * 将参数拼接为url: key=value&key=value * @param $params * @return string </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <br><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> ToUrlParams( <span style="color: rgba(128, 0, 128, 1)">$params</span><span> ){ <br></span><span style="color: rgba(128, 0, 128, 1)"> $string</span> = ''<span>; <br></span><span style="color: rgba(0, 0, 255, 1)"> if</span>( !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$params</span><span>) ){ <br></span><span style="color: rgba(128, 0, 128, 1)"> $array</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span>(); <br></span><span style="color: rgba(0, 0, 255, 1)"> foreach</span>( <span style="color: rgba(128, 0, 128, 1)">$params</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> => <span style="color: rgba(128, 0, 128, 1)">$value</span><span> ){ <br></span><span style="color: rgba(128, 0, 128, 1)"> $array</span>[] = <span style="color: rgba(128, 0, 128, 1)">$key</span>.'='.<span style="color: rgba(128, 0, 128, 1)">$value</span><span>; <br> }<br></span><span style="color: rgba(128, 0, 128, 1)"> $string</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>("&",<span style="color: rgba(128, 0, 128, 1)">$array</span><span>); <br> } <br></span><span style="color: rgba(0, 0, 255, 1)"> return</span> <span style="color: rgba(128, 0, 128, 1)">$string</span><span>; <br>} <br><br></span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">* * 调用接口, $data是数组参数 * @return 签名 </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <br><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> http_request(<span style="color: rgba(128, 0, 128, 1)">$url</span>, <span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(0, 0, 255, 1)">null</span>, <span style="color: rgba(128, 0, 128, 1)">$headers</span>=<span style="color: rgba(0, 0, 255, 1)">array</span><span>()) { <br></span><span style="color: rgba(128, 0, 128, 1)"> $curl</span> =<span> curl_init();<br></span><span style="color: rgba(0, 0, 255, 1)"> if</span>( <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$headers</span>) >= 1<span> ){ <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_HTTPHEADER, <span style="color: rgba(128, 0, 128, 1)">$headers</span><span>); <br> } <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_URL, <span style="color: rgba(128, 0, 128, 1)">$url</span><span>); <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span>); <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span>); <br></span><span style="color: rgba(0, 0, 255, 1)"> if</span> (!<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$data</span><span>)){ <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_POST, 1<span>); <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_POSTFIELDS, <span style="color: rgba(128, 0, 128, 1)">$data</span><span>); <br> } <br> curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span>, CURLOPT_RETURNTRANSFER, 1<span>); <br></span><span style="color: rgba(128, 0, 128, 1)"> $output</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$curl</span><span>); <br> curl_close(</span><span style="color: rgba(128, 0, 128, 1)">$curl</span><span>); <br> </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$output</span><span>; <br>} <br><br></span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取xml里面数据,转换成array</span> <br><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> xml2array(<span style="color: rgba(128, 0, 128, 1)">$xml</span><span>){ <br></span><span style="color: rgba(128, 0, 128, 1)"> $p</span> = <span style="color: rgba(0, 128, 128, 1)">xml_parser_create</span><span>(); <br></span><span style="color: rgba(0, 128, 128, 1)"> xml_parse_into_struct</span>(<span style="color: rgba(128, 0, 128, 1)">$p</span>, <span style="color: rgba(128, 0, 128, 1)">$xml</span>, <span style="color: rgba(128, 0, 128, 1)">$vals</span>, <span style="color: rgba(128, 0, 128, 1)">$index</span><span>); <br></span><span style="color: rgba(0, 128, 128, 1)"> xml_parser_free</span>(<span style="color: rgba(128, 0, 128, 1)">$p</span><span>); <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span> = ""<span>; <br></span><span style="color: rgba(0, 0, 255, 1)"> foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$index</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span>=><span style="color: rgba(128, 0, 128, 1)">$value</span><span>) { <br></span><span style="color: rgba(0, 0, 255, 1)"> if</span>(<span style="color: rgba(128, 0, 128, 1)">$key</span> == 'xml' || <span style="color: rgba(128, 0, 128, 1)">$key</span> == 'XML') <br><span style="color: rgba(0, 0, 255, 1)"> continue</span><span>; <br></span><span style="color: rgba(128, 0, 128, 1)"> $tag</span> = <span style="color: rgba(128, 0, 128, 1)">$vals</span>[<span style="color: rgba(128, 0, 128, 1)">$value</span>]['tag'<span>]; <br></span><span style="color: rgba(128, 0, 128, 1)"> $value</span> = <span style="color: rgba(128, 0, 128, 1)">$vals</span>[<span style="color: rgba(128, 0, 128, 1)">$value</span>]['value'<span>]; <br></span><span style="color: rgba(128, 0, 128, 1)"> $data</span>[<span style="color: rgba(128, 0, 128, 1)">$tag</span>] = <span style="color: rgba(128, 0, 128, 1)">$value</span><span>; <br> } <br></span><span style="color: rgba(0, 0, 255, 1)"> return</span> <span style="color: rgba(128, 0, 128, 1)">$data</span><span>;<br>} <br><br></span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">支付完后的回调</span> <br><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span> notify(){ <br></span><span style="color: rgba(128, 0, 128, 1)"> //do something <br></span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">更新支付状态</span> <span><br></span><span style="color: rgba(0, 128, 0, 1)"> //</span><span style="color: rgba(0, 128, 0, 1)">更新购物商品状态</span> <span><br> </span><span style="color: rgba(0, 0, 255, 1)">return</span> json(<span style="color: rgba(0, 0, 255, 1)">array</span>('code'=> 1, 'data'=>'支付成功'<span>));</span><span><br>}</span></em></em></pre>
</div>
<p> </p>
<p>没整理好,以后有时间再说吧,,,</p>
<p>以上所有方法都可从SDK及DEMO中寻得,官方参考。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/sanplit/p/11044265.html
頁:
[1]