参考:异步返回结果的验签
这个地方还是使用阿里提供的工具类处理,最简单
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并继续商户自身业务处理,校验失败返回failurelog.info("支付宝验签通过");//实收金额。商家在交易中实际收到的款项,单位为人民币(元),精确到小数点后 2 位Double receiptAmount = Double.valueOf(paramsMap.get("receipt_amount"));//支付宝交易号,支付宝交易凭证号。String tradeNo = paramsMap.get("trade_no");//商家订单号。原支付请求的商家订单号String outTradeNo = paramsMap.get("out_trade_no");//自己请求的时候定义的bodyJSONObject 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();}
