支付接口修改
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java
index b7c1928..67622a9 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayfinishParam.java
@@ -16,6 +16,7 @@
@NotNull(message = "交易参考号不能为空")
private String refno;
+
@Override
public boolean checkParam() throws RequestParamCheckException {
return true;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java
index fae16dc..fc8ebe9 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ThirdPayinitParam.java
@@ -42,6 +42,14 @@
@NotNull(message = "支付方式不能为空")
private String sourceType;
+ @Sign
+ @NotNull(message = "支付类型不能为空,包含:APP,H5,JS,SM")
+ private String subType;
+
+ @Sign
+ private String spip;
+
+
@Override
public boolean checkParam() throws RequestParamCheckException {
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 54975a5..b5e1f3b 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,7 +1,6 @@
package com.supwisdom.dlpay.paysdk.proxy;
-import com.supwisdom.dlpay.api.bean.QrcodePayParam;
-import com.supwisdom.dlpay.api.bean.QrcodePayResponse;
+import com.supwisdom.dlpay.api.bean.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -17,4 +16,10 @@
@PostMapping("/qrcode/confirm")
QrcodePayResponse qrcodePayConfirm(@RequestBody QrcodePayParam param);
+ @PostMapping("/thirdpay/init")
+ ThirdPayResponse thirdpayInit(@RequestBody ThirdPayinitParam param);
+
+ @PostMapping("/thirdpay/finish")
+ ThirdPayResponse thirdpayFinish(@RequestBody ThirdPayfinishParam param);
+
}
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index 5e5d9ef..36705fe 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -174,6 +174,11 @@
response.getRetcode(), equalTo(0));
}
+ @Test
+ public void thirdpay(){
+
+ }
+
public static void main(String[] args) {
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
index 40b62e5..9cc15b9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/WechatReqResp.java
@@ -483,6 +483,16 @@
this.sign = MD5.encodeByMD5(signTemp);
return sign;
}
+ public String generaAPPParamters() {
+ String json = "{\"appid\":\"" + this.appid + "\","
+ + "\"nonceStr\":\"" + this.nonce_str + "\","
+ + "\"packages\":\"" + this.wpackage + "\","
+ + "\"nonceStr\":\"" + this.nonce_str + "\","
+ + "\"prepayid\":\"" + this.prepay_id+"\","
+ + "\"timeStamp\":\"" + this.timestamp + "\","
+ + "\"sign\":\"" + this.sign + "\"}";
+ return json;
+ }
public String generaJSAPISign() {
String signTemp = "appId=" + this.appid
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
index 6ee3e99..250a2ef 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java
@@ -2,9 +2,13 @@
import com.supwisdom.dlpay.api.domain.TPersonIdentity;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface PersonIdentityDao extends JpaRepository<TPersonIdentity, String> {
TPersonIdentity getByThirdUid(String thirdUid);
+
+ @Query("select a from TPersonIdentity a where a.person.userid=?1 and a.sourcetype=?2 ")
+ TPersonIdentity getBySourcetype(String userid,String sourcetype);
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
index 805a984..ec294cf 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java
@@ -36,6 +36,12 @@
@Column(name = "ISSIGNED", length = 20)
private String issigned;
+ @Column(name = "SOURCETYPE", length = 20)
+ private String sourcetype;
+
+ @Column(name = "SOURCETYPEID", length = 64)
+ private String sourcetypeId;
+
public TPersonIdentity() {
}
@@ -112,4 +118,20 @@
public void setTenantid(String tenantid) {
this.tenantid = tenantid;
}
+
+ public String getSourcetype() {
+ return sourcetype;
+ }
+
+ public void setSourcetype(String sourcetype) {
+ this.sourcetype = sourcetype;
+ }
+
+ public String getSourcetypeId() {
+ return sourcetypeId;
+ }
+
+ public void setSourcetypeId(String sourcetypeId) {
+ this.sourcetypeId = sourcetypeId;
+ }
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
index d5bebe9..2657b51 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -153,4 +153,17 @@
}
+ public static String urlAppend(String url ,String path){
+ if(url.endsWith("/")){
+ if(path.startsWith("/")){
+ return url+path.substring(1);
+ }
+ return url+path;
+ }else{
+ if(path.startsWith("/")){
+ return url+path;
+ }
+ return url+"/"+path;
+ }
+ }
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
index d55d345..b78049f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -16,6 +16,18 @@
// QRcode 聚合支付
public static final int TRANSCODE_QRCODE = 1002;
+ //APP 内支付
+ public static final int TRANSCODE_APPPAY = 1003;
+
+ //H5 支付
+ public static final int TRANSCODE_H5PAY = 1004;
+
+ //JS 支付
+ public static final int TRANSCODE_JSPAY = 1005;
+
+ //小程序 支付
+ public static final int TRANSCODE_SMPAY = 1006;
+
public static final int TRANSCODE_ERCHARGE = 3500; //账户充值
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index 85c2578..4676ca5 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -76,6 +76,10 @@
public static final String PAYTYPE_YKT_CARD = "yktpay"; //一卡通
public static final String PAYTYPE_OTHER_THIRDPART = "thirdpart"; //其他第三方
+ public static final String PAYTYPE_APP = "APP"; //app内支付
+ public static final String PAYTYPE_H5 = "H5"; //H5内支付
+ public static final String PAYTYPE_JS = "JS"; //JS内支付
+ public static final String PAYTYPE_SM = "SM"; //SM内支付
/**
* feetype
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
index 2ca8fef..4c9d1ed 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/alipay_service_impl.kt
@@ -24,6 +24,8 @@
import com.alipay.api.domain.AlipayTradeRefundModel
import com.supwisdom.dlpay.RestTemplateConfig
import com.supwisdom.dlpay.api.bean.BaseResp
+import com.supwisdom.dlpay.framework.util.StringUtil
+import com.supwisdom.dlpay.framework.util.TradeCode
@Service
@@ -82,7 +84,7 @@
request.bizModel = AlipayTradePayModel().apply {
this.authCode = qrcodePayTrans.qrcode
this.outTradeNo = transaction.refno
- this.subject = "POS扫支付宝二维码消费"
+ this.subject = transaction.shopDtl.payInfo
this.totalAmount = transaction.shopDtl.amount.toString()
}
try {
@@ -139,33 +141,38 @@
val request = AlipayTradeAppPayRequest()
val productCode = ""
//判断是否为H5
- //productCode = "QUICK_WAP_WAY"
+ if (transaction.transCode == TradeCode.TRANSCODE_H5PAY) productCode = "QUICK_WAP_WAY"
request.bizModel = AlipayTradePayModel().apply {
this.outTradeNo = transaction.refno
- this.subject = "支付宝支付"
+ this.subject = transaction.shopDtl.payInfo
this.totalAmount = transaction.shopDtl.amount.toString()
this.productCode = productCode
}
- request.notifyUrl = config[PaytypeUtil.CFG_ALIPAY_NOTIFY]
- request.returnUrl = config[PaytypeUtil.CFG_ALIPAY_RETURNURL]
+ request.notifyUrl = StringUtil.urlAppend(config[PaytypeUtil.CFG_ALIPAY_NOTIFY],transaction.tenantid)
+ request.returnUrl = StringUtil.urlAppend(config[PaytypeUtil.CFG_ALIPAY_RETURNURL],transaction.tenantid)
try {
/**
* h5 支付方式
- * String form = alipayClient.pageExecute(request).getBody();
- *
* */
- val response = alipayClient.sdkExecute(request)
- if (response.isSuccess) {
- agentResponse.agentRefno = response.tradeNo
- agentResponse.agentMsg = response.msg
- agentResponse.agentCode = response.code
- //body 为APP
- agentResponse.agentBody = response.body
+ if (transaction.transCode == TradeCode.TRANSCODE_H5PAY) {
+ var form = alipayClient.pageExecute(request).body
+ //body 为Html
+ agentResponse.agentBody = form
+ agentResponse.code = AgentCode.REQUIRE_QUERY
} else {
- agentResponse.code = AgentCode.FAIL
- agentResponse.agentMsg = response.msg
- agentResponse.agentCode = response.code
- logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
+ val response = alipayClient.sdkExecute(request)
+ if (response.isSuccess) {
+ agentResponse.agentRefno = response.tradeNo
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
+ //body 为APP
+ agentResponse.agentBody = response.body
+ } else {
+ agentResponse.code = AgentCode.FAIL
+ agentResponse.agentMsg = response.msg
+ agentResponse.agentCode = response.code
+ logger.error { "支付宝:${response.code},${response.msg},${response.subCode},${response.subMsg}" }
+ }
}
} catch (e: AlipayApiException) {
logger.error { "支付宝:${e.message}" }
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 1f3b6d1..460e113 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
@@ -13,6 +13,7 @@
import com.supwisdom.dlpay.api.service.SourceTypeService
import com.supwisdom.dlpay.api.service.TransactionServiceProxy
import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.framework.util.RandomUtils.getRandomString
import com.supwisdom.dlpay.util.PaytypeUtil
import mu.KotlinLogging
import org.apache.commons.lang.StringUtils
@@ -108,7 +109,7 @@
this.out_trade_no = transaction.refno
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
this.spbill_create_ip = qrcodeTrans.spip
- this.body = "POS扫微信二维码支付"
+ this.body = transaction.shopDtl.payInfo
}
bean.generalPaySign()
@@ -152,19 +153,28 @@
val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_WECHAT, transaction.shopDtl.shopaccno, false, false)
if (checkCfg(config, agentResponse)) {
//H5 支付
+ val trans = agentServiceProxy.qrcodePayTransFindByRefno(transaction.refno)
val bean = WechatReqResp().apply {
this.appid = config[PaytypeUtil.CFG_WECHAT_APPID]
this.mch_id = config[PaytypeUtil.CFG_WECHAT_MECHID]
this.key = config[PaytypeUtil.CFG_WECHAT_MECHKEY]
this.out_trade_no = transaction.refno
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
- this.spbill_create_ip = ""
- this.body = "微信支付"
- this.trade_type = "MWEB"
- this.notify_url = config[PaytypeUtil.CFG_WECHAT_NOTIFY]
+ this.spbill_create_ip = trans.spip
+ this.body = transaction.shopDtl.payInfo
+ this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY],transaction.tenantid)
+ this.trade_type = when(transaction.transCode){TradeCode.TRANSCODE_H5PAY->"MWEB"
+ TradeCode.TRANSCODE_JSPAY->"JSAPI"
+ TradeCode.TRANSCODE_APPPAY->"APP"
+ else->"JSAPI"}
this.scene_info = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + config[PaytypeUtil.CFG_WECHAT_NOTIFY] + "\",\"wap_name\": \"微信支付\"}}"
}
- //TODO IP 问题
+ if( transaction.transCode==TradeCode.TRANSCODE_JSPAY || transaction.transCode==TradeCode.TRANSCODE_SMPAY){
+ var p = personIdentityDao.getBySourcetype(transaction.personDtl.userid,transaction.sourceType)
+ if(p!=null){
+ bean.openid = p.sourcetypeId
+ }
+ }
bean.generaSign()
val xml = bean.generaXML()
restTemplate.messageConverters[1] = StringHttpMessageConverter(StandardCharsets.UTF_8)
@@ -172,13 +182,30 @@
var eleMap = XmlUtils.parseXml(res.body)
var retcode = eleMap["return_code"]
var resultCode = eleMap["result_code"]
- val mwebUrl = eleMap["mweb_url"]
+
if (!retcode.isNullOrEmpty() && "SUCCESS" == retcode
- && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode && !mwebUrl.isNullOrEmpty()) {
+ && !resultCode.isNullOrEmpty() && "SUCCESS" == resultCode ) {
agentResponse.code = AgentCode.REQUIRE_QUERY
agentResponse.agentCode =resultCode
agentResponse.agentMsg = eleMap["return_msg"]
- agentResponse.agentBody = mwebUrl
+ when {
+ transaction.transCode==TradeCode.TRANSCODE_H5PAY -> agentResponse.agentBody = eleMap["mweb_url"]
+ transaction.transCode==TradeCode.TRANSCODE_APPPAY -> {
+ bean.prepay_id = eleMap["prepay_id"]
+ bean.timestamp = DateUtil.getNowSecond().toString()
+ bean.nonce_str = getRandomString(30)
+ bean.wpackage = "Sign=WXPay"
+ bean.generaAPPSign()
+ agentResponse.agentBody = bean.generaAPPParamters()
+ }
+ transaction.transCode==TradeCode.TRANSCODE_JSPAY || transaction.transCode==TradeCode.TRANSCODE_SMPAY -> {
+ bean.prepay_id = eleMap["prepay_id"]
+ bean.timestamp = DateUtil.getNowSecond().toString()
+ bean.nonce_str = getRandomString(30)
+ bean.generaJSAPISign()
+ agentResponse.agentBody = bean.generaJSAPIParamters()
+ }
+ }
agentResponse.agentRefno = eleMap["prepay_id"]
} else {
logger.error { "code=${eleMap["err_code"]},des=${eleMap["err_code_des"]}" }
@@ -242,7 +269,7 @@
this.total_fee = MoneyUtil.YuanToFen(transaction.shopDtl.amount)
this.refund_fee = MoneyUtil.YuanToFen(transaction.refundAmount)
this.out_refund_no = transaction.reverseRefno
- this.notify_url = config[PaytypeUtil.CFG_WECHAT_NOTIFY]
+ this.notify_url = StringUtil.urlAppend(config[PaytypeUtil.CFG_WECHAT_NOTIFY],transaction.tenantid)
}
bean.generaReverseSign()
val xml = bean.generaReverseXML()
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 ebcb63e..7c35683 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
@@ -618,7 +618,7 @@
val response = service.pay(transaction)
return when (response.code) {
AgentCode.SUCCESS -> {
- transactionService.success(transaction.refno,response.agentRefno)
+ transactionService.success(transaction.refno, response.agentRefno)
ResponseEntity.ok(ResponseBodyBuilder.create()
.success(apiResponse))
}
@@ -642,8 +642,8 @@
* 第三方(支付宝、微信)支付【交易初始化】
* ============================================================================
* */
- @PostMapping("/thirdpay/payinit")
- fun thirdpayInit(@RequestBody param: ThirdPayinitParam): ResponseEntity<Any> {
+ @PostMapping("/thirdpay/init")
+ fun thirdpayInit(@RequestBody param: ThirdPayinitParam,request:HttpServletRequest): ResponseEntity<Any> {
val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES)
val sourceType = sourceTypeService.getBySourceType(param.sourceType)
?: return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -654,16 +654,20 @@
val account = accountUtilServcie.readAccount(param.uid)
val shopacc = accountUtilServcie.readShopbyShopaccno(param.shopaccno)
val subject = accountUtilServcie.readSubject(sourceType.paySubjno)
- var transcode=0
- when(sourceType.sourceType){
- TradeDict.PAYTYPE_ALIPAY ->transcode = TradeCode.TRANSCODE_ALIPAY
- TradeDict.PAYTYPE_WECHAT ->transcode = TradeCode.TRANSCODE_WECHAT
+ var transcode = 0
+ var des = ""
+ when (param.subType) {
+ TradeDict.PAYTYPE_APP ->{transcode = TradeCode.TRANSCODE_APPPAY;des="APP内支付"}
+ TradeDict.PAYTYPE_JS -> {transcode = TradeCode.TRANSCODE_JSPAY;des="JS支付"}
+ TradeDict.PAYTYPE_H5 -> {transcode = TradeCode.TRANSCODE_H5PAY;des="H5支付"}
+ TradeDict.PAYTYPE_SM -> {transcode = TradeCode.TRANSCODE_SMPAY;des="小程序支付"}
}
val transaction = TransactionBuilder().apply {
- setTransInfo(param.transdate, param.transtime,transcode,
+ setTransInfo(param.transdate, param.transtime, transcode,
sourceType.sourceType)
setOutTransInfo(shopacc.shopaccno, param.billno)
operator(param.shopaccno, TradeDict.OPERTYPE_SHOP)
+ payinfo=sourceType.paydesc+des
}.person(account).apply {
setAmount(param.amount / 100.0, TradeDict.TRADE_FLAG_OUT)
@@ -681,10 +685,28 @@
}
}.init(transactionService)
+ var systime = systemUtilService.sysdatetime
+ if(param.spip.isNullOrEmpty()){
+ param.spip = request.remoteAddr
+ }
+ // 2. 记录 qrcode 交易明细表
+ agentServiceProxy.qrcodePayTransSaveOrUpdate(
+ QrcodePayTrans().apply {
+ this.agentMerchId = param.shopaccno
+ this.billno = param.billno
+ this.qrcode = "none"
+ this.createTime = systime.sysdate
+ this.hostdate = systime.hostdate
+ this.sourceType = sourceType.sourceType
+ this.isAnonymous = false
+ this.updateTime = systime.sysdate
+ this.refno = transaction.refno
+ this.spip = param.spip
+ })
return ResponseEntity.ok(ResponseBodyBuilder.create()
.success(ThirdPayResponse(transaction.refno,
transaction.outTradeNo,
- transaction.shopDtl.amount,null), "交易初始化成功"))
+ transaction.shopDtl.amount, null), "交易初始化成功"))
}
return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -697,13 +719,13 @@
* 第三方(支付宝、微信)支付【交易确认】
* ============================================================================
* */
- @PostMapping("/thirdpay/payfinish")
+ @PostMapping("/thirdpay/finish")
fun thirdpayFinish(@RequestBody param: ThirdPayfinishParam): ResponseEntity<Any> {
val dtl = transactionService.wip(param.refno)
- var type=""
- if(dtl.transCode== TradeCode.TRANSCODE_ALIPAY){
+ var type = ""
+ if (dtl.transCode == TradeCode.TRANSCODE_ALIPAY) {
type = TradeDict.PAYTYPE_ALIPAY
- }else if(dtl.transCode== TradeCode.TRANSCODE_WECHAT){
+ } else if (dtl.transCode == TradeCode.TRANSCODE_WECHAT) {
type = TradeDict.PAYTYPE_WECHAT
}
val service = createAgentService(type)
@@ -714,7 +736,7 @@
return ResponseEntity.ok(ResponseBodyBuilder.create()
.success(ThirdPayResponse(it.refno,
it.outTradeNo,
- it.shopDtl.amount,resp.agentBody), "交易确认成功"))
+ it.shopDtl.amount, resp.agentBody), "交易确认成功"))
}
AgentCode.REQUIRE_QUERY -> {
@@ -722,12 +744,12 @@
return ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(ThirdPayResponse(dtl.refno,
dtl.outTradeNo,
- dtl.shopDtl.amount,resp.agentBody), TradeErrorCode.WAIT_QUERY_RESULT, "请查询支付结果"))
+ dtl.shopDtl.amount, resp.agentBody), TradeErrorCode.WAIT_QUERY_RESULT, "请查询支付结果"))
}
else -> //失败
transactionService.fail(param.refno, resp.agentMsg).let {
return ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(ThirdPayResponse(dtl.refno, dtl.outTradeNo, dtl.shopDtl.amount,resp.agentBody),
+ .fail(ThirdPayResponse(dtl.refno, dtl.outTradeNo, dtl.shopDtl.amount, resp.agentBody),
TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${resp.agentMsg}"))
}
}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
index 51ed2ef..c4ae9b6 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
@@ -1,15 +1,12 @@
package com.supwisdom.dlpay.api.controller
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.SourceTypeService
-import com.supwisdom.dlpay.api.service.TransactionService
-import com.supwisdom.dlpay.framework.util.MD5
-import com.supwisdom.dlpay.framework.util.StringUtil
-import com.supwisdom.dlpay.util.PaytypeUtil
+import com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.service.AlipayService
+import com.supwisdom.dlpay.agent.service.WechatService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
import org.dom4j.io.SAXReader
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.util.StringUtils
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseBody
@@ -26,17 +23,16 @@
class NotifyController {
private val logger = LoggerFactory.getLogger(NotifyController::class.java)
@Autowired
- lateinit var paytypeService: SourceTypeService
+ lateinit var alipayService: AlipayService
@Autowired
- lateinit var accountUtilServcie: AccountUtilServcie
+ lateinit var wechatService: WechatService
- @Autowired
- lateinit var transactionService: TransactionService
-
- @RequestMapping(value = ["/wechat"])
+ @RequestMapping(value = ["/wechat/{schema}"])
@ResponseBody
fun index(@PathVariable schema: String, request: HttpServletRequest,
response: HttpServletResponse): String {
+ logger.error("====================== 收到微信回调通知 wechat notify: ========================")
+ TenantContext.setTenantSchema(schema)
try {
// 解析结果存储在HashMap
var map: MutableMap<String, String> = HashMap()
@@ -55,44 +51,49 @@
}
// 释放资源
inputStream.close()
-
- val sign = map["sign"]
- if (StringUtils.isEmpty(sign)) {
- logger.error("签名错误")
- return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
+ val resp = wechatService.doNotify(map)
+ return if (resp.code == AgentCode.SUCCESS) {
+ "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
+ } else {
+ "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[" + resp.agentMsg + "]]></return_msg></xml>"
}
- map = StringUtil.paraFilter(map)
- //TODO 校验签名
- var signStr = StringUtil.createLinkString(map)
- val config = paytypeService.getSourceTypeConfigBySourceType(PaytypeUtil.WECHAT)
- if (config["appkey"].isNullOrEmpty()) {
- logger.error("签名错误")
- return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>"
- }
- val key = config["appkey"]
- signStr += "&key=$key"
- val signRet = MD5.encodeByMD5(signStr)
- logger.error("*******signStr=$signStr")
- if (!signRet.equals(sign, ignoreCase = true)) {
- return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>"
- }
- logger.error("*******signRet=$signRet,sign=$sign*****************")
- val return_code = map["return_code"]
- val result_code = map["result_code"]
- val out_trade_no = map["out_trade_no"]
- if (out_trade_no == null || StringUtils.isEmpty(out_trade_no)) {
- return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[订单信息错误]]></return_msg></xml>"
- }
- if (!StringUtils.isEmpty(return_code) && "SUCCESS" == return_code
- && !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) {
- //map.get("transaction_id") 第三方流水号
- transactionService.success(out_trade_no)
- }
- return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>"
} catch (e: Exception) {
e.printStackTrace()
logger.error("------------step7----------------" + e.message)
return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[解析失败]]></return_msg></xml>"
}
}
+
+ private fun makeMapFromParam(request: HttpServletRequest): Map<String, String> {
+ val map = mutableMapOf<String, String>()
+ val paramNames = request.parameterNames
+ while (paramNames.hasMoreElements()) {
+ val paramName = paramNames.nextElement() as String
+ val paramValues = request.getParameterValues(paramName)
+ if (paramValues.size == 1) {
+ val paramValue = paramValues[0]
+ if (paramValue.isNotEmpty()) {
+ map[paramName] = paramValue
+ logger.error("$paramName=$paramValue")
+ }
+ }
+ }
+ return map
+ }
+
+ @RequestMapping(value = ["/alipay/{schema}"])
+ @ResponseBody
+ fun alipay(@PathVariable schema: String, request: HttpServletRequest,
+ response: HttpServletResponse): String {
+ logger.error("====================== 收到支付宝回调通知 alipay notify: ========================")
+ TenantContext.setTenantSchema(schema)
+ // 解析结果存储在HashMap
+ val map = makeMapFromParam(request)
+ val resp = alipayService.doNotify(map)
+ return if (resp.code == AgentCode.SUCCESS) {
+ "success"
+ } else {
+ "failure"
+ }
+ }
}
\ No newline at end of file