浅谈使用PHP开发微信支付的流程
《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.至此,微信付出的参数准备工作完成. 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>
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.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实例:浅谈使用PHP开发微信支付的流程》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |