From 8af03dd8432c240313f73eb6a0b2b3c672e3b595 Mon Sep 17 00:00:00 2001 From: qiaowei Date: Mon, 29 Jul 2019 15:00:31 +0800 Subject: [PATCH] =?utf8?q?=E6=94=AF=E4=BB=98=E6=8E=A5=E5=8F=A3=E4=BF=AE?= =?utf8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/api/bean/ThirdPayfinishParam.java | 1 + .../dlpay/api/bean/ThirdPayinitParam.java | 8 ++ .../dlpay/paysdk/proxy/ConsumePropxy.java | 9 +- .../paysdktest/CitizenCardPayProxyTest.java | 5 + .../dlpay/api/bean/WechatReqResp.java | 10 ++ .../dlpay/api/dao/PersonIdentityDao.java | 4 + .../dlpay/api/domain/TPersonIdentity.java | 22 +++++ .../dlpay/framework/util/StringUtil.java | 13 +++ .../dlpay/framework/util/TradeCode.java | 12 +++ .../dlpay/framework/util/TradeDict.java | 4 + .../agent/service/impl/alipay_service_impl.kt | 43 +++++---- .../agent/service/impl/wechat_service_impl.kt | 47 ++++++++-- .../api/controller/consume_api_controller.kt | 54 +++++++---- .../api/controller/notify_api_controller.kt | 93 ++++++++++--------- 14 files changed, 233 insertions(+), 92 deletions(-) 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 b7c19286..67622a9b 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 @@ public class ThirdPayfinishParam extends APIRequestParam { @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 fae16dc1..fc8ebe9e 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 @@ public class ThirdPayinitParam extends APIRequestParam { @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 54975a55..b5e1f3be 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 @@ public interface ConsumePropxy { @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 5e5d9ef1..36705fe9 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 @@ public class CitizenCardPayProxyTest { 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 40b62e51..9cc15b90 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 @@ public class WechatReqResp { 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 6ee3e995..250a2efe 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 @@ package com.supwisdom.dlpay.api.dao; 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 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 805a984e..ec294cfd 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 @@ public class TPersonIdentity { @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 class TPersonIdentity { 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 d5bebe9f..2657b515 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 class StringUtil { } + 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 d55d3456..b78049f9 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 @@ public class TradeCode { // 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 85c2578b..4676ca58 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 class TradeDict { 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 2ca8fef0..4c9d1ed2 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.AlipayTradeQueryModel 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 @@ class AlipayServiceImpl(val sourceTypeService: SourceTypeService, 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 @@ class AlipayServiceImpl(val sourceTypeService: SourceTypeService, 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 1f3b6d11..460e113d 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.ConsumePayService 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 @@ class WechatServiceImpl(val sourceTypeService: SourceTypeService, 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 @@ class WechatServiceImpl(val sourceTypeService: SourceTypeService, 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 @@ class WechatServiceImpl(val sourceTypeService: SourceTypeService, 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 @@ class WechatServiceImpl(val sourceTypeService: SourceTypeService, 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 ebcb63ed..7c356837 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 @@ class ConsumeAPIController { 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 @@ class ConsumeAPIController { * 第三方(支付宝、微信)支付【交易初始化】 * ============================================================================ * */ - @PostMapping("/thirdpay/payinit") - fun thirdpayInit(@RequestBody param: ThirdPayinitParam): ResponseEntity { + @PostMapping("/thirdpay/init") + fun thirdpayInit(@RequestBody param: ThirdPayinitParam,request:HttpServletRequest): ResponseEntity { val dtlType = consumePayService.getDtltypeDictionary(param.dtltype, Dictionary.DTLTYPES) val sourceType = sourceTypeService.getBySourceType(param.sourceType) ?: return ResponseEntity.ok(ResponseBodyBuilder.create() @@ -654,16 +654,20 @@ class ConsumeAPIController { 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 @@ class ConsumeAPIController { } }.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 @@ class ConsumeAPIController { * 第三方(支付宝、微信)支付【交易确认】 * ============================================================================ * */ - @PostMapping("/thirdpay/payfinish") + @PostMapping("/thirdpay/finish") fun thirdpayFinish(@RequestBody param: ThirdPayfinishParam): ResponseEntity { 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 @@ class ConsumeAPIController { 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 @@ class ConsumeAPIController { 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 51ed2efb..c4ae9b6b 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 @@ import javax.servlet.http.HttpServletResponse 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 = HashMap() @@ -55,44 +51,49 @@ class NotifyController { } // 释放资源 inputStream.close() - - val sign = map["sign"] - if (StringUtils.isEmpty(sign)) { - logger.error("签名错误") - return "" - } - map = StringUtil.paraFilter(map) - //TODO 校验签名 - var signStr = StringUtil.createLinkString(map) - val config = paytypeService.getSourceTypeConfigBySourceType(PaytypeUtil.WECHAT) - if (config["appkey"].isNullOrEmpty()) { - logger.error("签名错误") - return "" + val resp = wechatService.doNotify(map) + return if (resp.code == AgentCode.SUCCESS) { + "" + } else { + "" } - val key = config["appkey"] - signStr += "&key=$key" - val signRet = MD5.encodeByMD5(signStr) - logger.error("*******signStr=$signStr") - if (!signRet.equals(sign, ignoreCase = true)) { - return "" - } - 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 "" - } - 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 "" } catch (e: Exception) { e.printStackTrace() logger.error("------------step7----------------" + e.message) return "" } } + + private fun makeMapFromParam(request: HttpServletRequest): Map { + val map = mutableMapOf() + 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 -- 2.17.1