You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					
					
						
							472 lines
						
					
					
						
							23 KiB
						
					
					
				
			
		
		
	
	
							472 lines
						
					
					
						
							23 KiB
						
					
					
				| package com.ynxbd.bcm.config;
 | |
| 
 | |
| import com.alibaba.fastjson.JSONObject;
 | |
| import com.bocom.api.DefaultBocomClient;
 | |
| import com.bocom.api.utils.ApiUtils;
 | |
| import com.ynxbd.bcm.bean.pmssMpng.*;
 | |
| import com.ynxbd.common.bean.enums.MerchantEnum;
 | |
| import com.ynxbd.common.bean.pay.Order;
 | |
| import com.ynxbd.common.bean.pay.PayResult;
 | |
| import com.ynxbd.common.helper.common.DateHelper;
 | |
| import com.ynxbd.common.helper.common.ErrorHelper;
 | |
| import com.ynxbd.common.helper.common.JsonHelper;
 | |
| import com.ynxbd.common.helper.common.RepeatKeyHelper;
 | |
| import com.ynxbd.common.result.ResultEnum;
 | |
| import com.ynxbd.common.result.ServiceException;
 | |
| import com.ynxbd.wx.config.WeChatConfig;
 | |
| import com.ynxbd.wx.wxfactory.utils.WxSignHelper;
 | |
| import lombok.extern.slf4j.Slf4j;
 | |
| import org.apache.commons.lang3.ObjectUtils;
 | |
| 
 | |
| import javax.servlet.http.HttpServletRequest;
 | |
| import java.math.BigDecimal;
 | |
| import java.math.RoundingMode;
 | |
| import java.util.*;
 | |
| 
 | |
| @Slf4j
 | |
