From 6fff79f43c4fe000cb80452ca65acee7303ce1fa Mon Sep 17 00:00:00 2001 From: Xia Kaixiang Date: Wed, 19 Jun 2019 18:07:49 +0800 Subject: [PATCH] =?utf8?q?=E6=92=A4=E9=94=80=E9=80=80=E6=AC=BE=E6=8E=A5?= =?utf8?q?=E5=8F=A3=E5=8E=9F=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/api/bean/api_request_param.kt | 24 +++ .../api/controller/charge_api_controller.kt | 44 ++-- .../api/controller/consume_api_controller.kt | 202 +++++++----------- .../dlpay/api/service/consume_pay_service.kt | 4 + .../service/impl/consume_pay_service_impl.kt | 14 ++ 5 files changed, 136 insertions(+), 152 deletions(-) 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 c151b4b3..cff556be 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 YktCardPayinitParam : APIRequestParam() { } } +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 d66a927d..3c749afd 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 @@ class ChargeAPIController { @Autowired lateinit var chargeApiService: ChargeApiService + /** + * ============================================================================ + * 查询充值流水状态 + * ============================================================================ + * */ + @PostMapping("/queryresult") + fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity { + 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 @@ class ChargeAPIController { } - /** - * ============================================================================ - * 查询充值流水状态 - * ============================================================================ - * */ - @PostMapping("/queryresult") - fun rechargeConfirm(@RequestBody param: CommonQueryRechargeResultParam, authentication: Authentication): ResponseEntity { - 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 7be1e164..9665c286 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 @@ class ConsumeAPIController { lateinit var transactionService: TransactionServiceProxy /** - * 流水结果查询统一接口 + * ============================================================================ + * 消费流水结果查询统一接口 + * ============================================================================ * */ - fun queryDtlResult(@RequestBody param: QueryDtlResultParam, - request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { - 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 { + 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, "流水不存在")) } /** @@ -305,19 +245,41 @@ class ConsumeAPIController { } } + /** + * ============================================================================ + * 消费流水撤销 + * ============================================================================ + * */ + @PostMapping("/paycancel") + fun payCancel(@RequestBody param: ConsumePayCancelParam): ResponseEntity { + 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 { + return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "退款逻辑未实现")) + } + /** * ============================================================================ * 一卡通支付【交易初始化】 * ============================================================================ * */ @PostMapping("/ykt/payinit") - fun yktPayInit(@RequestBody param: YktCardPayinitParam, authentication: Authentication): ResponseEntity { - 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 { // 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 @@ class ConsumeAPIController { // // } - 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 @@ class ConsumeAPIController { * ============================================================================ * */ @PostMapping("/ykt/payfinish") - fun yktPayFinish(@RequestBody param: CitizenCardPayfinishParam, authentication: Authentication): ResponseEntity { - 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 { +// 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 1fa74f3e..ec92ddcb 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 @@ interface ConsumePayService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true) fun getUserdtlExtendParamMap(refno: String): Map + + @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 3eb78fdb..f367feb3 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 @@ package com.supwisdom.dlpay.api.service.impl 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 @@ class ConsumePayServiceImpl : ConsumePayService { 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 @@ class ConsumePayServiceImpl : ConsumePayService { ?: 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 { TODO("未实现方法") } + + } \ No newline at end of file -- 2.17.1