From: Tang Cheng Date: Wed, 19 Feb 2020 06:31:01 +0000 (+0800) Subject: 增加 inapp 接口 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=a86f32eee43cab1fa1f699ab72029ca1d364ed39;p=epayment%2Ffood_payapi.git 增加 inapp 接口 --- diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/InAppPayParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/InAppPayParam.java new file mode 100644 index 00000000..9b7ecf9b --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/InAppPayParam.java @@ -0,0 +1,53 @@ +package com.supwisdom.dlpay.api.bean; + +import com.supwisdom.dlpay.api.APIRequestParam; +import com.supwisdom.dlpay.api.annotation.StringList; +import com.supwisdom.dlpay.api.annotation.TransDate; +import com.supwisdom.dlpay.api.annotation.TransTime; +import com.supwisdom.dlpay.api.exception.RequestParamCheckException; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; + +@Setter +@Getter +public class InAppPayParam extends APIRequestParam { + + @NotNull + @StringList(value = {"h5", "native"}) + private String inAppType; + + @NotNull + @StringList(value = {"shop", "person"}) + private String recipientType; + + @NotNull + private String sourceType; + + private String userid; + + private String merchno; + + @Positive(message = "金额不合法") + private Integer totalAmount; + + private String describe; + + @TransDate + private String transDate; + + @TransTime + private String transTime; + + @NotNull + private String billno; + + @Override + public boolean checkParam() throws RequestParamCheckException { + return true; + } + + +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/InAppPayResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/InAppPayResponse.java new file mode 100644 index 00000000..88588605 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/InAppPayResponse.java @@ -0,0 +1,18 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class InAppPayResponse extends ApiResponse { + private String refno; + + private Integer actuallyAmount; + + private String externalRefno; + + private String message; + + private String status; +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/TransactionQueryResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/TransactionQueryResponse.java new file mode 100644 index 00000000..95e7fbd9 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/TransactionQueryResponse.java @@ -0,0 +1,18 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class TransactionQueryResponse extends ApiResponse { + private String refno; + + private String accdate; + + private String status; + + private String hostdate; + + private String hosttime; +} diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt index 5f314770..65c6e6e1 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/charge_api_controller.kt @@ -146,7 +146,7 @@ class ChargeAPIController { @PostMapping("/merchant/init") fun merchantDepositInit(@RequestBody @Valid param: MerchantDepositParam, auth: Authentication): - ResponseEntity { + ResponseEntity { val response = MerchantDepositResponse() val account = when { param.userid.isNotBlank() -> { @@ -209,7 +209,7 @@ class ChargeAPIController { @PostMapping("/merchant/confirm") fun merchantDepositConfirm(@RequestBody @Valid param: MerchantDepositParam, auth: Authentication): - ResponseEntity { + ResponseEntity { val response = MerchantDepositResponse() val transaction = transactionService.success(param.refno) response.apply { 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 ac739593..52f0529e 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 @@ -461,7 +461,7 @@ class ConsumeAPIController { @RequestMapping("/qrcode/init", method = [RequestMethod.POST, RequestMethod.GET]) fun qrcodePayInit(@Validated(InitAction::class) @RequestBody param: QrcodePayParam) - : ResponseEntity { + : ResponseEntity { val apiResp = QrcodePayResponse() // 1. 检查 qrcode val qrcode = agentServiceProxy.qrcodeMatch(param.qrcode) @@ -507,9 +507,9 @@ class ConsumeAPIController { AgentCode.SUCCESS -> { val qrcodeTransResp = agentResp.payload if (!sourceType.anonymousEnable && qrcodeTransResp.isAnonymous) { - ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR, - "支付方式<${qrcode.sourceType}> 不支持匿名支付")) + ResponseBodyBuilder.failEntity(apiResp, + TradeErrorCode.BUSINESS_DEAL_ERROR, + "支付方式<${qrcode.sourceType}> 不支持匿名支付") } else { ResponseEntity.ok(ResponseBodyBuilder.create() .success(apiResp.also { @@ -521,20 +521,17 @@ class ConsumeAPIController { AgentCode.NOT_SUPPORT -> { val qrcodeTransResp = agentResp.payload if (!sourceType.anonymousEnable) { - ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR, - "支付方式<${qrcode.sourceType}> 不支持匿名支付")) + ResponseBodyBuilder.failEntity(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR, + "支付方式<${qrcode.sourceType}> 不支持匿名支付") } else { - ResponseEntity.ok(ResponseBodyBuilder.create() - .success(apiResp.also { - it.anonymous = qrcodeTransResp.isAnonymous - })) + ResponseBodyBuilder.successEntity(apiResp.also { + it.anonymous = qrcodeTransResp.isAnonymous + }) } } else -> { - ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR, - "第三方身份错误,<${agentResp.agentMsg}")) + ResponseBodyBuilder.failEntity(apiResp, TradeErrorCode.BUSINESS_DEAL_ERROR, + "第三方身份错误,<${agentResp.agentMsg}") } } } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/transaction_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/transaction_controller.kt new file mode 100644 index 00000000..f0846afe --- /dev/null +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/transaction_controller.kt @@ -0,0 +1,54 @@ +package com.supwisdom.dlpay.api.controller + +import com.supwisdom.dlpay.api.bean.InAppPayParam +import com.supwisdom.dlpay.api.bean.InAppPayResponse +import com.supwisdom.dlpay.api.bean.TransactionQueryResponse +import com.supwisdom.dlpay.api.service.TransactionServiceProxy +import com.supwisdom.dlpay.framework.ResponseBodyBuilder +import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.multitenant.TenantContextHolder +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RestController +import javax.validation.Valid + + +@RestController("/api/transaction") +class TransactionController(private val transactionServiceProxy: TransactionServiceProxy, + private val systemUtilService: SystemUtilService) { + + @GetMapping("/query") + fun queryTransaction(refno: String): ResponseEntity<*> { + val tranaction = transactionServiceProxy.findTransactionByRefno(refno) + ?: return ResponseBodyBuilder.fail(HttpStatus.NOT_FOUND, "未找到流水") + if (tranaction.tenantid != TenantContextHolder.getContext().tenant.id) { + return ResponseBodyBuilder.fail(HttpStatus.CONFLICT, "未找到流水") + } + + return ResponseBodyBuilder.successEntity(TransactionQueryResponse().apply { + this.refno = tranaction.refno + accdate = tranaction.accdate + status = tranaction.status + hostdate = systemUtilService.sysdatetime.hostdate + hosttime = systemUtilService.sysdatetime.hosttime + }, "成功") + } + + @PostMapping("/inapp/payinit") + fun inAppPayInit(@Valid param: InAppPayParam): ResponseEntity { + val response = InAppPayResponse() + return ResponseBodyBuilder.successEntity(response) + } +} + +@RestController("/api/notify") +class TransactionNotifyController { + + @PostMapping("/inapp/alipay/{tenant}") + fun inAppPayCallback(@PathVariable("tenant") tenant: String): ResponseEntity { + TODO("") + } +} \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt index fc1d8865..4facb76d 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt @@ -169,7 +169,8 @@ class UserAPIController { } @PostMapping("/biz_init") - fun userBizInit(@RequestBody @Validated(InitAction::class) request: CardBizParam): ResponseEntity { + fun userBizInit(@RequestBody @Validated(InitAction::class) request: CardBizParam) + : ResponseEntity { val builder = TransactionBuilder().apply { setTransInfo(request.transdate, request.transtime, TradeCode.TRANSCODE_CARD_BIZ, "internal") setOutTransInfo(request.operid, request.operSeqno) @@ -284,7 +285,8 @@ class UserAPIController { } @PostMapping("/biz_confirm") - fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: CardBizParam): ResponseEntity { + fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: CardBizParam) + : ResponseEntity { val transaction = transactionService.success(request.refno) val response = CardBizResponse().apply { accdate = transaction.accdate @@ -297,7 +299,8 @@ class UserAPIController { } @PostMapping("/biz_refund_init") - fun userBizRefundInit(@RequestBody @Validated(InitAction::class) request: CardBizRefundParam): ResponseEntity { + fun userBizRefundInit(@RequestBody @Validated(InitAction::class) request: CardBizRefundParam) + : ResponseEntity { val result = CardBizResponse() val originTrans = transactionService.findTransactionByRefno(request.originRefno) ?: return ResponseBodyBuilder.failEntity(result, TradeErrorCode.TRANSACTION_NOT_EXISTS, @@ -332,7 +335,7 @@ class UserAPIController { } @PostMapping("/biz_refund") - fun userBizRefund(refno: String): ResponseEntity { + fun userBizRefund(refno: String): ResponseEntity { val result = CardBizResponse() val transaction = transactionService.success(refno) result.apply { @@ -348,7 +351,7 @@ class UserAPIController { } @GetMapping("/biz_query") - fun userBizQuery(refno: String): ResponseEntity { + fun userBizQuery(refno: String): ResponseEntity { val transaction = transactionService.findTransactionByRefno(refno) ?: throw TransactionCheckException(TradeErrorCode.TRANSACTION_NOT_EXISTS , "交易不存在") diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt index c9d61a11..8614d232 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt @@ -8,6 +8,7 @@ import com.supwisdom.dlpay.exception.TransactionCheckException import com.supwisdom.dlpay.exception.TransactionException import com.supwisdom.dlpay.framework.util.TradeErrorCode import mu.KotlinLogging +import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity @@ -18,13 +19,21 @@ class ResponseBodyBuilder private constructor() { private val LOGGER = KotlinLogging.logger {} fun create() = ResponseBodyBuilder() - fun successEntity(bean: ApiResponse, msg: String? = null): ResponseEntity { + fun successEntity(bean: T, msg: String? = null): ResponseEntity { return ResponseEntity.ok(create().success(bean, msg)) } - fun failEntity(bean: ApiResponse, code: Int, msg: String): ResponseEntity { + fun failEntity(bean: T, code: Int, msg: String): ResponseEntity { return ResponseEntity.ok(create().fail(bean, code, msg)) } + + fun fail(status: HttpStatus, bean: T): ResponseEntity<*> { + return ResponseEntity.status(status).body(bean) + } + + fun fail(status: HttpStatus, msg: String): ResponseEntity<*> { + return ResponseEntity.status(status).body(msg) + } } private var retCode = INVALIDE_RETCODE @@ -47,7 +56,7 @@ class ResponseBodyBuilder private constructor() { return build() } - fun success(bean: ApiResponse, msg: String? = null): ApiResponse { + fun success(bean: T, msg: String? = null): T { bean.retcode = 0 bean.retmsg = msg ?: "成功" return bean @@ -62,7 +71,7 @@ class ResponseBodyBuilder private constructor() { return build() } - fun fail(bean: ApiResponse, code: Int, msg: String): ApiResponse { + fun fail(bean: T, code: Int, msg: String): T { if (code == 0) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "错误码未正确定义") }