微信v3支付,怎么就这么烦, 开发对接了3次,每次问题都不一样
前2个月帮客户开发一个小程序, 对接微信支付, 用的v3, 发起支付,回调都成功,没有任何问题
上个月 帮客户开发一个小程序, 对接微信支付, 用的v3, 发起支付成功, 一直收不到回调消息, 后来改成定时器去查询订单来修改状态,这个就勉强用,
这2天帮客户开发一个小程序, 对接微信支付, 用的v3, 发起支付成功,收到了 回调消息, 但是对消息进行验签,一直不通过, 折腾2天现在都没解决,
一模一样的代码, 申请证书,设置公钥pub_key.pem, 设置v3秘钥, 为啥遇到到的问题 总是让人 头疼
这个支付号1320509601 麻烦帮我查询一下原因, 实在找不到问题, 证书设置很多遍了, v3也设置很多次了, 总是提示验签不通过
@Override
public PayRecord notify(HttpServletRequest request) throws Exception{
//获取报文
String reqBody = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);
log.error("wx pay notify 获取报文: {}", reqBody);
if (StringUtils.isEmpty(reqBody)) {
log.error("wx pay notify 获取报文 为空");
return null;
}
//随机串
String nonceStr = request.getHeader("Wechatpay-Nonce");
//log.info("wx pay notify nonceStr................."+nonceStr);
//微信传递过来的签名
String signature = request.getHeader("Wechatpay-Signature");
//log.info("wx pay notify signature................."+signature);
//证书序列号(微信平台), 验证 方法2 就用这个
String serialNo = request.getHeader("Wechatpay-Serial");
//log.info("wx pay notify serialNo................."+serialNo);
//时间戳
String timestamp = request.getHeader("Wechatpay-Timestamp");
//log.info("wx pay notify timestamp................."+timestamp);
//构造签名串 应答时间戳\n,应答随机串\n,应答报文主体\n
String signStr = String.format("%s\n%s\n%s\n", timestamp, nonceStr, reqBody);
log.info("wx pay notify signStr................."+signStr);
boolean flag = WechatPayUtils.verifyWithCertificate2(signStr.getBytes("utf-8"), signature);
log.info("wx pay notify 验签结果................."+flag);
if (!flag) {
log.error("wx pay notify 验签结果 不通过");
return null;
}
public static boolean verifyWithCertificate2(byte[] message, String signature) throws Exception {
// 1. 加载微信平台公钥(非商户证书!)
String publicKeyPem = IOUtils.toString(
new ClassPathResource("classpath:/wxpay1715631399/pub_key.pem").getInputStream(), //微信公钥 路径
StandardCharsets.UTF_8
);
// 2. 提取公钥内容
String publicKeyStr = publicKeyPem
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll("\\s+", "");
// 3. 构造PublicKey对象
byte[] keyBytes = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);
// 4. 验证签名
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initVerify(publicKey);
sig.update(message);
return sig.verify(Base64.getDecoder().decode(signature));
}

你好 经查询1320509601 这个商户号目前还有平台证书,根据你的描述不同商户号出现的验签查询,回调验签失败可能是证书不对应导致的。
建议先确认下回调请求头中的Wechatpay-Serial参数是否和使用的验证证书/公钥一致https://pay.weixin.qq.com/doc/v3/partner/4012925289
如果一致的话建议把验签内容和签名内容打印出对照验签工具https://pay.weixin.qq.com/doc/v3/partner/4012365880验证下签名是否正确
若仍未解决辛苦私信提供相关参数私信我(https://developers.weixin.qq.com/community/personal/oCJUsw9CJvLXfoIsy8cDn__JOfUc)协助排查
可以先从这里验证一下https://tools.aifuwu.net/wechat-pay-tools/apiv3-signature-validator