收藏
回答

微信支付无法调起

下单成功

{nonce_str=OHxfotZZLV7CGJye, appid=wx017084a6b6666c9c, sign=C7D33EC264D9C495AD34CD4FA5B4F6C92E3BB6546836656DD9135521B99AC4E8, trade_type=APP, return_msg=OK, result_code=SUCCESS, mch_id=1521140851, return_code=SUCCESS, prepay_id=wx27142003836680930b09d4844018498804, timestamp=1551248403}


,但是微信的支付无法调起

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<xml>

<packagevalue>Sign=WXPay</packagevalue>

<appid>wx017084a6b6666c9c</appid>

<sign>8D438B5344C3857A336A93C9CCB45328</sign>

<partnerid>1521140851</partnerid>

<prepayid>wx27142003836680930b09d4844018498804</prepayid>

<noncestr>OHxfotZZLV7CGJye</noncestr>

<timestamp>1551248403</timestamp>

</xml>

返回errorCode -1

我用的环境不是沙箱环境,并且使用官方的签名测试工具测试签名通过,并且包名的签名我也使用官方给的工具查出来填上的。。

好心的人们啊,帮我看看这是怎么回事啊

最后一次编辑于  02-27
回答关注问题邀请回答
收藏

1 个回答

  • 微信支付技术助手
    微信支付技术助手
    02-27

    您好,按照以下几点来检查,

    1)你签名中的key,也就是你的API密钥key,这个参数要你们自己到商户平台设置的,设置的规则是32位数字与字母大小写的组合的随机数,不能设置成签名串和参数appsecret,你们有正确设置吗???

    2)检查开放平台对应的包名与签名是否有正确设置。

    https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 这里有详细的设置说明。

    3)调用支付使用的noncestr这个参数必须和商家服务器调用统一下单接口返回的那个noncestr一致

    4)从预支付订单返回的数据 ,没有重新签名,也会引起这个问题。

    5)重新安装微信后试试。


    02-27
    赞同
    回复 4
    • 排长
      排长
      02-27

      你说的这些我都弄了一遍了还是不行报错是-1,我现在就是想知道到底是哪错了

      关键是不知道哪儿错了这么瞎改下去很浪费时间,你们能帮忙看看你们的后台说是哪错了吗


      02-27
      回复
    • 微信支付技术助手
      微信支付技术助手
      02-28回复排长

      您好,后台查不到您的具体错误信息,目前从报错信息来看,属于小细节问题,请仔细按照我给您发的仔细排查,请参考:首先应该检查app打包时使用的签名文件的MD5的值是否一样,如果这个MD5的值跟微信开放平台填写的值是一个的话就应该跟服务器交流核对noncestr的值是否一至,我此次出现的问题是直接把服务器发过来的sign发送给微信了,根据第四条应该重新进行签名,签名方式参考代码如下:


      支付拉起代码:参数从服务器获取


      public static void sendPayMessage(final String prepayId, final String nonceStr, final String timeStamp, final String sign){

          if (!isSupportPay() || !Fanrncho_api.isWXAppInstalled()){

              showToast(instance, WX_INFO);

              return;

          }

          PayReq req = new PayReq();

          req.appId = "xxxxxxxxxxxxxxxxxxx";//开放平台获取的appid

          req.partnerId     = "xxxxxxxxx";//此处为商户的商户号  此处也要核对  在微信商户后台获取

          req.prepayId      = prepayId;

          req.nonceStr      = nonceStr;

          req.timeStamp     = timeStamp;

          req.packageValue   = "Sign=WXPay";

          req.sign = sign;

          //开始将6个字段进行数据封装

          LinkedList<NameValuePair> signParams = new LinkedList<NameValuePair>();

          signParams.add(new BasicNameValuePair("appid", req.appId));

          signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));

          signParams.add(new BasicNameValuePair("package", req.packageValue));

          signParams.add(new BasicNameValuePair("partnerid", req.partnerId));

          signParams.add(new BasicNameValuePair("prepayid", req.prepayId));//这个字段服务器签名的时候没用到,客户端签名的时候记得加上

          signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));


          req.sign = genAppSign(signParams);


          // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信

          Fanrncho_api = WXAPIFactory.createWXAPI(instance, "xxxxxxxx");

          Fanrncho_api.registerApp(Fanrncho_WX_APP_ID);

          Fanrncho_api.sendReq(req);

      }

      签名生成代码:

      /**

       * 生成签名

       */

      private static String genAppSign(LinkedList<NameValuePair> list) {

          StringBuilder sb = new StringBuilder();

          for (int i = 0; i < list.size(); i++) {

              sb.append(list.get(i).getName());

              sb.append('=');

              sb.append(list.get(i).getValue());

              sb.append('&');

          }

          sb.append("key=");

          sb.append(WX_MCH_KEY);//此处为商户的appkey  此处也要核对  在微信商户后台获取

          String appSign = getMessageDigest(sb.toString()).toUpperCase();

          return appSign;

      }


      public final static String getMessageDigest(String buffer) {

          String result = null;

          try

          {

              MessageDigest md = MessageDigest.getInstance("MD5");

              md.update(buffer.getBytes());

              byte b[] = md.digest();

              int i;

              StringBuffer buf = new StringBuffer("");

              for (int offset = 0; offset < b.length; offset++)

              {

                  i = b[offset];

                  if (i < 0)

                      i += 256;

                  if (i < 16)

                      buf.append("0");

                  buf.append(Integer.toHexString(i));

              }

              result = buf.toString();

          } catch (NoSuchAlgorithmException e)

          {

              e.printStackTrace();

          }

          return result;

      }


      再以上代码中appid、partnerid、WX_MCH_KEY要进行核对是否一样如果不一样也会导致返回-1,该值的获取方式写在该值的后边了,注意签名方式要和获取prepayid的签名方式相同,就是说服务器的怎么签名客户端也要怎么签名,只不过客户端添加了prepayid这个字段,如果服务器给的签名是添加了prepayid这个字段的签名则可以用服务器给的签名,否则一定要自己重新进行签名。支付的回调就按微信文档中的创建一个wxapi包放在包名下,回调的文件直接用demo中的WXPayEntryActivity即可,名字不可更改。实现onResp方法即可。


      02-28
      回复
    • 肖
      03-04

      我这边APP接入微信支付也是沙盒环境无法拉起客户端,但是生产环境又可以拉起客户端并支付成功,不知为何?按理说沙盒环境没有测试过,生产环境应该是不能支付的。

      03-04
      回复
    • 微信支付技术助手
      微信支付技术助手
      03-04回复

      您好,有些功能只能在生产环境才可以测试。而有些可能是您的沙盒配置出现失误导致的。

      03-04
      回复