市民卡支付完善
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 9a2d51b..0000000
--- 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 0000000..87b0e77
--- /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<TReverseDtl, String> {
+
+ @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 0000000..93e30b3
--- /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 ba51cfd..eaa385c 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 @@
@NotNull
private String tenantid = "";
+ @Column(name = "DTLTYPE", length = 20)
+ @NotNull
+ private String dtltype;
+
public String getRefno() {
return refno;
}
@@ -170,4 +174,12 @@
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 fdd77e5..8435ce1 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 @@
@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 @@
private String tenantid = "";
@Column(name = "DTLTYPE", length = 20)
+ @NotNull
private String dtltype;
public String getDtltype() {
@@ -295,6 +299,14 @@
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 9d36cea..e731908 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 @@
List<TDictionary> 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 46377e9..c7c9d89 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 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 d48c602..2ff2c01 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
@@ -90,16 +90,6 @@
public static final int LOCK_READ_TIMEOUT = 10015;
/**
- * 卡已挂失
- */
- public static final int ACCOUNT_IS_LOSS = 10016;
-
- /**
- * 卡已锁定
- */
- public static final int ACCOUNT_IS_LOCKED = 10017;
-
- /**
* 费用类别未定义
*/
public static final int FEETYPE_NOT_EXISTS = 10018;
@@ -140,4 +130,19 @@
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 d5a2528..ef6fea0 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 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<String, String> 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 83bfde8..0a2c5d5 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 @@
@Configuration
@EnableAsync
class SpringAsyncConfig : AsyncConfigurer {
- @Bean("shopAccBalanceUpdater")
+ @Bean(value = ["shopAccBalanceUpdater", "queryCitizencardPayResult"])
fun threadPoolExecutor(): Executor {
return ThreadPoolTaskExecutor().apply {
corePoolSize = 5
@@ -50,4 +53,59 @@
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 24efe80..8361ebb 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 @@
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 @@
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 @@
* */
@PostMapping("/citizencard/payinit")
fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayinitParam): ResponseEntity<Any> {
- 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 @@
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 @@
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 @@
* */
@PostMapping("/citizencard/payfinish")
fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
- 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 @@
* */
@PostMapping("/paycancel")
fun payCancel(@Valid @RequestBody param: ConsumePayCancelParam): ResponseEntity<Any> {
- 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)
+ 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()
}
- val cancelTrans = builder.cancelInit(it.refno, transactionService)
- //fixme: 撤销逻辑
- if (it.sourceType.isNotEmpty()) {
- // 第三方冲正
- }
- 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 @@
* */
@PostMapping("/payrefund")
fun payRefund(@Valid @RequestBody param: ConsumePayRefundParam): ResponseEntity<Any> {
- 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)
+ 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()
}
- val refundTrans = builder.refundInit(it.refno,
- param.refundAmount / 100.0, transactionService)
- //fixme: 撤销逻辑
- if (it.sourceType.isNotEmpty()) {
- // 第三方冲正
- }
- 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 0000000..4b09146
--- /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 ec92ddc..02533ab 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 @@
@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 8b378e8..d5a960f 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 @@
@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 0000000..4610ef7
--- /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 6ab347e..0396d36 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 @@
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 @@
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 d345330..df5ed08 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 @@
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 d51f97a..99f6948 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 @@
settleDate = null
tenantid = TenantContext.getTenantSchema()
this.sourceType = sourceType.sourceType
+ dtltype = builder.dtltype
}
if (builder.hasPerson()) {
@@ -104,6 +105,7 @@
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 @@
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 @@
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 @@
//////////////////////////////////////////////////////////////////
// 成功
- 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 @@
"个人流水<${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 @@
}
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 fff1a0e..011244a 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 @@
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 @@
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 a237617..b0f583f 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 @@
var payinfo: String = ""
var description: String = ""
var remark: String = ""
+ var dtltype: String = ""
fun person(): PersonTranactionBuilder {
return this.personBuilder
@@ -295,6 +296,11 @@
}
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 5da1116..49dbe4d 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 96b8dda..2439bcf 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.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.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 @@
}
}
- 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 @@
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 @@
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 @@
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 @@
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 @@
}
val systime = systemUtilService.sysdatetime
+ val refno = systemUtilService.refno
val params = hashMapOf<String, String>()
params.plus(mapOf(
"transcode" to YnrccUtil.BANKCARD_QUERYRESULT_TRANSCODE,
@@ -284,6 +306,51 @@
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<String, String>()
+ 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 @@
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 610e4fd..a9878e1 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -560,5 +560,17 @@
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