交易细节优化
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 08bf26f..d48c602 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 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 0a893ea..d19f656 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.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 @@
.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 @@
@Component
@Aspect
class RestControllerAspect {
+ @Autowired
+ lateinit var commonService: CommonService
private val logger = KotlinLogging.logger { }
@@ -53,13 +59,19 @@
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 7a15077..d2cc60b 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 @@
* */
@PostMapping("/balance/pay")
fun balancePay(@RequestBody param: CitizenCardPayinitParam, authentication: Authentication): ResponseEntity<Any> {
- 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 @@
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 @@
* */
@PostMapping("/citizencard/payinit")
fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, authenticateAction: Authentication): ResponseEntity<Any> {
- 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)
-
- return ResponseEntity.ok(ResponseBodyBuilder.create()
- .data("refno", transaction.refno)
- .data("amount", transaction.shopDtl.amount)
- .success("交易初始化成功"))
- }
-
+ if (!param.checkSign(commonService.getSecretByAppid(authenticateAction.name))) {
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, "业务处理错误"))
+ .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 = 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)
+
+ return ResponseEntity.ok(ResponseBodyBuilder.create()
+ .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 48e9e29..e12d3cd 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 @@
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 @@
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 {