收藏
回答

支付签名(pay_sig)校验失败,发起扣减代币,的想问下这个paySig是用第一种还是第二种?

Map<String, Object> params = new LinkedHashMap<>();
params.put("openid", vo.getOpenId());
params.put("amount", vo.getPayPrice());
params.put("payitem", vo.getProductId());
params.put("order_id", vo.getPayNo());
params.put("env", weixinpayProperties.getEnv());

String sigDataStr = JsonUtils.objToString(params);

// 第一种
String paySig =
    hmacSha256Hex(weixinpayProperties.getAppKey(), "requestVirtualPayment&" + sigDataStr);
// 第二种
String paySig = calcPaySig("/xpay/currency_pay", sigDataStr, weixinpayProperties.getAppKey());

private String calcPaySig(String uri, String postBody, String appKey) {
  return hmacSha256Hex(appKey, uri + "&" + postBody);
}

private String hmacSha256Hex(String key, String data) {
  try {
    Mac mac = Mac.getInstance("HmacSHA256");

    mac.init(new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
    byte[] bytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
    StringBuilder sb = new StringBuilder(bytes.length * 2);
    for (byte b : bytes) {
      sb.append(String.format("%02x", b & 0xff));
    }
    return sb.toString();
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}

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

2 个回答

登录 后发表内容