前言
目前移动端支付比较常用的就是支付宝,微信,银联了,其实集成支付对于前端来说还是比较简单的,于是简单的做下笔记.
别人的总结,收藏一下:
步骤
- 微信
步骤1:
初始化微信支付api对象
//第二个参数为app_id
IWXAPI api = WXAPIFactory.createWXAPI(this, "wxb4ba3c02aa476ea1");
步骤2:
下订单,提交商品参数到服务器,这时请求成功后台会返回一个唯一的订单号.
步骤3:
通过订单号请求服务器,这时请求成功后台会返回一个支付串码
步骤4:
调用微信支付SDK,传入“支付串码”
/**调用微信支付*/
public void sendPayRequest() {
PayReq req = new PayReq();
//支付串码
req.appId = Constants.APP_ID;
req.partnerId = wechatPayInfo.getPartnerId();//合作者id
req.prepayId = wechatPayInfo.getPrepayId()+"";//微信支付核心参数:预支付订单号
req.nonceStr = wechatPayInfo.getNonceStr();
req.timeStamp = wechatPayInfo.getTimestamp();
req.packageValue = wechatPayInfo.getPackageValue();
req.sign = wechatPayInfo.getSign();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
//3.调用微信支付sdk支付方法
api.sendReq(req);
}
步骤5:
处理支付结果回调
微信支付异常:
问题: 微信支付第一次支付成功,第二次开始都是失败,返回-1 ,需要清除微信数据,重新登录后,还是只能支付一次成功,后面支付都是返回-1.
百度了一轮,最终答案都是微信开发者平台的appId,包名或者签名错了.
请参考:
https://blog.csdn.net/nnmmbb/article/details/50533138
最终还是没解决,原来是后台返回的appId错了,他返回的是公众号的appId,所以只能调起一次,其实后台返回的appid和我们微信开发者平台的appid是一样的.
解决思路:
iOS不需要验证签名合法性,就是说他们appid不需要绑定boundID,Android需要绑定包名签名。也就是说如果后台返回的appid不对iOS也可以唤起。
官网下载的demo,Android也只能唤起一次,而iOS可以一直唤起。
如果你检查你的签名包名配置什么的都是对的,那百分之99是后台返回的appid有问题。不要因为iOS可以唤起就认为后台没问题。
因为客户端不够安全,所以appsercret等要放在后台,客户端做的事情非常少,只需要1. 用appid注册wxapi 2. 从后台获取支付信息 3. 调用sdk发起支付 4. 接收支付结果 5. 请求自己的业务服务器是否支付成功
最后感谢各位大佬,