支付宝APP支付V2.0异步通知处理
{'@RequestMapping':{'value':'/yunpay/app/aliPayAppPayV2Notify','method':'POST'},'aliPayAppPayV2Notify':{'params':[{'name':'req','type':'HttpServletRequest'},{'name':'resp','type':'HttpServletResponse'}],'body':'LOGGER.info('支付宝app(钱包)支付V2.0->交易结果通知->开始');\nlong start = System.currentTimeMillis();\ndealWhitAliPayAppV2Req(req, resp, 'aliPayAppPayV2Notify', ALIPAY_APPPAY_V2_KEY);\nlong end = System.currentTimeMillis();\nLOGGER.info('支付宝app(钱包)支付V2.0->交易结果通知->结束,耗时:{}', end - start);'},'dealWhitAliPayAppV2Req':{'params':[{'name':'req','type':'HttpServletRequest'},{'name':'resp','type':'HttpServletResponse'},{'name':'transCode','type':'String'},{'name':'redisKey','type':'String'}],'body':'/* 编码格式 */\nString charset = req.getCharacterEncoding();\nif (StringUtil.isEmpty(charset)) {\n charset = CHARSET;\n}\n//String merNo = '';\nMap<String, String> paramMap = getParams(req);\nif (null == paramMap) {\n LOGGER.error('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->请求报文为空');\n return;\n}\nJSONObject json = new JSONObject();\nfor (Map.Entry<String, String> entry : paramMap.entrySet()) {\n String key = entry.getKey();\n String value = entry.getValue();\n json.put(key, value);\n}\nString jsonString = json.toJSONString();\nLOGGER.info('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->请求数据:{}', jsonString);\n\n//读取惠付发往通道订单号\nString merNo = paramMap.get(AliPayV2CommonConstans.APP_ID);\nJSONObject secureFld = null;\ntry {\n //截取通道商户号//读取安全域\n//merNo = serialNo.substring(0, 16); //共38位 通道商户号为16位\n Map<String, String> secureFldMap = redisInstance.getObj(HashMap.class, redisKey);\n String secureFldStr = secureFldMap.get(merNo);\n secureFld = JSONObject.parseObject(secureFldStr);\n} catch (Exception e) {\n LOGGER.error('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->安全域读取失败或解析失败:{}', e);\n return;\n}\nif (secureFld == null) {\n LOGGER.error('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->安全域读取失败或解析失败');\n return;\n}\ntry {\n LOGGER.info('请求客户端地址:{}', HttpUtils.getReqIPAddr(req));\n// //除去sign、sign_type两个参数\n// paramMap.remove(AliPayV2CommonConstans.SIGN);\n// paramMap.remove(AliPayV2CommonConstans.SIGN_TYPE);\n //验签 调用支付宝SDK\n boolean signVerify = false;\n if (alipayV2Flag) {\n signVerify = true;\n } else {\n signVerify = AlipaySignature.rsaCheckV1(paramMap, secureFld.getString(AliPayV2CommonConstans.ALIPAY_PUBLIC_KEY), charset, AliPayV2CommonConstans.SIGN_TYPE_RSA2);\n }\n if (signVerify) {\n //验签成功后对比交易请求的金额与异步返回是否一致\n String total_amount = secureFld.getString(AliPayV2CommonConstans.TOTAL_AMOUNT);//支付金额\n// JSONArray array = JSONArray.parseArray(paramMap.get('fund_bill_list'));\n String returnAmout = paramMap.get(AliPayV2CommonConstans.TOTAL_AMOUNT);//返回金额\n if (!StringUtil.equals(total_amount, returnAmout)){\n LOGGER.error('支付宝APP支付V2->APP支付结果异步通知->支付与返回的交易金额不一致');\n return;\n }\n IYunPayGateWayService notifyService = yunPayGateWayServiceFactory\n .getServiceByServiceName(transCode);\n notifyService.execute(paramMap);\n writeToResp(resp, AliPayV2CommonConstans.SUCCESS);\n } else {\n LOGGER.error('异步通知异常:{}', '验签失败');\n throw new SanxiaPayBizException(\n EnumRespMsg.VERIFY_FAILED.getRespCode(),\n EnumRespMsg.VERIFY_FAILED.getRespMsg());\n }\n} catch (Exception e) {\n LOGGER.error('异步通知异常:{}', e);\n}\n}'}}
代码说明:
- 创建JSONObject对象:
java JSONObject json = new JSONObject();2. 遍历表单参数Map:java for (Map.Entry<String, String> entry : paramMap.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); json.put(key, value); }3. 将JSONObject转换为字符串:java String jsonString = json.toJSONString();4. 将JSON字符串输出到日志:java LOGGER.info('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->请求数据:{}', jsonString);
**将上述代码替换掉原代码中的:**javaLOGGER.info('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->请求数据:{}', paramMap);
**最后,完整的代码如下:**java@RequestMapping(value = '/yunpay/app/aliPayAppPayV2Notify', method = RequestMethod.POST)public void aliPayAppPayV2Notify(HttpServletRequest req, HttpServletResponse resp) { LOGGER.info('支付宝app(钱包)支付V2.0->交易结果通知->开始'); long start = System.currentTimeMillis(); dealWhitAliPayAppV2Req(req, resp, 'aliPayAppPayV2Notify', ALIPAY_APPPAY_V2_KEY); long end = System.currentTimeMillis(); LOGGER.info('支付宝app(钱包)支付V2.0->交易结果通知->结束,耗时:{}', end - start);}
private void dealWhitAliPayAppV2Req(HttpServletRequest req, HttpServletResponse resp, String transCode, String redisKey) { /* 编码格式 */ String charset = req.getCharacterEncoding(); if (StringUtil.isEmpty(charset)) { charset = CHARSET; }// String merNo = ''; Map<String, String> paramMap = getParams(req); if (null == paramMap) { LOGGER.error('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->请求报文为空'); return; } JSONObject json = new JSONObject(); for (Map.Entry<String, String> entry : paramMap.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); json.put(key, value); } String jsonString = json.toJSONString(); LOGGER.info('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->请求数据:{}', jsonString);
//读取惠付发往通道订单号 String merNo = paramMap.get(AliPayV2CommonConstans.APP_ID); JSONObject secureFld = null; try { //截取通道商户号//读取安全域// merNo = serialNo.substring(0, 16); //共38位 通道商户号为16位 Map<String, String> secureFldMap = redisInstance.getObj(HashMap.class, redisKey); String secureFldStr = secureFldMap.get(merNo); secureFld = JSONObject.parseObject(secureFldStr); } catch (Exception e) { LOGGER.error('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->安全域读取失败或解析失败:{}', e); return; } if (secureFld == null) { LOGGER.error('支付宝手机app(钱包)支付V2->钱包支付结果异步通知->安全域读取失败或解析失败'); return; } try { LOGGER.info('请求客户端地址:{}', HttpUtils.getReqIPAddr(req));// //除去sign、sign_type两个参数// paramMap.remove(AliPayV2CommonConstans.SIGN);// paramMap.remove(AliPayV2CommonConstans.SIGN_TYPE); //验签 调用支付宝SDK boolean signVerify = false; if (alipayV2Flag) { signVerify = true; } else { signVerify = AlipaySignature.rsaCheckV1(paramMap, secureFld.getString(AliPayV2CommonConstans.ALIPAY_PUBLIC_KEY), charset, AliPayV2CommonConstans.SIGN_TYPE_RSA2); } if (signVerify) { //验签成功后对比交易请求的金额与异步返回是否一致 String total_amount = secureFld.getString(AliPayV2CommonConstans.TOTAL_AMOUNT);//支付金额// JSONArray array = JSONArray.parseArray(paramMap.get('fund_bill_list')); String returnAmout = paramMap.get(AliPayV2CommonConstans.TOTAL_AMOUNT);//返回金额 if (!StringUtil.equals(total_amount, returnAmout)){ LOGGER.error('支付宝APP支付V2->APP支付结果异步通知->支付与返回的交易金额不一致'); return; } IYunPayGateWayService notifyService = yunPayGateWayServiceFactory .getServiceByServiceName(transCode); notifyService.execute(paramMap); writeToResp(resp, AliPayV2CommonConstans.SUCCESS); } else { LOGGER.error('异步通知异常:{}', '验签失败'); throw new SanxiaPayBizException( EnumRespMsg.VERIFY_FAILED.getRespCode(), EnumRespMsg.VERIFY_FAILED.getRespMsg()); } } catch (Exception e) { LOGGER.error('异步通知异常:{}', e);
原文地址: https://www.cveoy.top/t/topic/pT05 著作权归作者所有。请勿转载和采集!