From 6ab45d98aed504a943a9a374267dfd69454623b7 Mon Sep 17 00:00:00 2001 From: Xia Kaixiang Date: Wed, 19 Jun 2019 14:50:57 +0800 Subject: [PATCH] =?utf8?q?=E4=BA=A4=E6=98=93=E7=BB=86=E8=8A=82=E4=BC=98?= =?utf8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/framework/util/TradeErrorCode.java | 4 +- .../kotlin/com/supwisdom/dlpay/api/advices.kt | 18 +- .../api/controller/consume_api_controller.kt | 169 ++++++++++-------- .../dlpay/api/service/transaction_service.kt | 13 +- 4 files changed, 121 insertions(+), 83 deletions(-) diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java index 08bf26fa..d48c602c 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java @@ -136,6 +136,8 @@ public class TradeErrorCode { public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持 - public static final int UNHANLDED_EXCEPTION = 300004; // 未处理异常 + public static final int SQL_EXCEPTION = 30004; // SQL处理异常 + + public static final int REQUEST_PARAM_EEROR = 30005; // 请求参数实体位置错误 } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt index 0a893ea3..d19f656b 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt @@ -1,8 +1,10 @@ package com.supwisdom.dlpay.api import com.supwisdom.dlpay.exception.RequestParamCheckException +import com.supwisdom.dlpay.exception.TransactionCheckException import com.supwisdom.dlpay.exception.TransactionException import com.supwisdom.dlpay.framework.ResponseBodyBuilder +import com.supwisdom.dlpay.framework.service.CommonService import com.supwisdom.dlpay.framework.util.APIRequestParam import com.supwisdom.dlpay.framework.util.TradeErrorCode import mu.KotlinLogging @@ -10,7 +12,9 @@ import org.aspectj.lang.ProceedingJoinPoint import org.aspectj.lang.annotation.Around import org.aspectj.lang.annotation.Aspect import org.aspectj.lang.annotation.Pointcut +import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity +import org.springframework.security.core.Authentication import org.springframework.stereotype.Component import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.RestControllerAdvice @@ -31,7 +35,7 @@ class RestControllerAdvice { .requestException(undeclared, "请求参数错误")) } else if (undeclared is TransactionException) { return ResponseEntity.ok(ResponseBodyBuilder.create() - .transException(undeclared, "业务处理错误")) + .exception(undeclared.code(), undeclared, "业务处理错误")) } return ResponseEntity.ok().body(ResponseBodyBuilder.create() @@ -42,6 +46,8 @@ class RestControllerAdvice { @Component @Aspect class RestControllerAspect { + @Autowired + lateinit var commonService: CommonService private val logger = KotlinLogging.logger { } @@ -53,13 +59,19 @@ class RestControllerAspect { fun postmapping() { } - @Around("restcontroller() && postmapping() && args(.., @RequestBody body)") + @Around("restcontroller() && postmapping() && args(@RequestBody body, auth, ..)") @Throws(Throwable::class) - fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any): Any { + fun logPostMethods(joinPoint: ProceedingJoinPoint, body: Any, auth: Authentication): Any { return try { if (body is APIRequestParam) { body.checkParam() + if (!body.checkSign(commonService.getSecretByAppid(auth.name))) { + throw RequestParamCheckException(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误") + } + } else { + throw TransactionCheckException(TradeErrorCode.REQUEST_PARAM_EEROR, "请求参数实体位置错误") } + val result = joinPoint.proceed() logger.debug(result.toString()) result 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 7a15077c..d2cc60b2 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 @@ -140,13 +140,13 @@ class ConsumeAPIController { * */ @PostMapping("/balance/pay") fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity { - if(!param.checkSign(commonService.getSecretByAppid(authentication.name))){ + if (!param.checkSign(commonService.getSecretByAppid(authentication.name))) { return ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } val person = userService.findPersonByIdentityCheckStatus(param.cardNo) - if(consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) { + if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) { val account = accountUtilServcie.readAccount(person.userid) val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno) @@ -166,30 +166,33 @@ class ConsumeAPIController { opposite = AccountProxy(account) }.and().addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), param.amount / 100.0, "账户余额消费") - .also { builder -> - param.feelist?.forEach { - val feeamt = it.amount / 100.0 - when (it.feetype) { - TradeDict.FEETYPE_CONSUME_MEALER -> { - //搭伙费 - val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE) - val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目 - when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) { - true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收 - false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目 - } - } - TradeDict.FEETYPE_CONSUME_DISCOUNT -> { - //优惠折扣 - val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE) - val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目 - builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary) - - } - else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "账户余额支付费用清单不支持feetype<${it.feetype}>") - } + .also { + param.feelist?.also { + TODO("feelist 费用清单未实现!") } +// param.feelist?.forEach { +// val feeamt = it.amount / 100.0 +// when (it.feetype) { +// TradeDict.FEETYPE_CONSUME_MEALER -> { +// //搭伙费 +// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE) +// val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目 +// when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) { +// true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收 +// false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目 +// } +// } +// TradeDict.FEETYPE_CONSUME_DISCOUNT -> { +// //优惠折扣 +// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE) +// val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目 +// builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary) +// +// } +// else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, +// "账户余额支付费用清单不支持feetype<${it.feetype}>") +// } +// } }.init(transactionService) transactionService.success(dtl.refno) @@ -213,64 +216,74 @@ class ConsumeAPIController { * */ @PostMapping("/citizencard/payinit") fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, authenticateAction: Authentication): ResponseEntity { - try { - if (param.checkParam() && param.checkSign(commonService.getSecretByAppid(authenticateAction.name))) { - return ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) - } - - val person = userService.findPersonByIdentityCheckStatus(param.cardNo) - 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) - val transaction = TransactionBuilder().apply { - setTransInfo(param.transdate, param.transtime, - TradeCode.TRANSCODE_CITIZENCARD_PAY, - TradeDict.PAYTYPE_CITIZEN_CARD) - setOutTransInfo(shopacc.shopaccno, param.billno) - operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) - payinfo = "市民卡代扣消费" - description = "市民卡代扣消费" - }.person(account).apply { - setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT) - opposite = AccountProxy(shopacc) - }.and().shop(shopacc).apply { - setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN) - opposite = AccountProxy(account) - }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account), - param.amount / 100.0, "市民卡代扣消费") - .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), - param.amount / 100.0, "市民卡代扣消费") - .also { builder -> - param.feelist?.forEach { - //fixme: 科目 -> 商户 与个人无关 - val feeconfig = accountUtilServcie.readFeetype(it.feetype, - TradeDict.PAYTYPE_CITIZEN_CARD) - val subj = accountUtilServcie.readSubject(feeconfig.drsubjno) - builder.addDebitCreditRecord(AccountProxy(subj), AccountProxy(shopacc), - it.amount / 100.0, feeconfig.summary) - - } - }.init(transactionService) + if (!param.checkSign(commonService.getSecretByAppid(authenticateAction.name))) { + return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) + } - return ResponseEntity.ok(ResponseBodyBuilder.create() - .data("refno", transaction.refno) - .data("amount", transaction.shopDtl.amount) - .success("交易初始化成功")) - } + val person = userService.findPersonByIdentityCheckStatus(param.cardNo) + if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_CITIZEN_CARD)) { - return ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>")) + val account = accountUtilServcie.readAccount(person.userid) + val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno) + val subject = accountUtilServcie.readSubject(Subject.SUBJNO_PAY_CITIZEN_CARD) + val transaction = TransactionBuilder().apply { + setTransInfo(param.transdate, param.transtime, + TradeCode.TRANSCODE_CITIZENCARD_PAY, + TradeDict.PAYTYPE_CITIZEN_CARD) + setOutTransInfo(shopacc.shopaccno, param.billno) + operator(param.shopaccno, TradeDict.OPERTYPE_SHOP) + payinfo = param.cardNo + description = "市民卡代扣消费" + }.person(account).apply { + setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT) + opposite = AccountProxy(shopacc) + }.and().shop(shopacc).apply { + setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_IN) + opposite = AccountProxy(account) + }.and().addDebitCreditRecord(AccountProxy(subject), AccountProxy(account), + param.amount / 100.0, "市民卡代扣消费") + .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), + param.amount / 100.0, "市民卡代扣消费") + .also { + param.feelist?.also { + TODO("feelist 费用清单未实现!") + } +// param.feelist?.forEach { +// val feeamt = it.amount / 100.0 +// when (it.feetype) { +// TradeDict.FEETYPE_CONSUME_MEALER -> { +// //搭伙费 +// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_MEALER, TradeDict.PAYTYPE_BALANCE) +// val subject = accountUtilServcie.readSubject(feetypeConfig.crsubjno) //不同在贷方科目 +// when (Subject.SUBJNO_MACHANT_INCOME == subject.subjno) { +// true -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc), feeamt, feetypeConfig.summary) //商户收 +// false -> builder.addDebitCreditRecord(AccountProxy(account), AccountProxy(subject), feeamt, feetypeConfig.summary) //其他科目 +// } +// } +// TradeDict.FEETYPE_CONSUME_DISCOUNT -> { +// //优惠折扣 +// val feetypeConfig = accountUtilServcie.readFeetype(TradeDict.FEETYPE_CONSUME_DISCOUNT, TradeDict.PAYTYPE_BALANCE) +// val subject = accountUtilServcie.readSubject(feetypeConfig.drsubjno) //不同在借方科目 +// builder.addDebitCreditRecord(AccountProxy(subject), AccountProxy(shopacc), feeamt, feetypeConfig.summary) +// +// } +// else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, +// "账户余额支付费用清单不支持feetype<${it.feetype}>") +// } +// +// } + }.init(transactionService) - } catch (ex: RequestParamCheckException) { - return ResponseEntity.ok(ResponseBodyBuilder.create() - .requestException(ex, "请求参数错误")) - } catch (et: TransactionException) { return ResponseEntity.ok(ResponseBodyBuilder.create() - .transException(et, "业务处理错误")) + .data("refno", transaction.refno) + .data("billno", transaction.outTradeNo) + .data("amount", transaction.shopDtl.amount) + .success("交易初始化成功")) } + + return ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>")) } /** diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt index 48e9e29c..e12d3cd4 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt @@ -3,6 +3,8 @@ package com.supwisdom.dlpay.api.service import com.supwisdom.dlpay.api.ShopAccBalanceAsyncTask import com.supwisdom.dlpay.api.TransactionBuilder import com.supwisdom.dlpay.api.domain.TTransactionMain +import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component import org.springframework.stereotype.Service @@ -75,7 +77,16 @@ class TransactionServiceProxy { fun init(builder: TransactionBuilder): TTransactionMain { - return transactionService.init(builder) + try{ + return transactionService.init(builder) + }catch (ex:Exception){ + ex.javaClass.name.let { + val name = it.substringAfterLast('.') + + throw TransactionProcessException(TradeErrorCode.SQL_EXCEPTION, + "SQL错误 $name - ${ex.message}") + } + } } fun wip(refno: String): TTransactionMain { -- 2.17.1