fix: 修改微信inapp 支付的业务事务完整性
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/InAppPayService.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/InAppPayService.java
index c860bbf..2c66bbc 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/InAppPayService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/InAppPayService.java
@@ -1,6 +1,7 @@
package com.supwisdom.dlpay.agent;
import com.supwisdom.dlpay.api.domain.TTransactionMain;
+import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
@@ -17,15 +18,19 @@
* @param transation
* @return
*/
+ @Transactional
AgentResponse<T> init(TTransactionMain transation);
/**
* 当用支付完成后,第三方支付平台会发起通知给服务端,由服务端处理后续业务
*
+ *
+ * @param refno
* @param request - 第三方平台通知请求的 HttpRequest
* @return
*/
- AgentResponse<T> notify(HttpServletRequest request);
+ @Transactional
+ AgentResponse<T> notify(String refno, HttpServletRequest request);
/**
* 由服务端主动发起的查询第三方支付平交易情况
@@ -33,5 +38,6 @@
* @param transation - 交易参数
* @return
*/
+ @Transactional
AgentResponse<T> query(TTransactionMain transation);
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
index 4b8b1c9..50288b9 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/wechat_service_impl.kt
@@ -31,8 +31,6 @@
class WechatServiceImpl(val sourceTypeService: SourceTypeService,
val agentServiceProxy: AgentServiceProxy,
val personIdentityDao: PersonIdentityDao,
- val sourceTypeConfigDao: SourceTypeConfigDao,
- var shopSourceTypeConfigDao: ShopSourceTypeConfigDao,
val consumePayService: ConsumePayService,
val transactionService: TransactionServiceProxy,
val restTemplate: RestTemplate) : WechatService {
@@ -372,7 +370,7 @@
this.total_fee = 1
this.spbill_create_ip = "14.23.150.211"
this.body = "充值测试"
- this.notify_url = "http://ykt.supwisdom.com:10201/payapi/api/notify/inapp/wechat/100010"
+ this.notify_url = "http://ykt.supwisdom.com:10201/payapi/api/notify/inapp/wechat/100010/${transaction.refno}"
this.trade_type = "MWEB"
this.scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \" https://pay.qq.com\",\"wap_name\": \"微信支付\"}}"
}
@@ -455,9 +453,8 @@
return agentResponse
}
- override fun doPayNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans> {
+ override fun doPayNotify(transaction: TTransactionMain?, param: Map<String, String>): AgentResponse<QrcodePayTrans> {
val agentResponse = AgentResponse<QrcodePayTrans>()
- val transaction = consumePayService.getTransactionMainDtl(param["out_trade_no"], null, null)
if (transaction == null) {
agentResponse.code = AgentCode.REFNO_NOT_EXISTS
agentResponse.agentCode = AgentResponse.AGENTCODE_FAIL
@@ -493,12 +490,6 @@
val resultCode = param["result_code"]
if (!returnCode.isNullOrEmpty() && "SUCCESS" == returnCode
&& !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode) {
- val transid = param["transaction_id"]
- if (transid.isNullOrEmpty()) {
- transactionService.success(transaction.refno)
- } else {
- transactionService.success(transaction.refno, transid, true)
- }
agentResponse.code = AgentCode.SUCCESS
agentResponse.agentCode = resultCode
} else {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_alipay.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_alipay.kt
index 0286f15..f87f922 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_alipay.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_alipay.kt
@@ -16,7 +16,7 @@
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
- override fun notify(request: HttpServletRequest): AgentResponse<AlipayInAppResponse>? {
+ override fun notify(String: refno, request: HttpServletRequest): AgentResponse<AlipayInAppResponse>? {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_wechatpay.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_wechatpay.kt
index 841d411..2010519 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_wechatpay.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/inapp_wechatpay.kt
@@ -3,11 +3,9 @@
import com.supwisdom.dlpay.agent.AgentCode
import com.supwisdom.dlpay.agent.AgentResponse
import com.supwisdom.dlpay.agent.InAppPayService
-import com.supwisdom.dlpay.api.domain.TShopdtl
import com.supwisdom.dlpay.api.domain.TTransactionMain
-import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.TransactionServiceProxy
import mu.KotlinLogging
-import org.dom4j.Element
import org.dom4j.io.SAXReader
import org.springframework.stereotype.Component
import java.util.HashMap
@@ -15,8 +13,8 @@
@Component("wechatInAppAgent")
-class WechatInAppService(private val sourceTypeService: SourceTypeService,
- private val wechatService: WechatService)
+class WechatInAppService(private val wechatService: WechatService,
+ private val transactionServiceProxy: TransactionServiceProxy)
: InAppPayService<TTransactionMain> {
private val logger = KotlinLogging.logger { }
@@ -30,8 +28,8 @@
return wechatPayResponse;
}
- override fun notify(request: HttpServletRequest): AgentResponse<TTransactionMain>? {
- val wechatPayResponse = AgentResponse<TTransactionMain>();
+ override fun notify(refno: String, request: HttpServletRequest): AgentResponse<TTransactionMain>? {
+ val wechatPayResponse = AgentResponse<TTransactionMain>()
// 解析结果存储在HashMap
val map = HashMap<String, String>()
// 读取输入流
@@ -43,11 +41,14 @@
}
// 释放资源
request.inputStream.close()
- val resp = wechatService.doPayNotify(map)
+ val transation = transactionServiceProxy.findTransactionByRefno(refno)
+ val resp = wechatService.doPayNotify(transation, map)
if (resp.code == AgentCode.SUCCESS) {
+ wechatPayResponse.payload = transactionServiceProxy.success(refno)
wechatPayResponse.agentBody = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
} else {
wechatPayResponse.agentBody = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[" + resp.agentMsg + "]]></return_msg></xml>"
+ wechatPayResponse.payload = transactionServiceProxy.fail(refno, resp.agentMsg)
}
return wechatPayResponse
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
index fc9e813..7dddd0c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/wechat_service.kt
@@ -27,7 +27,7 @@
fun doPayQuery(transaction: TTransactionMain): AgentResponse<QrcodePayTrans>
- fun doPayNotify(param: Map<String, String>): AgentResponse<QrcodePayTrans>
+ fun doPayNotify(transaction: TTransactionMain?, param: Map<String, String>): AgentResponse<QrcodePayTrans>
}
@Component("wechatAgent")
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
index a87324f..5710c4a 100644
--- 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
@@ -221,9 +221,10 @@
private val transactionServiceProxy: TransactionServiceProxy,
private val agentPayServiceContext: AgentPayServiceContext) {
- @PostMapping("/inapp/{sourcetype}/{tenant}")
+ @PostMapping("/inapp/{sourcetype}/{tenant}/{refno}")
fun inAppPayCallback(@PathVariable("sourcetype") sourcetype: String,
@PathVariable("tenant") tenant: String,
+ @PathVariable("refno") refno: String,
request: HttpServletRequest): ResponseEntity<*> {
val tenantDetails = tenantDetailsRegistrar.getTenantDetailsById(tenant)
if (!tenantDetails.isPresent) {
@@ -232,7 +233,7 @@
TenantContextHolder.getContext().tenant = tenantDetails.get()
val agent = agentPayServiceContext.findInAppPayService<Any>(sourcetype)
?: return ResponseBodyBuilder.badRequest("请求支付类型错误 <$sourcetype> 不存在")
- val agentResponse = agent.notify(request)
+ val agentResponse = agent.notify(refno, request)
return ResponseBodyBuilder.ok(agentResponse.agentBody)
}
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 77c3e01..b0aefd2 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
@@ -392,6 +392,10 @@
return success(refno, "", true)
}
+ override fun readByRefnoForUpdate(refno: String): TTransactionMain {
+ return transactionMainDao.findByRefnoForUpdate(refno)
+ }
+
//////////////////////////////////////////////////////////////////
// 回退业务接口,包括撤销和退款
override fun refundInit(originRefno: String, refundAmount: Double, builder: TransactionBuilder): TTransactionMain {
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 ca4ef1d..cb4a931 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
@@ -34,6 +34,9 @@
@Transactional
fun success(refno: String): TTransactionMain
+ @Transactional
+ fun readByRefnoForUpdate(refno: String): TTransactionMain
+
/**
* 退款类业务
*/
@@ -149,6 +152,10 @@
return transactionMainDao.findByRefno(refno)
}
+ fun findTransactionByRefnoForUpdate(refno: String): TTransactionMain {
+ return transactionMainDao.findByRefnoForUpdate(refno)
+ }
+
fun findByOutTradeNo(refno: String): TTransactionMain? {
return transactionMainDao.findByOutTradeNo(refno)
}