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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、背景介绍 作为一名Android开发,从最初的跌跌撞撞到现在小有所悟,这其中经历过的辛酸苦辣也是一种痛并快乐着...
    freecats08阅读 4,868评论 7 54
  • 准备工作: 需要公司的营业执照,税务信息,等老板的身份证信息等,我记得,用这些材料,去支付宝注册一个商家账户(审核...
    Hevin_Chen阅读 6,822评论 0 9
  • 引言 秋高气爽,天气转凉,正是学习工作做的好时候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是个phper最近在写微信支付...
    恩就是这个名阅读 8,004评论 2 15
  • 今日推荐 经常阅读博客是个好习惯推荐鸿洋CSDN的博客 微信支付相关文章 详细介绍Android开发集成微信支付(...
    MrQ_Android阅读 6,202评论 9 52
  • 文/阳光雨露 又是这样的时刻 我的心为何总也起伏不定 我在想什么 想你带给我的朦胧诗意 我在寻觅谁 想要搜索你沉醉...
    严红阅读 599评论 3 5