楼主,解决了吗
微信支付JSAPI支付V3 退款回调接口 获取body中文参数乱码支付和退款使用相同的代码获取body参数,支付回调中文正常返回,验签成功。 退款回调接口中的body中文乱码, 验签失败。 获取body参数代码如下: public static String getRequestBody(HttpServletRequest request) throws IOException { ServletInputStream stream = null; BufferedReader reader = null; StringBuffer sb = new StringBuffer(); try { stream = request.getInputStream(); // 获取响应 reader = new BufferedReader(new InputStreamReader(stream)); String line; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { throw new IOException("读取返回支付接口数据流出现异常!"); } finally { reader.close(); } return sb.toString(); } 获取body返回打印结果如下: [图片] 验签代码如下: request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); String Timestamp = request.getHeader("Wechatpay-Timestamp"); String Nonce = request.getHeader("Wechatpay-Nonce"); String Signature = request.getHeader("Wechatpay-Signature"); String Serial = request.getHeader("Wechatpay-Serial"); System.err.println("Wechatpay-Timestamp:" + Timestamp); System.err.println("Wechatpay-Nonce:" + Nonce); System.err.println("Wechatpay-Signature:" + Signature); System.err.println("Wechatpay-Serial:" + Serial); // 加载商户私钥(privateKey:私钥字符串) merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8"))); // 获取证书管理器实例 certificatesManager = CertificatesManager.getInstance(); // 向证书管理器增加需要自动更新平台证书的商户信息 certificatesManager.putMerchant(mchId, new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)), apiV3Key.getBytes("UTF-8")); // 从证书管理器中获取verifier verifier = certificatesManager.getVerifier(mchId); // 请求体信息 String body = getRequestBody(request); System.err.println("body:" + body); String VerifySignature = Stream.of(Timestamp, Nonce, body).collect(Collectors.joining("\n", "", "\n")); boolean verify = verifier.verify(Serial, VerifySignature.getBytes(), Signature); System.err.println("验签结果=" + verify);
2023-05-05