撤销退款接口原型
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index c151b4b..cff556b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -248,6 +248,30 @@
}
}
+class ConsumePayCancelParam : APIRequestParam() {
+ @Sign
+ var refno:String? = null //流水号
+ @Sign
+ var billno:String?=null //订单号
+ @Sign
+ var shopaccno:String?=null //商户号
+ @Sign
+ var requestbillno:String="" //退款请求唯一标识
+ @Sign
+ var transdate: String = "" //必传
+ @Sign
+ var transtime: String = "" //必传
+
+ override fun checkParam(): Boolean {
+ if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "原流水唯一号不能为空")
+ if (StringUtil.isEmpty(requestbillno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "撤销或退款流水号不能为空")
+ if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]")
+ if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]")
+
+ return true
+ }
+}
+
// ============================ RECHARGE ============================ //
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
index d66a927..3c749af 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt
@@ -37,6 +37,28 @@
@Autowired
lateinit var chargeApiService: ChargeApiService
+ /**
+ * ============================================================================
+ * 查询充值流水状态
+ * ============================================================================
+ * */
+ @PostMapping("/queryresult")
+ fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity<Any> {
+ chargeApiService.getTransactionMainDtl(param.refno, param.billno, authentication.name).let {
+ if (null == it) {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "充值流水不存在"))
+ }
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", it.refno)
+ .data("billno", it.outTradeNo)
+ .data("status", it.status)
+ .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
+ .data("reverseflag", it.reverseFlag)
+ .success("查询成功"))
+ }
+ }
/**
* ============================================================================
@@ -119,26 +141,4 @@
}
- /**
- * ============================================================================
- * 查询充值流水状态
- * ============================================================================
- * */
- @PostMapping("/queryresult")
- fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity<Any> {
- chargeApiService.getTransactionMainDtl(param.refno, param.billno, authentication.name).let {
- if (null == it) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "充值流水不存在"))
- }
-
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .data("refno", it.refno)
- .data("billno", it.outTradeNo)
- .data("status", it.status)
- .data("amount", chargeApiService.getPersonDtl(it.refno).amount)
- .success("查询成功"))
- }
- }
-
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 7be1e16..9665c28 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -52,85 +52,25 @@
lateinit var transactionService: TransactionServiceProxy
/**
- * 流水结果查询统一接口
+ * ============================================================================
+ * 消费流水结果查询统一接口
+ * ============================================================================
* */
- fun queryDtlResult(@RequestBody param: QueryDtlResultParam,
- request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
- try {
- if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
- }
-
- val dtl = transactionMainDao.findByRefnoForUpdate(param.refno)
- ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号错误<${param.refno}>"))
-
- val person = if (dtl.person) {
- userService.findPersonByUserid(dtl.personDtl.userid)
- } else {
- null
- }
+ @PostMapping("/queryresult")
+ fun queryDtlResult(@RequestBody param: QueryDtlResultParam): ResponseEntity<Any> {
+ consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
return ResponseEntity.ok(ResponseBodyBuilder.create()
- .data("refno", dtl.refno)
- .data("amount", dtl.personDtl.amount)
- .data("paytype", dtl.personDtl.sourceType)
- .data("payinfo", dtl.personDtl.payinfo)
- .also {
- if (null != person) {
- it.data("name", person.name)
- }
- }
+ .data("refno", it.refno)
+ .data("billno", it.outTradeNo)
+ .data("amount", it.shopDtl.amount)
+ .data("status", it.status)
+ .data("sourcetype", it.personDtl.sourceType)
+ .data("payinfo", it.personDtl.payinfo)
+ .data("reverseflag", it.reverseFlag)
+ .data("transdesc", it.shopDtl.transdesc)
.success("查询成功"))
- } catch (ex: RequestParamCheckException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .requestException(ex, "请求参数错误"))
- } catch (et: TransactionException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .transException(et, "查询错误"))
- }
- }
-
- private fun consumeMealer(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
- builder: TransactionBuilder,
- feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
- val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
- TradeDict.PAYTYPE_BALANCE)
- val amount = feetype.amount / 100.0
- when (feetypeConfig.crsubjno) {
- shop.subjno -> {
- builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(shop),
- amount, feetypeConfig.summary)
- .shop().also {
- it.addAmount(amount)
- }
- }
- else -> {
- val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno)
- builder.addDebitCreditRecord(AccountProxy(person), AccountProxy(subject),
- amount, feetypeConfig.summary)
- }
- }
-
- }
-
- private fun consumeDiscount(@Suppress("UNUSED_PARAMETER") param: CitizenCardPayinitParam,
- builder: TransactionBuilder,
- feetype: ConsumeFeetype, person: TAccount, shop: TShopacc) {
- val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER,
- TradeDict.PAYTYPE_BALANCE)
- val amount = feetype.amount / 100.0
- when (feetypeConfig.drsubjno) {
- shop.subjno -> {
- builder.addDebitCreditRecord(AccountProxy(shop), AccountProxy(person),
- amount, feetypeConfig.summary)
- }
- else -> {
- val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno)
- builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shop),
- amount, feetypeConfig.summary)
- }
- }
+ } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
}
/**
@@ -307,17 +247,39 @@
/**
* ============================================================================
+ * 消费流水撤销
+ * ============================================================================
+ * */
+ @PostMapping("/paycancel")
+ fun payCancel(@RequestBody param: ConsumePayCancelParam): ResponseEntity<Any> {
+ consumePayService.getTransactionMainDtl(param.refno, param.billno, param.shopaccno)?.let {
+ //fixme: 撤销逻辑
+
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .success("交易确认成功"))
+ } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
+ }
+
+ /**
+ * ============================================================================
+ * 消费流水退款
+ * ============================================================================
+ * */
+ @PostMapping("/payrefund")
+ fun payRefund(@RequestBody param: ConsumePayCancelParam): ResponseEntity<Any> {
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "退款逻辑未实现"))
+ }
+
+ /**
+ * ============================================================================
* 一卡通支付【交易初始化】
* ============================================================================
* */
@PostMapping("/ykt/payinit")
- fun yktPayInit(@RequestBody param: YktCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
- try {
- if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
- }
-//
+ fun yktPayInit(@RequestBody param: YktCardPayinitParam): ResponseEntity<Any> {
// val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } //没注册,可能匿名?
// if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person == null)) {
// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
@@ -353,15 +315,8 @@
//
// }
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
- } catch (ex: RequestParamCheckException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .requestException(ex, "请求参数错误"))
- } catch (et: TransactionException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .transException(et, "业务处理错误"))
- }
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
}
@@ -371,47 +326,34 @@
* ============================================================================
* */
@PostMapping("/ykt/payfinish")
- fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity<Any> {
- try {
- if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authentication.name))) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
- }
-//
-// var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
+// var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .wip(personBalancePayService)
+// val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
+// val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
+// dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
+// if (code.retcode == "0") {
+// dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
// .setRefno(param.refno)
-// .wip(personBalancePayService)
-// val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
-// val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid == null),
-// dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
-// if (code.retcode == "0") {
-// dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
-// .setRefno(param.refno)
-// .addResult(code.data)
-// .success(personBalancePayService) //流水置成功
+// .addResult(code.data)
+// .success(personBalancePayService) //流水置成功
//
-// return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .data("refno", dtl.refno)
-// .data("billno", dtl.outtradeno)
-// .success())
-// } else {
-// PersonTransBuilder.newBuilder(accountUtilServcie)
-// .setRefno(param.refno)
-// .addResult("errmsg", code.retmsg!!)
-// .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .data("refno", dtl.refno)
+// .data("billno", dtl.outtradeno)
+// .success())
+// } else {
+// PersonTransBuilder.newBuilder(accountUtilServcie)
+// .setRefno(param.refno)
+// .addResult("errmsg", code.retmsg!!)
+// .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
//
-// return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
-// }
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
- } catch (ex: RequestParamCheckException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .requestException(ex, "请求参数错误"))
- } catch (et: TransactionException) {
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .transException(et, "业务处理错误"))
- }
+// return ResponseEntity.ok(ResponseBodyBuilder.create()
+// .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
+// }
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败"))
}
// ============================================== //
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
index 1fa74f3..ec92ddc 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
@@ -1,5 +1,6 @@
package com.supwisdom.dlpay.api.service
+import com.supwisdom.dlpay.api.domain.TTransactionMain
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
@@ -12,4 +13,7 @@
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
fun getUserdtlExtendParamMap(refno: String): Map<String, String>
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
+ fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain?
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
index 3eb78fd..f367feb 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
@@ -3,8 +3,11 @@
import com.supwisdom.dlpay.api.dao.SourceTypeDao
import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
+import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.api.service.ConsumePayService
import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.StringUtil
import com.supwisdom.dlpay.framework.util.TradeErrorCode
import com.supwisdom.dlpay.util.ConstantUtil
import org.springframework.beans.factory.annotation.Autowired
@@ -18,6 +21,8 @@
lateinit var shopPaytypeDao: ShopPaytypeDao
@Autowired
lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
+ @Autowired
+ lateinit var transactionMainDao: TransactionMainDao
override fun checkShopPaytype(shopaccno: String, sourceType: String, anonymousflag: Boolean?): Boolean {
sourceTypeDao.getBySourceType(sourceType).let {
@@ -91,7 +96,16 @@
?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
}
+ override fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain? {
+ return when (!StringUtil.isEmpty(refno)) {
+ true -> transactionMainDao.findByRefno(refno)
+ false -> transactionMainDao.findByBillno(billno, shopaccno)
+ }
+ }
+
override fun getUserdtlExtendParamMap(refno: String): Map<String, String> {
TODO("未实现方法")
}
+
+
}
\ No newline at end of file