diff --git a/design.md b/design.md
new file mode 100644
index 0000000..24ec8a7
--- /dev/null
+++ b/design.md
@@ -0,0 +1,792 @@
+[TOC]
+
+# 小额免密技术方案
+
+## 改造思路
+
+- ~~风控~~沿用现有支付原有的实时风控,增加资金种类维度
+- 满足小额免密条件的交易在商户扫码下单后自动完成进行支付(快捷交易除外)
+- 在SESSION中增加小额免密标志以供APP判断是否需要跳密码框
+- 后台支付交易同样判别SESSION中的标志来选择是否需要进行验密流程
+
+### 原交易流程
+
+- 商户侧
+
+ ```mermaid
+ sequenceDiagram
+ participant merc
+ participant front
+ participant pay
+
+ merc->>front:扫码下单(bsdkmca1.TSDK4090400)
+ front->>front:检查付款码
+ front->>pay:消费下单
+ pay-->>front:返回订单号
+ front-->>pay:申请支付令牌
+ pay-->>front:返回支付令牌
+ front->>front:更新付款码
+ loop 循环检查订单状态
+ front-->>front:检查订单状态
+ alt 订单被支付
+ front-->>merc:返回订单支付状态
+ else 订单未被支付
+ note over merc,front:Continue
+
+ end
+ end
+ ```
+
+- 用户侧
+
+ ```mermaid
+ sequenceDiagram
+ participant app
+ participant front
+ participant pay
+
+ loop 循环查询待支付订单
+ app->>front:查询待支付订单(eappmca1.APP4080805)
+ front-->>app:返回查询结果
+
+ alt 有待支付订单
+ app->>app:唤起密码框
+ app->>app:唤起短信验证交互流程(仅快捷)
+ app->>front:支付确认(eappmca.EAPP4080806)
+ front->>pay:账户/快捷/卡包支付
+ pay-->>front:返回支付结果
+ front-->>app:返回支付结果
+ else 没有订单
+ note over app,front:Continue
+ end
+ end
+ ```
+
+
+### 改造后交易流程
+
+- 商户侧
+ ```mermaid
+ sequenceDiagram
+ participant merc
+ participant front
+ participant pay
+
+ merc->>front:扫码下单(bsdkmca1.TSDK4090400)
+ front->>front:检查付款码
+ front->>pay:消费下单
+ note over merc,pay:**************************** 改造点 START ******************************
+ pay->>pay:检查小额免密风控
+ pay->>pay:更新小额免密标志到订单表
+ note over merc,pay:**************************** 改造点 END ******************************
+ pay-->>front:返回订单号
+ front-->>pay:申请支付令牌
+ pay-->>front:返回支付令牌
+ front->>front:更新付款码
+
+ note over merc,pay:**************************** 改造点 START ******************************
+
+ front->>front:判断是否免密
+
+ alt 免密
+ front->>pay:账户/卡包支付
+ pay->>front:返回支付结果
+ else 非免密
+ note over front,pay:该干嘛就干嘛
+ end
+ note over merc,pay:*************************** 改造点 END ******************************
+
+ loop 循环检查订单状态
+ front-->>front:检查订单状态
+ alt 订单被支付
+ front-->>merc:返回订单支付状态
+ else 订单未被支付
+ note over merc,front:Continue
+
+ end
+ end
+ ```
+
+- 用户侧
+ ```mermaid
+ sequenceDiagram
+ participant app
+ participant front
+ participant pay
+
+ loop 循环查询待支付订单
+ app->>front:查询待支付订单(eappmca1.APP4080805)
+
+ note over app,pay:*************************** 改造点 START ******************************
+ front-->>app:返回查询结果 & 免密标志(SESSION)
+
+ alt 有支付订单
+ app->>app:判断订单状态
+
+ alt 订单已支付
+ app->>app:直接显示支付订单成功信息
+
+ else 订单未支付
+
+ app->>app:判断免密标志
+
+ alt 非免密
+ app->>app:唤起密码框
+ app->>app:唤起短信验证交互流程(仅快捷)
+ app->>front:支付确认(eappmca.EAPP4080806)
+ front->>pay:账户/快捷/卡包支付
+ pay-->>front:返回支付结果
+ front-->>app:返回支付结果
+ else 免密
+ app->>app:判断是否快捷
+ alt 快捷
+ app->>app:唤起短信验证交互流程(仅快捷)
+ app->>front:支付确认(eappmca.EAPP4080806)
+ front->>pay:快捷支付
+ pay-->>front:返回支付结果
+ front-->>app:返回支付结果
+ else 非快捷
+ app-->>app:直接显示订单支付结果
+ end
+ end
+ end
+
+ else 没有订单
+ note over app,front:Continue
+ end
+
+ note over app,pay:*************************** 改造点 END ******************************
+
+ end
+ ```
+
+
+
+## 风控改造
+
+- 增加一套小额免密规则(自己写JAVA代码) `肖景才`
+
+ - [x] 从产品获取风控组件源码
+ - [ ] 风控组件改造
+ 1. 新建四条小额免密风控规则,但对应的java包名跟原产品日累,月累,日限额,月限额相同
+ 2. 新建风控类型:小额免密
+ 3. 新建业务类型规则维护:小额免密类型 + 四条风控规则
+ 4. 新建资金种类:小额免密(风控累计维度是按照账户类型 + 资金种类 + 交易类型 + 业务类型 等来累计)
+ > 可行性待验证(现风控组件可能将资金属性写死成现金),若不可行则自行开发风控组件 `已验证可行`
+ 5. 新建小额免密风控参数维护界面
+
+- 运营增加独立的小额免密参数维护界面(可复制账户交易参数维护维护界面) `肖景才`
+
+
+
+ > 运营系统->实时风控控制->风控参数维护->账户交易参数维护
+ > 在维护界面中去做以下修改
+ > - 账户类型:界面隐藏,后台固定值:100-个人账户
+ > - 资金种类:后台固定值:1-现金
+ > - 交易类型:后台固定值:02-消费
+ > - 业务类型:后台固定值:P0001-小额免密
+ > - 实名标志:界面隐藏,后台固定值:02-强实名
+ > - 收付标志:后台固定值:D-付款方
+ > - 限制级别:界面隐藏,后台固定值:1-用户级别限制
+ > - 业务受理渠道:与原界面相同
+ > - 单笔最大金额:后台固定值:200
+ > - 单笔最小金额:后台固定值:0
+ > - 日限额:与原界面相同
+ > - 月限额:与原界面相同
+ > - 日累计:与原界面相同
+ > - 月累计:与原界面相同
+
+
+
+
+- 支付核心增加小额免密判定接口 `肖景才` `com.murong.ecp.app.rpm.action.brpmpub8.T2015620`
+
+ - 接口
+
+ - 请求
+
+ 名称 | 长度 | 必输 | 备注
+ ------ | :----: | :----: | --------
+ cre_dt | 8 | M | 创建日期
+ ord_no | 20 | M | 订单号
+
+ - 返回
+
+ 名称 | 长度 | 必输 | 备注
+ ------ | :----: | :----: | --------
+ nnp_flg | 1 | M | 免密标志 Y:免密 N:不免密
+
+ - 交易流程
+ ```mermaid
+ graph LR
+
+ 请求((开始))
+ 订单查询(订单查询)
+ 订单状态判断{订单状态判断}
+ 交易金额判断{交易金额判断}
+ 小额风控检查(小额风控检查
chkRtmRsk)
+ 风控结果判断{风控结果判断}
+ 设置免密标志_Y(设置免密标志
DDP_FLG:Y 免密)
+ 设置免密标志_N(设置免密标志
DDP_FLG:N 不免密)
+ 更新免密标志(更新免密标志
订单表DDP_FLG=Y)
+ 结束((结束))
+
+ 请求-->订单查询
+ 订单查询-->订单状态判断
+ 订单状态判断--待支付-->交易金额判断
+ 交易金额判断-- <=200 -->小额风控检查
+ 小额风控检查-->风控结果判断
+ 风控结果判断--满足-->设置免密标志_Y
+ 设置免密标志_Y-->更新免密标志
+ 更新免密标志-->结束
+
+ 设置免密标志_N-->结束
+ 风控结果判断--不满足-->设置免密标志_N
+ 交易金额判断-- >200 -->设置免密标志_N
+ 订单状态判断--非待支付-->设置免密标志_N
+ ```
+
+- 支付核心增加小额免风控累计接口 `肖景才` `com.murong.ecp.app.rpm.action.brpmpub8.T2015621`
+
+ - 接口
+
+ - 请求
+
+ 名称 | 长度 | 必输 | 备注
+ ------ | :----: | :----: | --------
+ cre_dt | 8 | M | 创建日期
+ ord_no | 20 | M | 订单号
+
+ - 返回
+
+ 名称 | 长度 | 必输 | 备注
+ ------ | :----: | :----: | --------
+ | | |
+
+- 小额免密金额标准 `业务`
+ > <=200RMB
+
+- 风控参数设置(可参考产品需求) `业务`
+
+ | 日频次 | 日累计金额 | 月频次 | 月累计金额 |
+ | :--: | :---: | :--: | :---: |
+ | 10 | 2000 | 100 | 10000 |
+
+## 线下扫码支付改造
+
+> 商户下单判断一旦满足小额免密直接支付 `郑骁`
+
+### 改造图示
+
+- 商户扫码下单请求(改造前)
+ ```mermaid
+ graph LR
+ 商户SDK(商户SDK)
+ 扫码下单(扫码下单
TSDK4090400)
+ 登记远程消费订单(登记远程消费订单
brpmpub8.2015301)
+
+ 商户SDK-->扫码下单
+ 扫码下单-->登记远程消费订单
+ 登记远程消费订单-->原有流程(原有流程)
+ 原有流程--返回商户token-->商户SDK
+ ```
+- 商户扫码下单请求(改造后)
+ > 针对账户支付、卡包支付一旦满足小额免密后条件后(快捷需要短信验证码,故不做处理),就后台自动发起支付请求完成支付
+ ```mermaid
+ graph LR
+ 商户SDK(商户SDK)
+ 扫码下单(扫码下单
TSDK4090400)
+ 登记远程消费订单(登记远程消费订单
brpmpub8.2015301)
+ 小额免密检查服务(小额免密检查服务)
+ 是否满足小额免密{是否满足小额免密}
+ 账户支付(账户支付
bsdkmca1.SDK4090320)
+ 卡包支付(卡包支付
bsdkmca1.SDK4090660)
+ 判断支付方式{判断支付方式}
+ 原有流程(原有流程)
+
+ 商户SDK-->扫码下单
+ 扫码下单-->登记远程消费订单
+ 登记远程消费订单-->小额免密检查服务
+ 小额免密检查服务-->是否满足小额免密
+ 是否满足小额免密--是-->判断支付方式
+ 判断支付方式--账户支付-->账户支付
+ 判断支付方式--卡包支付-->卡包支付
+ 判断支付方式--快捷支付-->原有流程
+ 是否满足小额免密--否-->原有流程
+ 账户支付-->原有流程
+ 卡包支付-->原有流程
+ 原有流程--返回商户支付结果/token-->商户SDK
+
+ style 登记远程消费订单 fill:#f9f,stroke:#333,stroke-width:1px;
+ style 是否满足小额免密 fill:#20E912,stroke:#333,stroke-width:1px;
+ style 小额免密检查服务 fill:#20E912,stroke:#333,stroke-width:1px;
+ style 判断支付方式 fill:#20E912,stroke:#333,stroke-width:1px;
+ style 账户支付 fill:#20E912,stroke:#333,stroke-width:1px;
+ style 卡包支付 fill:#20E912,stroke:#333,stroke-width:1px;
+ ```
+
+
+
+- APP发起支付确认(改造前)
+ ```mermaid
+ graph LR
+ 用户APP(用户APP)
+ 支付确认(支付确认
eappmca.EAPP4080806)
+ 账户支付(账户支付
bsdkmca1.SDK4090320)
+ 快捷支付(快捷支付
bsdkmca1.SDK4090340)
+ 卡包支付(卡包支付
bsdkmca1.SDK4090660)
+ 支付密码校验(支付密码校验
burmpub1.0011471)
+ 判断支付类型{判断支付类型}
+ 密码验证(密码验证)
+ 原有流程(原有流程)
+
+
+ 用户APP-->支付确认
+ 支付确认-->判断支付类型
+ 判断支付类型-->账户支付
+ 判断支付类型-->快捷支付
+ 判断支付类型-->卡包支付
+
+ 账户支付-->支付密码校验
+ 快捷支付-->支付密码校验
+ 卡包支付-->支付密码校验
+
+ 支付密码校验-->密码验证
+ 密码验证-->原有流程
+ 原有流程--返回支付结果-->用户APP
+ ```
+
+- APP发起支付确认(改造后)
+ ```mermaid
+ graph LR
+ 用户APP(用户APP)
+ 支付确认(支付确认
eappmca.EAPP4080806)
+ 账户支付(账户支付
bsdkmca1.SDK4090320)
+ 快捷支付(快捷支付
bsdkmca1.SDK4090340)
+ 卡包支付(卡包支付
bsdkmca1.SDK4090660)
+ 支付密码校验(支付密码校验
burmpub1.0011471)
+ 判断支付类型{判断支付类型}
+ 判断是否验密{判断是否验密}
+ 密码验证(密码验证)
+ 原有流程(原有流程)
+
+ 用户APP-->支付确认
+ 支付确认-->判断支付类型
+ 判断支付类型-->账户支付
+ 判断支付类型-->快捷支付
+ 判断支付类型-->卡包支付
+
+ 账户支付-->判断是否验密
+ 快捷支付-->判断是否验密
+ 卡包支付-->判断是否验密
+
+ 判断是否验密--需要-->支付密码校验
+ 判断是否验密--不需要-->原有流程
+
+ 支付密码校验-->密码验证
+ 密码验证-->原有流程
+ 原有流程--返回支付结果-->用户APP
+
+
+ style 卡包支付 fill:#f9f,stroke:#333,stroke-width:1px;
+ style 账户支付 fill:#f9f,stroke:#333,stroke-width:1px;
+ style 快捷支付 fill:#f9f,stroke:#333,stroke-width:1px;
+
+ style 支付密码校验 fill:#20E912,stroke:#333,stroke-width:1px;
+ style 判断是否验密 fill:#20E912,stroke:#333,stroke-width:1px;
+ style 密码验证 fill:#20E912,stroke:#333,stroke-width:1px;
+ ```
+
+- APP查询支付结果(改造前)
+ ```mermaid
+ graph LR
+ 用户APP(用户APP)
+ 查询支付结果(查询支付结果
eappmca1.APP4080805)
+
+ 用户APP--每秒触发-->查询支付结果
+ 查询支付结果--返回支付结果-->用户APP
+
+ ```
+
+- APP查询支付结果(改造后)
+ ```mermaid
+ graph LR
+ 用户APP(用户APP)
+ 查询支付结果(查询支付结果
eappmca1.APP4080805)
+
+ 用户APP--每秒触发-->查询支付结果
+ 查询支付结果--返回支付结果&是否免密-->用户APP
+
+ style 查询支付结果 fill:#f9f,stroke:#333,stroke-width:1px;
+ ```
+
+### 代码改造
+
+- 封装小额免密专用组件
+ > 本质上就是调用现有风控组件,但资金属性送小额免密类型
+
+- 付款码商户下单接口改造 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090400`
+
+ ```java
+ +246:
+ } else {
+ logger.info("else begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "SCM60001", "");
+ logger.info("else end");
+ return;
+ }
+
+ /** 此处增加支付相关代码 **/
+
+ /** 调用小额免密检查服务 **/
+
+ /** 若满足小额免密,并且又是账户支付或卡包支付,则调用支付接口进行支付 **/
+
+ logger.info("循环查询该笔订单的状态 begin");
+ Utils.setData(bizCtx, "count_index", "1");
+ while(true){
+ if(Utils.eval(bizCtx, "intcmp($count_index,1,50)")){
+ logger.info("intcmp($count_index,1,50) begin");
+ PUBATCUtil.queryForObject(bizCtx, "qry_ord_inf", "ordinf");
+ ```
+
+- 账户支付请求交易改造 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090320`
+
+ ```mermaid
+ graph LR
+ TSDK4090320(bsdkmca1.TSDK4090320
账户支付请求)-->T2011210(brpmpub1.T2011210
订单支付)
+ ```
+
+ ```java
+ /** 从SESSION获取免密标志,若为免密则跳过如下代码 **/
+ +44:
+ WEBATCUtil.getSession(bizCtx, "$sess_nm", sessMap);
+ PUBATCUtil.logETF(bizCtx);
+
+ logger.info("组装AES 解密所需的数据 begin");
+ Utils.setData(bizCtx, "inp_dat.ocx_key", "$ocx_key");// 随机因子
+ Utils.setData(bizCtx, "inp_dat.pswd_o", "$paypwd");// 登录密码
+ logger.info("组装AES 解密所需的数据 end");
+
+ logger.info("AES使用随机因子对密码进行解密 开始 ......");
+ this.Pinconvert.process(bizCtx, "inp_dat", "out_dat|msg_cd|");
+ logger.info("AES使用随机因子对密码进行解密 成功 结束 ......");
+ Utils.setData(bizCtx, "pay_pswd", "@O.out_dat.pswd_c");
+
+ Utils.setData(bizCtx, "pwd_typ", "PAY");
+ logger.info("call package:[MCA.DecipherPwd]");
+ DecipherPwd.process(bizCtx, "pay_pswd|pwd_typ|", "pay_pswd|msg_cd");
+ if (Utils.eval(bizCtx, "is_succ(@O.msg_cd)=0")) {
+ logger.info("step(3): if(is_succ(@O.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "@O.msg_cd", "");
+ logger.info("step(3): if(is_succ(@O.msg_cd)=0) end");
+ }
+ /** 从SESSION获取免密标志,若为免密则跳过如下代码 **/
+ +102:
+ logger.info("调用交易验密 begin ......");
+ PUBATCUtil.callThirdServiceIgnore(bizCtx, "burmpub1", "0011471");
+ if (Utils.eval(bizCtx, "~retcod=0")) {
+ logger.info("step(45): if(~retcod=0) begin");
+ if (Utils.eval(bizCtx, "is_succ($gda.msg_cd)=0")) {
+ logger.info("step(46): if(is_succ($gda.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "$gda.msg_cd",
+ "$gda.msg_dat");
+ logger.info("step(46): if(is_succ($gda.msg_cd)=0) end");
+ return;
+ }
+ logger.info("step(45): if(~retcod=0) end");
+ } else {
+ logger.info("else begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "SCM60001", "");
+ logger.info("else end");
+ return;
+ }
+ logger.info("验证支付密码通过 end ......");
+ ```
+
+- 快捷支付交易改造 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090340`
+ ```mermaid
+ graph LR
+ TSDK4090340(bsdkmca1.TSDK4090340
下单快捷支付请求1.0)-->T0501041(bpaybrm1.T0501041
快捷支付.支付原订单)
+ T0501041-->2023020(bpwmppd3.2023020
有账户快捷支付)
+ ```
+
+ ```java
+ /** 从SESSION获取免密标志,若为免密则跳过如下代码 **/
+ +83:
+ logger.info("组装AES 解密所需的数据 begin");
+ Utils.setData(bizCtx, "inp_dat.ocx_key", "$ocx_key");// 随机因子
+ Utils.setData(bizCtx, "inp_dat.pswd_o", "$paypwd");// 登录密码
+ logger.info("组装AES 解密所需的数据 end");
+
+ logger.info("AES使用随机因子对密码进行解密 开始 ......");
+ this.Pinconvert.process(bizCtx, "inp_dat", "out_dat|msg_cd|");
+ logger.info("AES使用随机因子对密码进行解密 成功 结束 ......");
+ Utils.setData(bizCtx, "pay_pswd", "@O.out_dat.pswd_c");
+
+ Utils.setData(bizCtx, "gda.bus_typ", "0012");
+ Utils.setData(bizCtx, "sign_key", "NO");
+ Utils.setData(bizCtx, "pwd_typ", "PAY");
+ logger.info("call package:[MCA.DecipherPwd]");
+ DecipherPwd.process(bizCtx, "pay_pswd|pwd_typ|", "pay_pswd|msg_cd");
+ if (Utils.eval(bizCtx, "is_succ(@O.msg_cd)=0")) {
+ logger.info("step(9): if(is_succ(@O.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "@O.msg_cd", "");
+ logger.info("step(9): if(is_succ(@O.msg_cd)=0) end");
+ return;
+ }
+ Utils.setData(bizCtx, "pay_pswd", "@O.pay_psw");
+
+ /** 从SESSION获取免密标志,若为免密则跳过如下代码 **/
+ +139:
+ logger.info("调用交易验密 begin ......");
+ PUBATCUtil.callThirdServiceIgnore(bizCtx, "burmpub1", "0011471");
+ if (Utils.eval(bizCtx, "~retcod=0")) {
+ logger.info("step(45): if(~retcod=0) begin");
+ if (Utils.eval(bizCtx, "is_succ($gda.msg_cd)=0")) {
+ logger.info("step(46): if(is_succ($gda.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "$gda.msg_cd","$gda.msg_dat");
+ logger.info("step(46): if(is_succ($gda.msg_cd)=0) end");
+ return;
+ }
+ logger.info("step(45): if(~retcod=0) end");
+ } else {
+ logger.info("else begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "SCM60001", "");
+ logger.info("else end");
+ return;
+ }
+ logger.info("验证支付密码通过 end ......");
+ ```
+
+- 卡包支付交易改造 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090660`
+ ```mermaid
+ graph LR
+ TSDK4090660(bsdkmca1.TSDK4090660
卡包支付接口)-->T2011106(brpmpub1.T2011106
网上订单登记-录入金额组成)
+ T2011106-->0000832(bcrdpub1.0000832
卡包支付)
+ ```
+
+ ```java
+ +56:
+ /** 从SESSION获取免密标志,若为免密则跳过如下代码 **/
+ logger.info("组装AES 解密所需的数据 begin");
+ Utils.setData(bizCtx, "inp_dat.ocx_key", "$ocx_key");// 随机因子
+ Utils.setData(bizCtx, "inp_dat.pswd_o", "$paypwd");// 登录密码
+ logger.info("组装AES 解密所需的数据 end");
+
+ logger.info("AES使用随机因子对密码进行解密 开始 ......");
+ this.Pinconvert.process(bizCtx, "inp_dat", "out_dat|msg_cd|");
+ logger.info("AES使用随机因子对密码进行解密 成功 结束 ......");
+ Utils.setData(bizCtx, "pay_pswd", "@O.out_dat.pswd_c");
+
+ Utils.setData(bizCtx, "gda.bus_typ", "0012");
+ Utils.setData(bizCtx, "sign_key", "NO");
+ Utils.setData(bizCtx, "pwd_typ", "PAY");
+ logger.info("二层解密 begin");
+ logger.info("call package:[MCA.DecipherPwd]");
+ DecipherPwd.process(bizCtx, "pay_pswd|pwd_typ|", "pay_pswd|msg_cd");
+ if (Utils.eval(bizCtx, "is_succ(@O.msg_cd)=0")) {
+ logger.info("step(9): if(is_succ(@O.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "@O.msg_cd", "");
+ logger.info("step(9): if(is_succ(@O.msg_cd)=0) end");
+ return;
+ }
+ logger.info("二层解密 成功 end");
+ /** 从SESSION获取免密标志,若为免密则跳过如下代码 **/
+ +116:
+ logger.info("调用交易验密 begin ......");
+ PUBATCUtil.callThirdServiceIgnore(bizCtx, "burmpub1", "0011471");
+ if (Utils.eval(bizCtx, "~retcod=0")) {
+ logger.info("step(45): if(~retcod=0) begin");
+ if (Utils.eval(bizCtx, "is_succ($gda.msg_cd)=0")) {
+ logger.info("step(46): if(is_succ($gda.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "$gda.msg_cd","$gda.msg_dat");
+ logger.info("step(46): if(is_succ($gda.msg_cd)=0) end");
+ return;
+ }
+ logger.info("step(45): if(~retcod=0) end");
+ } else {
+ logger.info("else begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "SCM60001", "");
+ logger.info("else end");
+ return;
+ }
+ logger.info("验证支付密码通过 end ......");
+ ```
+
+- 支付成功后小额免密风控累计
+
+ - 账户支付 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090320`
+ ```java
+ +435:
+ Utils.setData(bizCtx, "paytm", "get_date_time()");
+ Utils.setData(bizCtx, "lastuptm", "get_date_time()");
+ Utils.setData(bizCtx, "status", "@O.status");
+ Utils.setData(bizCtx, "message_code", "@O.message_code");
+ Utils.setData(bizCtx, "message_desc", "@O.message_desc");
+ Utils.setData(bizCtx, "ret_sign", "@O.ret_sign");
+ Utils.setData(bizCtx, "ret_cert", "@O.ret_cert");
+ Utils.setData(bizCtx, "ret_data", "@O.ret_data");
+ Utils.setData(bizCtx, "char_set", "@O.char_set");
+ Utils.setData(bizCtx, "sign_type", "RSA");
+ Utils.setData(bizCtx, "ordno", "$ord_no");
+ Utils.setData(bizCtx, "ppdoutord", "$ord_no");
+ Utils.setData(bizCtx, "mercordno", "$merc_ord_no");
+ logger.info("拼装加密数据 暂时没有用到 end ");
+ Utils.setData(bizCtx, "tx_nm", "APP-现金余额支付");
+ Utils.setData(bizCtx, "tx_cd", "$gda.tx_cd");
+ Utils.setData(bizCtx, "ip_addr", "@MSG.SIP");
+ PUBATCUtil.invokeServiceIgnore(bizCtx, "0015070", "burmpub5",
+ "burmpub5", "notify");
+
+ /** 此处调用小额免密风控累计接口 **/
+
+ PUBATCUtil.logETFIgnore(bizCtx);
+ PUBATCUtil.GDASetMsg(bizCtx, "MCA00000", "");
+ ```
+
+ - 快捷支付 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090340`
+ ```java
+ +485:
+ logger.info("调用交易 去支付 begin ......");
+ PUBATCUtil.callThirdServiceIgnore(bizCtx, "bpaybrm1", "0501041");
+ if (Utils.eval(bizCtx, "~retcod!=0")) {
+ logger.info("step(231): if(~retcod!=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "MCA00005", "调用支付平台失败");
+ logger.info("step(231): if(~retcod!=0) end");
+ return;
+ }
+ if (Utils.eval(bizCtx, "is_succ($gda.msg_cd)=0")) {
+ logger.info("step(234): if(is_succ($gda.msg_cd)=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "$gda.msg_cd", "$gda.msg_dat");
+ logger.info("step(234): if(is_succ($gda.msg_cd)=0) end");
+ return;
+ }
+ logger.info("调用交易 去支付 end ......");
+
+ Utils.setData(bizCtx,"paytm","get_date_time()");
+ Utils.setData(bizCtx, "mercid", "$merc_id");
+ Utils.setData(bizCtx, "token", "$token");
+ Utils.setData(bizCtx, "ordamt", "$totamt");
+ Utils.setData(bizCtx, "mercordno", "$merc_ord_no");
+ Utils.setData(bizCtx, "ppdoutord", "$ppd_ord_no");
+ Utils.setData(bizCtx, "qryneed", "$qryneed");
+ Utils.setData(bizCtx, "tx_nm", "APP-快捷支付");
+ Utils.setData(bizCtx, "tx_cd", "$gda.tx_cd");
+ Utils.setData(bizCtx, "ip_addr", "@MSG.SIP");
+ PUBATCUtil.invokeServiceIgnore(bizCtx, "0015070", "burmpub5",
+ "burmpub5", "notify");
+
+ /** 此处调用小额免密风控累计接口 **/
+
+ PUBATCUtil.GDASetMsg(bizCtx, "MCA00000", "");
+ ```
+
+ - 卡包支付 `com.murong.ecp.app.egw.action.bsdkmca1.TSDK4090660`
+
+ ```java
+ +263:
+ logger.info("调用交易 去支付 begin ......");
+ PUBATCUtil.callThirdServiceIgnore(bizCtx, "brpmpub1", "2011106");
+ if (Utils.eval(bizCtx, "~retcod!=0")) {
+ logger.info("step(231): if(~retcod!=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "MCA00005", "调用支付平台失败");
+ logger.info("step(231): if(~retcod!=0) end");
+ return;
+ }
+ if (Utils.eval(bizCtx, "is_succ($gda.msg_cd)=0")) {
+ logger.info("step(234): if(is_succ($gda.msg_cd)=0) begin");
+ logger.info("step(234): if(is_succ($gda.msg_cd)=0) end");
+ return;
+ }
+ logger.info("调用交易 去支付 end ......");
+
+ Utils.setData(bizCtx, "tx_nm", "APP-卡包支付");
+ Utils.setData(bizCtx, "tx_cd", "$gda.tx_cd");
+ Utils.setData(bizCtx, "ip_addr", "@MSG.SIP");
+ PUBATCUtil.invokeServiceIgnore(bizCtx, "0015070", "burmpub5",
+ "burmpub5", "notify");
+
+ /** 此处调用小额免密风控累计接口 **/
+
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "MCA00000", "");
+ PUBATCUtil.logETFIgnore(bizCtx);
+ logger.info("=================================>>卡包支付接口 end");
+ ```
+
+- 扫码支付查询交易改造
+ > 需要返订单【是否免密标志】
+
+ `com/murong/ecp/app/egw/mapper/bappmca1.TAPP4080806Mapper.xml`
+ ```sql
+
+ +3:
+
+ ```
+
+ `com.murong.ecp.app.egw.action.bappmca1.TAPP4080805`
+ ```java
+ +68:
+ PUBATCUtil.readRecordBind(bizCtx, "qryOrdInf", "");
+ if (Utils.eval(bizCtx, "~retcod=0")) {
+
+ /** 此处需要把查询出来的免密标志添加到SESSION中去 **/
+
+ logger.info("step(11): if(~retcod=0) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "MCA00000", "交易成功");
+ logger.info("step(11): if(~retcod=0) end");
+ } else if (Utils.eval(bizCtx, "~retcod=2")) {
+ logger.info("step(11): if(~retcod=2) begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "MCA10017", "未找到记录");
+ logger.info("step(11): if(~retcod=2) end");
+ return;
+ } else {
+ ```
+
+- 付款码确认支付交易改造
+
+ `com.murong.ecp.app.egw.action.bappmca1.TAPP4080806`
+
+ ```java
+ +81:
+ PUBATCUtil.queryForObject(bizCtx, "qry_ord_sts");
+ logger.info("ord_sts="+Utils.getData(bizCtx, "$ord_sts"));
+ if(Utils.eval(bizCtx, "~retcod=0")){
+
+ /** 此处需要判断订单是否已被支付(BD状态) **/
+
+ if(Utils.eval(bizCtx, "is_equal_string($ord_sts,BE,BF)")){
+ logger.info("if(is_equal_string($ord_sts,BE,BF)) begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx,"RPM75111","订单已关闭,无法支付");
+ logger.info("if(is_equal_string($ord_sts,BE,BF)) end");
+ return;
+ }
+ if(Utils.eval(bizCtx, "is_noequal_string($ord_sts,BA,BB,BM)")){
+ logger.info("if(is_noequal_string($ord_sts,BA,BB,BM)) begin");
+ PUBATCUtil.GDASetMsgIgnore(bizCtx, "MCA60025", "订单状态异常");
+ logger.info("if(is_noequal_string($ord_sts,BA,BB,BM)) end");
+ return;
+ }
+ }else {
+ logger.info("step(13): else begin");
+ PUBATCUtil.GDASetMsg(bizCtx, "RPM22201", "订单不存在");
+ logger.info("step(13): else end");
+ return;
+ }
+ ```
+
+## APP改造
+
+- 小额免密开关设置 `王雷、陈孝豪`
+ > 按产品原型开发即可
+
+- 轮训交易针对小额免密的支付成功的订单返回交互界面需改造 `王雷、陈孝豪`
+
+ 1. 查询交易改造
+ > 商户扫码完成后的查询交易需要判别后台返回的支付结果,一旦支付结果为成功时,直接显示支付结果,无需再调用密码框跟支付流程
+ > 若支付方式为账户支付,则需要判别小额免密标志是否免密,若免密则跳过密码输入框,直接进入短信验证的交互,最后调用支付接口完成支付
+ > 详细请参照流程图