最近项目需要用到微信支付,以前弄过淘宝支付,其实原理都差不多,在此做个笔记,方便以后用到。
微信支付分几种,而我只用到了微信内网页支付,其他支付过程大同小异。
官方文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_1
微信页内支付:用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程。
总体业务流程时序图:
我们就根据时序图,逐步记录分解说明。
1、申请微信支付
申请微信公众号支付,必需满足以下条件:
1、公众号为服务号,且为企业、媒体、政府及其他组织类型;
2、已完成微信认证(完成资质认证或名称认证,审核服务费用:300元/次)
认证申请是一个漫长又繁琐的过程~~
2、填写支付测试授权地址,测试白名单
3、编写统一下单接口
官方文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1
除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
注意:
(1)其中签名算法一定要按照规定,http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
(2)文档中提到的APP密匙是在商户系统-》账户设置-》安全设置-》API安全里面获得的密匙,而不是Appsecret(因为这里理解错误,我花了两天困在了签名!)。
APP密匙:交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。
(3)不要泄露任何密匙相关信息,所以所有的签名操作都需要提交给服务器完成,不要在html里面硬编码。
(4)notify_url是接收微信支付异步通知回调地址,是判断支付是否成功的关键,该URL不能附带任何类似?A=1&B=2的参数,会被过滤掉,参数应该附加在attach附加参数这个字段中。异步通知回调的时候会原封返回,处理完成数据之后,记得返回微信服务器成功信息,不然会定期重传。关于回调的相关文档http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_7
完成统一下单接口之后,与微信支付交互,就能够得到页内支付的预交易会话标识了。
4、编写微信页内支付签名接口
官方文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_7
由于又要签名一次,签名用到API密匙,所以服务端要提供签名接口,其中的参数可以在服务端生成,也可以由客户端生成。
根据文档要求,签名完成之后,就调用微信JSAPI直接进入支付流程即可。
整个过程采用XML数据传输。