From: Xia Kaixiang Date: Tue, 16 Jul 2019 10:54:04 +0000 (+0800) Subject: 市民卡支付完善 X-Git-Tag: 1.0.0^2~39 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=fd9a6a6c75a6b178b216e2b9a9d0b87ec8e9eb7e;p=epayment%2Ffood_payapi.git 市民卡支付完善 --- diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java index 5b0e7dc0..175bdbce 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CitizenCardPayinitParam.java @@ -40,6 +40,10 @@ public class CitizenCardPayinitParam extends APIRequestParam { @NotNull(message = "交易时间不能为空") private String transtime; + @Sign + @NotNull(message = "流水类型不能为空") + private String dtltype; + @Override public boolean checkParam() throws RequestParamCheckException { if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/exception/RequestParamCheckException.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/exception/RequestParamCheckException.java index a58a3362..fdce7215 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/exception/RequestParamCheckException.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/exception/RequestParamCheckException.java @@ -4,8 +4,8 @@ public class RequestParamCheckException extends Exception { private int errCode; public RequestParamCheckException(String message) { - super(String.format("Req-%d,%s", 300001, message)); - this.errCode = errCode; + super(String.format("Req-%d,%s", 20000, message)); + this.errCode = 20000; } public int getErrCode() { diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/controller/TestAction.java b/payapi/src/main/java/com/supwisdom/dlpay/api/controller/TestAction.java deleted file mode 100644 index 9a2d51b4..00000000 --- a/payapi/src/main/java/com/supwisdom/dlpay/api/controller/TestAction.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.supwisdom.dlpay.api.controller; - -import com.supwisdom.dlpay.api.bean.BaseResp; -import com.supwisdom.dlpay.framework.data.SystemDateTime; -import com.supwisdom.dlpay.framework.service.SystemUtilService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -@Controller //将所有方法标识@ResponseBody注解 -@RequestMapping("/test") -public class TestAction { - @Autowired - private SystemUtilService systemUtilService; - - @RequestMapping("/demo") - @ResponseBody - public BaseResp test() { - SystemDateTime dt = systemUtilService.getSysdatetime(); - - BaseResp resp = new BaseResp(); - resp.setRetcode("0"); - resp.setRetmsg("OK"); - resp.setData("hostdate=["+dt.getHostdate()+"],hosttime=["+dt.getHosttime()+"],hostdatetime=["+dt.getHostdatetime()+"],date=["+dt.getSysdate()+"]"); - return resp; - } -} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ReverseDtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ReverseDtlDao.java new file mode 100644 index 00000000..87b0e770 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/ReverseDtlDao.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.api.dao; + +import com.supwisdom.dlpay.api.domain.TReverseDtl; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface ReverseDtlDao extends JpaRepository { + + @Query("from TReverseDtl t where t.originRefno=?1 and t.billno=?2 ") + TReverseDtl findByOriginRefnoAndBillno(String originRefno, String billno); +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TReverseDtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TReverseDtl.java new file mode 100644 index 00000000..93e30b3b --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TReverseDtl.java @@ -0,0 +1,140 @@ +package com.supwisdom.dlpay.api.domain; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Entity +@Table(name = "TB_REVERSEDTL", indexes = {@Index(name = "TB_REVERSEDTL_UK", unique = true, columnList = "originRefno, billno")}) +public class TReverseDtl { + @Id + @GenericGenerator(name = "idGenerator", strategy = "uuid") + @GeneratedValue(generator = "idGenerator") + @Column(name = "ID", nullable = false, length = 32) + private String id; + + @Column(name = "ORIGIN_REFNO", length = 20) + @NotNull + private String originRefno; //原始流水号 + + @Column(name = "BILLNO", length = 20) + @NotNull + private String billno; //业务系统请求流水号 + + @Column(name = "TRANSDATE", length = 8) + @NotNull + private String transdate; + + @Column(name = "TRANSTIME", length = 6) + @NotNull + private String transtime; + + @Column(name = "REFUND_AMOUNT", precision = 9) + private Integer refundAmount; //退款金额 + + @Column(name = "REVERSE_FLAG", nullable = false, length = 10) + @NotNull + private String reverseFlag; //refund, cancel + + @Column(name = "STATUS", nullable = false, length = 20) + @NotNull + private String status; + + @Column(name = "REMARK", length = 600) + private String remark; + + @Column(name = "CREATETIME", length = 14) + private String createtime; + + @Column(name = "tenantid", length = 20) + private String tenantid = ""; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOriginRefno() { + return originRefno; + } + + public void setOriginRefno(String originRefno) { + this.originRefno = originRefno; + } + + public String getBillno() { + return billno; + } + + public void setBillno(String billno) { + this.billno = billno; + } + + public String getTransdate() { + return transdate; + } + + public void setTransdate(String transdate) { + this.transdate = transdate; + } + + public String getTranstime() { + return transtime; + } + + public void setTranstime(String transtime) { + this.transtime = transtime; + } + + public Integer getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Integer refundAmount) { + this.refundAmount = refundAmount; + } + + public String getReverseFlag() { + return reverseFlag; + } + + public void setReverseFlag(String reverseFlag) { + this.reverseFlag = reverseFlag; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime; + } + + public String getTenantid() { + return tenantid; + } + + public void setTenantid(String tenantid) { + this.tenantid = tenantid; + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java index ba51cfdf..eaa385c5 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSubjectdtl.java @@ -59,6 +59,10 @@ public class TSubjectdtl { @NotNull private String tenantid = ""; + @Column(name = "DTLTYPE", length = 20) + @NotNull + private String dtltype; + public String getRefno() { return refno; } @@ -170,4 +174,12 @@ public class TSubjectdtl { public void setTenantid(String tenantid) { this.tenantid = tenantid; } + + public String getDtltype() { + return dtltype; + } + + public void setDtltype(String dtltype) { + this.dtltype = dtltype; + } } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java index fdd77e5b..8435ce16 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionMain.java @@ -58,6 +58,9 @@ public class TTransactionMain { @Column(name = "sourcetype", length = 20) private String sourceType = ""; + @Column(name = "SOURCETYPE_REFNO", length = 32) + private String sourceTypeRefno; + @Column(name = "outtradeno", length = 60) private String outTradeNo = ""; @@ -116,6 +119,7 @@ public class TTransactionMain { private String tenantid = ""; @Column(name = "DTLTYPE", length = 20) + @NotNull private String dtltype; public String getDtltype() { @@ -295,6 +299,14 @@ public class TTransactionMain { this.sourceType = sourceType; } + public String getSourceTypeRefno() { + return sourceTypeRefno; + } + + public void setSourceTypeRefno(String sourceTypeRefno) { + this.sourceTypeRefno = sourceTypeRefno; + } + public Integer getTransCode() { return transCode; } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java index 9d36cea0..e731908e 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/DictionaryDao.java @@ -13,4 +13,7 @@ public interface DictionaryDao extends JpaRepository { List findAllByDicttype(String dicttype); void deleteByDicttype(String dicttype); + + @Query("from TDictionary t where t.dicttype=?1 and t.dictval=?2 ") + TDictionary getByDicttypeAndDictval(String dicttype, String dictval); } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java index 46377e92..c7c9d891 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/Dictionary.java @@ -7,6 +7,7 @@ public class Dictionary { public static final String IDTYPE = "idtypeList"; public static final String SEX = "sexList"; public static final String ACCOUNT_STATUS = "accountStatusList"; + public static final String DTLTYPES = "dtltypeList"; ///////////////////////////////////// public static final String SOURCE_TYPE = "sourcetypeList"; diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java index d48c602c..2ff2c018 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java @@ -89,16 +89,6 @@ public class TradeErrorCode { */ public static final int LOCK_READ_TIMEOUT = 10015; - /** - * 卡已挂失 - */ - public static final int ACCOUNT_IS_LOSS = 10016; - - /** - * 卡已锁定 - */ - public static final int ACCOUNT_IS_LOCKED = 10017; - /** * 费用类别未定义 */ @@ -140,4 +130,19 @@ public class TradeErrorCode { public static final int REQUEST_PARAM_EEROR = 30005; // 请求参数实体位置错误 + //============= 交易错误 ============// + public static final int CARD_NOT_EXISTS = 40000; //卡不存在 + + public static final int CARD_IS_CLOSED = 40001; //卡已注销 + + public static final int ACCOUNT_IS_LOSS = 40002; //卡已挂失 + + public static final int ACCOUNT_IS_FROZEN = 40003; //卡已挂失 + + public static final int ACCOUNT_IS_LOCKED = 40004; //卡已锁定 + + public static final int WAIT_QUERY_RESULT = 55555; //查询结果 + + + } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java index d5a2528f..ef6fea07 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/util/YnrccUtil.java @@ -26,6 +26,18 @@ public class YnrccUtil { public static final String TRANSTYPE_SIGNCARD = "1"; //签约 public static final String TRANSTYPE_UNSIGNCARD = "2"; //解约 + public static final String CODE_SUCCESS = "0000"; //成功 + public static final String CODE_NOT_EXISTS = "0401"; //流水不存在 + public static final String CODE_EXCEPTION = "10000"; //异常 + + //查询接口返回的流水状态 + public static final String DTL_STATUS_SUCCESS = "0"; //成功 + public static final String DTL_STATUS_FAIL = "1"; //失败 + public static final String DTL_STATUS_REFUND = "2"; //已退款 + public static final String DTL_STATUS_PART_REFUND = "3"; //部分退款 + + public static final int QUERY_MAX_COUNT = 3; //查询最大次数 + public static final Map errcode = new HashMap<>(0); static { errcode.put("0000", "成功"); diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt index 83bfde8e..0a2c5d52 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/async_tasks.kt @@ -1,6 +1,9 @@ package com.supwisdom.dlpay.api import com.supwisdom.dlpay.api.repositories.ShopaccService +import com.supwisdom.dlpay.api.service.TransactionServiceProxy +import com.supwisdom.dlpay.citizencard.service.CitizencardPayService +import com.supwisdom.dlpay.util.YnrccUtil import mu.KotlinLogging import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler import org.springframework.beans.factory.annotation.Autowired @@ -17,7 +20,7 @@ import java.util.concurrent.Executor @Configuration @EnableAsync class SpringAsyncConfig : AsyncConfigurer { - @Bean("shopAccBalanceUpdater") + @Bean(value = ["shopAccBalanceUpdater", "queryCitizencardPayResult"]) fun threadPoolExecutor(): Executor { return ThreadPoolTaskExecutor().apply { corePoolSize = 5 @@ -50,4 +53,59 @@ class ShopAccBalanceAsyncTask { fun updateShopBalance(shopdtlRefno: String) { shopaccService.recalcShopBalance(shopdtlRefno, true) } +} + +@Component +class CitizencardQueryResultTask { + private val logger = KotlinLogging.logger { } + + @Autowired + private lateinit var citizencardPayService: CitizencardPayService + @Autowired + lateinit var transactionService: TransactionServiceProxy + + @Async("queryCitizencardPayResult") + fun queryResult(refno: String, qcnt: Int) { + try { + if(qcnt >= YnrccUtil.QUERY_MAX_COUNT){ + //查询超最大次数 + logger.error("查询refno=[$refno]流水结果查询超最大次数[${YnrccUtil.QUERY_MAX_COUNT}]") + return + } + + logger.info("refno=[$refno]开始第" + (qcnt + 1) + "次查询支付结果:") + val resp = citizencardPayService.queryResult(refno) + when { + YnrccUtil.CODE_SUCCESS == resp.code -> { + //查询成功 + when { + YnrccUtil.DTL_STATUS_SUCCESS == resp.status -> + transactionService.success(refno, resp.bankjourno) //流水成功 + YnrccUtil.DTL_STATUS_REFUND == resp.status -> { + //流水已退款 + return + } + YnrccUtil.DTL_STATUS_PART_REFUND == resp.status -> { + //流水已部分退款 TODO:暂无逻辑 + return + } + else -> { + //流水失败 + transactionService.fail(refno, "查询流水状态为交易失败") + } + } + } + YnrccUtil.CODE_NOT_EXISTS == resp.code -> + transactionService.fail(refno, "银行流水不存在") //银行返回流水不存在 + YnrccUtil.CODE_EXCEPTION == resp.code -> + queryResult(refno, qcnt + 1) //查询次数加1 + else -> { + //其他明确错误,查询失败 + logger.error("查询refno=[$refno]流水结果返回失败:code=[${resp.code}],message=[${resp.message}]") + } + } + } catch (ex: Exception) { + ex.printStackTrace() + } + } } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt index 24efe809..8361ebbc 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt @@ -2,16 +2,13 @@ package com.supwisdom.dlpay.api.controller import com.supwisdom.dlpay.api.* import com.supwisdom.dlpay.api.bean.* -import com.supwisdom.dlpay.api.service.AccountUtilServcie -import com.supwisdom.dlpay.api.service.ConsumePayService -import com.supwisdom.dlpay.api.service.TransactionServiceProxy -import com.supwisdom.dlpay.api.service.UserService +import com.supwisdom.dlpay.api.domain.TReverseDtl +import com.supwisdom.dlpay.api.service.* +import com.supwisdom.dlpay.citizencard.service.CitizencardPayService import com.supwisdom.dlpay.framework.ResponseBodyBuilder import com.supwisdom.dlpay.framework.service.SystemUtilService -import com.supwisdom.dlpay.framework.util.Subject -import com.supwisdom.dlpay.framework.util.TradeCode -import com.supwisdom.dlpay.framework.util.TradeDict -import com.supwisdom.dlpay.framework.util.TradeErrorCode +import com.supwisdom.dlpay.framework.util.* +import com.supwisdom.dlpay.util.YnrccUtil import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping @@ -33,6 +30,12 @@ class ConsumeAPIController { lateinit var consumePayService: ConsumePayService @Autowired lateinit var transactionService: TransactionServiceProxy + @Autowired + lateinit var cardService: CardService + @Autowired + lateinit var citizencardPayService: CitizencardPayService + @Autowired + lateinit var citizencardQueryResultTask: CitizencardQueryResultTask /** * ============================================================================ @@ -128,9 +131,9 @@ class ConsumeAPIController { * */ @PostMapping("/citizencard/payinit") fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayinitParam): ResponseEntity { - val person = userService.findPersonByIdentityCheckStatus(param.cardNo) + val person = cardService.getPersonByCitizencard(param.cardNo) + val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES) if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) { - val account = accountUtilServcie.readAccount(person.userid) val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno) val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD) @@ -141,7 +144,8 @@ class ConsumeAPIController { setOutTransInfo(shopacc.shopaccno, param.billno) operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) payinfo = param.cardNo - description = "市民卡代扣消费" + description = dtlType.dictcaption + dtltype = param.dtltype }.person(account).apply { setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT) setOpposite(AccountProxy(shopacc)) @@ -149,9 +153,9 @@ class ConsumeAPIController { setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN) setOpposite(AccountProxy(account)) }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account), - param.amount / 100.0, "市民卡代扣消费") + param.amount / 100.0, dtlType.dictcaption) .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), - param.amount / 100.0, "市民卡代扣消费") + param.amount / 100.0, dtlType.dictcaption) .also { param.feelist?.also { TODO("feelist 费用清单未实现!") @@ -199,23 +203,26 @@ class ConsumeAPIController { * */ @PostMapping("/citizencard/payfinish") fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayfinishParam): ResponseEntity { - val code = transactionService.wip(param.refno).let { - CallService.CallCitizenCardPay( - consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, it.shopDtl.shopaccno), - it.shopDtl) - } - if (code.retcode == "0") { - transactionService.success(param.refno, "支付").let { + val dtl = transactionService.wip(param.refno) + var resp = citizencardPayService.cardPay(dtl.shopDtl.shopaccno, dtl.personDtl.userid, MoneyUtil.YuanToFen(dtl.personDtl.amount), dtl.refno) + if (YnrccUtil.CODE_SUCCESS == resp.code) { + //成功 + transactionService.success(param.refno, resp.bankjourno).let { return ResponseEntity.ok(ResponseBodyBuilder.create() .success(CitizenPayResponse(it.refno, it.outTradeNo, it.shopDtl.amount), "交易确认成功")) } - + } else if (YnrccUtil.CODE_EXCEPTION == resp.code) { + //去查询 + citizencardQueryResultTask.queryResult(dtl.refno, 0) + return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.WAIT_QUERY_RESULT, "请查询支付结果")) } else { - transactionService.fail(param.refno).let { + //失败 + transactionService.fail(param.refno, resp.message).let { return ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}")) + .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${resp.message}")) } } } @@ -227,19 +234,39 @@ class ConsumeAPIController { * */ @PostMapping("/paycancel") fun payCancel(@Valid @RequestBody param: ConsumePayCancelParam): ResponseEntity { - consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let { - val builder = TransactionBuilder().apply { - setTransInfo(param.transdate, param.transtime, it.transCode, it.sourceType) - setOutTransInfo(it.outId, param.requestbillno) - } - val cancelTrans = builder.cancelInit(it.refno, transactionService) - //fixme: 撤销逻辑 - if (it.sourceType.isNotEmpty()) { - // 第三方冲正 + consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {mainDtl-> + //保存撤销请求 + val reverseDtl = consumePayService.saveInitReverseDtl(TReverseDtl().apply { + this.originRefno = mainDtl.refno + this.billno = param.billno + this.transdate = param.transdate + this.transtime = param.transtime + this.refundAmount = null + this.reverseFlag = TradeDict.REVERSE_FLAG_CANCEL //撤销 + this.status = TradeDict.DTL_STATUS_INIT + this.createtime = systemUtilService.sysdatetime.hostdatetime + }) + + try { + //TODO: 不管撤销怎么样返回成功 + val builder = TransactionBuilder().apply { + setTransInfo(param.transdate, param.transtime, mainDtl.transCode, mainDtl.sourceType) + setOutTransInfo(mainDtl.outId, param.requestbillno) + } + val cancelTrans = builder.cancelInit(mainDtl.refno, transactionService) + //fixme: 撤销逻辑 + if (mainDtl.sourceType.isNotEmpty()) { + // 第三方冲正 + } + transactionService.success(cancelTrans.refno) + + } catch (ex: Exception) { + ex.printStackTrace() } - transactionService.success(cancelTrans.refno) + + return ResponseEntity.ok(ResponseBodyBuilder.create() - .success(PayReverseResponse(cancelTrans.refno), "交易确认成功")) + .success(PayReverseResponse(""), "交易确认成功")) } ?: return ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在")) } @@ -251,24 +278,42 @@ class ConsumeAPIController { * */ @PostMapping("/payrefund") fun payRefund(@Valid @RequestBody param: ConsumePayRefundParam): ResponseEntity { - consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let { - val builder = TransactionBuilder().apply { - setTransInfo(param.transdate, param.transtime, it.transCode, it.sourceType) - setOutTransInfo(it.outId, param.requestbillno) - } - val refundTrans = builder.refundInit(it.refno, - param.refundAmount / 100.0, transactionService) - //fixme: 撤销逻辑 - if (it.sourceType.isNotEmpty()) { - // 第三方冲正 + consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {mainDtl-> + //保存退款请求 + val reverseDtl = consumePayService.saveInitReverseDtl(TReverseDtl().apply { + this.originRefno = mainDtl.refno + this.billno = param.billno + this.transdate = param.transdate + this.transtime = param.transtime + this.refundAmount = null + this.reverseFlag = TradeDict.REVERSE_FLAG_REFUND //撤销 + this.status = TradeDict.DTL_STATUS_INIT + this.createtime = systemUtilService.sysdatetime.hostdatetime + }) + + try{ + val builder = TransactionBuilder().apply { + setTransInfo(param.transdate, param.transtime, mainDtl.transCode, mainDtl.sourceType) + setOutTransInfo(mainDtl.outId, param.requestbillno) + } + val refundTrans = builder.refundInit(mainDtl.refno, + param.refundAmount / 100.0, transactionService) + //fixme: 撤销逻辑 + if (mainDtl.sourceType.isNotEmpty()) { + // 第三方冲正 + } + transactionService.success(refundTrans.refno) + }catch (ex :Exception){ + ex.printStackTrace() } - transactionService.success(refundTrans.refno) + return ResponseEntity.ok(ResponseBodyBuilder.create() - .success(PayReverseResponse(refundTrans.refno), "交易确认成功")) + .success(PayReverseResponse(""), "交易确认成功")) } ?: return ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在")) } + /** * ============================================================================ * 一卡通支付【交易初始化】 diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt new file mode 100644 index 00000000..4b09146d --- /dev/null +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/card_service.kt @@ -0,0 +1,15 @@ +package com.supwisdom.dlpay.api.service + +import com.supwisdom.dlpay.api.domain.TCard +import com.supwisdom.dlpay.api.domain.TPerson +import org.springframework.transaction.annotation.Transactional + +interface CardService { + @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true) + fun getBankcardByUserid(userid: String): TCard? + + @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true) + fun getPersonByCitizencard(cardno: String, ignoreStatus: Boolean? = false): TPerson + + +} \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt index ec92ddcb..02533abf 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt @@ -1,6 +1,8 @@ package com.supwisdom.dlpay.api.service +import com.supwisdom.dlpay.api.domain.TReverseDtl import com.supwisdom.dlpay.api.domain.TTransactionMain +import com.supwisdom.dlpay.framework.domain.TDictionary import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional @@ -16,4 +18,13 @@ interface ConsumePayService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true) fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain? + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true) + fun getDtltypeDictionary(dictval:String, dicttype:String):TDictionary + + @Transactional(rollbackFor = [Exception::class]) + fun saveOrUpdateReverseDtl(revDtl: TReverseDtl): TReverseDtl + + //没有事务 + fun saveInitReverseDtl(revDtl: TReverseDtl): TReverseDtl } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt index 8b378e8d..d5a960f4 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/dali_datasync_service.kt @@ -10,7 +10,4 @@ interface DaliDatasyncService{ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) fun doUpdateUserInfos(bean: DaliDatasyncDetail): Boolean - @Transactional(rollbackFor = arrayOf(Exception::class), readOnly = true) - fun getBankcardByUserid(userid: String): TCard? - } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt new file mode 100644 index 00000000..4610ef7e --- /dev/null +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/card_service_impl.kt @@ -0,0 +1,41 @@ +package com.supwisdom.dlpay.api.service.impl + +import com.supwisdom.dlpay.api.dao.CardDao +import com.supwisdom.dlpay.api.dao.PersonDao +import com.supwisdom.dlpay.api.domain.TCard +import com.supwisdom.dlpay.api.domain.TPerson +import com.supwisdom.dlpay.api.service.CardService +import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.util.TradeDict +import com.supwisdom.dlpay.framework.util.TradeErrorCode +import com.supwisdom.dlpay.util.ConstantUtil +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class CardServiceImpl : CardService { + @Autowired + lateinit var cardDao: CardDao + @Autowired + lateinit var personDao: PersonDao + + override fun getBankcardByUserid(userid: String): TCard? { + return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_BANKCARD) + } + + override fun getPersonByCitizencard(cardno: String, ignoreStatus: Boolean?): TPerson { + val cityCard = cardDao.findCardByCardnoAndCardtype(cardno, ConstantUtil.CARDTYPE_CITIZENCARD) + ?: throw TransactionProcessException(TradeErrorCode.CARD_NOT_EXISTS, "市民卡[$cardno]不存在!") + if (true != ignoreStatus) { + when { + TradeDict.STATUS_NORMAL != cityCard.status -> throw TransactionProcessException(TradeErrorCode.CARD_IS_CLOSED, "市民卡[$cardno]已经注销!") + TradeDict.STATUS_LOST == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "市民卡[$cardno]已经挂失!") + TradeDict.STATUS_FROZEN == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_FROZEN, "市民卡[$cardno]已经冻结!") + TradeDict.STATUS_LOCKED == cityCard.transStatus -> throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "市民卡[$cardno]已被锁定!") + } + } + + return personDao.findByUserid(cityCard.userid) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "市民卡[$cardno]用户信息不存在!") + } +} \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt index 6ab347ee..0396d366 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt @@ -1,11 +1,21 @@ package com.supwisdom.dlpay.api.service.impl +import com.supwisdom.dlpay.api.dao.ReverseDtlDao import com.supwisdom.dlpay.api.dao.TransactionMainDao +import com.supwisdom.dlpay.api.domain.TReverseDtl import com.supwisdom.dlpay.api.domain.TTransactionMain +import com.supwisdom.dlpay.api.exception.RequestParamCheckException import com.supwisdom.dlpay.api.service.ConsumePayService import com.supwisdom.dlpay.api.service.SourceTypeService +import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.dao.DictionaryDao +import com.supwisdom.dlpay.framework.domain.TDictionary +import com.supwisdom.dlpay.framework.tenant.TenantContext +import com.supwisdom.dlpay.framework.util.Dictionary import com.supwisdom.dlpay.framework.util.StringUtil +import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired +import org.springframework.dao.DataAccessException import org.springframework.stereotype.Service @Service @@ -14,6 +24,10 @@ class ConsumePayServiceImpl : ConsumePayService { lateinit var sourceTypeService: SourceTypeService @Autowired lateinit var transactionMainDao: TransactionMainDao + @Autowired + lateinit var dictionaryDao: DictionaryDao + @Autowired + lateinit var reverseDtlDao: ReverseDtlDao override fun checkShopPaytype(shopaccno: String, sourceType: String, anonymousflag: Boolean?): Boolean { return sourceTypeService.checkShopSourceType(shopaccno, sourceType, true == anonymousflag) @@ -35,5 +49,26 @@ class ConsumePayServiceImpl : ConsumePayService { TODO("未实现方法") } + override fun getDtltypeDictionary(dictval: String, dicttype: String): TDictionary { + return dictionaryDao.getByDicttypeAndDictval(dicttype, dictval) + ?: throw RequestParamCheckException("未识别流水类别[$dictval]") + } + + override fun saveOrUpdateReverseDtl(revDtl: TReverseDtl): TReverseDtl { + if (StringUtil.isEmpty(revDtl.tenantid)) { + revDtl.tenantid = TenantContext.getTenantSchema() + } + return reverseDtlDao.save(revDtl) + } + + override fun saveInitReverseDtl(revDtl: TReverseDtl): TReverseDtl { + return try { + saveOrUpdateReverseDtl(revDtl) + } catch (ex: DataAccessException) { + //唯一索引冲突,其他异常抛出 + reverseDtlDao.findByOriginRefnoAndBillno(revDtl.originRefno, revDtl.billno) + ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "保存撤销或退款请求失败") + } + } } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt index d3453304..df5ed081 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/dali_datasync_service_impl.kt @@ -129,8 +129,4 @@ class DaliDatasyncServiceImpl : DaliDatasyncService { return true } - - override fun getBankcardByUserid(userid: String): TCard? { - return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_BANKCARD) - } } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt index d51f97ab..99f6948a 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt @@ -80,6 +80,7 @@ class TransactionServiceImpl : TransactionService { settleDate = null tenantid = TenantContext.getTenantSchema() this.sourceType = sourceType.sourceType + dtltype = builder.dtltype } if (builder.hasPerson()) { @@ -104,6 +105,7 @@ class TransactionServiceImpl : TransactionService { this.reverseFlag = TradeDict.REVERSE_FLAG_NONE remark = builder.person().remark tenantid = transaction.tenantid + this.dtltype = builder.dtltype this.status = status }.also { // persondtlDao.save(it) @@ -133,6 +135,7 @@ class TransactionServiceImpl : TransactionService { this.reverseFlag = TradeDict.REVERSE_FLAG_NONE this.updateBala = false this.tenantid = transaction.tenantid + this.dtltype = builder.dtltype this.status = status }.also { // save shopdtl @@ -154,6 +157,7 @@ class TransactionServiceImpl : TransactionService { this.oppositeAccNo = builder.subject().oppositeAccNo() this.oppositeAccName = builder.subject().oppositeAccName() this.tenantid = transaction.tenantid + this.dtltype = builder.dtltype this.status = status }.also { transaction.subjectDtl = it @@ -313,7 +317,7 @@ class TransactionServiceImpl : TransactionService { ////////////////////////////////////////////////////////////////// // 成功 - private fun transactionOnSuccess(transaction: TTransactionMain, remark: String, overdraft: Boolean) { + private fun transactionOnSuccess(transaction: TTransactionMain, sorcetypeRefno: String, overdraft: Boolean) { if (transaction.person) { // update account balance val amount = transaction.sumAmountByAccno( @@ -327,21 +331,20 @@ class TransactionServiceImpl : TransactionService { "个人流水<${transaction.refno}>不存在") } transaction.personDtl.status = TradeDict.DTL_STATUS_SUCCESS - transaction.personDtl.remark = remark } if (transaction.shop) { transaction.shopDtl.updateBala = false transaction.shopDtl.status = TradeDict.DTL_STATUS_SUCCESS transaction.shopDtl.accdate = transaction.accdate - transaction.shopDtl.remark = remark } if (transaction.subject) { // update subject balance } + transaction.sourceTypeRefno = sorcetypeRefno } - override fun success(refno: String, remark: String): TTransactionMain { + override fun success(refno: String, sourcetypeRefno: String): TTransactionMain { val transaction = transactionMainDao.findByRefnoForUpdate(refno) ?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "参考号<$refno>错误,流水不存在") @@ -351,7 +354,7 @@ class TransactionServiceImpl : TransactionService { } transaction.status = TradeDict.DTL_STATUS_SUCCESS transaction.accdate = systemUtilService.accdate - transactionOnSuccess(transaction, remark, false) + transactionOnSuccess(transaction, sourcetypeRefno, false) transaction.endTime = systemUtilService.sysdatetime.sysdate transactionMainDao.save(transaction) diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt index fff1a0e0..011244aa 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt @@ -27,7 +27,7 @@ interface TransactionService { fun fail(refno: String, remark: String): TTransactionMain @Transactional - fun success(refno: String, remark: String): TTransactionMain + fun success(refno: String, sourcetypeRefno: String): TTransactionMain @Transactional fun success(refno: String): TTransactionMain @@ -84,8 +84,8 @@ class TransactionServiceProxy { return transactionService.fail(refno, remark) } - fun success(refno: String, remark: String): TTransactionMain { - return transactionService.success(refno, remark).also { + fun success(refno: String, sourcetypeRefno: String): TTransactionMain { + return transactionService.success(refno, sourcetypeRefno).also { if (it.shop) { shopAccBalanceAsyncTask.updateShopBalance(it.refno) } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt index a237617b..b0f583fb 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/transaction_builder.kt @@ -211,6 +211,7 @@ class TransactionBuilder { var payinfo: String = "" var description: String = "" var remark: String = "" + var dtltype: String = "" fun person(): PersonTranactionBuilder { return this.personBuilder @@ -295,6 +296,11 @@ class TransactionBuilder { } fun preCheck() { + if (dtltype.isNullOrEmpty()) { + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, + "流水类型错误") + } + if (outId.isNotEmpty() && outtradeno.isEmpty()) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "第三方账号未指定第三方流水号") diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt index 5da11166..49dbe4d8 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/citizencard_service.kt @@ -1,18 +1,18 @@ package com.supwisdom.dlpay.citizencard.service import com.supwisdom.dlpay.api.bean.DlpayResp -import com.supwisdom.dlpay.api.domain.TPerson interface CitizencardPayService { fun bindCard(bankcardno: String, username: String, idtype: String, idno: String, phone: String): DlpayResp fun signCard(bankcardno: String, username: String, idtype: String, idno: String, phone: String, transtype: String): DlpayResp - fun cardPay(shopaccno: String, person: TPerson, amount: Int, refno: String): DlpayResp + fun cardPay(shopaccno: String, userid: String, amount: Int, refno: String): DlpayResp fun cardPayRefund(refno: String, orignRefno: String, amount: Int): DlpayResp - fun queryResult(refno: String, orignRefno: String): DlpayResp + fun queryResult(orignRefno: String): DlpayResp + fun getChkfilename(checkdate: String, merchantBankcardno: String?): DlpayResp } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt index 96b8dda7..2439bcfb 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/citizencard/service/impl/citizencard_service_impl.kt @@ -4,9 +4,9 @@ import com.google.gson.Gson import com.sun.jersey.api.client.Client import com.sun.jersey.api.client.ClientResponse import com.supwisdom.dlpay.api.bean.DlpayResp -import com.supwisdom.dlpay.api.domain.TPerson -import com.supwisdom.dlpay.api.service.DaliDatasyncService +import com.supwisdom.dlpay.api.service.CardService import com.supwisdom.dlpay.api.service.SourceTypeService +import com.supwisdom.dlpay.api.service.UserService import com.supwisdom.dlpay.api.types.IDTypes import com.supwisdom.dlpay.citizencard.service.CitizencardPayService import com.supwisdom.dlpay.framework.service.SystemUtilService @@ -14,15 +14,19 @@ import com.supwisdom.dlpay.framework.util.* import com.supwisdom.dlpay.util.YnrccUtil import mu.KotlinLogging import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service import javax.ws.rs.core.MediaType +@Service class CitizencardPayServiceImpl : CitizencardPayService { @Autowired lateinit var sourceTypeService: SourceTypeService @Autowired lateinit var systemUtilService: SystemUtilService @Autowired - lateinit var daliDatasyncService: DaliDatasyncService + lateinit var cardService: CardService + @Autowired + lateinit var userService: UserService private val logger = KotlinLogging.logger { } @@ -148,7 +152,7 @@ class CitizencardPayServiceImpl : CitizencardPayService { } } - override fun cardPay(shopaccno: String, person: TPerson, amount: Int, refno: String): DlpayResp { + override fun cardPay(shopaccno: String, userid: String, amount: Int, refno: String): DlpayResp { var resp = DlpayResp() val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, shopaccno, false, false) if (!checkCitizencardConfig(config, resp)) { @@ -162,6 +166,7 @@ class CitizencardPayServiceImpl : CitizencardPayService { logger.error(resp.message) return resp } + val person = userService.findOnePersonByUserid(userid) val idType = IDTypes.findByValue(person.idtype) if (idType < 0) { resp.code = YnrccUtil.PARAM_VALUE_ERROR @@ -169,7 +174,7 @@ class CitizencardPayServiceImpl : CitizencardPayService { logger.error(resp.message) return resp } - val userBankcard = daliDatasyncService.getBankcardByUserid(person.userid) + val userBankcard = cardService.getBankcardByUserid(person.userid) if (null == userBankcard) { resp.code = "99" resp.message = "用户[${person.userid}]未绑定银行卡" @@ -210,18 +215,26 @@ class CitizencardPayServiceImpl : CitizencardPayService { params["sign"] = sign val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/cardpay" logger.error("url=[$url], params=[" + Gson().toJson(params) + "]") - val client = Client.create() - client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000) - val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java) - return if (200 == respClient.status) { - resp = respClient.getEntity(DlpayResp::class.java) - logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]") - resp - } else { - resp.code = "99" - resp.message = "请求前置返回失败[httpStatus=$respClient.status]" + try { + val client = Client.create() + client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000) + val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java) + return if (200 == respClient.status) { + resp = respClient.getEntity(DlpayResp::class.java) + logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]") + resp + } else { + resp.code = "99" + resp.message = "请求前置返回失败[httpStatus=$respClient.status]" + logger.error(resp.message) + resp + } + } catch (e: Exception) { + e.printStackTrace() + resp.code = YnrccUtil.CODE_EXCEPTION + resp.message = "请求前置抛出异常" logger.error(resp.message) - resp + return resp } } @@ -248,22 +261,30 @@ class CitizencardPayServiceImpl : CitizencardPayService { params["sign"] = sign val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/cardpayrefund" logger.error("url=[$url], params=[" + Gson().toJson(params) + "]") - val client = Client.create() - client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000) - val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java) - return if (200 == respClient.status) { - resp = respClient.getEntity(DlpayResp::class.java) - logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]") - resp - } else { - resp.code = "99" - resp.message = "请求前置返回失败[httpStatus=$respClient.status]" + try { + val client = Client.create() + client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000) + val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java) + return if (200 == respClient.status) { + resp = respClient.getEntity(DlpayResp::class.java) + logger.error("refno=[$refno], url=[$url], return=[" + Gson().toJson(resp) + "]") + resp + } else { + resp.code = "99" + resp.message = "请求前置返回失败[httpStatus=$respClient.status]" + logger.error(resp.message) + resp + } + } catch (e: Exception) { + e.printStackTrace() + resp.code = YnrccUtil.CODE_EXCEPTION + resp.message = "请求前置抛出异常" logger.error(resp.message) - resp + return resp } } - override fun queryResult(refno: String, orignRefno: String): DlpayResp { + override fun queryResult(orignRefno: String): DlpayResp { var resp = DlpayResp() val config = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true) if (!checkCitizencardConfig(config, resp)) { @@ -271,6 +292,7 @@ class CitizencardPayServiceImpl : CitizencardPayService { } val systime = systemUtilService.sysdatetime + val refno = systemUtilService.refno val params = hashMapOf() params.plus(mapOf( "transcode" to YnrccUtil.BANKCARD_QUERYRESULT_TRANSCODE, @@ -284,6 +306,51 @@ class CitizencardPayServiceImpl : CitizencardPayService { params["sign"] = sign val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/queryresult" logger.error("url=[$url], params=[" + Gson().toJson(params) + "]") + try { + val client = Client.create() + client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000) + val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java) + return if (200 == respClient.status) { + resp = respClient.getEntity(DlpayResp::class.java) + logger.error("refno=[$orignRefno], url=[$url], return=[" + Gson().toJson(resp) + "]") + resp + } else { + resp.code = "99" + resp.message = "请求前置返回失败[httpStatus=$respClient.status]" + logger.error(resp.message) + resp + } + } catch (e: Exception) { + e.printStackTrace() + resp.code = YnrccUtil.CODE_EXCEPTION + resp.message = "请求前置抛出异常" + logger.error(resp.message) + return resp + } + } + + override fun getChkfilename(checkdate: String, merchantBankcardno: String?): DlpayResp { + var resp = DlpayResp() + val config = sourceTypeService.getChargePaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, true) + if (!checkCitizencardConfig(config, resp)) { + return resp + } + val systime = systemUtilService.sysdatetime + val refno = systemUtilService.refno + val params = hashMapOf() + params.plus(mapOf( + "transcode" to YnrccUtil.BANKCARD_BIND_TRANSCODE, + "transdate" to systime.hostdate, + "transtime" to systime.hosttime, + "refno" to refno, + "checkdate" to checkdate, + "merchant_bankcardno" to merchantBankcardno, + "sign_type" to "MD5" + )) + val sign = MD5.encodeByMD5(StringUtil.createLinkString(StringUtil.paraFilter(params)) + config[YnrccUtil.YNRCC_SIGNKEY]!!.trim()) + params["sign"] = sign + val url = config[YnrccUtil.YNRCC_ANGENT_URL]!!.trim() + "/bindcard" + logger.error("url=[$url], params=[" + Gson().toJson(params) + "]") val client = Client.create() client.setConnectTimeout(YnrccUtil.AGENT_CONNECT_TIMEOUT * 1000) val respClient = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(ClientResponse::class.java) @@ -297,8 +364,6 @@ class CitizencardPayServiceImpl : CitizencardPayService { logger.error(resp.message) resp } - } - } \ No newline at end of file diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql index 610e4fd0..a9878e1b 100644 --- a/payapi/src/main/resources/data.sql +++ b/payapi/src/main/resources/data.sql @@ -560,5 +560,17 @@ INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dictty VALUES (25, 'locked', 'accountStatusList', '锁定', '账户状态', '{tenantid}'); INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid") VALUES (26, 'unknown', 'accountStatusList', '异常', '账户状态', '{tenantid}'); + + +INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid") +VALUES (27, 'water', 'dtltypeList', '生活用水', '流水类型', '{tenantid}'); +INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid") +VALUES (28, 'carbus', 'dtltypeList', '乘车', '流水类型', '{tenantid}'); +INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid") +VALUES (29, 'canteen', 'dtltypeList', '食堂就餐', '流水类型', '{tenantid}'); +INSERT INTO "tb_dictionary" ("id", "dictval", "dicttype", "dictcaption", "dicttypename", "tenantid") +VALUES (30, 'shopmarket', 'dtltypeList', '商超消费', '流水类型', '{tenantid}'); + + ---------------------------------------------------- commit; \ No newline at end of file