浅谈使用PHP开发支付的流程
浅谈使⽤PHP开发⽀付的流程
下⾯以PHP语⾔为例,对⽀付的开发流程进⾏⼀下说明。
1.获取订单信息
2.根据订单信息和⽀付相关的账号⽣成sign,并且⽣成⽀付参数
3.将⽀付参数信息POST到服务器,获取返回信息
4.根据返回信息⽣成相应的⽀付代码(内部)或是⽀付⼆维码(⾮内),完成⽀付。
下⾯分步骤的讲⼀下:
1.⽀付中相关的必须的订单参数有三个,分别是:body(商品名或订单描述),out_trade_no(⼀般为订单号)和
total_fee(订单⾦额,单位“分”,要注意单位问题),在不同的应⽤中,⾸先要做的就是获取订单中的相关信息,为⽀付参数⽣成做准备。
2.其他必须的⽀付参数有 appid(appid),mch_id(申请成功后告知),device_info(web端和
端该参数都是统⼀的,为⼤写的”WEB“),trade_type(根据使⽤场景不同,该值也是不同的,外部为”NATIVE“,内部
为”JSAPI“),nonce_str(32位随机字符串),spbill_create_ip(发起⽀付的终端IP,即服务器IP),notify_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。
D:string = md5(string)
E: sign = strtoupper(string)
⾄此,sign⽣成完毕。
将sign添加到array数组⾥⾯⽣成新的数组。将该数组转换为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>
proteus仿真
<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:该数组的参数包括:appId,timeStamp,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._msg);
_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>
⾄此,⽀付的整个开发介绍完毕。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。