微信支付遇到过的坑
来源:互联网 发布:人工智能发展史 知乎 编辑:程序博客网 时间:2024/04/30 05:31
记得当时做支付宝接口的时候,和朋友就在讨论,支付宝开发文档就是个坑。可是最近做了微信支付后才感觉支付宝真是如春天般温暖,微信的坑是天坑,真是腾讯的老话“用钱创造快乐,没钱玩你妈比”。
据说,微信支付的开发文档还是一个什么都不会的实习生写的,醉醉的。我花了整天时间才完成订单的生成,可见开发的难度。。。所以在此分享下自己踩过的坑,希望大家可以用更短的时间完成开发。
以下只写实现思路和一些错误,具体代码请到最后我的git上下载
APP微信支付生成订单
首先先来看下图
流程如下:
- app端将订单返回给后台的用于生成订单的接口
- 后台获取订单信息,生成签名
签名必须按照签名规范,请参照https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=4_3签名前字符串如下:String testp = "appid=应用ID&body=商品描述&mch_id=商户号&nonce_str=随机字符串,不长于32位¬ify_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=预订单号×tamp=时间戳&key=应用KEY";这里需要注意的是时间戳必须是10位数,也就是精确到秒。之前没有仔细看文档直接在eclipse中new Date()精确到毫秒,移动端就老是跳不到支付界面
7.将这些参数和生成的签名全部返回给移动端
8.移动端调用,APP端调起支付接口跳转到支付界面
自己demo的git路径:
总的来说,微信支付在错误信息的反馈上处理的很不人性化,如果错了支付界面就是空白无论什么错误都没有提示,就如上面IOS同事的那个错误,不浪费好久是看不出来的。如有问题,请留言讨论。
1 0
- 微信支付遇到过的坑
- 微信支付趟过的坑
- 微信支付趟过的坑
- 微信支付趟过的坑
- Android微信支付遇到的坑
- Android微信支付遇到的坑
- 微信支付遇到的坑们
- 微信支付遇到的坑
- 微信支付遇到的坑
- 微信支付遇到的坑
- 微信支付遇到的坑
- 微信支付签名遇到的坑
- 微信支付遇到的坑(移动支付)
- 微信支付(微信支付的坑基本上都踩过一遍了)
- 微信jsApiPay支付踩过的坑
- Android接入微信支付踩过的坑
- 微信JSAPI支付躺过的坑
- Android微信支付集成和踩过的坑
- GPSDmeo
- OpenCV(开源计算机视觉库介绍)
- 自定义ViewGroup---measureChildren
- 【解决方法】UITableView 性能优化笔记
- 新年后的英语学习
- 微信支付遇到过的坑
- Tomcat7.0 Can't load AMD 64-bit .dll on a IA 32-bit platform
- ThinkPHP框架配置
- yii2的表单验证与数据库操作
- [疯狂Java笔记]AWT:布局管理器、绝对布局、FlowLayout流式布局
- HTML+CSS慕课网学习总结(六)
- 智能指针初探
- Java直接插入排序
- python 变长参数