欢迎访问个人博客www.kohmax.com
不得不说微信支付的集成是个相当坑爹的事,相比之下,阿里的实在太好用了,但因为工作需要不得不集成WechatPay,但又不想借助第三方平台如Ping++之类的,那也只好硬着头皮上了
微信支付开发文档
这个容易,根据官方的开发文档一步步操作即可--->微信支付开发文档
遇到的问题
接下来才是最坑爹的事了,如下图所示。
几乎百分之五十的开发者都会遇到这样的情况,是的,跳转成功了,但支付界面只有一个“确定”按钮是什么鬼。而根据开发文档操作,只要有一个疏漏,就会导致这个结果,下面,我就将一些常见的疏漏整理一番,以供参考
正文
1. appid一定不能错
这个问题一般是粗心所致,但只要appid填写错误(有多处用到appid,如注册微信支付功能、提交订单、查询订单等),便会导致支付后无法跳转回app,app里的支付回调无法正确执行等,所以一旦遇到问题,不妨先检查一下各处的appid是否正确。
2. 时间戳格式(int)
这个坑点十分容易忽视,一般来讲,不管是服务器传给你的,或是自己生成的时间戳,都是string类型,那么就需要进行转换,在值后加上intValue
即可,官方Demo是个很好的参考实例,但往往会忽视一些细节。
3. sign签名
值得注意的是签名有两处,第一处是“统一下单”时由服务器生成的签名,这个在客户端用不上,客户端需要用到的是“提交订单”的sign,注意,第二个sign,能且只能由客户端生成!虽然不明原因,但只要用到服务端传过来的sign就会毫无悬念的出现只有一个确定按钮的错误界面,所以这个签名一定得客户端自己生成,生成方法十分简单,官方Demo里也有提供,为了大家方便我在这里也附上代码。
// MARK: -微信支付
func goWechat(response:OnCreateOrder) {
KohUserDefaultManager.SetLocalDataString(self.orderNo, key: KEY_PAY_ORDERNO)
let request = PayReq()
request.partnerId = response.partnerid
request.prepayId = response.prepayid
request.package = response.package
if request.prepayId != nil {
//获取到prepayid后进行第二次签名
//设置支付参数
let time_stamp = WXUtil.nowTime()
let nonce_str = WXUtil.md5(time_stamp)
//重新按提交格式组包,微信客户端暂只支持package=Sign=WXPay格式,须考虑升级后支持携带package具体参数的情况
//package = [NSString stringWithFormat:@"Sign=%@",package];
let package = "Sign=WXPay"
//第二次签名参数列表
let signParams = NSMutableDictionary()
signParams.setObject(response.appid, forKey: "appid")
signParams.setObject(nonce_str, forKey: "noncestr")
signParams.setObject(package, forKey: "package")
signParams.setObject(response.partnerid, forKey: "partnerid")
signParams.setObject(response.prepayid, forKey: "prepayid")
signParams.setObject(time_stamp, forKey: "timestamp")
//生成签名
let sign = WXUtil.createMd5Sign(signParams)
//添加签名
signParams.setObject(sign, forKey: "sign")
request.nonceStr = nonce_str
request.timeStamp = UInt32(time_stamp)!
request.sign = signParams["sign"] as? String
print(signParams)
}
let r = WXApi.sendReq(request)
if r == true {
KohDemoLog.instance().saveDemoLogInfo("提交微信支付请求成功", withDetail: nil)
}
}