/**
* 微信支付回调函数
*
* @param body
* @param request
* @return 所有逻辑完成, 返回true, 完成支付, 并将订单状态改变
*/
@Override
@Transactional
public boolean wxpayNotify(Map body, HttpServletRequest request) {
try {
//从消息头获取微信支付回调的获取签名信息
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
//从消息头获取应答签名
String sign = request.getHeader("Wechatpay-Signature");
//从消息头获取平台对应的证书
String serialNo = request.getHeader("Wechatpay-Serial");
//解析报文体
ObjectMapper objectMapper = new ObjectMapper();
String data = objectMapper.writeValueAsString(body);
String message = timestamp + "\n" + nonce + "\n" + data + "\n";
//判断微信平台证书公钥与初始化时取得的是否相同
if (!WxpayStaticParameter.certificateMap.containsKey(serialNo))
WxpayStaticParameter.certificateMap = WechatPayUtils.refreshCertificate();
//获取微信平台证书公钥
X509Certificate x509Certificate = WxpayStaticParameter.certificateMap.get(serialNo);
//验签(使用获取的微信平台公匙和应答签名以及)
if (!WechatPayUtils.verify(x509Certificate, message.getBytes(), sign))
throw new IllegalArgumentException("微信支付签名验证失败:" + message);
Map<String, String> resource = (Map) body.get("resource");
AesUtil aesUtil = new AesUtil(WxpayStaticParameter.v3Key.getBytes());
//获取解密后的json
String resourceDataToString = aesUtil.decryptToString(
resource.get("associated_data").getBytes(),
resource.get("nonce").getBytes(),
resource.get("ciphertext"));
//将json转换成map
Map<String, Object> resourceData = objectMapper.readValue(resourceDataToString, Map.class);
//获取支付的交易单号
String orderNo = resourceData.get("out_trade_no").toString();
//支付状态的判断 如果是success就代表支付成功
if ("SUCCESS".equals(resourceData.get("trade_state"))) {
//业务逻辑
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}