1. 云栖社区>
  2. PHP教程>
  3. 正文

浅谈使用PHP开发微信支付的流程

作者:用户 来源:互联网 时间:2017-12-01 13:53:04

支付流程

浅谈使用PHP开发微信支付的流程 - 摘要: 本文讲的是浅谈使用PHP开发微信支付的流程, 下面以PHP语言为例对微信支付的开发流程进行一下说明。1.获取订单信息2.根据订单信息和支付相关的账号生成sign并且生成支付参数3.将支付参数信息POST到微信服务器获取返回信息4.根据返回信息生成相应的支付代码微信内部或是支付二维码非


下面以PHP语言为例对微信支付的开发流程进行一下说明。

1.获取订单信息

2.根据订单信息和支付相关的账号生成sign并且生成支付参数

3.将支付参数信息POST到微信服务器获取返回信息

4.根据返回信息生成相应的支付代码微信内部或是支付二维码非微信内完成支付。

下面分步骤的讲一下

1.微信支付中相关的必须的订单参数有三个分别是body(商品名或订单描述),out_trade_no一般为订单号和total_fee订单金额单位“分”要注意单位问题在不同的应用中首先要做的就是获取订单中的相关信息为支付参数生成做准备。

2.其他必须的支付参数有 appid微信appidmch_id申请成功后告知,device_info(web端和微信端该参数都是统一的为大写的”WEB“)trade_type根据使用场景不同该值也是不同的微信外部为”NATIVE“微信内部为”JSAPI“,nonce_str(32位随机字符串),spbill_create_ip发起支付的终端IP即服务器IPnotify_url支付回调地址微信服务器通知网站支付完成与否修改订单状态sign签名还有一个需要说明的地方如果trade_type为JSAPI的话openid为必填的参数。

签名算法是比较容易出错的地方在于签名步骤繁琐其实很关键的是sign不参与签名

A将1、2中提到的除sign外的参数赋值放到一个数组array里面按照字典顺序排序其实就是键值按照A―Z的顺序进行排序。

B将数组转换成字符串string格式为 k1=v1&k2=v2&...kN=vN

C在此string后加上KEY值在微信支付商户后台用户自己设定的现在string = k1=v1&k2=v2&...kN=vN&key=KEY。

Dstring = md5(string)

E: sign = strtoupper(string)

至此sign生成完毕。

将sign添加到array数组里面生成新的数组。将该数组转换为XML。至此微信支付的参数准备工作完成。

3.将2中生成的XML使用POST的方式发送请求到微信https://api.mch.weixin.qq.com/pay/unifiedorder获取返回的XML信息将该信息转换成数组格式方便操作。返回的XML信息如下

<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg> <appid><![CDATA[wx2421b1c4370ec43b]]></appid> <mch_id><![CDATA[10000100]]></mch_id> <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str> <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign> <result_code><![CDATA[SUCCESS]]></result_code> <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id> <trade_type><![CDATA[JSAPI]]></trade_type></xml>


如果是trade_type==native支付的话还会多一个参数code_url该URL为微信扫码支付的地址。

4.下面就是支付的过程了。

如果trade_type==native那么使用一些方式将code_url转换成二维码使用微信扫码就可以了如果是微信内部点击支付的话需要调用微信js-sdk中的相关东西这一步中最关键是生成一个json格式的字符串。

首先要生成转换json字符串的数组array_jsapi。

A该数组的参数包括appIdtimeStamp,nonceStr,package,signType(默认为”MD5“)要注意大小写和上面的数组里面是不一样的。

B使用该数组生成paySign参数签名方式同上。

C将paySign参数追加到array_jsapi数组中。

D将该数组使用json_encode格式化为字符串js_string。

完成上面的工作就可以在微信内部进行支付了。

下面为相关支付的示例代码

<script type='text/javascript'> function jsApiCall()     {      WeixinJSBridge.invoke(       'getBrandWCPayRequest',       $js_string,       function(res){WeixinJSBridge.log(res.err_msg); if(res.err_msg=='get_brand_wcpay_request:ok') {  alert('支付成功'); } else {  alert('支付失败'); }       }      );     }     function callpay()     {      if (typeof WeixinJSBridge == 'undefined'){       if( document.addEventListener ){document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);       }else if (document.attachEvent){document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall);       }      }else{       jsApiCall();      }     }    </script>


代码中js_string即为我们生成的字符串。

HTML代码中调用callpay()函数发起支付。

这样微信支付的支付工作就完成了。

下面是回调工作该功能确保订单支付成功后有正确的状态显示给用户。

支付完成后微信使用POST请求将支付结果反馈给网站服务器网站服务器获取POST信息根据支付成功与否来确定是否修改订单信息。

A将POST参数中的sign去除并且记录下来该值。

B对剩余的参数进行签名

C将签名结果和POST中的sign进行比对相同说明签名正确根据支付结果修改订单状态。

E返回XML信息给微信确保微信知道网站已经收到该通知避免微信再次推送POST示例如下

<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>


如果失败则返回

<xml> <return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[失败原因]]></return_msg></xml>


至此微信支付的整个开发介绍完毕。浅谈使用PHP开发微信支付的流程

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索支付 , 流程 ,以便于您获取更多的相关知识。

稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一

6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验

弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率

开发者常用软件,超百款实用软件一站式提供