收藏
回答

微信服务商模式app支付对接 , 二次验签返回app后 提示验签失败!求大佬解答

下面这段代码是实际支付代码 appid是服务商appid ,如果在二次加签的时候依旧使用服务商appid和mach_id那么可以唤起微信并且支付成功(app端的
appId使用服务商appid),但是app端的appId换成子商户的appId , 二次加签使用的appId换成子商户id后唤起微信一直提示验签失败 ???有没有大佬遇
到过
Map<String, String> returnMap = new HashMap<>();
//支付参数
WXConfigUtil config = new WXConfigUtil();
WxPay wxpay = new WxPay(config);
//请求参数封装
Map<String, String> data = new HashMap<>();
data.put("appid", config.getAppID());
//附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
data.put("attach", "淘有道商城");
data.put("body", "taoyoudao");
data.put("mch_id", config.getMchID());
data.put("nonce_str", WXPayUtil.generateNonceStr());
//异步通知地址(请注意必须是外网)
data.put("notify_url", wxCfg.getAppNotifyUrl());
data.put("out_trade_no", orderId);
//自己的服务器IP地址
data.put("spbill_create_ip", wxCfg.getIp());
data.put("total_fee", String.valueOf(1));
data.put("sub_appid", config.getSubAppID());
data.put("sub_mch_id", config.getSubMchID());
//交易类型
data.put("trade_type", wxCfg.getAppType());
//签名
String s = WXPayUtil.generateSignature(data, config.getKey());
//签名
data.put("sign", s);
try {
    //使用官方API请求预付订单
    //Map<String, String> response = wxpay.unifiedOrder(data);
    Map<String, String> response = wxpay.unifiedOrder(data, 8000, 10000);
    System.out.println(response);
    //获取返回码
    String returnCode = response.get("return_code");
    //若返回码为SUCCESS,则会返回一个result_code,再对该result_code进行判断
    if (returnCode.equals("SUCCESS")) {
        //主要返回以下5个参数(必须按照顺序,否则APP报错:-1)
        String resultCode = response.get("result_code");
        returnMap.put("appid", response.get("sub_appid"));
        returnMap.put("noncestr", response.get("nonce_str"));
        if ("SUCCESS".equals(resultCode)) {
            //resultCode 为SUCCESS,才会返回prepay_id和trade_type
            returnMap.put("package", "Sign=WXPay");
            returnMap.put("partnerid", response.get("sub_mch_id"));
            returnMap.put("prepayid", response.get("prepay_id"));
            //单位为秒,10位的
            returnMap.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
            // 二次签名
            String sign = WXPayUtil.generateSignature(returnMap, config.getKey());
            //签名
            returnMap.put("sign", sign);
            //获取预支付交易回话标志
            returnMap.put("trade_type", response.get("trade_type"));
            return returnMap;
        } else {
            //此时返回没有预付订单的数据
            return returnMap;
        }
    } else {
        return returnMap;
    }
} catch (Exception e) {
    System.out.println(e);
    //系统等其他错误的时候
}
return returnMap;

回答关注问题邀请回答
收藏

1 个回答

  • 微信支付技术助手8
    微信支付技术助手8
    2020-07-07

    请按照以下几点进行排查:

    1、使用签名检查工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误

    2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)

    3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)

    4、确认参数的大小写,参数名与接口文档一致

    5、签名原串的参数值使用原始值,不需要encode

    6、接口需要使用UTF-8编码

    2020-07-07
    有用
    回复
登录 后发表内容
问题标签