完成二维码消费接口
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 538f23a..973c02d 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -6,7 +6,7 @@
# Postgresql settings
spring.datasource.platform=postgresql
#spring.datasource.url=jdbc:postgresql://ykt.supwisdom.com:15432/payapidev
-spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/payapidev
+spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/touchorder
spring.datasource.username=payapi
spring.datasource.password=123456
spring.datasource.continue-on-error=true
@@ -55,4 +55,5 @@
spring.kafka.consumer.auto-commit-interval=100
# 指定消息key和消息体的编解码方式
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
-spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
\ No newline at end of file
+spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
+payapi.url=localhost:8080/payapi
\ No newline at end of file
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/payapi/model/QrcodePayConfirmRequest.java b/payapi-common/src/main/java/com/supwisdom/dlpay/payapi/model/QrcodePayConfirmRequest.java
index e9db9f1..e7064c7 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/payapi/model/QrcodePayConfirmRequest.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/payapi/model/QrcodePayConfirmRequest.java
@@ -28,8 +28,8 @@
@JsonProperty("transTime")
private String transTime;
- @JsonProperty("dlttype")
- private String dlttype;
+ @JsonProperty("dtltype")
+ private String dtltype;
@JsonProperty("amount")
private Integer amount;
@@ -126,24 +126,24 @@
this.transTime = transTime;
}
- public QrcodePayConfirmRequest dlttype(String dlttype) {
- this.dlttype = dlttype;
+ public QrcodePayConfirmRequest dtltype(String dtltype) {
+ this.dtltype = dtltype;
return this;
}
/**
- * Get dlttype
- * @return dlttype
+ * Get dtltype
+ * @return dtltype
*/
@ApiModelProperty(value = "")
- public String getDlttype() {
- return dlttype;
+ public String getDtltype() {
+ return dtltype;
}
- public void setDlttype(String dlttype) {
- this.dlttype = dlttype;
+ public void setDtltype(String dtltype) {
+ this.dtltype = dtltype;
}
public QrcodePayConfirmRequest amount(Integer amount) {
@@ -261,7 +261,7 @@
Objects.equals(this.shopaccno, qrcodePayConfirmRequest.shopaccno) &&
Objects.equals(this.transDate, qrcodePayConfirmRequest.transDate) &&
Objects.equals(this.transTime, qrcodePayConfirmRequest.transTime) &&
- Objects.equals(this.dlttype, qrcodePayConfirmRequest.dlttype) &&
+ Objects.equals(this.dtltype, qrcodePayConfirmRequest.dtltype) &&
Objects.equals(this.amount, qrcodePayConfirmRequest.amount) &&
Objects.equals(this.userid, qrcodePayConfirmRequest.userid) &&
Objects.equals(this.anonymous, qrcodePayConfirmRequest.anonymous) &&
@@ -271,7 +271,7 @@
@Override
public int hashCode() {
- return Objects.hash(billno, shopaccno, transDate, transTime, dlttype, amount, userid, anonymous, qrcode, qrcodeFormat);
+ return Objects.hash(billno, shopaccno, transDate, transTime, dtltype, amount, userid, anonymous, qrcode, qrcodeFormat);
}
@Override
@@ -283,7 +283,7 @@
sb.append(" shopaccno: ").append(toIndentedString(shopaccno)).append("\n");
sb.append(" transDate: ").append(toIndentedString(transDate)).append("\n");
sb.append(" transTime: ").append(toIndentedString(transTime)).append("\n");
- sb.append(" dlttype: ").append(toIndentedString(dlttype)).append("\n");
+ sb.append(" dtltype: ").append(toIndentedString(dtltype)).append("\n");
sb.append(" amount: ").append(toIndentedString(amount)).append("\n");
sb.append(" userid: ").append(toIndentedString(userid)).append("\n");
sb.append(" anonymous: ").append(toIndentedString(anonymous)).append("\n");
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java
index 604d9ff..7b43372 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java
@@ -7,11 +7,12 @@
import feign.RequestInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.Optional;
-@Component
+@Configuration
public class PayAPIRequestInterceptor {
private final JwtTokenClientManager manager;
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPISDKConfigure.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPISDKConfigure.java
index 065ba9c..fed5022 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPISDKConfigure.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPISDKConfigure.java
@@ -8,11 +8,13 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
+import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;
@Configuration
@EnableTenantJwtClient
@EnableFeignClients(basePackages = "com.supwisdom.dlpay.paysdk")
+@Import({PayAPIRequestInterceptor.class})
public class PayAPISDKConfigure {
@Bean
public JwtTokenClientCallback jwtTokenClientCallback(ApiLoginProxy loginProxy) {
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java
index dc287f3..fabcbbf 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java
@@ -1,24 +1,20 @@
package com.supwisdom.dlpay.paysdk.proxy;
import com.supwisdom.dlpay.api.bean.*;
+import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmRequest;
+import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmResponse;
+import com.supwisdom.dlpay.payapi.model.QrcodePayInitRequest;
+import com.supwisdom.dlpay.payapi.model.QrcodePayInitResponse;
import com.supwisdom.mutlitenant.client.annotations.JwtMethod;
import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
@FeignClient(name = "consumePropxy", url = "${payapi.url}")
@RequestMapping("/api/consume")
public interface ConsumePropxy {
- @PostMapping("/qrcode/init")
- @JwtMethod
- QrcodePayResponse qrcodePayInit(@RequestBody QrcodePayParam param);
-
- @PostMapping("/qrcode/confirm")
- @JwtMethod
- QrcodePayResponse qrcodePayConfirm(@RequestBody QrcodePayParam param);
-
@PostMapping("/thirdpay/init")
@JwtMethod
ThirdPayResponse thirdpayInit(@RequestBody ThirdPayinitParam param);
@@ -30,4 +26,20 @@
@PostMapping("/qrcodequery")
@JwtMethod
DoorQrcodeResponse qrcodequery(@RequestBody DoorQRCodeParam param);
+
+
+ @RequestMapping(value = "/qrcode/init", method = RequestMethod.POST)
+ @JwtMethod
+ QrcodePayInitResponse qrcodePayInit(@RequestHeader(name = "X-TENANT-ID") String xTenantId,
+ @Valid @RequestBody QrcodePayInitRequest qrcodePayInitRequest);
+
+ @RequestMapping(value = "/qrcode/confirm", method = RequestMethod.POST)
+ @JwtMethod
+ QrcodePayConfirmResponse qrcodePayConfirm(@RequestHeader(name = "X-TENANT-ID") String xTenantId,
+ @Valid @RequestBody QrcodePayConfirmRequest qrcodePayConfirmRequest);
+
+ @RequestMapping(value = "/qrcode/query/{refno}", method = RequestMethod.GET)
+ @JwtMethod
+ QrcodePayConfirmResponse qrcodePayQuery(@RequestHeader(name = "X-TENANT-ID") String xTenantId,
+ @PathVariable("refno") String refno);
}
diff --git a/payapi-spec/consumeapi.yaml b/payapi-spec/consumeapi.yaml
index 80df543..1df2d8c 100644
--- a/payapi-spec/consumeapi.yaml
+++ b/payapi-spec/consumeapi.yaml
@@ -52,7 +52,7 @@
$ref: 'definitions.yaml#/components/schemas/TransDate'
transTime:
$ref: 'definitions.yaml#/components/schemas/TransTime'
- dlttype:
+ dtltype:
type: string
title: 交易类型
amount:
diff --git a/payapi-spec/definitions.yaml b/payapi-spec/definitions.yaml
index d45a0d7..4ca2848 100644
--- a/payapi-spec/definitions.yaml
+++ b/payapi-spec/definitions.yaml
@@ -1,7 +1,7 @@
components:
headers:
TenantId:
- name: X-Tenant-Id
+ name: X-TENANT-ID
in: header
description: 租户ID
required: true
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java
index 1a54012..191eb57 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java
@@ -2,10 +2,14 @@
import com.supwisdom.dlpay.agent.domain.QrcodePayTrans;
import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import javax.persistence.LockModeType;
+import javax.persistence.QueryHint;
@Repository
@@ -16,5 +20,11 @@
QrcodePayTrans findByAgentMerchIdAndHostdateAndBillnoAndTenantid(String agentMerchId, String hostdate,
String billno, String tenantid);
+ @Lock(LockModeType.PESSIMISTIC_WRITE)
+ @Query("select t from QrcodePayTrans t where t.agentMerchId=:agentMerchId and t.hostdate=:hostdate and t.billno=:billno and t.tenantid=:tenantid")
+ @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "0")})
+ QrcodePayTrans findByQrcodePayTransForUpdate(@Param("agentMerchId") String agentMerchId,@Param("hostdate") String hostdate,
+ @Param("billno")String billno,@Param("tenantid") String tenantid);
+
void deleteByRefnoAndTenantid(String refno, String tenantid);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java
index ec57610..4619435 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java
@@ -68,7 +68,7 @@
@Column(name = "tenantid", length = 20)
private String tenantid;
- @Column(name = "spid", length = 20)
+ @Column(name = "spip", length = 20)
private String spip;
public QrcodePayTrans() {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java
index e33c0db..8eaf790 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java
@@ -42,6 +42,11 @@
systemUtilService.getSysdatetime().getHostdate(), billno, TenantContextHolder.getContext().getTenant().getId());
}
+ public QrcodePayTrans findByQrcodePayTransForUpdate(String merchid, String billno) {
+ return qrcodeTransDao.findByQrcodePayTransForUpdate(merchid,
+ systemUtilService.getSysdatetime().getHostdate(), billno, TenantContextHolder.getContext().getTenant().getId());
+ }
+
public QrcodePayTrans qrcodePayTransSaveOrUpdate(@NotNull QrcodePayTrans bean) {
if (StringUtil.isEmpty(bean.getTenantid())) {
bean.setTenantid(TenantContextHolder.getContext().getTenant().getId());
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java b/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java
index 7c59309..4625ca9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/ConsumeApi.java
@@ -74,7 +74,7 @@
produces = { "application/json" },
consumes = { "application/json" },
method = RequestMethod.POST)
- default ResponseEntity<QrcodePayInitResponse> qrcodePayInit(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "QrCode 初始化" ) @Valid @RequestBody QrcodePayInitRequest qrcodePayInitRequest) {
+ default ResponseEntity<QrcodePayInitResponse> qrcodePayInit(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-TENANT-ID", required=true) String xTenantId,@ApiParam(value = "QrCode 初始化" ) @Valid @RequestBody QrcodePayInitRequest qrcodePayInitRequest) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
@@ -96,7 +96,7 @@
@RequestMapping(value = "/consume/qrcode/query/{refno}",
produces = { "application/json" },
method = RequestMethod.GET)
- default ResponseEntity<QrcodePayConfirmResponse> qrcodePayQuery(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-Tenant-Id", required=true) String xTenantId,@ApiParam(value = "系统交易参考号",required=true) @PathVariable("refno") String refno) {
+ default ResponseEntity<QrcodePayConfirmResponse> qrcodePayQuery(@ApiParam(value = "租户ID" ,required=true) @RequestHeader(value="X-TENANT-ID", required=true) String xTenantId,@ApiParam(value = "系统交易参考号",required=true) @PathVariable("refno") String refno) {
getRequest().ifPresent(request -> {
for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) {
if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt
index 7d86677..7bf36cd 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/k12_consume_api_controller.kt
@@ -3,21 +3,24 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentPayService
import com.supwisdom.dlpay.agent.AgentPayServiceContext
-import com.supwisdom.dlpay.agent.domain.QrcodePattern
import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.agent.service.AgentServiceProxy
import com.supwisdom.dlpay.api.ConsumeApi
-import com.supwisdom.dlpay.api.service.*
+import com.supwisdom.dlpay.api.service.ConsumePayService
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.api.service.UserService
import com.supwisdom.dlpay.exception.BadRequestError
+import com.supwisdom.dlpay.exception.ConflictError
import com.supwisdom.dlpay.exception.TransactionCheckException
import com.supwisdom.dlpay.framework.ResponseBodyBuilder
import com.supwisdom.dlpay.framework.service.SystemUtilService
import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.framework.util.TradeErrorCode
-import com.supwisdom.dlpay.payapi.model.QrcodePayInitRequest
-import com.supwisdom.dlpay.payapi.model.QrcodePayInitResponse
-import com.supwisdom.multitenant.TenantContextHolder
+import com.supwisdom.dlpay.payapi.model.*
import org.apache.commons.lang3.StringUtils
+import org.springframework.dao.PessimisticLockingFailureException
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@@ -35,83 +38,90 @@
private val agentPayServiceContext: AgentPayServiceContext,
private val userService: UserService,
private val consumePayService: ConsumePayService,
- private val transactionService: TransactionServiceProxy,
- private val accountUtilServcie: AccountUtilServcie) : ConsumeApi {
+ private val transactionService: TransactionServiceProxy) : ConsumeApi {
override fun getRequest(): Optional<NativeWebRequest> {
return Optional.ofNullable(request)
}
override fun qrcodePayInit(xTenantId: String, @Valid param: QrcodePayInitRequest): ResponseEntity<QrcodePayInitResponse> {
- val apiResp = QrcodePayInitResponse()
- // 1. 检查 qrcode
- val qrcode: QrcodePattern
try {
- qrcode = agentServiceProxy.qrcodeMatch(param.qrcode)
+ val apiResp = QrcodePayInitResponse()
+ // 1. 检查 qrcode
+ val qrcode = agentServiceProxy.qrcodeMatch(param.qrcode)
?: throw BadRequestError("未识别的支付码")
- } catch (e: Exception) {
- throw BadRequestError(e.message!!)
- }
- val sourceType = sourceTypeService.getBySourceType(qrcode.sourceType)
- ?: throw BadRequestError("不支持的支付方式<${qrcode.sourceType}>")
- if (sourceType.paySubjno.isEmpty()
- || !StringUtils.isNumeric(sourceType.paySubjno)) {
- throw BadRequestError("支付方式<${qrcode.sourceType}>未配置科目号")
- }
- val systime = systemUtilService.sysdatetime
- // 2. 记录 qrcode 交易明细表
- val qrcodeTrans = agentServiceProxy.qrcodePayTransSaveOrUpdate(
- QrcodePayTrans().apply {
- this.agentMerchId = param.shopaccno
- this.billno = param.billno
- this.qrcode = param.qrcode
- this.createTime = systime.sysdate
- this.hostdate = systime.hostdate
- this.sourceType = sourceType.sourceType
- this.updateTime = systime.sysdate
- })
- // 3. 查询用户身份
- val service = createAgentService<QrcodePayTrans>(qrcode.sourceType)
- val agentResp = service.auth(param.shopaccno, param.billno)
- // 4. 重新读取 qrcode 交易明细表,以获取 service.auth 查询后的结果数据
- // 修改, 通过返回值来判断
+ val sourceType = sourceTypeService.getBySourceType(qrcode.sourceType)
+ ?: throw BadRequestError("不支持的支付方式<${qrcode.sourceType}>")
+ if (sourceType.paySubjno.isEmpty()
+ || !StringUtils.isNumeric(sourceType.paySubjno)) {
+ throw BadRequestError("支付方式<${qrcode.sourceType}>未配置科目号")
+ }
+ val systime = systemUtilService.sysdatetime
+ // 2. 记录 qrcode 交易明细表
+ val qrcodeTrans = agentServiceProxy.qrcodePayTransSaveOrUpdate(
+ QrcodePayTrans().apply {
+ this.agentMerchId = param.shopaccno
+ this.billno = param.billno
+ this.qrcode = param.qrcode
+ this.createTime = systime.sysdate
+ this.hostdate = systime.hostdate
+ this.sourceType = sourceType.sourceType
+ this.updateTime = systime.sysdate
+ this.isAnonymous = true
+ })
+ // 3. 查询用户身份
+ val service = createAgentService<QrcodePayTrans>(qrcode.sourceType)
+ val agentResp = service.auth(param.shopaccno, param.billno)
+ // 4. 重新读取 qrcode 交易明细表,以获取 service.auth 查询后的结果数据
+ // 修改, 通过返回值来判断
// val qrcodeTransResp = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(qrcodeTrans.agentMerchId,
// qrcodeTrans.billno)
- apiResp.also {
- it.sourcetype = sourceType.sourceType
- }
- return when (agentResp.code) {
- AgentCode.SUCCESS -> {
- val qrcodeTransResp = agentResp.payload
- if (!sourceType.anonymousEnable && qrcodeTransResp.isAnonymous) {
- throw BadRequestError("支付方式<${qrcode.sourceType}> 不支持匿名支付")
- } else {
- // 更新qrcode交易明细表 是否匿名 字段
- if (StringUtil.isEmpty(qrcodeTransResp.userid)) {
- qrcodeTransResp.isAnonymous = true
+ apiResp.also {
+ it.sourcetype = sourceType.sourceType
+ }
+ return when (agentResp.code) {
+ AgentCode.SUCCESS -> {
+ val qrcodeTransResp = agentResp.payload
+ if (!sourceType.anonymousEnable && qrcodeTransResp.isAnonymous) {
+ throw BadRequestError("支付方式<${qrcode.sourceType}> 不支持匿名支付")
} else {
- val person = userService.findByUseridOrThirdUniqueIdenty(qrcodeTransResp.userid, null)
- if (person == null) {
+ // 更新qrcode交易明细表 是否匿名 字段
+ if (StringUtil.isEmpty(qrcodeTransResp.userid)) {
qrcodeTransResp.isAnonymous = true
} else {
- apiResp.apply {
- qrcodeTransResp.isAnonymous = false
- this.userid = qrcodeTransResp.agentUserId
- this.username = person.name
+ val person = userService.findByUseridOrThirdUniqueIdenty(qrcodeTransResp.userid, null)
+ if (person == null) {
+ qrcodeTransResp.isAnonymous = true
+ } else {
+ apiResp.apply {
+ qrcodeTransResp.isAnonymous = false
+ this.userid = qrcodeTransResp.agentUserId
+ this.username = person.name
+ }
}
}
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans.also {
+ it.isAnonymous = qrcodeTransResp.isAnonymous
+ })
+ ResponseBodyBuilder.ok(apiResp)
}
- agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans.also {
- it.isAnonymous = qrcodeTransResp.isAnonymous
- })
- ResponseBodyBuilder.ok(apiResp)
+ }
+ AgentCode.NOT_SUPPORT -> {
+ throw BadRequestError("系统或商户暂不支持当前的支付类型}")
+ }
+ else -> {
+ throw BadRequestError("第三方身份错误,<${agentResp.agentMsg}")
}
}
- AgentCode.NOT_SUPPORT -> {
- throw BadRequestError("系统或商户暂不支持当前的支付类型}")
- }
- else -> {
- throw BadRequestError("第三方身份错误,<${agentResp.agentMsg}")
+ } catch (e: Exception) {
+ when (e) {
+ is BadRequestError -> throw BadRequestError(e.message)
+ is PessimisticLockingFailureException -> throw ConflictError(e.message)
+ else -> {
+ e.printStackTrace()
+ println("二维码消费初始化异常:<${e.message}>")
+ throw InternalError(e.message)
+ }
}
}
}
@@ -122,118 +132,97 @@
"支付类型<$sourceType>未定义")
}
-// override fun qrcodePayConfirm(xTenantId: String, @Valid param: QrcodePayConfirmRequest): ResponseEntity<Void> {
-// //1. 交易检查
-// val apiResponse = QrcodePayResponse()
-// val qrcodeTrans = agentServiceProxy.qrcodePayTransFindByMerchIdAndBillno(param.shopaccno,
-// param.billno) ?: return ResponseBodyBuilder.notFound(
-// "未找到billno") as ResponseEntity<Void>
-// if (!qrcodeTrans.refno.isNullOrEmpty()) {
-// return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR, "该交易已确认,请查询结果"))
-// }
-//
-// if (qrcodeTrans.qrcode != param.qrcode && param.qrcode.isNotEmpty()) {
-// val qrcode = agentServiceProxy.qrcodeMatch(param.qrcode)
-// ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR, "未识别的支付码"))
-// if (qrcodeTrans.sourceType != qrcode.sourceType) {
-// return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR, "支付码不符"))
-// }
-// qrcodeTrans.qrcode = param.qrcode
-// }
-//
-// val sourceType = sourceTypeService.getBySourceType(qrcodeTrans.sourceType)
-// ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR,
-// "不支持的支付方式<${qrcodeTrans.sourceType}>"))
-// if (!sourceType.anonymousEnable && qrcodeTrans.isAnonymous) {
-// return ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR,
-// "支付方式<${qrcodeTrans.sourceType}>不支持匿名支付"))
-// }
-// qrcodeTrans.spip = param.spip
-// val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES)
-// //2. 初始化交易流水
-// // sourcetype 资产类科目
-// val stSubject = accountUtilServcie.readSubject(sourceType.paySubjno)
-// // build 交易明细
-// val builder = TransactionBuilder().apply {
-// setTransInfo(param.transdate, param.transtime, TradeCode.TRANSCODE_QRCODE, qrcodeTrans.sourceType)
-// setOutTransInfo(qrcodeTrans.agentMerchId, qrcodeTrans.billno)
-// payinfo = qrcodeSummary(sourceType)
-// description = dtlType.dictcaption
-// dtltype = param.dtltype
-// }
-//
-// val shopacc = accountUtilServcie.readShopbyShopaccno(qrcodeTrans.agentMerchId)
-// val amount = param.amount / 100.0
-// builder.shop(shopacc).apply {
-// setAmount(amount, TradeDict.TRADE_FLAG_IN)
-// }
-// if (qrcodeTrans.isAnonymous) {
-// builder.anonymous().apply {
-// setAmount(amount, TradeDict.TRADE_FLAG_OUT)
-// setOpposite(shopacc.shopaccno, shopacc.shopname)
-// }.and() // 匿名消费时,借 科目 , 贷 商户
-// .addDebitCreditRecord(AccountProxy(stSubject), AccountProxy(shopacc),
-// amount, qrcodeSummary(sourceType))
-// } else {
-// val account = accountUtilServcie.readAccount(param.userid)
-// builder.person(account).apply {
-// setAmount(amount, TradeDict.TRADE_FLAG_OUT)
-// setOpposite(shopacc.shopaccno, shopacc.shopname)
-// }.and().shop().apply {
-// setOpposite(account.accno, account.accname)
-// }.and() // 实名消费时, 1. 借 科目, 贷 个人账户 ;2. 借 个人账户 贷 商户
-// .addDebitCreditRecord(AccountProxy(stSubject), AccountProxy(account),
-// amount, qrcodeSummary(sourceType))
-// .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
-// amount, qrcodeSummary(sourceType))
-// }
-//
-// // 同一个客户ID + billno 是唯一索引,如果重复请求不能保存
-// val transaction = builder.init(transactionService)
-//
-// // qrcode 交易明细表记录 refno
-// qrcodeTrans.refno = transaction.refno
-// // 保存失败,可能客户端重复请求,导致前序交易已完成
-// agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
-//
-// //3. 调用第三方支付
-// transactionService.wip(transaction.refno)
-// val service = createAgentService<QrcodePayTrans>(qrcodeTrans.sourceType)
-// apiResponse.apply {
-// refno = transaction.refno
-// accdate = transaction.accdate
-// isRequireQuery = false
-// anonymous = qrcodeTrans.isAnonymous
-// }
-//
-// val response = service.pay(transaction)
-// return when (response.code) {
-// AgentCode.SUCCESS -> {
-// transactionService.success(transaction.refno, response.agentRefno)
-// ResponseEntity.ok(ResponseBodyBuilder.create()
-// .success(apiResponse))
-// }
-// AgentCode.REQUIRE_QUERY -> {
-// ResponseEntity.ok(ResponseBodyBuilder.create()
-// .success(apiResponse.also {
-// it.isRequireQuery = true
-// }))
-// }
-// else -> {
-// transactionService.fail(transaction.refno, response.agentMsg)
-// ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(apiResponse, TradeErrorCode.BUSINESS_DEAL_ERROR,
-// "第三方身份错误,<${response.agentMsg}"))
-// }
-// }
-// }
+ override fun qrcodePayConfirm(xTenantId: String, @Valid param: QrcodePayConfirmRequest): ResponseEntity<QrcodePayConfirmResponse> {
+ try {//1. 交易检查
-// override fun qrcodePayQuery(xTenantId: String, refno: String): ResponseEntity<Void> {
-// return null
-// }
+ val transaction = consumePayService.getTransactionMainByParam(param)
+ val systime = systemUtilService.sysdatetime
+ val apiResponse = QrcodePayConfirmResponse().apply {
+ this.refno = transaction.refno
+ this.hostDate = systime.hostdate
+ this.hostTime = systime.hosttime
+ }
+ if (TradeDict.DTL_STATUS_INIT != transaction.status) {
+ return when (transaction.status) {
+ TradeDict.DTL_STATUS_WIP -> {
+ ResponseBodyBuilder.ok(apiResponse.apply {
+ this.result = TransResult.REQUIRE_QUERY
+ })
+ }
+ TradeDict.DTL_STATUS_FAIL -> {
+ ResponseBodyBuilder.ok(apiResponse.apply {
+ this.result = TransResult.FAILED
+ })
+ }
+ TradeDict.DTL_STATUS_SUCCESS -> {
+ ResponseBodyBuilder.ok(apiResponse.apply {
+ this.result = TransResult.ALREADY_SUCCESS
+ })
+ }
+ else -> {
+ ResponseBodyBuilder.ok(apiResponse.apply {
+ this.result = TransResult.FAILED
+ })
+ }
+ }
+ }
+
+ transactionService.qrcodeWip(param.billno, transaction)
+
+ val service = createAgentService<QrcodePayTrans>(transaction.sourceType)
+ val response = service.pay(transaction)
+
+ consumePayService.qrcodePayConfirmPostProcess(response, param.billno, transaction)
+ return when (response.code) {
+ AgentCode.SUCCESS -> {
+ ResponseBodyBuilder.ok(apiResponse.apply { this.result = TransResult.SUCCESS })
+ }
+ AgentCode.REQUIRE_QUERY -> {
+ ResponseBodyBuilder.ok(apiResponse.apply { this.result = TransResult.REQUIRE_QUERY })
+ }
+ else -> {
+ ResponseBodyBuilder.ok(apiResponse.apply { this.result = TransResult.FAILED })
+ }
+ }
+ } catch (e: Exception) {
+ when (e) {
+ is BadRequestError -> throw BadRequestError(e.message)
+ is PessimisticLockingFailureException -> throw ConflictError(e.message)
+ else -> {
+ e.printStackTrace()
+ println("二维码消费确认异常:<${e.message}>")
+ throw InternalError(e.message)
+ }
+ }
+ }
+ }
+
+ override fun qrcodePayQuery(xTenantId: String, refno: String): ResponseEntity<QrcodePayConfirmResponse> {
+ try {
+ val systime = systemUtilService.sysdatetime
+ consumePayService.getTransactionMainDtl(refno, null, null)?.let {
+ return ResponseBodyBuilder.ok(QrcodePayConfirmResponse().apply {
+ this.refno = it.refno
+ this.hostDate = systime.hostdate
+ this.hostTime = systime.hosttime
+ this.result = when (it.status) {
+ TradeDict.DTL_STATUS_SUCCESS -> TransResult.SUCCESS
+ TradeDict.DTL_STATUS_WIP -> TransResult.REQUIRE_QUERY
+ TradeDict.DTL_STATUS_FAIL -> TransResult.FAILED
+ else -> TransResult.FAILED
+ }
+ })
+ } ?: throw BadRequestError("未找到refno")
+ } catch (e: Exception) {
+ when (e) {
+ is BadRequestError -> throw BadRequestError(e.message)
+ is PessimisticLockingFailureException -> throw ConflictError(e.message)
+ else -> {
+ e.printStackTrace()
+ println("二维码消费查询异常:<${e.message}>")
+ throw InternalError(e.message)
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
index 29867ae..832cf5c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
@@ -1,7 +1,10 @@
package com.supwisdom.dlpay.api.service
+import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.framework.domain.TDictionary
+import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmRequest
import org.springframework.transaction.annotation.Propagation
import org.springframework.transaction.annotation.Transactional
@@ -19,9 +22,14 @@
fun getTransactionMainDtl(refno: String?, billno: String?, shopaccno: String?): TTransactionMain?
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
- fun getDtltypeDictionary(dictval:String, dicttype:String):TDictionary
+ fun getDtltypeDictionary(dictval: String, dicttype: String): TDictionary
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class], readOnly = true)
fun checkCanReverse(sourcetype: String, shopaccno: String? = null): Boolean
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun qrcodePayConfirmPostProcess(response: AgentResponse<QrcodePayTrans>, billno: String,transaction:TTransactionMain)
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = [Exception::class])
+ fun getTransactionMainByParam(param: QrcodePayConfirmRequest): TTransactionMain
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
index 8830fcd..9d8b5c4 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/consume_pay_service_impl.kt
@@ -1,14 +1,30 @@
package com.supwisdom.dlpay.api.service.impl
+import com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.AgentPayService
+import com.supwisdom.dlpay.agent.AgentPayServiceContext
+import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.agent.dao.QrcodePayTransDao
+import com.supwisdom.dlpay.agent.domain.QrcodePayTrans
+import com.supwisdom.dlpay.agent.service.AgentServiceProxy
+import com.supwisdom.dlpay.api.AccountProxy
+import com.supwisdom.dlpay.api.TransactionBuilder
import com.supwisdom.dlpay.api.dao.TransactionMainDao
+import com.supwisdom.dlpay.api.domain.TSourceType
import com.supwisdom.dlpay.api.domain.TTransactionMain
import com.supwisdom.dlpay.api.exception.RequestParamCheckException
+import com.supwisdom.dlpay.api.service.AccountUtilServcie
import com.supwisdom.dlpay.api.service.ConsumePayService
import com.supwisdom.dlpay.api.service.SourceTypeService
-
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
+import com.supwisdom.dlpay.exception.BadRequestError
+import com.supwisdom.dlpay.exception.TransactionCheckException
import com.supwisdom.dlpay.framework.dao.DictionaryDao
import com.supwisdom.dlpay.framework.domain.TDictionary
-import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.payapi.model.QrcodePayConfirmRequest
+import com.supwisdom.multitenant.TenantContextHolder
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@@ -20,6 +36,18 @@
lateinit var transactionMainDao: TransactionMainDao
@Autowired
lateinit var dictionaryDao: DictionaryDao
+ @Autowired
+ lateinit var agentServiceProxy: AgentServiceProxy
+ @Autowired
+ lateinit var accountUtilServcie:AccountUtilServcie
+ @Autowired
+ lateinit var transactionService:TransactionServiceProxy
+ @Autowired
+ lateinit var agentPayServiceContext: AgentPayServiceContext
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
+ @Autowired
+ lateinit var qrcodePayTransDao: QrcodePayTransDao
override fun checkShopPaytype(shopaccno: String, sourceType: String, anonymousflag: Boolean?): Boolean {
return sourceTypeService.checkShopSourceType(shopaccno, sourceType, true == anonymousflag)
@@ -53,4 +81,104 @@
sourceTypeService.checkShopCanReverse(sourcetype, shopaccno);
}
}
+
+ override fun qrcodePayConfirmPostProcess(response: AgentResponse<QrcodePayTrans>, billno: String,transaction:TTransactionMain) {
+ val qrcodeTrans = qrcodePayTransDao.findByQrcodePayTransForUpdate(transaction.outId, systemUtilService.sysdatetime.hostdate,
+ billno, TenantContextHolder.getContext().tenant.id)
+ ?: throw BadRequestError("未找到billno")
+ when (response.code) {
+ AgentCode.SUCCESS -> {
+ transactionService.qrcodeSuccess(transaction.refno, response.agentRefno,transaction)
+ }
+ AgentCode.REQUIRE_QUERY -> {
+ return
+ }
+ else -> {
+ transactionService.qrcodeFail(transaction.refno, response.agentMsg,transaction)
+ }
+ }
+ }
+
+ private fun qrcodeSummary(st: TSourceType): String = st.paydesc + "扫码付"
+
+ fun <T> createAgentService(sourceType: String): AgentPayService<T> {
+ return agentPayServiceContext.findAgentPayService(sourceType)
+ ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "支付类型<$sourceType>未定义")
+ }
+
+ override fun getTransactionMainByParam(param: QrcodePayConfirmRequest): TTransactionMain {
+ // 1.交易检查
+ val qrcodeTrans = qrcodePayTransDao.findByQrcodePayTransForUpdate(param.shopaccno, systemUtilService.sysdatetime.hostdate,
+ param.billno, TenantContextHolder.getContext().tenant.id)
+ ?: throw BadRequestError("未找到billno")
+
+ if (qrcodeTrans.qrcode != param.qrcode && param.qrcode.isNotEmpty()) {
+ val qrcode = agentServiceProxy.qrcodeMatch(param.qrcode)
+ ?: throw BadRequestError("未识别的支付码")
+ if (qrcodeTrans.sourceType != qrcode.sourceType) {
+ throw BadRequestError("支付码不符")
+ }
+ qrcodeTrans.qrcode = param.qrcode
+ }
+
+ val sourceType = sourceTypeService.getBySourceType(qrcodeTrans.sourceType)
+ ?: throw BadRequestError("不支持的支付方式<${qrcodeTrans.sourceType}>")
+ if (!sourceType.anonymousEnable && qrcodeTrans.isAnonymous) {
+ throw BadRequestError("支付方式<${qrcodeTrans.sourceType}>不支持匿名支付")
+ }
+
+ if (!qrcodeTrans.refno.isNullOrEmpty()) {
+ return getTransactionMainDtl(qrcodeTrans.refno, null, null)
+ ?: throw InternalError("未找到refno")
+ }
+
+ //2. 初始化交易流水
+ qrcodeTrans.spip = "192.168.43.90"
+ val dtlType = getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES)
+ // sourcetype 资产类科目
+ val stSubject = accountUtilServcie.readSubject(sourceType.paySubjno)
+ val builder = TransactionBuilder().apply {
+ setTransInfo(param.transDate, param.transTime, TradeCode.TRANSCODE_QRCODE, qrcodeTrans.sourceType)
+ setOutTransInfo(qrcodeTrans.agentMerchId, qrcodeTrans.billno)
+ payinfo = qrcodeSummary(sourceType)
+ description = dtlType.dictcaption
+ dtltype = param.dtltype
+ }
+
+ val shopacc = accountUtilServcie.readShopbyShopaccno(qrcodeTrans.agentMerchId)
+ val amount = param.amount / 100.0
+ builder.shop(shopacc).apply {
+ setAmount(amount, TradeDict.TRADE_FLAG_IN)
+ }
+ if (qrcodeTrans.isAnonymous) {
+ builder.anonymous().apply {
+ setAmount(amount, TradeDict.TRADE_FLAG_OUT)
+ setOpposite(shopacc.shopaccno, shopacc.shopname)
+ }.and() // 匿名消费时,借 科目 , 贷 商户
+ .addDebitCreditRecord(AccountProxy(stSubject), AccountProxy(shopacc),
+ amount, qrcodeSummary(sourceType))
+ } else {
+ val account = accountUtilServcie.readAccount(param.userid)
+ builder.person(account).apply {
+ setAmount(amount, TradeDict.TRADE_FLAG_OUT)
+ setOpposite(shopacc.shopaccno, shopacc.shopname)
+ }.and().shop().apply {
+ setOpposite(account.accno, account.accname)
+ }.and() // 实名消费时, 1. 借 科目, 贷 个人账户 ;2. 借 个人账户 贷 商户
+ .addDebitCreditRecord(AccountProxy(stSubject), AccountProxy(account),
+ amount, qrcodeSummary(sourceType))
+ .addDebitCreditRecord(AccountProxy(account), AccountProxy(shopacc),
+ amount, qrcodeSummary(sourceType))
+ }
+
+ // 同一个客户ID + billno 是唯一索引,如果重复请求不能保存
+ val transaction = builder.init(transactionService)
+ // qrcode 交易明细表记录 refno
+ qrcodeTrans.refno = transaction.refno
+ // 保存失败,可能客户端重复请求,导致前序交易已完成
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(qrcodeTrans)
+
+ return transaction
+ }
}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 6165d49..2061144 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -1,5 +1,6 @@
package com.supwisdom.dlpay.api.service.impl
+import com.supwisdom.dlpay.agent.dao.QrcodePayTransDao
import com.supwisdom.dlpay.api.TransactionBuilder
import com.supwisdom.dlpay.api.dao.TransactionMainDao
import com.supwisdom.dlpay.api.domain.*
@@ -35,6 +36,9 @@
@Autowired
private lateinit var sourceTypeService: SourceTypeService
+ @Autowired
+ private lateinit var qrcodePayTransDao: QrcodePayTransDao
+
/// 公共函数部分
private fun preCheck(builder: TransactionBuilder) {
@@ -293,6 +297,18 @@
return transaction
}
+ override fun qrcodeWip(billno: String,transaction:TTransactionMain): TTransactionMain {
+ val qrcodeTrans = qrcodePayTransDao.findByQrcodePayTransForUpdate(transaction.outId, systemUtilService.sysdatetime.hostdate,
+ billno, TenantContextHolder.getContext().tenant.id)
+ ?: throw InternalError("未找到billno")
+ if (transaction.status != TradeDict.DTL_STATUS_INIT) {
+ throw InternalError("流水<${transaction.refno}>状态错误")
+ }
+ updateRecordStatus(transaction, TradeDict.DTL_STATUS_WIP)
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+
override fun fail(refno: String): TTransactionMain {
return fail(refno, "")
}
@@ -325,6 +341,32 @@
return transaction
}
+ override fun qrcodeFail(refno: String, remark: String, transaction: TTransactionMain): TTransactionMain {
+
+ val errorStatus = setOf(TradeDict.DTL_STATUS_SUCCESS, TradeDict.DTL_STATUS_CANCEL)
+ if (transaction.status in errorStatus) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>状态错误")
+ }
+
+ updateRecordStatus(transaction, TradeDict.DTL_STATUS_FAIL)
+ if (transaction.person) {
+ transaction.personDtl.remark = remark
+ }
+ if (transaction.shop) {
+ transaction.shopDtl.remark = remark
+ }
+ if (transaction.reverseType != TradeDict.REVERSE_FLAG_NONE) {
+ val originTrans = transactionMainDao.findByRefnoNoLock(transaction.reverseRefno ?: "")
+ ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "系统异常,无法处理退款流水")
+ originTrans.reverseFlag = TradeDict.REVERSE_FLAG_NONE
+ transactionMainDao.save(originTrans)
+ }
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+
//////////////////////////////////////////////////////////////////
// 成功
private fun transactionOnSuccess(transaction: TTransactionMain, sorcetypeRefno: String, overdraft: Boolean) {
@@ -388,6 +430,37 @@
return transaction
}
+ override fun qrcodeSuccess(refno: String, sourcetypeRefno: String, transaction: TTransactionMain, accdateUpdate: Boolean?): TTransactionMain {
+ val errorStatus = setOf(TradeDict.DTL_STATUS_SUCCESS, TradeDict.DTL_STATUS_CANCEL)
+ if (transaction.status in errorStatus) {
+ throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水<$refno>状态错误,流水已结束")
+ }
+ transaction.status = TradeDict.DTL_STATUS_SUCCESS
+ if (true == accdateUpdate) {
+ transaction.accdate = systemUtilService.accdate
+ }
+ transactionOnSuccess(transaction, sourcetypeRefno, false)
+
+ if (transaction.reverseType != TradeDict.REVERSE_FLAG_NONE) {
+ val originTrans = transactionMainDao.findByRefnoNoLock(transaction.reverseRefno ?: "")
+ ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+ "系统异常,无法处理退款流水")
+ originTrans.reverseFlag = transaction.reverseType
+ if (originTrans.person) {
+ originTrans.personDtl.reverseFlag = originTrans.reverseFlag
+ originTrans.personDtl.reverseAmount = originTrans.refundAmount
+ }
+ if (originTrans.shop) {
+ originTrans.shopDtl.reverseFlag = originTrans.reverseFlag
+ }
+ transactionMainDao.save(originTrans)
+ }
+
+ transaction.endTime = systemUtilService.sysdatetime.sysdate
+ transactionMainDao.save(transaction)
+ return transaction
+ }
+
override fun success(refno: String): TTransactionMain {
return success(refno, "", true)
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
index cb4a931..dd9dff4 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/transaction_service.kt
@@ -23,15 +23,24 @@
fun wip(builder: TransactionBuilder): TTransactionMain
@Transactional
+ fun qrcodeWip(billno: String, transaction: TTransactionMain): TTransactionMain
+
+ @Transactional
fun fail(refno: String): TTransactionMain
@Transactional
fun fail(refno: String, remark: String): TTransactionMain
@Transactional
+ fun qrcodeFail(refno: String, remark: String, transaction: TTransactionMain): TTransactionMain
+
+ @Transactional
fun success(refno: String, sourcetypeRefno: String, accdateUpdate: Boolean? = true): TTransactionMain
@Transactional
+ fun qrcodeSuccess(refno: String, sourcetypeRefno: String, transaction: TTransactionMain, accdateUpdate: Boolean? = true): TTransactionMain
+
+ @Transactional
fun success(refno: String): TTransactionMain
@Transactional
@@ -93,6 +102,10 @@
return transactionService.wip(refno)
}
+ fun qrcodeWip(billno: String, transaction: TTransactionMain): TTransactionMain {
+ return transactionService.qrcodeWip(billno, transaction)
+ }
+
fun fail(refno: String): TTransactionMain {
return transactionService.fail(refno)
}
@@ -101,6 +114,10 @@
return transactionService.fail(refno, remark)
}
+ fun qrcodeFail(refno: String, remark: String, transaction: TTransactionMain): TTransactionMain {
+ return transactionService.qrcodeFail(refno, remark, transaction)
+ }
+
fun success(refno: String, sourcetypeRefno: String, accdateUpdate: Boolean? = true): TTransactionMain {
return transactionService.success(refno, sourcetypeRefno, accdateUpdate).also {
if (it.shop) {
@@ -116,6 +133,22 @@
}
}
+ fun qrcodeSuccess(refno: String, sourcetypeRefno: String, transaction: TTransactionMain, accdateUpdate: Boolean? = true): TTransactionMain {
+ return transactionService.qrcodeSuccess(refno, sourcetypeRefno, transaction, accdateUpdate).also {
+ if (it.shop) {
+ shopAccBalanceAsyncTask.updateShopBalance(TenantContextHolder.getContext().tenant, it.shopDtl)
+ }
+
+ if (it.person && !it.personDtl.userid.isNullOrEmpty()) {
+ kafkaSendMsgService.sendJpushMessage(it.personDtl.userid,
+ "交易提醒",
+ "你有一笔${it.personDtl.amount}元的支出,点击查看详情",
+ it.refno, mutableMapOf(), it.tenantid)
+ }
+ }
+ }
+
+
fun success(refno: String): TTransactionMain {
return success(refno, "")
}
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index 3223e1c..6df1eef 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -57,5 +57,5 @@
multi-tenant.session.enableSessionScopedBean=false
multi-tenant.datasource.base-package=com.supwisdom.dlpay
multi-tenant.task.datacenter=default
-multi-tenant.environment=default
+multi-tenant.environment=touchorder
multi-tenant.task.worker.name=payapi
diff --git a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
index 96d2460..0d4f808 100644
--- a/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
+++ b/payapi/src/test/kotlin/com/supwisdom/dlpay/controller/security_controller_test.kt
@@ -125,8 +125,8 @@
@Test
fun testHMACSHA256() {
- val token = "TJ3UlX9/tyunSZ2b"
- val secret = "5f788ce433ec44f299351cdf7f137e81"
+ val token = "ddCUUHAF/OOBTAZq"
+ val secret = "dc1d26c0d43e442588092c8d45c21bce"
val jwt = HmacUtil.HMACSHA256(token, secret)
println(jwt)
}