集成微信支付时跳转到只有一个确定的页面--问题处理

欢迎访问个人博客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)
        }
        
    }

推荐阅读更多精彩内容