这次项目需要接入微信支付,看了下现在都是v3的版本了,但是微信支付的文档真的是一言难尽,所以把自己接入的微信支付回调给记录下来,也给需要的小伙伴参考一下
// 首先初始化平台证书的配置 后续会用到
public static void configinit(String merchantId, String privateKey, String merchantSerialNumber, String apiV3key)
{
// 使用自动更新平台证书的RSA配置
// 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错
config =
new RSAAutoCertificateConfig.Builder()
.merchantId(merchantId) // 商户号
//.privateKeyFromPath(privateKeyPath) // 商户API私钥路径
.privateKey(privateKey)
.merchantSerialNumber(merchantSerialNumber) // 商户证书序列号
.apiV3Key(apiV3key) // 商户APIV3密钥
.build();
}
然后就是接收回调部分了
public Map<String, String> wxCallback(HttpServletRequest request) {
logger.info("=============微信支付回调========");
// 初始化map,给微信响应用
Map<String, String> map = new HashMap<>(2);
try {
// 这一块是我的微信支付相关的参数
BloPayWay payWay = redisService.getCacheObject(UserCorrelationConstants.PAY_WAY_KEY);
// 获取设置 这里就是上面初始化的设置
Config config = WxPayUtil.getConfig(payWay.getPartner(), payWay.getPrivateKey(), payWay.getOtherParameter(), payWay.getApiPayKey());
// 从请求头中获取信息
// 这是微信回调固定在请求头里的参数,验签要用
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
String signature = request.getHeader("Wechatpay-Signature");
String singType = request.getHeader("Wechatpay-Signature-Type");
String number = request.getHeader("Wechatpay-Serial");
String body = getRequestBody(request);
// 初始化解析器 NotificationParser
// 这个解析器是微信支付SDK里的,他会帮我们做验签等一系列的事,不需要我们去做
NotificationParser parser = new NotificationParser((NotificationConfig) config);
RequestParam requestParam = new RequestParam.Builder().nonce(nonce).signature(signature).signType(singType)
.timestamp(timestamp).serialNumber(number).body(body).build();
// 不同的API的回调有不同的参数,这里的Transaction只是微信支付接口的回调参数对象
//.parse()方法中会做验签及resource对象的解密,Transaction对象中就是解密后的参数
Transaction decryptObject = parser.parse(requestParam, Transaction.class);
if (decryptObject != null) {
// 支付成功
logger.info("=============微信支付回调========trade_status:"+decryptObject.getTradeState());
if (Transaction.TradeStateEnum.SUCCESS.equals(decryptObject.getTradeState())){
// 处理支付成功逻辑
logger.info("进入try catch");
try {
// 下面就是做支付成功的逻辑
//响应微信
map.put("code", "SUCCESS");
map.put("message", "成功");
} catch (Exception e) {
logger.error("微信回调处理失败",e);
e.printStackTrace();
}
} else {
logger.info("莫名其妙");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
// 获取请求头里的数据
private String getRequestBody(HttpServletRequest request) {
StringBuffer sb = new StringBuffer();
try (ServletInputStream inputStream = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
) {
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
logger.error("读取数据流异常:{}", e);
}
return sb.toString();
}
大概就是这样了,希望能帮到有需要的人