参考:异步返回结果的验签

这个地方还是使用阿里提供的工具类处理,最简单

  1. private static final String CHARSET = "UTF-8";
  2. private static final String SING_TYPE = "RSA2";
  3. Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到map中
  4. boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名
  5. if(signVerified){
  6. // TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
  7. }else{
  8. // TODO 验签失败则记录异常日志,并在response中返回failure.
  9. }

JAVA代码

  1. /**
  2. * 异步数据回调(支付完成后会post这个接口)
  3. */
  4. @PostMapping("/callback")
  5. void receiveSuccess(@RequestParam Map<String, String> paramsMap, HttpServletResponse response
  6. ) throws IOException, AlipayApiException {
  7. PrintWriter writer = response.getWriter();
  8. log.info("接受到的异步数据:{}", paramsMap);
  9. //将异步通知中收到的所有参数都存放到map中
  10. String ALIPAY_PUBLIC_KEY = baseZhifubaoParamService.getAlipayPublicKey();
  11. boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SING_TYPE); //调用SDK验证签名
  12. if (signVerified) {
  13. // TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
  14. log.info("支付宝验签通过");
  15. //实收金额。商家在交易中实际收到的款项,单位为人民币(元),精确到小数点后 2 位
  16. Double receiptAmount = Double.valueOf(paramsMap.get("receipt_amount"));
  17. //支付宝交易号,支付宝交易凭证号。
  18. String tradeNo = paramsMap.get("trade_no");
  19. //商家订单号。原支付请求的商家订单号
  20. String outTradeNo = paramsMap.get("out_trade_no");
  21. //自己请求的时候定义的body
  22. JSONObject bodyJson = JSON.parseObject(paramsMap.get("body"));
  23. String type = bodyJson.getString("type");
  24. Integer id = bodyJson.getInteger("id");
  25. /** 根据body里的Type信息,判断是什么交易 **/
  26. switch (type) {
  27. //国外批次付款
  28. case "GW": {
  29. //1.根据实际的收到的金额记录一条财务充值记录
  30. CaseopGuowaibatch guowaibatch = caseopGuowaibatchService.getById(id);
  31. Integer kehuid = guowaibatch.getKehuid();
  32. //把支付宝充值的人民币转换成美元
  33. Double dmoney = baseNumvarService.getDollarByRmb(Double.valueOf(receiptAmount));
  34. String remark1 = "商家订单号:" + outTradeNo;
  35. //给用户充值,更新用户的余额
  36. Double dmoneyleft1 = usersService.updateRemainder(kehuid, dmoney);
  37. //新增财务记录
  38. caiwuService.sysNew(kehuid, receiptAmount, dmoney, dmoneyleft1, 1, "支付宝", tradeNo, remark1);
  39. //更新批次为付款状态
  40. guowaibatch.setIspay(1);
  41. caseopGuowaibatchService.updateById(guowaibatch);
  42. //更新批次里的关联箱号为付款状态
  43. caseopGuowaibatchService.setGuowaiInIsPayByBatchId(guowaibatch.getId());
  44. //2.按批次里的金额,新增一条财务扣款记录
  45. Double costsum = guowaibatch.getCostsum();//这个是批次的金额,并非充值的实际金额
  46. String remark0 = "海外批次扣款:" + guowaibatch.getCode();
  47. //从用户余额里扣款,更新余额
  48. Double dmoneyleft0 = usersService.updateRemainder(kehuid, -dmoney);
  49. //新增财务记录
  50. caiwuService.sysNew(kehuid, 0.0, costsum, dmoneyleft0, 0, "余额", null, remark0);
  51. writer.write("success");
  52. break;
  53. }
  54. default: {
  55. // TODO 验签失败则记录异常日志,并在response中返回failure.
  56. log.warn("支付宝验签未通过");
  57. writer.write("failure");
  58. break;
  59. }
  60. }
  61. }
  62. writer.close();
  63. }