参考:异步返回结果的验签
这个地方还是使用阿里提供的工具类处理,最简单
private static final String CHARSET = "UTF-8";
private static final String SING_TYPE = "RSA2";
Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名
if(signVerified){
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
}else{
// TODO 验签失败则记录异常日志,并在response中返回failure.
}
JAVA代码
/**
* 异步数据回调(支付完成后会post这个接口)
*/
@PostMapping("/callback")
void receiveSuccess(@RequestParam Map<String, String> paramsMap, HttpServletResponse response
) throws IOException, AlipayApiException {
PrintWriter writer = response.getWriter();
log.info("接受到的异步数据:{}", paramsMap);
//将异步通知中收到的所有参数都存放到map中
String ALIPAY_PUBLIC_KEY = baseZhifubaoParamService.getAlipayPublicKey();
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SING_TYPE); //调用SDK验证签名
if (signVerified) {
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
log.info("支付宝验签通过");
//实收金额。商家在交易中实际收到的款项,单位为人民币(元),精确到小数点后 2 位
Double receiptAmount = Double.valueOf(paramsMap.get("receipt_amount"));
//支付宝交易号,支付宝交易凭证号。
String tradeNo = paramsMap.get("trade_no");
//商家订单号。原支付请求的商家订单号
String outTradeNo = paramsMap.get("out_trade_no");
//自己请求的时候定义的body
JSONObject bodyJson = JSON.parseObject(paramsMap.get("body"));
String type = bodyJson.getString("type");
Integer id = bodyJson.getInteger("id");
/** 根据body里的Type信息,判断是什么交易 **/
switch (type) {
//国外批次付款
case "GW": {
//1.根据实际的收到的金额记录一条财务充值记录
CaseopGuowaibatch guowaibatch = caseopGuowaibatchService.getById(id);
Integer kehuid = guowaibatch.getKehuid();
//把支付宝充值的人民币转换成美元
Double dmoney = baseNumvarService.getDollarByRmb(Double.valueOf(receiptAmount));
String remark1 = "商家订单号:" + outTradeNo;
//给用户充值,更新用户的余额
Double dmoneyleft1 = usersService.updateRemainder(kehuid, dmoney);
//新增财务记录
caiwuService.sysNew(kehuid, receiptAmount, dmoney, dmoneyleft1, 1, "支付宝", tradeNo, remark1);
//更新批次为付款状态
guowaibatch.setIspay(1);
caseopGuowaibatchService.updateById(guowaibatch);
//更新批次里的关联箱号为付款状态
caseopGuowaibatchService.setGuowaiInIsPayByBatchId(guowaibatch.getId());
//2.按批次里的金额,新增一条财务扣款记录
Double costsum = guowaibatch.getCostsum();//这个是批次的金额,并非充值的实际金额
String remark0 = "海外批次扣款:" + guowaibatch.getCode();
//从用户余额里扣款,更新余额
Double dmoneyleft0 = usersService.updateRemainder(kehuid, -dmoney);
//新增财务记录
caiwuService.sysNew(kehuid, 0.0, costsum, dmoneyleft0, 0, "余额", null, remark0);
writer.write("success");
break;
}
default: {
// TODO 验签失败则记录异常日志,并在response中返回failure.
log.warn("支付宝验签未通过");
writer.write("failure");
break;
}
}
}
writer.close();
}