大理线下签约同步接口定义
authorkaixiang.xia <kaixiang.xia@supwisdom.com>
Fri, 30 Apr 2021 07:58:11 +0000 (15:58 +0800)
committerkaixiang.xia <kaixiang.xia@supwisdom.com>
Fri, 30 Apr 2021 07:58:11 +0000 (15:58 +0800)
payapi/sql/update-210106.sql
payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt

index 803b182..45a6a77 100644 (file)
@@ -30,3 +30,10 @@ CREATE INDEX idx1_ynrccpay_sign ON tb_ynrccpay_sign(bankcardno,shopaccno,status)
 INSERT INTO "tb_transcode" ("transcode_id", "transcode", "transname", "tenantid")
 VALUES (4, 3050, '农商行网关快捷支付', '{tenantid}');
 commit;
+
+
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('26', '农商行网关支付商户号', NULL, 'ynrcc.netpay.Mer_Id', 'f', 'ynrccpay', '{tenantid}');
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('27', '农商行网关支付商户名', NULL, 'ynrcc.netpay.Mer_IdName', 'f', 'ynrccpay', '{tenantid}');
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('28', '农商行网关支付回调地址', NULL, 'ynrcc.netpay.MerURL', 'f', 'ynrccpay', '{tenantid}');
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('25', '农商行网关支付地址', 'https://ebank.ynrcc.com/pweb/%s?LoginType=C&_locale=zh_CN&BankId=9999', 'ynrcc.netpay.URL', 't', 'ynrccpay', '{tenantid}');
+commit;
\ No newline at end of file
index 21edbe8..5c3163c 100644 (file)
@@ -5,6 +5,8 @@ import com.google.gson.reflect.TypeToken
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.DesUtil
+import java.util.*
+import kotlin.collections.ArrayList
 
 class DaliDatasyncParam {
     var app_id: String = ""
@@ -85,4 +87,59 @@ class DaliDatasyncErrorDetail {
     var errmsg: String = ""
 }
 
+/**
+ * 农商行推送线下签约数据报文
+ * */
+class YnrccSendSignInfoParam {
+    var appId: String = ""
+    var bankCardNo: String = ""
+    var idType: String = ""
+    var idNo: String = ""
+    var phone: String = ""
+    var signStatus: String = ""
+    var timestamp: String = ""
+    var signType: String = ""
+    var sign: String = ""
+
+    fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(appId)) {
+            throw RequestParamCheckException("请求参数错误[应用ID为空]")
+        }
+        if(StringUtil.isEmpty(bankCardNo)){
+            throw RequestParamCheckException("请求参数错误[银行卡号为空]")
+        }
+        if (StringUtil.isEmpty(idType)) {
+            throw RequestParamCheckException("请求参数错误[证件类型为空]")
+        }
+        if (StringUtil.isEmpty(idNo)) {
+            throw RequestParamCheckException("请求参数错误[证件号码为空]")
+        }
+        if (StringUtil.isEmpty(phone)) {
+            throw RequestParamCheckException("请求参数错误[手机号为空]")
+        }
+        if (StringUtil.isEmpty(phone)) {
+            throw RequestParamCheckException("请求参数错误[手机号为空]")
+        }
+        if(!listOf("Y","N").contains(signStatus)){
+            throw RequestParamCheckException("请求参数错误[签约状态(Y/N)]")
+        }
+        if (!DateUtil.checkDatetimeValid(timestamp, DateUtil.DATETIME_FMT)) {
+            throw RequestParamCheckException("请求参数错误[时间戳]")
+        }
+        if (StringUtil.isEmpty(signType)
+            || !"HmacSHA256".equals(signType, true)) {
+            throw RequestParamCheckException("请求参数错误[签名算法]")
+        }
+        if (StringUtil.isEmpty(sign)) {
+            throw RequestParamCheckException("请求参数错误[签名为空]")
+        }
+        return true
+    }
+
+    fun checkSign(key: String): Boolean {
+        val signData ="appId=$appId&bankCardNo=$bankCardNo&idType=$idType&idNo=$idNo&phone=$phone&signStatus=$signStatus&timestamp=$timestamp"
+        return sign.equals(HmacUtil.HMACSHA256(signData, key), true)
+    }
+}
+
 
index ee0d97a..d017f6e 100644 (file)
@@ -4,6 +4,7 @@ import com.google.gson.Gson
 import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
 import com.supwisdom.dlpay.api.bean.DaliDatasyncErrorDetail
 import com.supwisdom.dlpay.api.bean.DaliDatasyncParam
+import com.supwisdom.dlpay.api.bean.YnrccSendSignInfoParam
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.api.service.DaliDatasyncService
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
@@ -247,5 +248,39 @@ class DaliDatasyncApiController {
         }
     }
 
+    /**
+     * ============================================================================
+     * 大理卡管系统推送市民卡信息同步接口
+     * ============================================================================
+     * */
+    @PostMapping("/signsync")
+    fun daliDatasync(@RequestBody param: YnrccSendSignInfoParam): ResponseEntity<Any> {
+        try{
+            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
+            param.checkParam()
+            val appid = systemUtilService.getSysparaValue(2022)
+            val appkey = systemUtilService.getSysparaValue(2023)
+            if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(appkey)) {
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(1000, "系统参数未配置"))
+            } else if (appid != param.appId) {
+                throw RequestParamCheckException("请求参数错误[应用ID错误]")
+            }
+            if (!param.checkSign(appkey)) {
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(2002, "签名错误"))
+            }
+
+            return  ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "SUCCESS"))
+        }catch (ex: RequestParamCheckException) {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(2001, ex.message ?: "请求参数错误"))
+        }catch (e:Exception){
+            e.printStackTrace()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(4000, "系统业务处理异常"))
+        }
+
+    }
 
 }