问题描述:
统一下单可以正常得到prepay_id,调用wx:requestPayment 提示支付验证签名失败。
小程序端代码:
wx.requestPayment({
timeStamp: pay_p['timeStamp'],
nonceStr: pay_p['nonceStr'],
package: pay_p['package'],
signType: pay_p['signType'],
paySign: pay_p['paySign'],
success (res) {
console.log(res)
},
fail (res) {
console.log(res)
}
})
pay_p是后端Java生成的,java代码:
@RequestMapping("/payBefore")
public Map<String,String> payBefore (@RequestBody Map<String,String> requestData) throws Exception
{
logger.info("WxController payBefore requestData={}",gson.toJson(requestData));
Map<String,String> result = new HashMap<>();
Integer time = MyUtil.getCurrentTimestamp();
result.put("timeStamp",time.toString());
result.put("nonceStr",WXPayUtil.generateNonceStr());
result.put("package",requestData.get("package"));
result.put("signType",WXPayConstants.SignType.MD5.toString());
result.put("appId",DefaultConsts.WX_APPID);
WxConfig config = new WxConfig();
String sign = WXPayUtil.generateSignature(result, config.getKey(), WXPayConstants.SignType.MD5);
result.put("paySign",sign);
logger.info("WxController payBefore result={}",gson.toJson(result));
return result;
}
WXPayUtil、WXPayConstantssh jdk中代码
已经换过key了,还是没通过。
可以解决吗哥,我遇到和你同样的问题
请按照以下几点进行排查:
1、使用签名检查工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误
2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)
3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)
4、确认参数的大小写,参数名与接口文档一致
5、签名原串的参数值使用原始值,不需要encode
6、接口需要使用UTF-8编码
7、调用“小程序支付API”中appid没有按照文档要求的格式
8、调用“小程序支付API”中signType类型与“统一下单接口”不一致
2.密钥正确,调用统一下单可以成功;
3.请求参数与生成参数一致;
4.大小写、名称一致;
5.签名用的sdk的方法,没有对原始数据做处理
6.ide是utf-8,用的sdk
7.appId在后端参与了生成签名,中间“I”大写
8.不明白,后端我用的sighType,统一下单用的sign_type,需要都用sign_type吗?
nonceStr: "ucEcxj3nUWPVlVWGaIxABSlKIYRoBdkc"
package: "prepay_id=wx27181727782768b8e3b7085b56d5490000"
paySign: "C3DC9AB3CFB6BF77DD08471CD20DE999"
signType: "MD5"
timeStamp: "1598523448"
与Java对比:
Long timeStamp = System.currentTimeMillis() / 1000;
r.put("timeStamp",timeStamp+ "");
String nonceStr = WXPayUtil.generateNonceStr();
r.put("nonceStr",nonceStr);
String prepayid = result.get("prepay_id");
r.put("package","prepay_id="+prepayid);
r.put("signType","MD5");
r.put("appId",DefaultConsts.WX_APPID);
WxConfig config = new WxConfig();
String sign = WXPayUtil.generateSignature(r,config.getKey() );
System.out.println("生成的签名paySign : "+ sign);
r.put("paySign",sign);
文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=7_7&index=5
要求:签名方式为signType,值为MD5。
统一接口文档要求:签名方式为sign_type,值为MD5。
你意思是变量名也保持一致吗?
我开发的流程是这个样子的:
1.调用统一支付,成功之后,将:
timeStamp、//重新生成
nonceStr、//重新生成
package、//取统一支付的prepay_id,组装
signType、//都为MD5
appId、
paySign
2.小程序收到响应之后,将1返回的参数传给requestPayment,拉起支付
3.微信扫码,支付验证失败。
请问:我上述步骤有问题吗?
ps:key重置了。