支付和退款使用相同的代码获取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);
楼主,解决了吗