| public class BCMHelper {
 | |
|     // 排重
 | |
|     public static final RepeatKeyHelper KEYS = new RepeatKeyHelper(60);
 | |
| 
 | |
|     // 支付类型JSAPI
 | |
|     public static String B2C_JSAPI_WECHAT = "B2C-JSAPI-WECHAT";
 | |
| 
 | |
|     public static String VERSION = "V-1.0";
 | |
|     public static String ONLINE = "ONLINE"; // 线上或线下{ ONLINE/OFFLINE }
 | |
|     public static String CNY = "CNY"; // 币种
 | |
| 
 | |
|     // head交易状态
 | |
|     private static final String RESP_STATUS_P = "P"; // 处理中
 | |
|     private static final String RESP_STATUS_F = "F"; // 失败
 | |
|     private static final String RESP_STATUS_S = "S"; // 成功
 | |
| 
 | |
|     // 订单处理状态
 | |
|     private static final String TRAN_STATE_PROCESS = "PROCESS"; // 处理中
 | |
|     private static final String TRAN_STATE_SUCCESS = "SUCCESS"; // 交易成功
 | |
|     private static final String TRAN_STATE_FAILURE = "FAILURE"; // 交易失败
 | |
| 
 | |
|     // body交易状态
 | |
|     private static final String ORDER_STATUS_PAIED = "PAIED";       // 交易成功
 | |
|     private static final String ORDER_STATUS_WAITPAY = "WAITPAY";   // 等待支付
 | |
|     private static final String ORDER_STATUS_REFUNDED = "REFUNDED"; // 部分退款
 | |
|     private static final String ORDER_STATUS_REFUNDALL = "REFUNDALL"; // 全部退款
 | |
|     private static final String ORDER_STATUS_CLOSED = "CLOSED";     // 部分退款
 | |
|     private static final String ORDER_STATUS_INITIAL = "INITIAL";   // 初始化
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 交行支付调用及通知
 | |
|      *
 | |
|      * @param request 请求
 | |
|      * @return 交行支付信息
 | |
|      */
 | |
|     public static PayResult payNotify(HttpServletRequest request) throws ServiceException {
 | |
|         try {
 | |
|             // 获取请求数据
 | |
|             String respJson = WxSignHelper.getReqData(request);
 | |
|             if (respJson == null) {
 | |
|                 throw new ServiceException("【交行】回调通知参数解析失败");
 | |
|             }
 | |
| 
 | |
|             PmmsMpngNotifyRequestV1.PmmsMpngNotifyRequestV1Biz bizContent;
 | |
|             bizContent = (PmmsMpngNotifyRequestV1.PmmsMpngNotifyRequestV1Biz) ApiUtils.parseNotifyJsonWithBocomSign(respJson, "UTF-8", BCMConfig.API_GW_PUBLIC_KEY, PmmsMpngNotifyRequestV1.PmmsMpngNotifyRequestV1Biz.class);
 | |
|             if (bizContent == null || !TRAN_STATE_SUCCESS.equals(bizContent.getTranState())) {
 | |
|                 throw new ServiceException("【交行】回调通知参数缺失");
 | |
|             }
 | |
| 
 | |
| 
 | |
|             PmmsMpngNotifyRequestV1.PmmsMpngNotifyRequestV1Biz.RequireValues requireValues = bizContent.getRequireValues();
 | |
|             String bankTransNo = requireValues.getThirdPartyTranNo();
 | |
|             // 已处理 去重
 | |
|             if (KEYS.isContainsKey(bankTransNo)) {
 | |
|                 throw new ServiceException(ResultEnum.PAY_NOTIFY_REPEAT, String.format("【交行】[重复请求]回调通知去重 bankTransNo={%s}", bankTransNo));
 | |
|             }
 | |
| 
 | |
|             log.info("【交行】回调通知返回 bankTransNo={} resp={}", bankTransNo, JsonHelper.toJsonString(bizContent));
 | |
| 
 | |
|             String outTradeNo = bizContent.getMerTranNo();
 | |
|             String bankMerchantNo = requireValues.getBankTranNo();
 | |
|             String totalAmount = bizContent.getTotalAmount();
 | |
|             if (outTradeNo == null || bankTransNo == null || bankMerchantNo == null) {
 | |
|                 throw new ServiceException(String.format("【交行】回调通知错误 outTradeNo={%s}, bankTransNo={%s}, bankMerchantNo={%s}", outTradeNo, bankTransNo, bankMerchantNo));
 | |
|             }
 | |
| 
 | |
|             // 保存支付结果
 | |
|             PayResult payInfo = new PayResult();
 | |
|             payInfo.setPatDate(DateHelper.getCurDate());
 | |
|             payInfo.setPatDate(DateHelper.getCurTime());
 | |
| 
 | |
|             payInfo.setOutTradeNo(outTradeNo);
 | |
|             payInfo.setTransId(bankTransNo);
 | |
|             payInfo.setBankMerchantNo(bankMerchantNo);
 | |
|             payInfo.setTotalFee(new BigDecimal(totalAmount));
 | |
|             JSONObject respJsonObj = JsonHelper.parseObject(respJson);
 | |
|             if (respJsonObj != null) {
 | |
|                 JSONObject info = respJsonObj.getJSONObject("notify_biz_content");
 | |
|                 payInfo.setInfo(JsonHelper.toJsonString(info));
 | |
|             }
 | |
|             return payInfo;
 | |
|         } catch (Exception e) {
 | |
|             if (e instanceof ServiceException) {
 | |
|                 throw new ServiceException(((ServiceException) e).getResultEnum(), e.getMessage());
 | |
|             }
 | |
| 
 | |
|             ErrorHelper.println(e);
 | |
|             throw new ServiceException(String.format("【交行】支付通知异常:[%s]", e.getMessage()));
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public static JSONObject createOrder(MerchantEnum merchantEnum, String title, String outTradeNo, String totalFee, String notifyType) {
 | |
|         try {
 | |
|             DefaultBocomClient client = BCMConfig.createClient();
 | |
| 
 | |
|             MPNG210003RequestV1 clientRequest = new MPNG210003RequestV1();
 | |
|             clientRequest.setServiceUrl(BCMConfig.API_GW_URL_ADDRESS + "/api/pmssMpng/MPNG210003/v1");
 | |
| 
 | |
|             MPNG210003RequestV1.MPNG210003RequestV1Biz bizContent = new MPNG210003RequestV1.MPNG210003RequestV1Biz();
 | |
|             MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqHead reqHead = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqHead();
 | |
|             reqHead.setTransTime(BCMConfig.getTransTime()); // 交易时间
 | |
|             reqHead.setVersion(VERSION);  // 版本信息
 | |
|             bizContent.setReqHead(reqHead);
 | |
| 
 | |
|             MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody reqBody = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody();
 | |
|             reqBody.setMerPtcId(BCMConfig.MER_PTC_ID);   // 商户编号
 | |
|             reqBody.setPartnerId(BCMConfig.PARTNER_ID); // 服务商编号
 | |
| 
 | |
|             reqBody.setTranScene(B2C_JSAPI_WECHAT);     // 交易场景{微 信:B2C-JSAPI-WECHAT 支付宝:B2C-JSAPI-ALIPAY}
 | |
|             reqBody.setMerTradeDate(BCMConfig.getMerTradeDate()); // 商户侧交易日期
 | |
|             reqBody.setMerTradeTime(BCMConfig.getMerTradeTime()); // 商户侧交易时间
 | |
| 
 | |
| 
 | |
|             // 回调地址
 | |
|             reqBody.setNotifyUrl(WeChatConfig.getBaseUrl() + merchantEnum.getNotifyUrl(null, notifyType));
 | |
|             reqBody.setPayMerTranNo(outTradeNo); // 商户订单号
 | |
|             reqBody.setTotalAmount(totalFee);    // 订单总金额
 | |
|             reqBody.setTranContent(title);       // 交易内容
 | |
|             reqBody.setLocation(ONLINE);
 | |
|             reqBody.setCurrency(CNY);
 | |
| 
 | |
|             List<MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields> require_fieldsList = new ArrayList<>();
 | |
|             // 行端交易流水号
 | |
|             MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields require_fields = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("bank_tran_no");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // 第三方渠道
 | |
|             require_fields = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("third_party");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // 第三方渠道交易流水号
 | |
|             require_fields = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("third_party_tran_no");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // 微信支付宝详细付款信息
 | |
|             require_fields = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("payment_info");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // 微信支付宝详细付款信息
 | |
|             require_fields = new MPNG210003RequestV1.MPNG210003RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("refund_info");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // 设置额外字段
 | |
|             reqBody.setRequireFields(require_fieldsList);
 | |
| 
 | |
|             bizContent.setReqBody(reqBody);
 | |
|             clientRequest.setBizContent(bizContent);
 | |
| 
 | |
|             MPNG210003ResponseV1 clientResponse = client.execute(clientRequest, UUID.randomUUID().toString().replace("-", ""));
 | |
|             log.info("【交行】下单 outTradeNo={}, resp={}", outTradeNo, JsonHelper.toJsonString(clientResponse));
 | |
|             if (clientResponse == null) {
 | |
|                 log.info("【交行】下单失败 outTradeNo={}", outTradeNo);
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             if (!clientResponse.isSuccess()) {
 | |
|                 log.info("【交行】下单失败 outTradeNo={}, resp={}", outTradeNo, JsonHelper.toJsonString(clientResponse));
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             // head
 | |
|             MPNG210003ResponseV1.RspHead rspHead = clientResponse.getRspHead();
 | |
|             if (rspHead == null) {
 | |
|                 log.info("【交行】下单失败 outTradeNo={}, rspHead={}", outTradeNo, JsonHelper.toJsonString(rspHead));
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             if (!RESP_STATUS_S.equals(rspHead.getResponseStatus())) {
 | |
|                 log.info("【交行】下单失败 outTradeNo={}, code={}, message={}", outTradeNo, rspHead.getResponseCode(), rspHead.getResponseMsg());
 | |
|                 return null;
 | |
|             }
 | |
| 
 | |
|             // body
 | |
|             MPNG210003ResponseV1.RspBody rspBody = clientResponse.getRspBody();
 | |
|             if (rspBody == null) {
 | |
|                 log.info("【交行】下单失败 outTradeNo={}, rspBody={}", outTradeNo, JsonHelper.toJsonString(rspBody));
 | |
|                 return null;
 | |
|             }
 | |
|             String payUrl = rspBody.getRedirectUrl();
 | |
|             if (ObjectUtils.isEmpty(payUrl)) {
 | |
|                 log.info("【交行】下单失败 outTradeNo={}, rspBody={}", outTradeNo, JsonHelper.toJsonString(rspBody));
 | |
|                 return null;
 | |
|             }
 | |
|             JSONObject jsonObj = new JSONObject();
 | |
|             jsonObj.put("outTradeNo", outTradeNo);
 | |
|             jsonObj.put("url", payUrl);
 | |
|             jsonObj.put("type", MerchantEnum.BCM.CODE);
 | |
|             return jsonObj;
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|         }
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public static Order queryOrder(String outTradeNo) {
 | |
|         Order order = new Order();
 | |
|         order.setOutTradeNo(outTradeNo);
 | |
|         try {
 | |
|             DefaultBocomClient client = BCMConfig.createClient();
 | |
| 
 | |
|             MPNG020702RequestV1 clientRequest = new MPNG020702RequestV1();
 | |
|             clientRequest.setServiceUrl(BCMConfig.API_GW_URL_ADDRESS + "/api/pmssMpng/MPNG020702/v1");
 | |
| 
 | |
|             MPNG020702RequestV1.MPNG020702RequestV1Biz bizContent = new MPNG020702RequestV1.MPNG020702RequestV1Biz();
 | |
|             MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqHead reqHead = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqHead();
 | |
| 
 | |
|             reqHead.setTransTime(BCMConfig.getTransTime()); // 交易时间
 | |
|             reqHead.setVersion(VERSION);
 | |
|             bizContent.setReqHead(reqHead);
 | |
| 
 | |
|             MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody reqBody = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody();
 | |
| 
 | |
|             reqBody.setMerTradeDate(BCMConfig.getMerTradeDate());
 | |
|             reqBody.setPayMerTranNo(outTradeNo);
 | |
|             reqBody.setTranScene(B2C_JSAPI_WECHAT); // 交易场景
 | |
| 
 | |
|             List<MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields> require_fieldsList = new ArrayList<>();
 | |
|             MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields require_fields = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("bank_tran_no");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             //--------------------------------------------
 | |
|             require_fields = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("third_party");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // ----------------------------------------------
 | |
|             require_fields = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("third_party_tran_no");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // ----------------------------------------------
 | |
|             require_fields = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("payment_info");
 | |
|             require_fieldsList.add(require_fields);
 | |
|             // ----------------------------------------------
 | |
|             require_fields = new MPNG020702RequestV1.MPNG020702RequestV1Biz.ReqBody.RequireFields();
 | |
|             require_fields.setRequireField("refund_info");
 | |
|             require_fieldsList.add(require_fields);
 | |
| 
 | |
|             reqBody.setRequireFields(require_fieldsList);
 | |
|             reqBody.setMerPtcId(BCMConfig.MER_PTC_ID);
 | |
|             reqBody.setPartnerId(BCMConfig.PARTNER_ID);
 | |
|             bizContent.setReqBody(reqBody);
 | |
|             clientRequest.setBizContent(bizContent);
 | |
|             // --------------------------------------------------
 | |
|             MPNG020702ResponseV1 clientResponse = client.execute(clientRequest, UUID.randomUUID().toString().replace("-", ""));
 | |
|             log.info("【交行】查询订单 outTradeNo={}, resp={}", outTradeNo, JsonHelper.toJsonString(clientResponse));
 | |
|             if (clientResponse == null) {
 | |
|                 order.setErrorMsg("【交行】调用查询订单失败");
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             if (!clientResponse.isSuccess()) {
 | |
|                 order.setErrorMsg(clientResponse.getRspMsg());
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
| 
 | |
|             // head
 | |
|             MPNG020702ResponseV1.RspHead rspHead = clientResponse.getRspHead();
 | |
|             if (rspHead == null) {
 | |
|                 order.setErrorMsg("【交行】查询订单失败 outTradeNo=" + outTradeNo);
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             if (!RESP_STATUS_S.equals(rspHead.getResponseStatus())) {
 | |
|                 order.setErrorCode(rspHead.getResponseCode());
 | |
|                 order.setErrorMsg(rspHead.getResponseMsg());
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             MPNG020702ResponseV1.RspBody rspBody = clientResponse.getRspBody();
 | |
|             if (rspBody == null) {
 | |
|                 order.setErrorCode(rspHead.getResponseCode());
 | |
|                 order.setErrorMsg(rspHead.getResponseMsg());
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             MPNG020702ResponseV1.RspBody.RequireValues requireValues = rspBody.getRequireValues();
 | |
|             if (requireValues != null) {
 | |
|                 order.setBankTransNo(requireValues.getBankTranNo());
 | |
|             }
 | |
|             order.setPayMoney(new BigDecimal(rspBody.getTotalAmount())); // 订单总金额
 | |
| 
 | |
|             String tranState = rspBody.getTranState();     // PROCESS 处理中  SUCCESS 交易成功   FAILURE 交易失败
 | |
|             String orderStatus = rspBody.getOrderStatus(); // PAIED交易成功 WAITPAY等待支付  REFUNDED部分退款  REFUNDALL全部退款  CLOSED订单关闭 INITIAL初始化
 | |
|             order.setTradeState(orderStatus);
 | |
| 
 | |
|             if (TRAN_STATE_SUCCESS.equals(tranState) && ORDER_STATUS_PAIED.equals(orderStatus)) {
 | |
|                 order.setSuccess(true); // 订单支付成功(判断条件)
 | |
| 
 | |
|             } else if (ORDER_STATUS_REFUNDED.equals(orderStatus) || ORDER_STATUS_REFUNDALL.equals(orderStatus)) {
 | |
|                 order.setErrorMsg("订单发生过退款");
 | |
|                 if (ORDER_STATUS_REFUNDED.equals(orderStatus)) order.setErrorMsg("订单发生过退款");
 | |
|                 if (ORDER_STATUS_REFUNDALL.equals(orderStatus)) order.setErrorMsg("订单已全额退款");
 | |
|                 order.setRefund(true); // 订单发生过退款
 | |
|             } else {
 | |
|                 // 交易错未成功
 | |
|                 order.setErrorCode(orderStatus);
 | |
|                 if (ORDER_STATUS_WAITPAY.equals(orderStatus)) order.setErrorMsg("等待支付");
 | |
|                 if (ORDER_STATUS_CLOSED.equals(orderStatus)) order.setErrorMsg("订单关闭");
 | |
|                 if (ORDER_STATUS_INITIAL.equals(orderStatus)) order.setErrorMsg("初始化");
 | |
|             }
 | |
|             return order;
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             order.setErrorMsg("【交行】" + e.getMessage());
 | |
|             return order;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 退款
 | |
|      *
 | |
|      * @param outTradeNo  订单号
 | |
|      * @param outRefundNo 退款单号(28位)
 | |
|      * @param tradeDate   发生交易的日期
 | |
|      * @param refundMoney 退款金额
 | |
|      * @param desc        退款描述
 | |
|      */
 | |
|     public static Order refund(String outTradeNo, String outRefundNo, String tradeDate, BigDecimal refundMoney, String desc) {
 | |
|         outRefundNo = outRefundNo.substring(4);
 | |
|         log.info("【交行】退款申请 outTradeNo={}, outRefundNo={}, tradeDate={}, refundMoney={}", outTradeNo, outRefundNo, tradeDate, refundMoney);
 | |
|         Order order = new Order();
 | |
|         try {
 | |
|             DefaultBocomClient client = BCMConfig.createClient();
 | |
| 
 | |
|             MPNG020701RequestV1 clientRequest = new MPNG020701RequestV1();
 | |
|             clientRequest.setServiceUrl(BCMConfig.API_GW_URL_ADDRESS + "/api/pmssMpng/MPNG020701/v1");
 | |
| 
 | |
|             MPNG020701RequestV1.MPNG020701RequestV1Biz bizContent = new MPNG020701RequestV1.MPNG020701RequestV1Biz();
 | |
|             MPNG020701RequestV1.MPNG020701RequestV1Biz.ReqHead reqHead = new MPNG020701RequestV1.MPNG020701RequestV1Biz.ReqHead();
 | |
|             reqHead.setTransTime(BCMConfig.getTransTime()); // 交易时间 yyyyMMddHHmmss
 | |
|             reqHead.setVersion(VERSION);
 | |
|             // req-body
 | |
|             MPNG020701RequestV1.MPNG020701RequestV1Biz.ReqBody reqBody = new MPNG020701RequestV1.MPNG020701RequestV1Biz.ReqBody();
 | |
|             reqBody.setTranScene(B2C_JSAPI_WECHAT);
 | |
|             reqBody.setCurrency(CNY);
 | |
| 
 | |
|             reqBody.setMerPtcId(BCMConfig.MER_PTC_ID);
 | |
|             reqBody.setPartnerId(BCMConfig.PARTNER_ID);
 | |
|             reqBody.setMerRefundDate(DateHelper.dateToStr(new Date(), DateHelper.DateEnum.yyyyMMdd));
 | |
|             reqBody.setMerRefundTime(DateHelper.dateToStr(new Date(), DateHelper.DateEnum.HHmmss));
 | |
|             // --------------
 | |
|             reqBody.setPayMerTranNo(outTradeNo);     // 订单号
 | |
|             reqBody.setRefundMerTranNo(outRefundNo); // 退费订单号
 | |
|             reqBody.setMerTradeDate(tradeDate);
 | |
|             reqBody.setAmount(refundMoney.setScale(2, RoundingMode.DOWN).toString());
 | |
|             reqBody.setTranContent(desc);
 | |
| 
 | |
|             bizContent.setReqHead(reqHead);
 | |
|             bizContent.setReqBody(reqBody);
 | |
|             clientRequest.setBizContent(bizContent);
 | |
|             // --------------------------------------------------
 | |
|             log.info("request={}", JsonHelper.toJsonString(clientRequest));
 | |
|             MPNG020701ResponseV1 clientResponse = client.execute(clientRequest, UUID.randomUUID().toString().replace("-", ""));
 | |
|             log.info("【交行】退款 outTradeNo={}, resp={}", outTradeNo, JsonHelper.toJsonString(clientResponse));
 | |
|             if (clientResponse == null) {
 | |
|                 order.setErrorMsg("【交行】调用退款失败");
 | |
|                 order.setRefundResult("调用退款失败");
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             if (!clientResponse.isSuccess()) {
 | |
|                 order.setErrorMsg(clientResponse.getRspMsg());
 | |
|                 order.setRefundResult(clientResponse.getRspMsg());
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
| 
 | |
|             // head
 | |
|             MPNG020701ResponseV1.RspHead rspHead = clientResponse.getRspHead();
 | |
|             if (rspHead == null) {
 | |
|                 order.setErrorMsg("【交行】退款失败 outTradeNo=" + outTradeNo);
 | |
|                 order.setRefundResult("退款失败");
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             if (!RESP_STATUS_S.equals(rspHead.getResponseStatus())) {
 | |
|                 order.setErrorCode(rspHead.getResponseCode());
 | |
|                 order.setErrorMsg(rspHead.getResponseMsg());
 | |
|                 order.setRefundResult(rspHead.getResponseMsg());
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             MPNG020701ResponseV1.RspBody rspBody = clientResponse.getRspBody();
 | |
|             if (rspBody == null) {
 | |
|                 order.setErrorCode(rspHead.getResponseCode());
 | |
|                 order.setErrorMsg(rspHead.getResponseMsg());
 | |
|                 order.setRefundResult(rspHead.getResponseMsg());
 | |
|                 return order;
 | |
|             }
 | |
| 
 | |
|             order.setRefundResult("OK");
 | |
|             order.setSuccess(true); // 操作成功标识
 | |
|             return order;
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|             order.setErrorMsg("【交行】" + e.getMessage());
 | |
|             return order;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 【交行】回调通知成功
 | |
|      */
 | |
|     public static Map<String, Object> resp(ServiceException e) {
 | |
|         if (ResultEnum.PAY_NOTIFY_REPEAT.equals(e.getResultEnum())) {
 | |
|             return respOk();
 | |
|         }
 | |
|         return respError(e.getMessage());
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 【交行】回调通知成功
 | |
|      */
 | |
|     public static Map<String, Object> respOk() {
 | |
|         log.info("【交行】回调通知成功");
 | |
|         Map<String, Object> resultMap = new HashMap<>();
 | |
|         resultMap.put("biz_state", "S");
 | |
|         resultMap.put("rsp_code", "0000");
 | |
|         resultMap.put("rsp_msg", "success");
 | |
|         return resultMap;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 【交行】回调通知失败
 | |
|      */
 | |
|     public static Map<String, Object> respError(String message) {
 | |
|         log.info("回调通知: {}", message);
 | |
|         if (message == null) {
 | |
|             message = "error";
 | |
|         }
 | |
|         Map<String, Object> resultMap = new HashMap<>();
 | |
|         resultMap.put("biz_state", "F");
 | |
|         resultMap.put("rsp_code", "0000");
 | |
|         resultMap.put("rsp_msg", "error");
 | |
|         return resultMap;
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 |