微信支付遇到过的坑

来源:互联网 发布:人工智能发展史 知乎 编辑:程序博客网 时间:2024/04/30 05:31

记得当时做支付宝接口的时候,和朋友就在讨论,支付宝开发文档就是个坑。可是最近做了微信支付后才感觉支付宝真是如春天般温暖,微信的坑是天坑,真是腾讯的老话“用钱创造快乐,没钱玩你妈比”。

据说,微信支付的开发文档还是一个什么都不会的实习生写的,醉醉的。我花了整天时间才完成订单的生成,可见开发的难度。。。所以在此分享下自己踩过的坑,希望大家可以用更短的时间完成开发。

以下只写实现思路和一些错误,具体代码请到最后我的git上下载

APP微信支付生成订单

首先先来看下图
这里写图片描述

流程如下:

  1. app端将订单返回给后台的用于生成订单的接口
  2. 后台获取订单信息,生成签名
签名必须按照签名规范,请参照https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=4_3签名前字符串如下:String testp = "appid=应用ID&body=商品描述&mch_id=商户号&nonce_str=随机字符串,不长于32位&notify_url=微信支付通知地址&out_trade_no=商户订单号&spbill_create_ip=移动端IP&total_fee=订单总金额,单位为分(1为1分,100为一元)&trade_type=交易类型(APP)&key=应用KEY";注意:用MD5加密后将字母转为大写    应用ID就是微信支付时注册的ID,和微信分享ID是不同的,我的一个IOS同事之前就是没把ID换过来浪费我好久(他一直用微信分享的appid)

3.将签名参数和生成的签名转为xml格式,如下:

<xml>   <appid>wx2421b1c4370ec43b</appid>   <body>JSAPI支付测试</body>   <mch_id>10000100</mch_id>   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>   <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>

4.将xml转成gbk编码(之前用utf8报错)
5.将封装好的xml数据发送到
统一下单url:https://api.mch.weixin.qq.com/pay/unifiedorder
获取预订单ID

// 生成预订单        TenpayHttpClient httpClient = new TenpayHttpClient();        String requestUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";        httpClient.setReqContent(requestUrl);        String resContent = "";        String prepayid = "";        if (httpClient.callHttpPost(requestUrl, utfxml)) {            resContent = httpClient.getResContent();            String utfres = "";            try {                utfres = new String(resContent.getBytes("gbk"), "utf-8");            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }            System.out.println(utfres);            //解析微信支付返回的xml,获取prepayid            Map res=XMLUtil.doXMLParse(utfres);            String preid=(String) res.get("prepay_id");            System.out.println("prepayid:"+preid);

6.其实做到这里订单已经生成了,可以通过查询订单接口查询prepay_id的订单是否存在。现在需要将APP移动端需要的数据再进行一次签名

String presign ="appid=应用ID&noncestr=同上的随机数&package=Sign=WXPay&partnerid=商户号&prepayid=预订单号&timestamp=时间戳&key=应用KEY";这里需要注意的是时间戳必须是10位数,也就是精确到秒。之前没有仔细看文档直接在eclipse中new Date()精确到毫秒,移动端就老是跳不到支付界面

7.将这些参数和生成的签名全部返回给移动端
8.移动端调用,APP端调起支付接口跳转到支付界面

自己demo的git路径:

总的来说,微信支付在错误信息的反馈上处理的很不人性化,如果错了支付界面就是空白无论什么错误都没有提示,就如上面IOS同事的那个错误,不浪费好久是看不出来的。如有问题,请留言讨论。

1 0
原创粉丝点击