美文网首页
Android微信扫码支付

Android微信扫码支付

作者: 波波维奇c | 来源:发表于2018-02-09 15:44 被阅读0次

    微信扫码支付模式二:

    微信文档:
    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 这个参数设置的地址,是支付结果回调通知的网址,这个回调地址还需要在商户平台的开发配置那里配置,配置地址和上面参数是一样的

    3.png

    回调是微信异步发给我们的,需要我们去接收,它是一个流传输过来的。
    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,单位:秒)
    注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
    推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
    特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

    由于涉及到交易问题,我这边需要存到数据库,所以回调通知这方面是后台去接收,然后我再请求后台查看支付结果。

    相关文章

      网友评论

          本文标题:Android微信扫码支付

          本文链接:https://www.haomeiwen.com/subject/vzwftftx.html