您的位置:首页 > 移动开发 > 微信开发

Android 支付宝微信支付集成备忘及吐槽(微信)

2015-12-30 08:56 696 查看
最近公司的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的返回结果作为显示依据。

至此,微信接口算是完成调试,微信的一整套机制,个人看来设计考虑的比较周全。虽然步骤流程有些复杂,但很有逻辑性安全性也考虑的比较周全,流程图很清晰,便于理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: