德保罗 發表於 2019-6-18 11:27:00

PHP实现微信小程序支付

<p>本文仅记录了微信小程序支付开发的基本流程和代码,具体业务需自行修改。tp5框架下演示:</p>
<h2>参考:</h2>
<p>微信小程序支付:业务流程</p>
<p>SDK与DEMO:&nbsp;&nbsp;下载页</p>
<p>PHPPayDemo: demo</p>
<h2>小程序端:</h2>
<div class="cnblogs_code">
<p><span>goPay(e){&nbsp; </span></p>
<p><span>  var&nbsp;that =&nbsp;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>&nbsp;</p>
<h2>PHP端:</h2>
<p>WxPay.php</p>
<div class="cnblogs_code">
<pre>&lt;?<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()-&gt;<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'=&gt;3, 'data'=&gt;'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>-&gt;insertGetId(<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(</span>
                            'pay_price'   =&gt;<span style="color: rgba(128, 0, 128, 1)">$total_fee</span>,
                            'orderid'      =&gt; <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>-&gt;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'=&gt;1, 'data'=&gt;<span style="color: rgba(128, 0, 128, 1)">$res</span>, 'oid'=&gt;<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()-&gt;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>-&gt;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>&lt;xml&gt; &lt;appid&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$appid</span>.'<span>&lt;/appid&gt;<br>      &lt;body&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$body</span>.'<span>&lt;/body&gt;<br>      &lt;mch_id&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$mch_id</span>.'<span>&lt;/mch_id&gt;<br>      &lt;nonce_str&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$nonce_str</span>.'<span>&lt;/nonce_str&gt;<br>      &lt;notify_url&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$notify_url</span>.'<span>&lt;/notify_url&gt;<br>      &lt;openid&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$openid</span>.'<span>&lt;/openid&gt;<br>      &lt;out_trade_no&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$out_trade_no</span>.'<span>&lt;/out_trade_no&gt;<br>      &lt;spbill_create_ip&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$spbill_create_ip</span>.'<span>&lt;/spbill_create_ip&gt;<br>      &lt;total_fee&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$total_fee</span>.'<span>&lt;/total_fee&gt;<br>      &lt;trade_type&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$trade_type</span>.'<span>&lt;/trade_type&gt;<br>      &lt;sign&gt;</span>'.<span style="color: rgba(128, 0, 128, 1)">$sign</span>.'<span>&lt;/sign&gt;&lt;/xml&gt; </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>-&gt;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>-&gt;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' &amp;&amp; <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>-&gt;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>-&gt;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&amp;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> . "&amp;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&amp;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> =&gt; <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>("&amp;",<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>) &gt;= 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>=&gt;<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'=&gt; 1, 'data'=&gt;'支付成功'<span>));</span><span><br>}</span></em></em></pre>
</div>
<p>&nbsp;</p>
<p>没整理好,以后有时间再说吧,,,</p>
<p>以上所有方法都可从SDK及DEMO中寻得,官方参考。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/sanplit/p/11044265.html
頁: [1]
查看完整版本: PHP实现微信小程序支付