Android微信扫码支付
微信扫码支付模式二:
微信文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5。
其实做支付的都知道微信文档是个巨坑,我也踩了不少坑但是最后还是解决了,于是打算总结一下。
我相信一般做微信扫码支付的一般都是网页版,或者PC端,反正我就很少看到APP里面扫码支付的。
准备:要先去微信开发者平台申请AppID,其次要去申请开通支付,开通支付必须要成为开发者,300/年,然后就是填一些必要的资料,什么收款账户之类的那些东西,总之最后会得到以下这三个必要的东西:
1.AppID.
2.商户号.
3.商户密钥
开发:
微信扫码支付有两种模式,我们使用的是第二种模式(文档在上面那个地址),看了文章我们就可以知道我们需要用的API
TIM图片20180209150104.png
统一下单,支付结果通知等等
统一下单:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
统一下单的文档,看完可以得到的信息就是,我们需要 post 微信需要的参数请求到统一下单这个接口,接口:URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder(统一下单)。
注意:其中两个参数 notify_url 这个参数设置的地址,是支付结果回调通知的网址,这个回调地址还需要在商户平台的开发配置那里配置,配置地址和上面参数是一样的
回调是微信异步发给我们的,需要我们去接收,它是一个流传输过来的。
sign 这个参数是要通过签名算法计算得出的签名值 ,具体怎么算微信参数描述那有说明的,其他参数 注意一下微信后面需要的要求,例如需要加密什么的。最后需要把我们的参数,转换成XML格式,在发送给下单接口。
例如:
<xml>
<appid>wx2421b1c4370ec43b</appid>
<attach>支付测试</attach>
<body>JSAPI支付测试</body>
<mch_id>10000100</mch_id>
<detail><![CDATA[{ "goods_detail":[ { "goods_id":"iphone6s_16G", "wxpay_goods_id":"1001", "goods_name":"iPhone6s 16G", "quantity":1, "price":528800, "goods_category":"123456", "body":"苹果手机" }, { "goods_id":"iphone6s_32G", "wxpay_goods_id":"1002", "goods_name":"iPhone6s 32G", "quantity":1, "price":608800, "goods_category":"123789", "body":"苹果手机" } ] }]]></detail>
<nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
<notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
<openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
<out_trade_no>1415659990</out_trade_no>
<spbill_create_ip>14.23.150.211</spbill_create_ip>
<total_fee>1</total_fee>
<trade_type>JSAPI</trade_type>
<sign>0CB01533B8C1EF103065174F50BCA001</sign>
</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>
<openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>
<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
<code_url>![CDATA[weixin://wxpay/s/An4baqw]]</code_url>
</xml>
这里放回来后我们为了简便 要把XML转换成json数据。
上面提到的 参数转XML, XML转json这些工具类,网上很多我就不发了。知道思路就可以了。
我们需要的就是<code_url>,这个标签下的这个链接,这个链接就是我们生成收款码的东西,。
之后我们就需要我们的 Zxing,不懂就去搜索一下,因为我们今天只是说微信扫码支付,其他必要知识不会细说,而且其实网上有很多生成二维码的工具类,最后会返回一个 Bitmap. 最后让ImageView显示出来就可以了。
支付结果通知
文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7
看懂微信文档这段话就可以了:
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
由于涉及到交易问题,我这边需要存到数据库,所以回调通知这方面是后台去接收,然后我再请求后台查看支付结果。