收藏
回答

微信支付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);



回答关注问题邀请回答
收藏

1 个回答

  • s.
    s.
    2023-05-05

    楼主,解决了吗

    2023-05-05
    有用
    回复 1
    • GrapefruitCocktail
      GrapefruitCocktail
      03-28
      解决了吗,我summary也中文乱码
      03-28
      回复
登录 后发表内容