Android 支付宝微信支付集成备忘及吐槽(微信)
2015-12-30 08:56
696 查看
最近公司的app提出需要支付的需求,之前的好几个项目,经理都说要上支付上支付,但最终都没有弄。
所以断断续续的看过一些文档,示例,有了一些初步的认识,看到各种key,id,还有满满一页的流程图,感觉好难。
又看到网上普遍反映,微信略微复杂一些,支付宝非常简单。看到这些,打消了心中的一些忐忑,开整。
先难后易,先弄微信:
提交一堆审核资料然后等。结果还算顺利,很快通过了验证。
先从DEMO入手。
1,提供应用id、商户id、支付金额等要素通过支付宝的统一下单接口获取一个prepay_id,如下。
其实业务的逻辑很清晰。微信收到请求,即创建一条订单,用户后续的操作通过这个prepay_id与微信进行关联从而更新支付订单的状态。
2、通过第一步获取到的prepay_id,构建一个PayReq对象,PayReq须向以下字段赋值:
签名通过如下以下方式获取
3、通过IWXAPI的msgApi.sendReq(req) 方法发送支付请求。
4、在微信客户端的执行支付操作,支付的结果会通过WXPayEntryActivity页面进行回调。
需要注意的有:
1:步骤1中的商户id在https://pay.weixin.qq.com/index.php/account获取,登陆账号为商户平台账号,微信支付审核通过邮件中提供。格式为1291xxxx1@1291xxxx1
2:步骤1中的total_fee单位是分,不是元。
3:步骤4中,要保证回调类WXPayEntryActivity.java文件必须位于包名的wxapi目录下,否则会导致无法回调的情况。
4:平台注册应用时需要填入应用的包名,和一个应用签名。包名即我们项目的包名,应用签名不是我们通常理解的keystore,是针对打包后的apk应用的一个签名,签名工具在以下地址下载,安装到手机后,在手机上完成签名操作。
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=de0bb5ed2572189867ad6bec44db1be1a5e3e017&lang=zh_CN
以上是一整套付款的流程,为了方便也是微信把所有的业务放在了客户端去实现,这一点是很不合理很不安全的。结合微信官方的流程图,梳理下优化方案。
微信下单接口需要提供我们业务中的订单号,以及最终支付金额等。
所以例如构建prepay_id这些步骤,应该放到服务端去完成,客户端提供商品的id及购买数量。服务端维护订单表及状态,并且可以增加优惠返利规则,生成最终的实际付款金额。
流程的第15步开始,app支付成功后,微信服务会异步的向app后台发送请求通知商户支付结果
结果包含支付结果、订单金额、最终付款金额(微信可能也会有返利优惠)、优惠金额、支付时间等要素。详细结果见:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_7
此通知才能最终作为支付结果的依据,用于更改订单等状态信息。
同时,app服务端需要提供结果查询接口,供app端调用,app也只能以查询到的结果作为依据显示支付结果。不能以微信app的返回结果作为显示依据。
至此,微信接口算是完成调试,微信的一整套机制,个人看来设计考虑的比较周全。虽然步骤流程有些复杂,但很有逻辑性安全性也考虑的比较周全,流程图很清晰,便于理解。
所以断断续续的看过一些文档,示例,有了一些初步的认识,看到各种key,id,还有满满一页的流程图,感觉好难。
又看到网上普遍反映,微信略微复杂一些,支付宝非常简单。看到这些,打消了心中的一些忐忑,开整。
先难后易,先弄微信:
提交一堆审核资料然后等。结果还算顺利,很快通过了验证。
先从DEMO入手。
1,提供应用id、商户id、支付金额等要素通过支付宝的统一下单接口获取一个prepay_id,如下。
List<NameValuePair> packageParams = new LinkedList<NameValuePair>(); packageParams.add(new BasicNameValuePair("appid", Constants.APP_ID)); packageParams.add(new BasicNameValuePair("body", "weixin")); packageParams.add(new BasicNameValuePair("mch_id", Constants.MCH_ID)); packageParams.add(new BasicNameValuePair("nonce_str", nonceStr)); packageParams.add(new BasicNameValuePair("notify_url", "http://121.40.35.3/test")); packageParams.add(new BasicNameValuePair("out_trade_no", genOutTradNo())); packageParams.add(new BasicNameValuePair("spbill_create_ip", "127.0.0.1")); packageParams.add(new BasicNameValuePair("total_fee", "1")); packageParams.add(new BasicNameValuePair("trade_type", "APP")); String sign = genPackageSign(packageParams); packageParams.add(new BasicNameValuePair("sign", sign));
其实业务的逻辑很清晰。微信收到请求,即创建一条订单,用户后续的操作通过这个prepay_id与微信进行关联从而更新支付订单的状态。
2、通过第一步获取到的prepay_id,构建一个PayReq对象,PayReq须向以下字段赋值:
req.appId = appId; //应用id req.partnerId = mch_id; //商户id req.prepayId = prepayId; //上一步的结果返回的prepay_id req.packageValue = packages; //包名 固定 "Sign=WXPay" req.nonceStr = nonc_str; //随机字符串 req.timeStamp = timeStamp; //时间戳 req.sign = genAppSign(signParams);//通过参数列表生成签名,并赋值PayReq对象
</pre><p></p><pre>
签名通过如下以下方式获取
List<NameValuePair> signParams = new LinkedList<NameValuePair>(); signParams.add(new BasicNameValuePair("appid", req.appId)); signParams.add(new BasicNameValuePair("noncestr", req.nonceStr)); signParams.add(new BasicNameValuePair("package", req.packageValue)); signParams.add(new BasicNameValuePair("partnerid", req.partnerId)); signParams.add(new BasicNameValuePair("prepayid", req.prepayId)); signParams.add(new BasicNameValuePair("timestamp", req.timeStamp)); String sign = genAppSign(signParams);
3、通过IWXAPI的msgApi.sendReq(req) 方法发送支付请求。
4、在微信客户端的执行支付操作,支付的结果会通过WXPayEntryActivity页面进行回调。
需要注意的有:
1:步骤1中的商户id在https://pay.weixin.qq.com/index.php/account获取,登陆账号为商户平台账号,微信支付审核通过邮件中提供。格式为1291xxxx1@1291xxxx1
2:步骤1中的total_fee单位是分,不是元。
3:步骤4中,要保证回调类WXPayEntryActivity.java文件必须位于包名的wxapi目录下,否则会导致无法回调的情况。
4:平台注册应用时需要填入应用的包名,和一个应用签名。包名即我们项目的包名,应用签名不是我们通常理解的keystore,是针对打包后的apk应用的一个签名,签名工具在以下地址下载,安装到手机后,在手机上完成签名操作。
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=de0bb5ed2572189867ad6bec44db1be1a5e3e017&lang=zh_CN
以上是一整套付款的流程,为了方便也是微信把所有的业务放在了客户端去实现,这一点是很不合理很不安全的。结合微信官方的流程图,梳理下优化方案。
微信下单接口需要提供我们业务中的订单号,以及最终支付金额等。
所以例如构建prepay_id这些步骤,应该放到服务端去完成,客户端提供商品的id及购买数量。服务端维护订单表及状态,并且可以增加优惠返利规则,生成最终的实际付款金额。
流程的第15步开始,app支付成功后,微信服务会异步的向app后台发送请求通知商户支付结果
结果包含支付结果、订单金额、最终付款金额(微信可能也会有返利优惠)、优惠金额、支付时间等要素。详细结果见:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_7
此通知才能最终作为支付结果的依据,用于更改订单等状态信息。
同时,app服务端需要提供结果查询接口,供app端调用,app也只能以查询到的结果作为依据显示支付结果。不能以微信app的返回结果作为显示依据。
至此,微信接口算是完成调试,微信的一整套机制,个人看来设计考虑的比较周全。虽然步骤流程有些复杂,但很有逻辑性安全性也考虑的比较周全,流程图很清晰,便于理解。
相关文章推荐
- Android 仿微信雷达搜索好友
- Android笔记(六十九) 仿微信界面(一)
- C#写的仿照Windows资源管理器的小程序:File Explorer(含代码)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信开发之使用java获取签名signature(贴源码,附工程)
- 微信支付错误修改 WxPay.Api.php curl出错 错误码60 28
- 如何在自己程序跳转至微信,新浪,腾讯微博,QQ空间等
- 用SAE搭建一个微信公众号
- Android QQ,微信,新浪微博登录笔记
- iOS小程序-混合计算器
- 微信公众号开发之创建自定义菜单
- 微信公众号开发之接入
- sharesdk微信分享
- 微信分享接口
- Ionic微信开发之环境配置
- 类似微信红包随机分配js方法
- .net微信授权登录整理
- Nagios全方位接入告警-微信/电话/短信都支持