1. 发送给微信的参数xml, 下图中的商户key就是微信后台设置的appsecret
2. 复制到 微信支付接口签名校验工具, 本文适用如下图是检测通过的
如果跟我一样, 检测通过了, 但下单接口仍返回 "签名错误", 唯一的问题就是:
签名方法传的key用的是appsecret, 而正确的应该用支付总账户的api密钥,
// 从数据库获取微信支付配置(换成自己的配置来源即可)
WxPayConfig wxPayConfig1 = wxPayConfigMapper.selectById(wxId);
// payKey就是支付总账户的api密钥
String payKey = wxPayConfig1.getApiKey();
SortedMap<Object, Object> paramMap = new TreeMap<Object, Object>();
paramMap.put("appid", wxPayConfig.getAppId());//公众号ID
paramMap.put("mch_id", wxPayConfig.getMchId());//商户号
paramMap.put("nonce_str", RandomUtil.createRandomString(32));//32位随机字符串
paramMap.put("body", body);//商品描述
paramMap.put("out_trade_no", out_trade_no);//商户订单号
paramMap.put("total_fee", StringUtils.substringBefore(String.valueOf(total_fee.multiply(new BigDecimal(100))), "."));//设置交易金额 金额为分
paramMap.put("spbill_create_ip", ipInfoUtil.getIpAddr(request));// 发起请求的客户机IP
paramMap.put("notify_url", notifyUrl);//通知地址
paramMap.put("sign_type", "MD5");//通知地址
paramMap.put("trade_type", "JSAPI");//支付方式 小程序支付
paramMap.put("openid", openid);//微信用户在商户对应appid下的唯一标识,trade_type=JSAPI时(即JSAPI支付),此参数必传
paramMap.put("sign", SignUtil.createSign(paramMap, payKey));// 签名
图下的appsecret是校验工具用来验证签名的,而apikey是下单接口签名用的
apikey是对应微信支付平台的,而微信支付平台可以绑定小程序和app,小程序或app调用统一下单时,参数sign,创建签名时传入的apikey就是它,千万不要传appsecret,我就是因为这个原因导致签名错误。