• uniapp微信APP支付踩坑指南:报错errMsg: "requestPayment:fail errors"


      起因:uni-app微信app支付一直报错“errMsg“: “requestPayment:fail errors“,但是坑的是没有具体的原因,微信APP支付官方文档也很坑。我们看看有多坑:

      返回结果-1,包含所有情况,至于什么情况,您自己猜去吧,唉~~

      网上查了很多别人也是很多遇到这个问题,但是所说解决方案都无用,当然我们记录一下,也未尝不可,有可能也能解决别人的问题。下面就一步一步踩坑指南吧。

    一、“errMsg”: “requestPayment:fail errors”

      uni-app 报 “errMsg”: “requestPayment:fail errors”,调不起微信,返回 -1 大部分原因出在包名,签名,和参数部分为空。

    var orderInfo = {
      "appid":res.map.appid,
      "noncestr":res.map.nonceStr,
      "package":res.map.package,
      "partnerid":res.map.partnerid,
      "prepayid":res.map.prepayid,
      "timestamp":res.map.timestamp,
      "sign":res.map.sign
    }
    uni.requestPayment({
        provider: 'wxpay',
        orderInfo: orderInfo, //微信、支付宝订单数据
        success: function (res) {
        console.log("微信调起支付成功")
            console.log(res); 
        },
        fail: function (err) {
        console.log("微信调起支付失败")
            console.log(err);
        }
    });

    1、为空判断

      首先,你必须确定appid,noncestr,package,partnerid,prepayid,timestamp,sign 都不为空或者不为undefind。

      这个一般没啥问题,可以打印一下,确保每个参数都不为空(先不考虑其正确性)。

    2、参数类型(orderInfo)

      如果是微信支付,上传参数需要是 Object 对象,而不能是 String 类型。不然可能只会出现一个加载框,就是不跳转到支付页面。

      App端,支付宝支付 orderInfo 为 String 类型。

      App端,微信支付 orderInfo 为 Object 类型。

    3、参数名全为小写。

      这点也是微信支付的一个大坑:很多参数都不规范,一个简单的支付有好几种命名规范,比如商户号有的要传mch_id,有的要传mchId,而app支付这个是partnerid。你就说坑不坑。

      appid,noncestr,package,partnerid,prepayid,timestamp,sign 这些参数都为小写,注意大小写。最后直接从微信文档里复制,省得又掉坑:

      调起支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

      然后我们传的这7个字段必须是小写,最好直接从文档里复制吧。

      最开始后端给的是驼峰,所以有问题,但是问题也不全在这,换了小写之后还是有问题,那么继续:

    4、二次签名问题

      所以我怀疑是不是签名有问题,用微信的签名工具对一下就可以发现后端返回的签名对不对,结果发现不对,问题在哪呢?

      还是之前说的二次签名的商户号字段是partnerid,而不是mch_id,由于统一下单的商户号字段是mch_id,所以二次签名的时候还是用的这个,那就不对了,更换字段之后签名正常了。但是还是唤不起app支付。

    5、timestamp

      timestap就要好好看下接口规则-参数规范,timestamp单位是秒,而不是毫秒,所以需要除以1000

    6、还有查到一些其他的操作,不确定有无用

    下面这个是微信技术助手回复:

    3)调用支付使用的noncestr这个参数必须和商家服务器调用统一下单接口返回的那个noncestr一致
    4)从预支付订单返回的数据 ,没有重新签名,也会引起这个问题。
    5)重新安装微信后试试。

      上面这2个也都无用。

    7、考虑商户号绑定、app支付开通等一类的问题

      这些是微信APP支付的前提,先去微信开放平台申请移动app应用,这里会要求填写app的包名和签名(这个地方是之前埋下的一个坑,因为之前刚开始就随便起了个demo的app填了,后面需要改),等app审核通过之后,就会获取到appId和appSecret,然后需要申请开通微信支付,然后需要绑定商户号,这些都没有问题。

      相当于就是商户号绑定,app支付开通等问题。这些对于我这个问题来说也没有问题。但是还是唤不起支付。

    8、app包名和签名

      在网上看到说

    刚刚碰到这个问题,看了微信官方文档,明白了,掉了一个步骤,需要测试机上生成应用签名。 生成签名提交给微信公众平台,请等待几分钟,再次调用就成功了

      然后我拿的是md5的签名,大写且有冒号,据说是要去掉冒号,然后全部改成小写。改了还是没有用。

    9、不能使用标准基座,得使用自定义基座以及相关支付权限开通,那么就再试吧

    (1)打包或使用自定义基座测试(很重要)。

      既是上面配置正确,也没办法调起支付,你需要打一个包测试,或者使用自定义基座测试(有打印信息)。

      自定义基座配置教程地址:https://ask.dcloud.net.cn/article/35115

     (2)权限和模块配置。

      一般选择后会自动添加相应支付权限,老版本可能需要自己选择。

      登录鉴权功能按需添加:这里的 appid 和 appsecret 在微信开放平台获取。

    (3)清除微信缓存。

      个别时候,缓存也会造成支付失败,比如包名和签名之前测试过,后来又修改了等。

      这些都是对的,还是无用。

    二、添加微信分享确定疑惑

      以上那些做了都是对的,所以我怀疑问题必定出在app的包名以及签名上,但是无法确认。这时候看到一个博客说,只要微信分享能够成功,那么就能确定微信里app签名和包名是对的。

      那么我就来引入一下微信分享来看看对不对。

      微信分享按要求引入:share模块需勾选。

      具体怎么引入不多说,在标准基座是可以分享成功的,但是这样就别以为是对的了。

      注意:需要的是打自定义基座,那么打一个,然后再分享下,报错:“微信:包名不对,请检查包名是否与开放平台填写一致”。

      到这里基本可以确认包名是一个问题,也比较能确认就是这个包名的问题影响了,那么就来一步一步排查。

    三、最后解决坑

      包名和签名需要在微信开放平台配置,在app打包时,你需要为其提供正确的包名和签名。

      包名是在哪里配置,我们都知道在uni-app的manifest.json里配置

      但是忽略了及其重要的一点就是:打包和自定义基座的时候包名也需要同步修改(因为最早之前我没有修改,所以一直都是使用的默认的dclod的appid,真是大坑啊,相当于你在微信开放平台怎么改包名两边都是对不上的,唉)

      修改好之后再打个包,微信APP支付和微信分享就都正常了,不容易啊,踩了一天坑,终于解决了,給大家做个参考吧。(顺便吐槽一下微信社区和Dcloud社区的一些交流,非常多的人遇到了这样的问题,有的搞了几天问了好多问题,最后说解决了就消失了,但是又不说怎么解决了,唉,真是大坑,花点时间总结下自己的处理过程,给别人一个参考,也为生态做点贡献,是挺好的)

  • 相关阅读:
    php的错误处理机制
    php的自动加载函数spl_autoload_register和__autoload
    mysql日志配置
    01,易语言网页填表
    mac 的全文搜索
    react native 热更新
    码云的使用教程
    autolayout实现水平三等分
    mac命令行快捷键
    什么是延展性(Malleability,可鍛性)
  • 原文地址:https://www.cnblogs.com/goloving/p/14187798.html
Copyright © 2020-2023  润新知