package com.nova.sankuai.domain.api.yinsheng; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.nova.sankuai.domain.api.yinsheng.config.YinShengProperties; import com.nova.sankuai.domain.api.yinsheng.dto.*; import com.nova.sankuai.domain.api.yinsheng.enums.BusinessTypeEnum; import com.nova.sankuai.domain.api.yinsheng.enums.YinShengMethodEnum; import com.nova.sankuai.domain.api.yinsheng.response.*; import com.nova.sankuai.domain.entity.PayRecord; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.utils.MoneyUtil; import com.nova.sankuai.service.IPayRecordService; import lombok.RequiredArgsConstructor; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; import static com.nova.sankuai.domain.api.yinsheng.enums.YinShengMethodEnum.*; /** * 银盛快捷协议支付工具类 * * @author ephemeral */ @Component @RequiredArgsConstructor public class YinShengFastProtocolUtils { @Value("${yinsheng.notify_url}") private String notifyUrl; private static final Logger log = LoggerFactory.getLogger("payLogger"); private static final String METHOD = "method"; private static final String PARTNER_ID = "partner_id"; private static final String TIMESTAMP = "timestamp"; private static final String CHARSET = "charset"; private static final String SIGN_TYPE = "sign_type"; private static final String SIGN = "sign"; private static final String VERSION = "version"; private static final String BIZ_CONTENT = "biz_content"; private static final String UTF_8 = "utf-8"; private static final String GM = "SM"; private static final String VERSION_NUM = "3.0"; private final YinShengProperties yinShengProperties; private final static String TIMEOUT_EXPRESS = "30m"; public final static String STATUS_SUCCESS = "10000"; // 于2022-11-17号 private final IPayRecordService payRecordService; /** * 准备公共请求参数 * * @param method * @return */ private Map prepareCommonParam(YinShengMethodEnum method) { Map mapData = new HashMap<>(); mapData.put(METHOD, method.getCode()); mapData.put(PARTNER_ID, yinShengProperties.getPartnerId()); mapData.put(TIMESTAMP, DateUtil.getDateNow()); mapData.put(CHARSET, UTF_8); mapData.put(SIGN_TYPE, GM); mapData.put(VERSION, VERSION_NUM); log.debug("准备公共请求参数:{}", mapData); return mapData; } public Map prepareSignParam(FastProtocolSignDTO signDTO) { Map mapData = prepareCommonParam(SIGN_PROTOCOL_METHOD); JSONObject json = new JSONObject(); json.put("out_trade_no", signDTO.getOutTradeNo()); json.put("seller_id", yinShengProperties.getSellerId()); //收款方银盛支付用户号 json.put("seller_name", yinShengProperties.getSellerName()); //收款方银盛支付客户名 json.put("buyer_name", encryptData(signDTO.getBuyerName())); json.put("buyer_card_number", encryptData(signDTO.getBuyerCardNumber())); json.put("buyer_mobile", encryptData(signDTO.getBuyerMobile())); json.put("pyerIDNo", encryptData(signDTO.getPayerIDNo())); json.put("user_id", signDTO.getUserId()); if (StringUtils.isNotEmpty(signDTO.getImei())) { json.put("imei", signDTO.getImei()); } if (StringUtils.isNotEmpty(signDTO.getActionScope())) { json.put("actionScope", signDTO.getActionScope()); } if (signDTO.getTotalAmount() != null) { json.put("total_amount", MoneyUtil.toYuan(signDTO.getTotalAmount())); } mapData.put(BIZ_CONTENT, json.toString()); mapData.put(SIGN, sign(mapData)); return mapData; } public Map prepareSignQueryParam(String protocolNo) { Map mapData = prepareCommonParam(QUERY_PROTOCOL_METHOD); JSONObject json = new JSONObject(); json.put("protocol_no", protocolNo); mapData.put(BIZ_CONTENT, json.toString()); mapData.put(SIGN, sign(mapData)); return mapData; } public Map prepareSignConfirmParam(FastProtocolSignConfirmDTO confirmDTO) { Map mapData = prepareCommonParam(SIGN_CONFIRM_METHOD); JSONObject json = new JSONObject(); json.put("out_trade_no", confirmDTO.getOutTradeNo()); json.put("mobile_verify_code", confirmDTO.getMobileVerifyCode()); if (StringUtils.isNotEmpty(confirmDTO.getCardCvn2())) { json.put("cardCvn2", encryptData(confirmDTO.getCardCvn2())); } if (StringUtils.isNotEmpty(confirmDTO.getCardExprDt())) { json.put("cardExprDt", encryptData(confirmDTO.getCardExprDt())); } mapData.put(BIZ_CONTENT, json.toString()); mapData.put(SIGN, sign(mapData)); return mapData; } public Map prepareSmsResendParam(String paySn) { Map mapData = prepareCommonParam(FAST_PROTOCOL_SMS_RESEND); JSONObject json = new JSONObject(); json.put("paysn", paySn); mapData.put(BIZ_CONTENT, json.toString()); mapData.put(SIGN, sign(mapData)); return mapData; } public Map prepareSmsConfirmParam(SmsConfirmDTO confirmDTO) { Map mapData = prepareCommonParam(FAST_PROTOCOL_SMS_CONFIRM); JSONObject json = new JSONObject(); json.put("paysn", confirmDTO.getPaySn()); json.put("mobile_verify_code", confirmDTO.getMobileVerifyCode()); mapData.put(BIZ_CONTENT, json.toString()); mapData.put(SIGN, sign(mapData)); return mapData; } public Map preparePayParam(FastProtocolPayDTO payDTO) { Map mapData = prepareCommonParam(FAST_PROTOCOL_PAY); mapData.put("notify_url", notifyUrl + "/api/v1/vipCardOrder/notifyByYinSheng"); JSONObject json = new JSONObject(); json.put("out_trade_no", payDTO.getOutTradeNo());//商户生成的订单号,生成规则前8位为交易日期,如20180525,范围跨度支持包含当天在内的前后一天,且只能由大小写英文字母、数字、下划线及横杠组成 json.put("shopdate", DateUtil.getDateNowYmd());//商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内 json.put("subject", payDTO.getSubject());//商品的标题/交易标题/订单标题/订单关键字等。该参数最长为250个汉字。 json.put("total_amount", MoneyUtil.toYuan(payDTO.getTotalAmount()));//该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。Number(10,2)指10位长度,2位精度 if (StringUtils.isNotEmpty(payDTO.getCurrency())) { json.put("currency", payDTO.getCurrency());//支持币种:CNY(人民币)、HKD(港币)、USD(美元)、EUR(欧元)、JPY(日元)。注:不填默认是CNY(人民币),如是非跨境商户,币种不能填HKD(港币)、USD(美元)、EUR(欧元)、JPY(日元)中的任意一种外币币种。 } else { json.put("currency", "CNY"); } json.put("seller_id", yinShengProperties.getSellerId());//收款方银盛支付用户号 json.put("seller_name", yinShengProperties.getSellerName());//收款方银盛支付客户名 json.put("timeout_express", TIMEOUT_EXPRESS);//设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭。取值范围:1m~15d。m-分钟,h-小时,d-天。该参数数值不接受小数点,如1.5h,可转换为90m。 if (StringUtils.isNotEmpty(payDTO.getExtendParams())) { json.put("extend_params", payDTO.getExtendParams());//业务扩展参数,一个json字符串,order_mode订单模式,暂时可选的值为:00 代表购物车模式;seller_list参与分账的收款方信息数组,每个元素包含seller_id收款方银盛支付用户号。实时分账业务,order_mode和seller_list均不能为空,order_mode的值必须为00。 } if (StringUtils.isNotEmpty(payDTO.getExtraCommonParam())) { json.put("extra_common_param", payDTO.getExtraCommonParam());//公用回传参数 } json.put("business_code", yinShengProperties.getBusinessCode());//业务代码 json.put("user_id", Long.toString(payDTO.getUserId()));//唯一客户标识,商户旗下客户号。签约时的user_id json.put("protocol_no", payDTO.getProtocolNo());//银盛支付平台的签约流水号:商户签约确认接口(mercSignConfirm)返回的protocol_no if (StringUtils.isNotEmpty(payDTO.getCardCvn2())) { json.put("cardCvn2", payDTO.getCardCvn2());//贷记卡必传,如果签名方式为RSA,则用DES加密,密钥为商户号前8位,不足8位在商户号前补空格;如果签名方式为SM,则用SM加密 } if (StringUtils.isNotEmpty(payDTO.getCardExprDt())) { json.put("cardExprDt", payDTO.getCardExprDt());//贷记卡必传,如果签名方式为RSA,则用DES加密,密钥为商户号前8位,不足8位在商户号前补空格,格式为MMYY; 如果签名方式为SM,则用SM加密 } SubMerchantInfoDTO subMerchant = payDTO.getSubMerchant(); if (subMerchant != null) { JSONObject subMerchantObj = new JSONObject(); subMerchantObj.put("merName", subMerchant.getMerName());//二级商户名称,支持25个中文 subMerchantObj.put("merShortName", subMerchant.getMerShortName());//二级商户简称,支持25个中文 subMerchantObj.put("merAddr", subMerchant.getMerAddr());//二级商户地址,支持100个中文 subMerchantObj.put("telephone", subMerchant.getTelephone());//固定电话/手机号码二选一 subMerchantObj.put("merNo", subMerchant.getMerNo());//二级商户编号 subMerchantObj.put("category", subMerchant.getCategory());//类目,按附件内容输入类目编号 subMerchantObj.put("mrchntCertId", subMerchant .getMerchantCertId());//身份证号,只支持身份证格式如果签名方式为RSA,则用DES加密,密钥为商户号前8位,不足8位在商户号前补空格; 如果签名方式为SM,则用SM加密) json.put("sub_merchant", subMerchantObj); } ConsigeeInfoDTO consigneeInfo = payDTO.getConsigneeInfo(); if (consigneeInfo != null) { JSONObject consigneeInfoObj = new JSONObject(); consigneeInfoObj.put("consigneeName", consigneeInfo.getConsigneeName());//收货人姓名 consigneeInfoObj.put("consigneeAddr", consigneeInfo.getConsigneeAddr());//收货地址 consigneeInfoObj.put("transportationInfo", consigneeInfo.getTransportationInfo());//物流配送信息(物流名称+订单号) consigneeInfoObj.put("commodityName", consigneeInfo.getCommodityName());//商品名称 consigneeInfoObj.put("commodityNumber", consigneeInfo.getCommodityNumber());//商品数量, json.put("consignee_info", consigneeInfoObj); } if (StringUtils.isNotEmpty(payDTO.getMccs())) { json.put("mccs", payDTO.getMccs());//Mcc码(支持上传多个,多个用|分割) } if (StringUtils.isNotEmpty(payDTO.getMerNo())) { json.put("mer_no", payDTO.getMerNo());//第三方商户号 } if (StringUtils.isNotEmpty(payDTO.getSubmerIp())) { json.put("submer_ip", payDTO.getSubmerIp());//子商户ip } mapData.put(BIZ_CONTENT, json.toString()); mapData.put(SIGN, sign(mapData)); return mapData; } private String post(Map mapData) { try { return HttpRequest.sendPost(yinShengProperties.getApiUrl(), CommonUtil.mapToString(mapData)); } catch (Exception e) { log.error("\n【请求地址】: {}\n【请求参数】:{}\n【异常信息】:{}", yinShengProperties.getApiUrl(), CommonUtil.mapToString(mapData), e.getMessage()); throw new CommonException(e); } } public FastProtocolResponse constructFastProtocolResponse(JSONObject jsonObj) { if (jsonObj == null) { return null; } String code = jsonObj.getString("code"); String msg = jsonObj.getString("msg"); String outTradeNo = jsonObj.getString("out_trade_no"); String protocolNo = jsonObj.getString("protocol_no"); String tradeStatus = jsonObj.getString("trade_status"); String subMsg = jsonObj.getString("sub_msg"); String bankType = jsonObj.getString("banktype"); FastProtocolResponse response = new FastProtocolResponse(); response.setCode(code); response.setMsg(msg); response.setOutTradeNo(outTradeNo); response.setTradeStatus(tradeStatus); response.setProtocolNo(protocolNo); response.setBankType(bankType); response.setSubMsg(subMsg); return response; } public FastProtocolQueryResponse constructFastProtocolQueryResponse(JSONObject jsonObj) { if (jsonObj == null) { return null; } String code = jsonObj.getString("code"); String msg = jsonObj.getString("msg"); String protocolNo = jsonObj.getString("protocol_no"); String tradeStatus = jsonObj.getString("trade_status"); String bankType = jsonObj.getString("banktype"); FastProtocolQueryResponse response = new FastProtocolQueryResponse(); response.setCode(code); response.setMsg(msg); response.setTradeStatus(tradeStatus); response.setProtocolNo(protocolNo); response.setBankType(bankType); return response; } public SmsResendResponse constructSmsResendResponse(JSONObject jsonObj) { if (jsonObj == null) { return null; } String code = jsonObj.getString("code"); String msg = jsonObj.getString("msg"); String payStatus = jsonObj.getString("pay_status"); SmsResendResponse response = new SmsResendResponse(); response.setCode(code); response.setMsg(msg); response.setPayStatus(payStatus); return response; } public FastProtocolPayResponse constructFastProtocolPayResponse(JSONObject jsonObj) { if (jsonObj == null) { return null; } String code = jsonObj.getString("code"); String msg = jsonObj.getString("msg"); String outTradeNo = jsonObj.getString("out_trade_no"); String tradeNo = jsonObj.getString("trade_no"); String tradeStatus = jsonObj.getString("trade_status"); String totalAmount = jsonObj.getString("total_amount"); String accountDate = jsonObj.getString("account_date"); String needSign = jsonObj.getString("need_sign"); String needSmsConfirm = jsonObj.getString("need_sms_confirm"); String paySn = jsonObj.getString("paysn"); String subMsg = jsonObj.getString("sub_msg"); String payStatus = jsonObj.getString("pay_status"); String merDiscountFee = jsonObj.getString("mer_discount_fee"); FastProtocolPayResponse response = new FastProtocolPayResponse(); response.setCode(code); response.setMsg(msg); response.setOutTradeNo(outTradeNo); response.setTradeNo(tradeNo); response.setTradeStatus(tradeStatus); response.setTotalAmount(totalAmount); response.setAccountDate(accountDate); response.setNeedSign(needSign); response.setNeedSmsConfirm(needSmsConfirm); response.setPaySn(paySn); response.setSubMsg(subMsg); response.setPayStatus(payStatus); response.setMerDiscountFee(merDiscountFee); JSONObject installmentResp = jsonObj.getJSONObject("installment_resp"); if (installmentResp != null) { String installmentNum = installmentResp.getString("installment_num"); String installmentFeeTotal = installmentResp.getString("installment_fee_total"); String installmentFeePayMode = installmentResp.getString("installment_fee_pay_mode"); String firstFee = installmentResp.getString("first_fee"); String eachFee = installmentResp.getString("each_fee"); String firstBackAmount = installmentResp.getString("first_back_amount"); String realDiscountFeeRate = installmentResp.getString("real_discount_fee_rate"); InstallmentResponse installmentResponse = new InstallmentResponse(); installmentResponse.setInstallmentNum(installmentNum); installmentResponse.setInstallmentFeeTotal(installmentFeeTotal); installmentResponse.setInstallmentFeePayMode(installmentFeePayMode); installmentResponse.setFirstFee(firstFee); installmentResponse.setEachFee(eachFee); installmentResponse.setFirstBackAmount(firstBackAmount); installmentResponse.setRealDiscountFeeRate(realDiscountFeeRate); response.setInstallmentResp(installmentResponse); } return response; } private String sign(Map mapData) { try { String signContent = CommonUtil.mapToString(mapData); return GMSignUtils.signMsgSM2(yinShengProperties.getPrivateKeyPath(), yinShengProperties.getPassword(), signContent); } catch (Exception e) { log.error("国密签名失败", e); throw new CommonException(e); } } private String encryptData(String data) { try { return GMSignUtils.encryptData(yinShengProperties.getPublicKeyPath(), data); } catch (Exception e) { log.error("参数加密失败,加密数据:{}", data, e); throw new CommonException(e); } } public FastProtocolResponse fastProtocolSign(FastProtocolSignDTO fastProtocolSignDTO) { try { Map mapData = prepareSignParam(fastProtocolSignDTO); log.info("银盛快捷协议支付签约申请入参为:{}", mapData.toString()); String result = post(mapData); log.info("银盛快捷协议支付签约申请响应参数为:{}", result); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject signObj = jsonObject.getJSONObject(BusinessTypeEnum.SIGN.getCode()); log.info("银盛快捷协议支付签约申请响应解密参数为:{}", signObj); FastProtocolResponse response = constructFastProtocolResponse(signObj); // 于2022-11-18新增 payRecordImpl(mapData, signObj); // 完 return response; } catch (Exception e) { log.error("银盛快捷协议支付签约申请失败", e); } return null; } @Autowired private PlatformTransactionManager transactionManager;// 引入 (平台)事务管理器,Spring 事务策略的核心。 /** * 于2022-11-18新增:录入支付记录表 */ @Async public void payRecordImpl(Map mapData, JSONObject signObj) { // 业务请求参数的集合 String biz_content = mapData.get("biz_content"); if (StringUtils.isBlank(biz_content)) { log.error("没有biz_content参数"); return; } JSONObject jsonObject = JSONObject.parseObject(biz_content); String method = mapData.get("method"); // 用户ID号 String user_id_str = jsonObject.getString("user_id"); Long user_id = StringUtils.isBlank(user_id_str) ? 0L : Long.parseLong(user_id_str); PayRecord payRecord = new PayRecord(); // ys 银盛支付 st闪态支付 al支付宝支付 yp 银盛签约 sp闪态签约 yd银盛获取短信验证 ys epay.trusteeship.sign.confirm sd闪态获取短信验证码 yc银盛签约确认 sc闪态签约确认 Integer payStatus = null;// 交易状态:支付、签约、短信等状态码,1成功 2失败 3 签约成功需再次确认 String trade_status = signObj.getString("trade_status"); String succ = "SUCCESS";// 成功; String failed = "FAILED"; // FAILED:签约失败 if (StringUtils.isBlank(trade_status)) {// 若trade_status参数为空 String code = signObj.getString("code"); String msg = signObj.getString("msg"); log.info("没有trade_status参数:{} code:{} msg:{}", user_id, code, msg); if ("10000".equals(code) && "Success".equals(msg)) { trade_status = "ysepay.trusteeship.fastPay".equals(method) ? "TRADE_SUCCESS" : succ; } else { trade_status = "ysepay.trusteeship.fastPay".equals(method) ? "TRADE_FAILED" : failed; } // return; } if ("ysepay.trusteeship.sign.confirm".equals(method)) {// 签约确认 payRecord.setPayType("yc"); if (succ.equals(trade_status)) { payStatus = 1; } else {// 失败 payStatus = 2; } } else if ("ysepay.trusteeship.sign".equals(method)) {// 签约 payRecord.setPayType("yp"); if (succ.equals(trade_status)) { payStatus = 1; } else if (failed.equals(trade_status)){// 失败 payStatus = 2; } else { payStatus = 3; } } else if ("ysepay.trusteeship.fastPay".equals(method)) {// 快捷支付 payRecord.setPayType("ys"); String pay_status = signObj.getString("pay_status"); trade_status = StringUtils.isNotBlank(pay_status) ? pay_status : trade_status; switch (trade_status) { case "TRADE_SUCCESS": payStatus = 1; break; case "TRADE_FAILED": // 失败 payStatus = 2; break; case "WAIT_BUYER_PAY": // 交易创建,等待买家付款 payStatus = 4; break; case "TRADE_CLOSED": // 在指定时间段内未支付时关闭的交易;客户主动关闭订单 payStatus = 5; break; case "TRADE_CANCEL": // 订单已撤销 payStatus = 7; break; case "TRADE_PROCESS": // 交易正在处理中,可对该交易做查询,避免重复支付 payStatus = 8; break; } } else { log.error("method参数不正确:{}", user_id); return; } if (payStatus == null) { log.error("交易状态参数不正确:{}", user_id); return; } payRecord.setPayStatus(payStatus); if (payStatus != 1) {// 交易状态不为1,成功 String sub_msg = signObj.getString("sub_msg"); payRecord.setPayError(sub_msg); payRecord.setPayErrorCode(trade_status); } // 订单号 String out_trade_no = jsonObject.getString("out_trade_no"); if (StringUtils.isBlank(out_trade_no)) { log.error("交易订单号不能为空:{}", user_id); return; } payRecord.setOutTradeNo(out_trade_no); // 交易时间 String timestamp = mapData.get("timestamp"); if (StringUtils.isBlank(timestamp)) { LocalDateTime payDate = LocalDateTime.now(); payRecord.setPayDate(payDate); } else { DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime payDate = LocalDateTime.parse(timestamp, df); payRecord.setPayDate(payDate); } // 短信验证码 String mobileVerifyCode = jsonObject.getString("mobile_verify_code"); payRecord.setMobileVerifyCode(mobileVerifyCode); // 若是银盛签约确认 if ("yc".equals(payRecord.getPayType())) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus defStatus = transactionManager.getTransaction(def);// 获得事务状态 // 获取获取验证码的数据 // payRecordService.lambdaQuery().eq(PayRecord::getOutTradeNo, out_trade_no).eq(PayRecord::getPayType, "yp"); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(PayRecord::getOutTradeNo, out_trade_no).eq(PayRecord::getPayType, "yp"); PayRecord ypPayRecord = payRecordService.getOne(wrapper); if (ypPayRecord != null) { payRecord.setUserId(ypPayRecord.getUserId()); payRecord.setId(ypPayRecord.getId()); payRecord.setMobileVerifyCode(ypPayRecord.getMobileVerifyCode()); payRecordService.updateById(payRecord); } transactionManager.commit(defStatus);// 手动提交事务 return; } if (user_id_str == null) { log.error("没有用户ID号"); return; } payRecord.setUserId(user_id); // 交易金额 String total_amount = jsonObject.getString("total_amount"); payRecord.setTotalAmount(total_amount); // 流水号 String tradeNo = signObj.getString("trade_no"); payRecord.setTradeNo(tradeNo); // 发起一个新事务 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);//新发起一个事务 TransactionStatus defStatus = transactionManager.getTransaction(def);// 获得事务状态 payRecordService.save(payRecord); transactionManager.commit(defStatus);// 手动提交事务 } public FastProtocolQueryResponse fastProtocolQuery(String protocolNo) { try { Map mapData = prepareSignQueryParam(protocolNo); log.info("银盛快捷协议支付签约查询请求入参为:{}", mapData.toString()); String result = post(mapData); log.info("银盛快捷协议支付签约查询请求响应参数为:{}", result); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject signObj = jsonObject.getJSONObject(BusinessTypeEnum.SIGN_QUERY.getCode()); log.info("银盛快捷协议支付签约查询请求响应解密参数为:{}", signObj); FastProtocolQueryResponse response = constructFastProtocolQueryResponse(signObj); return response; } catch (Exception e) { log.error("银盛快捷协议支付签约查询请求失败", e); } return null; } public FastProtocolResponse fastProtocolSignConfirm(FastProtocolSignConfirmDTO confirmDTO) { try { Map mapData = prepareSignConfirmParam(confirmDTO); log.info("银盛快捷协议支付签约确认请求入参为:{}", mapData.toString()); String result = post(mapData); log.info("银盛快捷协议支付签约确认请求响应参数为:{}", result); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject confirmObj = jsonObject.getJSONObject(BusinessTypeEnum.CONFIRM.getCode()); log.info("银盛快捷协议支付签约确认请求响应解密参数为:{}", confirmObj); FastProtocolResponse response = constructFastProtocolResponse(confirmObj); payRecordImpl(mapData, confirmObj); return response; } catch (Exception e) { log.error("银盛快捷协议支付签约确认请求失败", e); } return null; } public SmsResendResponse smsResend(String paySn) { try { Map mapData = prepareSmsResendParam(paySn); log.info("银盛快捷协议支付重新发送支付验证短信请求入参为:{}", mapData.toString()); String result = post(mapData); log.info("银盛快捷协议支付重新发送支付验证短信请求响应参数为:{}", result); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject payObj = jsonObject.getJSONObject(BusinessTypeEnum.SMS_RESEND.getCode()); log.info("银盛快捷协议支付重新发送支付验证短信请求解密参数为:{}", payObj); SmsResendResponse ret = constructSmsResendResponse(payObj); return ret; } catch (Exception e) { log.error("银盛快捷协议支付重新发送支付验证短信请求失败", e); } return null; } public FastProtocolPayResponse smsConfirm(SmsConfirmDTO confirmDTO) { try { Map mapData = prepareSmsConfirmParam(confirmDTO); log.info("银盛快捷协议支付短信确认支付请求入参为:{}", mapData.toString()); String result = post(mapData); log.info("银盛快捷协议支付短信确认支付请求响应参数为:{}", result); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject payObj = jsonObject.getJSONObject(BusinessTypeEnum.PAY.getCode()); log.info("银盛快捷协议支付短信确认支付请求响应解密参数为:{}", payObj); FastProtocolPayResponse ret = constructFastProtocolPayResponse(payObj); // 于2022-11-18新增 payRecordImpl(mapData, payObj); // 完 return ret; } catch (Exception e) { log.error("银盛快捷协议支付短信确认支付失败", e); } return null; } public FastProtocolPayResponse fastProtocolPay(FastProtocolPayDTO payDTO) { try { Map mapData = preparePayParam(payDTO); log.info("银盛快捷协议支付请求入参为:{}", mapData.toString()); String result = post(mapData); log.info("银盛快捷协议支付请求响应参数为:{}", result); JSONObject jsonObject = JSONObject.parseObject(result); JSONObject payObj = jsonObject.getJSONObject(BusinessTypeEnum.PAY.getCode()); log.info("银盛快捷协议支付请求响应解密参数为:{}", payObj); FastProtocolPayResponse ret = constructFastProtocolPayResponse(payObj); // 于2022-11-18新增 payRecordImpl(mapData, payObj); // 完 return ret; } catch (Exception e) { log.error("银盛快捷协议支付失败", e); } return null; } }