支付接口修改
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