UTPP-TAMSZ(交易接入管理系统)
2025-08-29 09:58:45 3 举报AI智能生成
UTPP
其他技术
模版推荐
作者其他创作
大纲/内容
<b><font color="#c41230">支付接口返回逻辑</font></b>
成功
000000+10
失败
非000000+20
非000000+空
流程未到支付核心
进行中
000000+06
出款交易同步返回
下游部分资金渠道<b><font color="#c41230">超时</font></b>
<font color="#00a650">正向</font>交易
渠道超时,<font color="#00a650">UTPP重试</font>快速恢复机制
<font color="#c41230">反向</font>(退款\撤销)交易,<font color="#16884a">业务系统当成功处理</font>
用户账<font color="#c41230">超时</font>
<font color="#c41230">用户账失败(未收到请求或商户余额不足),UTPP监控后续处理</font>
<b><font color="#c41230">非</font></b>用户账<font color="#c41230">超时</font>
渠道超时,<font color="#00a650">UTPP重试</font>快速恢复机制
反向(退款\撤销)交易,<b>渠道和渠道帐</b>(<b><font color="#c41230">fundFlow=R</font></b>)<b><font color="#c41230">失败</font></b>
渠道失败<font color="#00a650">转人工</font>,返回UTPP成功
UTPP重试快速恢复机制
支付核心流程<font color="#c41230">异常</font>
接口(线上)
com.pinganfu.utpptamsz.facade.BizOrderAiFacade
bizOrder()
pipeline节点
请求参数校验
数据入库
insert:T_UTPP_BUSINESS_ORDER
幂等控制失效
风控(Risk)
CP066
<b>不关注风控</b>返回结果,风控系统会异步化处理
分库分表逻辑
字段:sponsor后4位
FailOver(<b><font color="#c41230">故障转移</font></b>)逻辑
DB-FailOver:替换分库分表字段倒数第四位为F
业务逻辑
重复落单,返回失败,告诉上游系统成功业务单号,避免businessSysNo全表扫描
com.pinganfu.utpptamsz.facade.TransOrderAiFacade
transOrder()
pipeline节点
请求参数校验
<b>合同查询(MCP,不区分科技和电子两个主体)</b>
<b>商户签约<font color="#c41230">合同</font></b><br>
SELECT * from MCPDATA.T_CONT_BUSINESS c where c.trans_type='62' and c.PRODUCT_ID='100020060000' <b><font color="#c41230">and c.customer_id='2000010004925736' </font></b><br>
subTransType+productCode+toCustomerId<br>
subTransType+productCode+fromCustomerId
<b>基础<font color="#c41230">合同</font></b><br>
SELECT * from MCPDATA.T_PRODUCT_INFO c where c.trans_type='62' and c.PRODUCT_ID='100020060000'<br>
subTransType+productCode<br>
付款方和收款方<b><font color="#c41230">账户</font></b>信息组装(CIP)<br><b>businessFacade.queryAccountInfo</b><br>
select * from cipdata.T_CUST_ACCOUNT c where c.customer_id='1000010000001674' and c.account_type='10'<br>
select * from cipdata.T_MERCHANT_ACCOUNT c where c.customer_id='2000010004628726' and c.account_type='03'<br>
<b><font color="#c41230">付款方</font></b>账户查询<b>前提条件</b>
payerAcctType!=null&customerId!=null&customerId!=<b><font color="#c41230">999999999999</font></b>????<br>
<b><font color="#c41230">收款方</font></b>账户查询<b>前提条件</b>
payeeAcctType!=null&toCustomerId!=null&toCustomerId!=<b><font color="#c41230">999999999999</font></b>????<br>
交易信息和交易扩展信息组装
交易信息<br>
交易单号
分库分表<font color="#c41230">规则</font>选取
cache:T_UTPPZ_SHARDING_RULE
customerId或者toCustomerId<br>
分库分表<font color="#c41230">字段</font><font color="#16884a">具体值</font>获取
DB-FailOver校验:替换分库分表字段值倒数第四位为<font color="#c41230"><b>F</b></font>
替换全局shardField的<b><font color="#c41230">占位符</font></b><br>
日期(8)+<b><font color="#c41230">4位分库分表逻辑字段</font></b>+流水号(16),共28位
生成交易单号<br>
shardField和交易放入上下文
账务3.0白名单商户或流量匹配<br>
过滤商户白名单规则
调用账务2.0或者3.0接口
设置<b><font color="#c41230">账务主交易</font></b>账号
电子
cache:T_UTPPZ_SHARDACCT_DZ
科技
cache:T_UTPPZ_SHARDACCT_KJ
银行卡信息<br>
扩展字段信息
数据入库
insert:T_UTPPZ_TRANSACTION_U<br>
insert:T_TRANSCORE_TRANSACTION
交易状态
落单并支付
<font color="#16884a">入金</font>
03
<font color="#c41230">出金</font>
34
落单然后支付
00
失败
delete:T_TRANSCORE_TRANSACTION_U
失败
上游重新落单
orderNo不变:补偿
orderNo变化:无需补偿(BASS系统)
insert(<font color="#f15a23">datanode</font>):T_UTPP_TRANSACTION_EXT
insert:T_UTPP_BANKCARD_INFO
交易类型
电子账户充值01
提现业务05
结算提现30
通用代发60
通用代收63
冻结A0
通用代发到银行卡64
出款F3
10户提现X5
橙子银行提现C5
<b><font color="#c41230">优化</font></b>逻辑点
从uemsz链路搬回tamsz主链路,uemsz系统压力大,入库缓慢,支付时获取银行卡信息失败
加密
encInfo1(身份证证件号)
<font color="#f15a23">交易单大字段</font>用datatransfer-service(一致性缓存系统)统一封装,<font color="#c41230">上游决定是否降级</font>
set接口(4s)
请求参数
domain:UTPP
type:TRANSORDER
sequenceNo:<font color="#c41230">transId</font>
dataValue:<font color="#c41230">extFeilds</font>
返回参数
uniqueCode
get接口
请求参数
domain:UTPP
type:TRANSORDER
sequenceNo:transId
返回参数
extFeilds
交易事件通知组件(<font color="#0076b3"><b>transNotify</b></font>)
业务逻辑
分库分表逻辑
维度:transType、productCode、acctId(登录未登录)
字段:customerId | toCustomerId的后四位
FailOver逻辑
<strike>重复落单,返回失败,告诉上游系统成功交易单号,避免orderNo全表扫描</strike>
<b><font color="#c41230">返回逻辑</font></b>
<b><font color="#16884a">成功</font></b><br>
000000+交易单号<br>
<b><font color="#c41230">失败</font></b>
非000000
专用码
<b>fromSpecCode:付款方专用码 toSpecCode:收款方专用码 </b><br>
<b><font color="#c41230">渠道账和用户账都会有专用码,但专用码只对</font><font color="#16884a">账户</font><font color="#c41230">生效,不对</font><font color="#16884a">内部户</font><font color="#c41230">生效</font></b>
账务凭证ioDirect=<b>O</b>——》specCode=<b>fromSpecCode</b><br>
账务凭证ioDirect=<b>I</b>——》specCode=<b>toSpecCode</b><br>
com.pinganfu.utpptamsz.facade.PayOrderAiFacade
payOrder()
pipeline节点
请求参数校验
交易支付流程数据<b><font color="#c41230">整合</font></b>
交易状态
落单<b><font color="#c41230">并</font></b>支付
落单<b><font color="#c41230">然后</font></b>支付
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION
<font color="#000000">update</font>:T_TRANSCORE_TRANSACTION set trans_status=03 <font color="#000000">where trans_Id=? and trans_status in (00)</font><br>
insert:<b><font color="#c41230">T_TRANSCORE_PAYMENT</font></b>
<b>支付决策(支付明细入库)</b>
支付决策维度
支付产品
商户
场景
交易类型
决策返回成功(isDecisionSuccess=<b><font color="#c41230">true</font></b>&&rspCode=<b><font color="#c41230">000000</font></b>)<br>
决策返回失败或者Rpc异常降级
23(新快捷借记)——》01(快捷借记)
24(新快捷贷记)、33、34——》(快捷贷记)
27(新余额支付)——》12(活钱宝)
27(新余额支付)——》81(多基金)
42(好房宝)——》37(旺财)
12(活钱宝)
100020030000、100010100000场景,12(活钱宝)——》81(多基金)
其余场景,12(新余额支付)——》12(新余额支付)
<font color="#c41230">其余支付方式默认</font>
决策支付产品对基础支付产品1:N和1:1
27<br>
00
12<br>
81
82
83
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
数据准备
组装支付扩展字段
风控(Risk)
CP003
风控Rpc异常降级
风控业务明确拒绝,支付流程终止
结束
风控挂起
<font color="#7dcdc2">update</font>:T_TRANSCORE_PAYMENT set t.RISK_STATUS where id=?<br>
数据入库
支付扩展字段批量入库
insert(<font color="#f15a23">datanode</font>):T_UTPP_TRANSACTION_EXT
<b><font color="#c41230">解冻</font></b>指令
requestType=<b><font color="#c41230">5</font></b><br>
frozenId=<b><font color="#c41230">原冻结流水</font></b><br>
解冻<b><font color="#c41230">acctId</font></b>
渠道指令<br>
资金渠道
账务
未配置账务凭证
00(电子账户支付)
<b>56(<font color="#16884a">单位/企业</font><font color="#c41230">支付账户</font>)</b><br>
27(新余额—>活期)
30(机构支付)
机构信息逻辑poCode\poChannel(T_UTPP_ORGANPAY_CHANNELINFO)
消费
非签约模式:30—payAcctId—subPayType
迪士尼
迪士尼售卡
30-PAFDIS-PAFDIS1
poCode:DISNEY1
迪士尼乐园
poChannel:PAY
30-PAFDIS-PAFDIS2
poCode:DISNEY2
迪士尼配套设施
poChannel:PAY
迪士尼体验卡
30-DISMK-DISMK
poCode:DISMK
poChannel:PAY
多基金(活期消费支付账户改造)
大华
30-PAFHQB-PAFDH1
poCode:PADH
poChannel:SHT1
南方
30-PAFHQB-PAFNF1
poCode:NFFOF
poChannel:SHT1
。。。
陆财富
陆财富代销基金申购
30-LCF-LU01376
poCode:PADH
poChannel:SHT1
陆财富代销基金申购撤销
跨境支付
跨境收款新增币种
30-OPBSUSD-OPBSUSD
poCode:OPBSUSD
poChannel:OFLC
30-OPBSEUR-OPBSEUR<br>
poCode:OPBSEUR
poChannel:OFLC
签约模式:根据payAcctId协议号<font color="#f15a23">查询会员</font><font color="#8a8a8a">返</font>回的签约信息<font color="#c41230">bankShort</font>
30—<font color="#c41230">bankShort</font>—subPayType
30—<font color="#f15a23">LJS</font>-121A376
poCode:LUFAX
poChannel:121A376
。。。
线上版本:30—<font color="#c41230">bankShort</font>
30—<font color="#c41230">LJS</font>
poCode:LUFAX
poChannel:INSU
30—<font color="#c41230">WLT</font>
poCode:WLT-CP
poChannel:CPB
退货
UTPP不组装poCode、poChannel,账务根据原交易给资金对账
<b>41(新代发)</b><br>
渠道账
TF002|O-B001:I-C001
用户账<br>
EX001|O-C001:I-ACCT_ID
<font color="#c41230">43(</font><b><font color="#16884a">个人</font></b><font color="#c41230">支付账户【10户】)</font>
<b><font color="#c41230">渠道账</font></b>
TF022|O-OTHER:I-C001
O-10:I-C001
OTHER:UTPP会根据<b>customerId</b>+10(accountType)查询出<b><font color="#c41230">10户</font></b><br>
用户账
EX001|O-C001:I-ACCT_ID
银行
支付方式列表(<font color="#16884a">冲退转提现</font>)
聚合支付
46(APP支付)
47(扫码支付)<br>
48(公众号支付)
电子c扫b(300010080003)
网关返回码==000000
状态10
网关返回码!=000000
状态20
50(B扫C支付)
电子b扫c(300010080004)
网关返回码==000000
状态10
网关返回码==010003
返回码000000
状态06
网关返回码==其它
状态20
51(C扫B支付)
支付宝支持指定时间关单,微信不支持关单
54(小程序)
61(支付宝H5支付)<br>
落单然后支付
<font color="#55beed">select</font>:T_UTPP_TRANSACTION_EXT
payAcctId
二级支付机构(ZFB、WX)
44(橙子银行代扣)<br>
橙子银行【协议号调用会员查询卡信息】
B2C网银<br>
06( 网银借记)
000000—>状态00,否则失败20<br>
07( 网银贷记)
B2B网银
55(企业网银)
新快捷
23(新快捷借记)
24(新快捷贷记)
快捷【协议号调用会员查询卡信息】<br>
01(快捷借记,绑卡Id)
商城组合支付压测时用bankShort(<font color="#c41230">VIRTUAL</font>)来做区分
<font color="#c41230"><b>网联-商委</b></font>
各银行也开发商委接口,用户、商户、银行<b><font color="#c41230">三方签约</font></b>,<b><font color="#c41230">替代</font></b>10(<b><font color="#c41230">借记代扣</font></b>)
02(快捷贷记)
52(分期付)
<b><font color="#c41230">58</font></b>(新<b><font color="#c41230">银联</font></b>代收借记卡)
<font color="#c41230">59</font>(新<b><font color="#c41230">银联</font></b>代收贷记卡)
代收(扣)【协议号调用会员查询卡信息】
10(借记代扣)
22(贷记代扣)
落单然后支付,查询二级商户信息
<font color="#55beed">select</font>:T_UTPP_TRANSACTION_EXT
协议支付
13(借记)<br>
16(贷记)
无协议支付<br>
14(借记)
17(贷记)
32(MOTOPAY)
63(线上预授权贷记【银联】\线上预授权完成)
合作商
主账户虚拟大华
45(基金代发)
53(旺财宝)
11(<b>健康卡</b>)<br>
<b><font color="#c41230">渠道</font></b>能力
消费
退货<font color="#0076b3"><b>(线上退货、线下退货)</b></font>
<font color="#16884a"><b>冲正</b></font>
<b><font color="#16884a">撤销</font></b>
<b><font color="#0076b3">交易</font></b>能力
线上<br>
线上消费(62)
收银台模式(OnlinePay#transOrder+payOrder)<br>
线上消费<b><font color="#c41230">冲正</font></b>(62)
线上退货(38)<br>
<b><font color="#0076b3">OnlinePay#reverseOrder</font></b><br>
线下
线下消费(46)
收银台模式(OnlinePay#transOrder+payOrder)<br>
<font color="#16884a"><b>线下冲正(47)</b></font><br>
<b><font color="#16884a">OfflinePay#reverseOrder</font></b><br>
<b><font color="#16884a">线下撤销(48)</font></b><br>
<b><font color="#16884a">OfflinePay#returnOrder</font></b><br>
线下退货(50)<br>
<b><font color="#0076b3">OnlinePay#reverseOrder</font></b>
业务逻辑
健康卡退货业务保成功,caps请求养老险后,养老险返回明确失败,明确失败的信息<b><font color="#c41230">会推送到oms系统</font></b><br>
卡(18)
通卡
<b><font color="#c41230">渠道</font></b>能力
消费
退货<font color="#0076b3"><b>(</b></font><b><font color="#0076b3">线上消费冲正、</font></b><font color="#0076b3"><b>线上退货、线下退货)</b></font>
<b><font color="#16884a">冲正</font></b>
<b><font color="#16884a">撤销</font></b>
<b><font color="#0076b3">交易</font></b>能力
线上<br>
线上消费(62)
收银台模式(OnlinePay#transOrder+payOrder)<br>
线上消费<b><font color="#c41230">冲正</font></b>(62)
线上退货(38)<br>
<b><font color="#0076b3">OnlinePay#reverseOrder</font></b><br>
线下
线下消费(46)
收银台模式(OnlinePay#transOrder+payOrder)<br>
<font color="#16884a"><b>线下冲正(47)</b></font><br>
<b><font color="#16884a">OfflinePay#reverseOrder</font></b><br>
<b><font color="#16884a">线下撤销(48)</font></b><br>
<b><font color="#16884a">OfflinePay#returnOrder</font></b><br>
线下退货(50)<br>
<b><font color="#0076b3">OnlinePay#reverseOrder</font></b>
预付费卡
<b><font color="#c41230">渠道</font></b>能力
消费<br>
退货<font color="#0076b3"><b>(</b></font><b><font color="#0076b3">线上消费冲正、</font></b><font color="#0076b3"><b>线上退货、线下撤销、线下退货)</b></font>
<font color="#16884a"><b>冲正</b></font>
<b><font color="#0076b3">交易</font></b>能力
线上<br>
线上消费(62)
收银台模式(OnlinePay#transOrder+payOrder)<br>
线上消费<b><font color="#c41230">冲正</font></b>(62)
线上退货(38)<br>
<b><font color="#0076b3">OnlinePay#reverseOrder</font></b><br>
线下
线下消费(46)
收银台模式(OnlinePay#transOrder+payOrder)<br>
<font color="#16884a"><b>线下冲正(47)</b></font><br>
<b><font color="#16884a">OfflinePay#reverseOrder</font></b><br>
<b><font color="#16884a">线下撤销(48)</font></b><br>
<span style="font-size:inherit;"><b><font color="#0076b3">OfflinePay#returnOrder</font></b></span><br>
线下退货(50)<br>
<font color="#0076b3"><b>OnlinePay#reverseOrder</b></font>
业务逻辑
通卡
子支付方式<b><font color="#b71c1c">subPayType为E0开头</font></b>,单卡支付
消费
customer_id为9999999999999999
预付费卡
预付费卡的手续费:支付明细的externalFields
{"<b><font color="#c41230">feeAmt</font></b>":"1500000","cardBizLabels":["TYK00001"]}
卡系统调用acct系统记账(会计账)
<font color="#c41230">SR019</font>
(1)和(2)不符合,即subPayType为空(预付费卡,<b><font color="#16884a">线上</font><font color="#c41230">消费62</font></b>)
消费
customer_id为壹钱包会员号
卡系统根据customer_id,查询会员的卡列表,按有效期由近及远的扣减
子支付方式为E1开头,资金渠道是定向积分渠道的定向积分消费,并且不能退货(指定支付方式和非指定支付方式都不支持)
基金(异步化)
MFCS
81(多基金)、<b><font color="#c41230">60</font></b>(<b><font color="#c41230">旺财主账户支付</font></b>)
基金类型
大华
南方
汇添富
易方达
平安盈
赎回时间
<font color="#c41230">subPayType</font>=10
T+0
subPayType=<b><font color="#c41230">11</font></b>或subPayType=<font color="#c41230">null</font>
T+1
MBP
12(活钱宝)
CMA
28(增值宝)
29(工资宝)
37(旺财)
35(通用宝)
营销
消费金(<b><font color="#00a650">商户</font></b>模式)
09(红包)
渠道帐
com.pinganfu.mkt.common.facade.consumerMoney.MktConsumerMoneyUserFacade#getUserConsumerMoneyAccount<br>
根据交易单号+付款方+交易金额,查询<b><font color="#c41230">07户</font></b>红包的出资账号操作<br>
<b><font color="#c41230">07</font></b>——》C001
满立减(<b><font color="#00a650">商户</font></b>模式)
15(消费直抵)
渠道
com.pinganfu.mkt.common.facade.MktDiscountFacade#getAccountAndcheckDiscountRecord()
查询07户卡券的出资账号操作
优化点:<strike>去掉T_TRANSCORE_PAYMENT_DETAIL的SUB_DETAIL表更新操作</strike>
调用mkt资金核销券
渠道帐
<b><font color="#c41230">07</font></b>——》C001
卡券(<b><font color="#00a650">商户</font></b>模式)
19(内部券)
渠道
com.pinganfu.mkt.common.facade.MktCouponUserFacade#getUserCouponAccount
通过<b><font color="#c41230">卡券Id</font></b>查询<b><font color="#c41230">07户卡券</font></b>的<b><font color="#c41230">出资账号</font></b>操作
渠道帐
<b><font color="#c41230">07</font></b>——》C001
<b><font color="#b71c1c">平台</font></b>券(<b><font color="#c41230">渠道</font></b>模式)
62(平台券)
mkt核销券
调用企业结算
1成功,2失败,mkt返回utpp失败,mkt会回滚1<br>
调单
1成功,2失败
渠道帐
<font color="#c41230"><b>应收</b></font>——》C001<br>
核销券和撤销券对应两个账户,<font color="#c41230"><b>收支分离轧差</b></font><br>
<b><font color="#00a650">商户</font></b>模式下,某个商户并发量大的时候,<b><font color="#c41230">07户要配置子账户</font></b>
积分
08(积分)
消费
AMOUNT/000000=元
<b>FOREIGN_AMOUNT/EXCHANGE_RATE</b>=元
下游字段
transPoint
<b>FOREIGN_AMOUNT</b>(积分)
detail
支付明细扩展字段
"{"outMerId":"900000014678",<b>"feeAmt":7980000</b>,"orderNo":"20190505000000110984566","accountId":"1000010005013069","memberId":"010000099189042","feePoint":3987,"transDescription":"水电煤缴费",<b>"feeRate":"0.07"</b>}"<br>
商户模式(<b><font color="#c41230">已下线</font></b>)
渠道帐<br>
cache:T_TRANSCORE_ACCOUNT_CONFIG<br>
key:payType+subPayType,value:万里通积分消费商户账户ID <br>
<b><font color="#c41230">07</font></b>——》C001
渠道模式
退款
退款的时候<font color="#f15a23">退钱</font>不退积分,FOREIGN_AMOUNT从原交易获取,属于无用字段,退款的时候会按照金额比率退手续费
pointpay<b><font color="#c41230">退货失败</font></b>是会推送到oms转人工的
资产额度
31(额度支付)
<b><font color="#c41230">渠道账</font></b>指令
OR凭证
fundflow=<b><font color="#16884a">F</font></b>
<b><font color="#c41230">用户账转账</font></b>明细
EX凭证
账务不依赖任何系统,需要知道这笔交易的账户
<font color="#c41230"><b>用户账</b></font>指令
<b><font color="#c41230">转账</font></b>指令
requestType=<font color="#c41230"><b>0</b></font><br>
TF凭证<br>
<font color="#c41230"><b>交易手续费</b></font>指令
requestType=<font color="#c41230"><b>0</b></font><br>
SR凭证<br>
fundflow=<b><font color="#16884a">F</font></b>
<b><font color="#c41230">冻结</font></b>指令
requestType=<font color="#c41230"><b>4</b></font><br>
<font>冻结</font><font color="#c41230">toAcctId</font>
UTPP-TAMSZ-GW
支付指令:fundFlow=F
<b>通用支付</b>事件通知组件(<b><font color="#c41230">payNotify</font></b>)
业务逻辑<br>
分库分表逻辑
字段:transId的13-16位
FailOver逻辑
无
<font color="#c41230">支付单大字段</font>业务系统和下游资金渠道商量好<font color="#16884a">key</font>
业务系统 set接口
请求参数
domain:业务系统
type:<font color="#16884a">key</font>
sequenceNo:<font color="#c41230">业务系统的订单号</font>
dataValue:<font color="#55beed">extFeilds</font>
返回参数
uniqueCode
下游资金渠道 get接口
请求参数
domain:业务系统
type:<font color="#16884a">key</font>
sequenceNo:<font color="#c41230">业务系统单号</font>
返回参数
<font color="#55beed">extFeilds</font>
transAndPay()
transOrder()+payOrder(),并优化流程
transOrder=<b><font color="#16884a">sucess</font></b>&&payOrder=<b><font color="#c41230">fail</font></b><br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=00 <font color="#000000">where trans_Id=? and trans_status in (03,34)</font>
分库分表逻辑
同transOrder()
业务逻辑
收单
收单调用超时,返回<font color="#f15a23">上游进行中</font>
收单换一个orderNo再落交易单,落交易单成功
用户两笔都支付成功,接到两个成功消息,后面那笔支付会发起退货
交易金额(transAmt)+交易手续费(feeAmt)=交易总金额(transTotalAmount\transFactAmt)=支付工具支付金额总和Sum(payAmt)
reverseOrder()
pipeline节点
请求参数校验
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION 查询原交易
<font color="#c41230">原交易</font>支付明细组装和校验
查询原交易的成功支付单和支付明细单
<font color="#55beed">select</font>:T_TRANSCORE_PAYMENT JOIN T_TRANSCORE_PAYMENT_DETAIL
指定方式退款
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION 查询成功和进行中的<font color="#c41230">退款</font>交易
<font color="#55beed">select</font>:T_TRANSCORE_PAYMENT JOIN T_TRANSCORE_PAYMENT_DETAIL 查询成功和进行中的退款交易的支付单和支付明细单
<font color="#c41230">退款交易</font>支付明细组装
<b><font color="#d32f2f">支付账户</font></b>取<b>原交易的支付明细</b>
数据准备
原交易、退款交易、退款交易支付单、退款支付明细单、退款扩展信息
数据插入
控制并发退款: 更新<font color="#000000">原</font>交易退款金额、退款实际金额(<font color="#000000"> [where 退款实际金额 +本次退款实际金额< 消费实际金额 AND 交易状态 in (交易成功,部分退款)])</font>
<font color="#7dcdc2">update </font>T_TRANSCORE_TRANSACTION set REFUND_AMT =REFUND_AMT+<b><font color="#000000">本次退款金额</font></b>,REFUND_FACT_AMT=REFUND_FACT_AMT+<b><font color="#000000">本次退款实际金额</font></b>,TRANS_STATUS=?, UPDATE_TIME=systimestamp <font color="#000000">where trans_Id=? AND REFUND_FACT_AMT </font>+本次退款实际金额<font color="#000000"><=TRANS_FACT_AMT</font> <font color="#000000">and trans_status in (10,13)</font><br>
<b>原交易更新成功,后续数据插入失败,需要<font color="#000000">回滚原交易</font></b>
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION 插入退款交易
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
insert(<font color="#f15a23">datanode</font>):T_UTPP_TRANSACTION_EXT
事件通知节点(<font color="#0076b3"><b>transNotify</b></font>)
风控
CP003
用户帐支付指令
requestType=2
fundFlow=F
渠道(<b>渠道和渠道帐<font color="#c41230">失败</font>,</b>fundFlow=R,<b>返回上游<font color="#c41230">06+000000</font></b>)
账务
000000—>10<br>
001006—>06<br>
其余—>20<br>
银行(所有渠道)<br>
退款
<font color="#c41230">同步</font>返回000000,状态06,<font color="#c41230">异步</font>返回明确结果<br>
冲退转提现
返回码010003—》状态06
营销
09(红包)
15(消费直抵,<font color="#c41230">满立减就是优惠规则,只涉及退钱,不涉及退券</font>)<br>
组装指令优化点
去掉com.pinganfu.mkt.common.facade.MktDiscountFacade.getAccountAndcheckDiscountRecord()查询07户卡券的出资账号操作
去掉T_TRANSCORE_PAYMENT_DETAIL的SUB_DETAIL表更新操作
refund:<font color="#c41230">true(退款、部分退款)</font><br>
19(内部券)
退款(38)
GW:q_mkt_discount_<font color="#f15a23">refund</font>_reciever,不退券,<font color="#c41230">下游保成功</font>
撤销(39)
GW:q_mkt_discount_<font color="#c41230">payResult</font>_reciever,退券,<font color="#c41230">下游保成功</font>
62(平台券)
退款<font color="#c41230"><b>不退券(全部退款后,商城调用mkt退券)</b></font>
渠道帐支付指令
退款
requestType=2
冲退转提现
requestType=0
凭证<br>
消费交易付款方<b><font color="#c41230">未</font></b>登录
OP002(商户出金凭证)
消费交易付款方<b><font color="#c41230">已</font></b>登录
OP001(用户出金凭证)
UTPP-TAMSZ-GW
fundFlow=<font color="#f15a23">R</font>
returnGoodSign=<font color="#c41230">G</font>
事件通知节点(<b><font color="#c41230">payNotify</font></b>)
业务逻辑
分库分表逻辑
字段:parentTransId的13-16位
FailOver逻辑
消费交易落FailOver库,退货交易也会落FailOver库(<font color="#c41230">不涉及Failover数据回迁</font>)
针对一笔订单多次发起退款,如果第一次退款还在处理中,业务系统会报错
渠道<b>退款</b>能力<b>(非账务)<font color="#c41230">保成功</font></b><br>
<strike>standardWithHold()</strike>
pipeline节点
transOrder()流程
交易支付流程数据整合
T_TRANSCORE_PAYMENT
T_TRANSCORE_PAYMENT_DETAIL
风控(Risk)
风控Rpc异常降级
风控业务明确拒绝,支付流程终止
数据入库
T_UTPP_TRANSACTION_EXT
渠道和渠道帐指令
用户帐指令
UTPP-TAMSZ-GW
UTPP-UEMSZ
分库分表逻辑
业务逻辑
商户对公扣款业务
模式一:商户对公卡直接扣款至商户05/07户
模式二:商户对公卡先绑定在商户会员(结算卡),从商户结算卡扣款至商户05/07户
com.pinganfu.utpptamsz.facade.WithdrawOrderAiFacade<br>
withdrawOrder()<br>
pipeline节点
请求参数校验
交易支付流程数据整合
交易状态(34)
落单并提现
<font color="#c41230">交易状态=34(无需更新)</font>
落单然后提现
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=34 <font color="#000000">where trans_Id=? and trans_status in (00)</font>
数据插入
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):<b>T_TRANSCORE_PAYMENT_DETAIL</b>
insert(<font color="#f15a23">datanode</font>):T_UTPP_TRANSACTION_EXT
延时出款决策模块(ucmp)
获取银行卡信息
<b><font color="#55beed">select</font></b> * from <b>T_UTPP_BANKCARD_INFO</b> where trans_id=? and info_type='00'<br>
出金决策系统
<b>payDecisionId-决定走具体银行渠道</b>
现金管理平台
默认策略2小时后出款
场景
卡卡转账
100010020005
活钱宝
100020030000
财富宝(CMA)<br>
100020050000
延时出款处理模块
延时出款
insert:T_UTPP_PAYMENT_DELAY
延时出款调度
立即出款
通知出金Pub/Sub组件
业务逻辑
分库分表逻辑
字段:transId的13-16位
FailOver逻辑
无
transAndWithdraw()
transOrder()+withdrawOrder()
分库分表逻辑
同transOrder()
合并落单提现流程,并优化流程
000000同步返回06,其它返回20<br>
com.pinganfu.utpptamsz.common.facade.TransInternalAiFacade(内部使用,不对外提供服务)
withdrawOrderPay()
pipeline节点
交易支付流程数据整合
立即出款
<font color="#c41230">交易状态=34(无需更新)</font>
延时出款调度
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION
出款幂等性控制
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=00 <font color="#000000">where trans_Id=? and trans_status in (34)</font>
<font color="#55beed">select</font>:T_UTPP_TRANSACTION_EXT
支付决策
风控(Risk)
用户帐指令
requestType=0
<b><font color="#c41230">解冻</font></b>账务明细指令
<b><font color="#c41230">提现</font></b>账务明细指令
渠道指令
网关代扣(代发)
延时出款调度
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION_EXT
渠道帐指令
requestType=0
UTPP-TAMSZ-GW
fundFlow=<font color="#c41230">F</font>
UTPP-UEMSZ
分库分表逻辑
字段:transId的13-16位
onlineFundInReverse()<br>
pipeline节点
插入冲正幂等记录表
insert:T_UTPPZ_REV_IDEMPOTENT
索引<br>
唯一索引
TRANS_ID<br>
PAYMENT_ID
唯一索引
PAYMENT_ID
CREATE_TIME
唯一索引
ID
CREATE_TIME
<b>获取已成功的支付指令,组装待冲正的支付基础产品</b>
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION
com.pinganfu.utpptamsz.facade.PayGwServiceAiFacade#queryPayOrderStatus()
<b><font color="#ff0000">组装各个资金渠道和渠道帐两个冲正指令</font></b>
营销
消费直抵(15)
refund:false(<font color="#c41230"><b>冲正</b></font>操作,所有的钱全部退掉)<br>
内部券(19)
GW:q_mkt_discount_<font color="#c41230">payResult</font>_reciever,退券,<font color="#c41230">下游保成功</font>
平台券(62)
调用企业结算
核销券
1成功,2失败,<font color="#c41230">mkt返回utpp成功,mkt会重新核销券</font>
调单
渠道帐
冲退转提现
requestType=0
退款
requestType=2
<font color="#00a650">各个渠道</font><b><font color="#c41230">两个</font></b><font color="#00a650">冲正指令</font><font color="#c41230"><b>单独</b>调用</font>GW
GW不再调用<font color="#c41230">线上支付结果Pub/Sub组件(reverseSign:"Y")</font>
fundFlow=<font color="#c41230"><b>R</b></font>
reverseSign=<font color="#c41230">Y</font>
paymentId
每次调用gw生成新的paymentId
交易<b><font color="#c41230">不关心冲正结果</font></b>,哪个渠道冲正失败,<font color="#c41230">GW冲正指令状态为<b>09</b></font>
给qerp发Q:<b><font color="#c41230">q_utpp_pay_result_notify</font></b>
更新冲正表记录(成功:10,失败:20)
update:T_UTPP_OL_PAY_FAIL_RECORD where PAYMENT_ID=? and STATUS= ?<br>
分库分表逻辑
字段:transId的13-16位
onlineFundOutReverse()<br>
pipeline节点
insert:T_UTPPZ_REV_IDEMPOTENT
查询GW支付指令
select * from T_TRANSCORE_TRANSACTION where trans_id=?
设置<b><font color="#c41230">账务主交易</font></b>账号
电子
cache:T_UTPPZ_SHARDACCT_DZ
科技
cache:T_UTPPZ_SHARDACCT_KJ
com.pinganfu.utpptamsz.<b><font color="#c41230">facade</font></b>.PayGwServiceAiFacade#queryPayOrderStatus()
select:T_UTPP_GW_PAY JOIN T_UTPP_GW_PAY_ORDER
循环支付指令
渠道<b><font color="#c41230">失败</font></b> || 渠道帐<b><font color="#c41230">失败</font></b>——>reverseOrderType=channel || channelAccount<br>
<font color="#c41230"><b>用户账</b>失败</font>
结束
<b><font color="#9f8759">渠道失败</font></b>,冲正用户账
<b><font color="#f1753f">渠道账失败</font></b>
给<b><font color="#c41230">保障系统</font></b>发Q:q_pmcs_error_log_notify(<font color="#c41230">errorType:CAFE</font>)
<b>交易状态—<font color="#c41230">06</font></b>
结束
<b>组装</b>冲正指令
<b>30、64<font color="#c41230">冲</font>A0用户帐</b>【出金交易原指令:渠道、渠道帐】
30交易单<b><font color="#c41230">无父交易单号</font></b>,走EX002<br>
64走撤销
relExVoucherSeq获取<font color="#c41230"><b>原A0支付单号</b></font><br>
select * from <b><font color="#c41230">T_TRANSCORE_PAYMENT</font></b> p,<b><font color="#c41230"> T_TRANSCORE_PAYMENT_DETAIL</font></b> pd<br> where p.PAYMENT_ID = pd.PAYMENT_ID and p.TRANS_ID = ? AND p.STATUS = ?
<b>05、X5、C5、F3<font color="#c41230">冲正</font></b>对应<b>用户帐</b>【出金交易原指令:用户帐、渠道、渠道帐】
requestType:30=0,其他交易类型=2
UTPP-TAMSZ-GW<br>
组装网关请求参数
fundFlow=<font color="#c41230">R</font>
reverseSign=<font color="#c41230">Y</font>
调用用户账失败
GW向上游返回<font color="#c41230">06</font>,冲正指令状态翻为<font color="#c41230"><b>09</b></font>
insert:T_UTPP_GW_RETGOOD_RECORD
Rpc异常需要调单
调单成功,执行剩余流程
哪个渠道冲正失败,GW冲正指令状态为09
UTPP-UEMSZ
条件:<b><font color="#c41230">异步</font></b>交易通知&&(<b>第一笔指令失败</b>||<b><font color="#c41230">渠道失败</font></b>)
冲正结果
冲正失败
结束
冲正成功
UTPP-UEMSZ
结束
分库分表逻辑
字段:transId的13-16位
com.pinganfu.utpptamsz.common.facade.AcctAiFacade
transferAcct()<br>
pipeline节点
请求参数校验
查询付款方和收款方的账户(cip)
数据准备
数据插入
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION
交易状态
00
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
UTPP-UEMSZ
用户帐支付指令
用户帐requestType默认为3(手工)
UTPP-TAMSZ-GW
UTPP-UEMSZ
分库分表逻辑
业务系统传参shardField
FailOver逻辑
无
业务逻辑
业务系统决定调用账务3.0或2.0
业务系统传参linkAcctId,关联内部户调账
<strike>返回参数没有<font color="#c41230">globalTime</font>字段,业务系统日终对账文件是以utpp全局时间为准(已修复)</strike>
转账不过风控节点,比如购物车合单支付,风控只校验第一笔62消费交易
revTransferAcct()<br>
pipeline节点
请求参数校验
请求交易类型必须L2/I3
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION 获取<b><font color="#c41230">原交易</font></b>
数据准备
<font color="#55beed">select</font>:T_TRANSCORE_PAYMENT JOIN T_TRANSCORE_PAYMENT_DETAIL 查询原交易的成功支付单和支付明细单
数据插入(<font color="#f15a23">原交易更新</font>、新交易插入、新支付单插入、新支付明细单插入)
关联外部凭证流水号为空<br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION
原交易状态
当前退款金额 < 原交易金额-已退款金额
<font color="#c41230">13</font>(部分退款)
当前退款金额 = 原交易金额-已退款金额
<font color="#c41230">21</font>(部分退款)
当前退款金额 > 原交易金额-已退款金额
报异常
控制并发退款: 更新原交易退款金额、退款实际金额(<font color="#000000"> [where 退款实际金额 +本次退款实际金额< 消费实际金额 AND 交易状态 in (交易成功,部分退款)])</font>
<font color="#7dcdc2">update </font>T_TRANSCORE_TRANSACTION set REFUND_AMT =REFUND_AMT+<b><font color="#000000">本次退款金额</font></b>,REFUND_FACT_AMT=REFUND_FACT_AMT+<b><font color="#000000">本次退款实际金额</font></b>,TRANS_STATUS=?, UPDATE_TIME=systimestamp <font color="#000000">where trans_Id=? AND REFUND_FACT_AMT </font>+本次退款实际金额<font color="#000000"><=TRANS_FACT_AMT</font> <font color="#000000">and trans_status in (10,13)</font><br>
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION
insert:T_TRANSCORE_PAYMENT
insert:T_TRANSCORE_PAYMENT_DETAIL
UTPP-UEMSZ
用户帐支付指令
用户帐requestType=2(撤销)
UTPP-TAMSZ-GW
UTPP-UEMSZ
分库分表逻辑
FailOver逻辑
无
frozenAcct()<br>
pipeline节点
请求参数校验
查询冻结账户(cip)
数据准备
数据插入
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION
交易状态
00
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
UTPP-UEMSZ
风控(Risk)
冻结用户帐支付指令
用户帐requestType默认为4(冻结)
UTPP-TAMSZ-GW
UTPP-UEMSZ
分库分表逻辑
同transOrder()
FailOver逻辑
同transOrder()
业务逻辑
账务冻结指令的FrozenId用冻结的交易单号<br>
unfrozenAcct()<br>
pipeline节点
请求参数校验
frozenId不能为空
查询解冻账户(cip)
数据准备
数据插入
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION
交易状态
00
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
UTPP-UEMSZ
风控(Risk)
解冻用户帐支付指令
用户帐requestType默认为5(解冻)
UTPP-TAMSZ-GW
UTPP-UEMSZ
分库分表逻辑
同transOrder()
FailOver逻辑
同transOrder()
业务逻辑
账务解冻指令的FrozenId用冻结的交易单号<br>
接口(线下银行卡)
com.pinganfu.utpptamsz.facade.OfflinePayAiFacade
渠道能力
<b>支付方式</b>
<b>线下借记(04)</b>
线下贷记(05)
bank_pos
调用超时、返回码为空、000000、010003——》返回06,其余——》失败<br>
transAndPay()
pipeline节点
transOrder()
请求参数校验<br>
数据准备
组装支付和支付明细列表
数据插入(支付单插入、支付明细单插入)
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
风控(Risk)
CP003
资金指令(<font color="#c41230"><b>filter:交易类型</b></font>)
指令共性
渠道
fundflow=<font color="#00a650">F</font>
渠道帐
fundflow=<font color="#c41230">R</font>
用户帐
fundflow=<font color="#c41230">R</font>
用户帐、渠道账requestType=0
<font color="#31a8e0">预授权(51)</font><br>
<b>渠道</b>指令
线下消费(46)、<font color="#55beed">预授权完成(55)</font><br>
渠道指令
<font color="#c41230">线下消费(46)</font>需要用场景码进行交易区分,理财POS类交易,网关会做交易商户替换(商户池)<br>
渠道帐指令<br>
用户帐
UTPP-TAMSZ-GW
GateWayOffLineTransService.bankPosTrans()<br>
UTPP-UEMSZ
业务逻辑
分库分表逻辑
同transOrder()
<b>预授权完成</b>和<b>预授权</b>无关联
<b><font color="#c41230">返回逻辑</font></b>
流程<b><font color="#c41230">未到</font></b>支付核心
非000000——>空
流程<b><font color="#c41230">到</font></b>支付核心
gwStatus=06(支付核心流程正常或者异常):000000——>06<br>
gwStatus=10:000000——>10
gwStatus=20:非000000——>空
<b><font color="#c41230">reverseOrder()</font></b>
pipeline节点
请求参数校验<br>
非空校验、交易类型、金额
查询<b><font color="#c41230">原交易</font></b>
上游消费交易<b><font color="#c41230">超时</font></b>
根据原来的<b><font color="#c41230">orderNo+customerId</font></b>参数<b>查询交易</b>
select(<font color="#c41230"><b>datanode</b></font>):T_TRANSCORE_TRANSACTION where ORDER_NO=orderNo AND CUSTOMER_ID =customerId
(1)的查询结果<b>为空</b>,插入线下<b><font color="#c41230">冲正交易</font></b>(<b><font color="#c41230">TransStatus=RR</font></b>)<br>
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION
上游消费交易<b><font color="#c41230">未拿到交易终态</font></b><br>
根据<b><font color="#c41230">transId</font></b>查询
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION where TRANS_ID =?
<b>(2)</b>的查询交易单
<b>为空(</b>原交易不存在)
interruptFlag=true,uemsNotifyFlag=false<br>
返回<b><font color="#c41230">冲正成功</font></b>:<b>status=10,respCode=000000,<font color="#c41230">transId</font>=null</b><br>
结束
<b><font color="#c41230">不为空</font></b>(原交易存在)
交易状态 in [冲正(26),线下冲正特殊状态(RR) ]<br>
interruptFlag=true,uemsNotifyFlag=false<br>
返回<b><font color="#c41230">冲正成功</font></b>:<b>status=10,respCode=000000,<font color="#c41230">transId</font>=原交易单号</b><br>
结束
查询GW指令
<font color="#55beed">select</font>:T_TRANSCORE_PAYMENT JOIN T_TRANSCORE_PAYMENT_DETAIL where TRANS_ID=?<br>
根据消费交易TransId和PaymentId查询所有的GW指令<br>
select * from T_UTPP_GW_PAY p left join T_UTPP_GW_PAY_ORDER o<br>on p.pay_id=o.pay_id where p.trans_id=? and p.payment_id=?<br>
所有支付指令是否都<b><font color="#c41230">已冲正</font></b>(<b><font color="#c41230">status=11</font></b>)<br>
都冲正
interruptFlag=true<br>
返回<b><font color="#c41230">冲正成功</font></b>:<b>status=10,respCode=000000,<font color="#c41230">transId</font>=原交易单号</b><br>
未都冲正
返回<b><font color="#c41230">冲正进行中</font></b>:<b>status=<font color="#16884a">06</font>,respCode=000000,<font color="#c41230">transId</font>=原交易单号</b><br>
需要冲正【<font color="#c41230">非冲正成功(11)</font>】的指令<br>
指令共性
fundflow=<font color="#c41230">R</font>
用户帐、渠道账
requestType=1,冲正
线下消费冲正(47)、<font color="#31a8e0">预授权完成冲正(56)</font><br>
用户账
渠道(bank_pos)
渠道帐
<font color="#55beed">预授权冲正(52)</font>
渠道(bank_pos)
UTPP-TAMSZ-GW
GateWayOffLineTransService.bankPosTrans()<br>
单笔指令调用,不关注返回结果
<font color="#c41230">posReverseSign=Y</font><br>
<font color="#c41230">reverseSign=Y</font><br>
<font color="#c41230">transType=47|52|56</font><br>
UTPP-UEMSZ
分库分表逻辑
字段:transId的13-16位
需求点
returnOrder()<br>
pipeline节点
pipeline节点
请求参数校验
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION 查询原交易
<font color="#c41230">原交易</font>支付明细组装和校验
查询原交易的<font color="#c41230">成功</font>支付单和支付明细单
<font color="#55beed">select</font>:T_TRANSCORE_PAYMENT JOIN T_TRANSCORE_PAYMENT_DETAIL
<font color="#c41230">撤销交易</font>支付明细组装
数据插入
<b>线下<font color="#c41230">退货</font>(50)</b><br>
控制并发退款: 更新原交易退款金额、退款实际金额(<font color="#000000"> [where 退款实际金额 +本次退款实际金额< 消费实际金额 AND 交易状态 in (交易成功,部分退款)])</font>
<font color="#7dcdc2">update </font>T_TRANSCORE_TRANSACTION set REFUND_AMT =REFUND_AMT+<b><font color="#000000">本次退款金额</font></b>,REFUND_FACT_AMT=REFUND_FACT_AMT+<b><font color="#000000">本次退款实际金额</font></b>,TRANS_STATUS=?, UPDATE_TIME=systimestamp <font color="#000000">where trans_Id=? AND REFUND_FACT_AMT </font>+本次退款实际金额<font color="#000000"><=TRANS_FACT_AMT</font> <font color="#000000">and trans_status in (10,13)</font><br>
线下消费<font color="#f15a23">撤销</font>(48)、线下退货(50)、<font color="#55beed">预授权撤销(53)</font>、<font color="#55beed">预授权完成撤销(58)</font><br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=27(<font color="#c41230">控制并发退款 [where 交易状态 in (10,13</font>)])
insert:T_UTPPZ_TRANSACTION_U
insert:T_TRANSCORE_TRANSACTION 插入撤销交易
insert:T_TRANSCORE_PAYMENT
insert(<font color="#f15a23">datanode</font>):T_TRANSCORE_PAYMENT_DETAIL
UTPP-UEMSZ
风控(Risk)
资金指令
指令共性
用户帐、渠道账requestType=<font color="#c41230">2</font><br>
线下消费<font color="#c41230">撤销</font>(48)、线下退货(50)、<font color="#55beed">预授权完成撤销(58)</font><br>
用户账<br>
fundflow=<font color="#00a650">F</font>
渠道
fundflow=<font color="#c41230">R</font>
渠道账
fundflow=<font color="#c41230">R</font>
<font color="#55beed">预授权撤销(53)</font><br>
渠道
fundflow=<font color="#00a650">F</font>
UTPP-TAMSZ-GW
GateWayOffLineTransService.bankPosTrans()<br>
returnGoodSign=<font color="#c41230">G</font><br>
UTPP-UEMSZ
分库分表逻辑
字段:parentTransId的13-16位
需求点
撤销交易必须全额撤销
线下pos退货交易,网关不保<b><font color="#c41230">成功</font></b>
接口(通卡、健康卡)
<b>消费和退货、撤销走<font color="#16884a">线上</font>逻辑,冲正走<font color="#f15a23">线下</font>逻辑</b>
交易管控
com.pinganfu.utpptamsz.common.facade.TransControlFacade<br>
updatePayOrderStatus
pipeline
请求参数校验<br>
状态不能更新为00
更新支付指令
update T_UTPP_GW_PAY_ORDER t set t.STATUS = #{newStatus},RETURN_CODE = ?, UPDATE_TIME = NOW(6)<br>where PAY_ORDER_ID = ? and t.STATUS = #{oldStatus} and t.STATUS in ('00', '06')
业务逻辑
insertGwOvertimeRecord
pipeline
请求参数校验
payOrderIdList最大<b><font color="#c41230">500</font></b>条
数据准备并入库
去除<b><font color="#c41230">超时调单表</font></b>中<font color="#16884a"><b>存在</b></font>的PAY_ORDER_ID<br>
select PAY_ORDER_ID from <b><font color="#c41230">T_UTPP_GW_OVERTIME_RECORD</font></b> where <b><font color="#c41230">PAY_ORDER_ID</font></b> in (?)
去除支付指令中状态为<b><font color="#16884a">06</font></b>的PAY_ORDER_ID
select PAY_ORDER_ID from <b><font color="#c41230">T_UTPP_GW_PAY_ORDER</font></b> where PAY_ORDER_ID in (?) and <b><font color="#c41230">status='06'</font></b><br>
批量插入调单表
<b>insert into T_UTPP_GW_OVERTIME_RECORD</b>
业务逻辑
场景
下游资金渠道<b><font color="#c41230">异步</font></b>消息<b><font color="#c41230">丢失</font></b>
UTPP<b><font color="#c41230">更新</font></b>支付指令<font color="#c41230"><b>异常(UTPP的DB异常)</b></font><br>
通过<b><font color="#00a650">调单</font></b>继续执行<b>后续支付</b>流程,保证<b><font color="#c41230">业务连续性</font></b>
queryTransOrder
请求参数<br>
交易单号
来源系统单号<br>
付款方会员号
父交易单号<br>
交易类型
场景码<br>
业务单号
来源系统
pipeline
请求参数校验
业务单号不能为空<br>
来源系统不能为空<br>
请求参数交易单号不为空<br>
请求交易类型为退款,根据parentTransId<br>
<font color="#55beed">select</font>:T_TRANSCORE_TRANSACTION 查询原交易<br>
设置request参数customerId(原交易toCustomerId),<b><font color="#c41230">交易退款接口上游不传首付款会员</font></b><br>
校验orderNo、customerId不为空<br>
查询交易信息
根据交易单号<br>
select:T_TRANSCORE_TRANSACTION 查询原交易
根据orderNo+customerId
交易信息是否为空
空
<b><font color="#c41230">insert into</font></b> T_UTPPZ_TRANSACTION_U
<b>insert into</b> <b><font color="#c41230">T_TRANSCORE_TRANSACTION</font></b>
数据库非空
TRANS_ID
UTPP自己生成
TRANS_TYPE
BUSI_CHANNEL
M
TRANS_TIME
sysdate
TRANS_STATUS
<b><font color="#c41230">88</font></b>
CUSTOMER_ID
DC_FLAG
D
TRANS_AMT
CREATE_TIME
sysdate
UPDATE_TIME
sysdate
PRODUCT_CODE
非空
根据交易类型+场景码获取消息列表<br>
交易状态为成功或失败,异步消息补Q
返回参数
交易状态
返回码
描述
交易流水
业务逻辑
业务场景
落单+支付<br>
落单失败
落单成功
支付失败
再次支付,支付成功
再次支付,支付失败
支付成功
落单并支付
落单失败
落单成功
支付失败
再次支付,支付成功
再次支付,支付失败
支付成功
UTPP提供给上游业务系统<b><font color="#c41230">调单方法</font></b>
异步消息补Q
一笔交易,<b><font color="#c41230">多次支付</font></b>,同一个消息通知上游多次<br>
通知<b><font color="#c41230">支付单号或者状态</font></b>补发
基于现状目前原则就是,收单调用UTPP新调单接口后,utpp返回告诉收单该交易是否订阅Q,是否触发终态Q重新发送,终态Q需保证业务单系统拿到终态后能将处理中的交易正常异步处理下去(同一笔交易不能同时发送多条不一样内容的终态Q);未订阅任何状态Q的场景,同步需返回明确终态的交易结果
<b><font color="#16884a">交易</font><font color="#c41230">终态</font></b>才会通知上游(收单只关注<b><font color="#c41230">交易状态</font></b>)
只有失败是终态,成功还是能退货<br>
业务系统需求
1. UTPP支持收单流水号的幂等调单,并且返回“无此交易”时需要幂等返回,保证调单比同步交易快时,同步和调单结果一致,另外新接口需明确无此交易具体返回错误码及状态。
2. UTPP支持transId和收单流水号orderNo的调单,需要触发终态交易的通知向收单发送异步Q,通知内容需要和交易结果通知保持一致。<br>针对有异步通知订阅的场景,同步需返回标示是否触发异步Q通知成功;<br>针对没有订阅异步通知的场景,需同步明确返回交易结果,此时返回数据格式尽量包括原来旧调单接口的字段信息。
3. UTPP新调单接口交易结果返回需要给出明确的失败及明确成功的定义,错误码及状态.<br>
收银台模式下,失败的通知,其实给到收单的是“支付通知”,而非“交易通知”,而API模式下,通知给收单的是“交易通知”
reverseSuccessOrder()
收单自己的订单超时关单后,收到Utpp的<font color="#c41230">成功交易</font>通知,调用该方法对成功交易发起退款
pipeline节点
查询原交易单
交易状态10
交易状态非10
返回失败
组织退款参数
调用退款接口<font color="#c41230">com.pinganfu.utpptamsz.facade.TransAiFacade#reverseOrder()</font>
调用ReverseOrderPipelineFactory
UTPP-UEMSZ
q_cstc_mtxn_commit(TxnType==XX)<br>
2.0:t_transcore_baps_payfail<br>
3.5:交易描述
<font color="rgba(0, 0, 0, 0)">原交易单状态改为30</font><br>
调度(集群中<b><font color="#c41230">某一单机</font></b>执行,<font color="#c41230"><b>支持分库分表</b>,不需要依赖IP</font>)
特性
上个调度任务未执行完成,<b><font color="#c41230">下次调度会暂停执行</font></b><br>
默认的配置是是通过选主节点,给机器分配分片,获取到分片的就可以执行作业,如果作业配置的是1个分片情况下只有一个机器会执行这个作业<br>
刷新缓存
0 0/5 * * * ?
T_UTPPX_COMMON_CONFIG<br>
T_UTPPX_ACCT_VOUCHER
T_UTPPX_ORGANPAY_CHANNEL
超时调单<br>
10 0/2 * * * ?
SELECT * FROM T_UTPP_GW_OVERTIME_RECORD<br><font color="#c41230"> WHERE STATUS = '00'</font> and DISPATCH_TIME<=<b><font color="#c41230">NOW(6)</font></b> and CREATE_TIME>=<b><font color="#c41230">DATE_SUB(NOW(6), INTERVAL 1 DAY)</font></b> order by DISPATCH_NUMBER limit <b><font color="#c41230">200</font></b><br>
线上入金冲正<br>
20 0/2 * * * ?
select * from T_UTPP_OL_REVERSE_RECORD where <b><font color="#c41230">STATUS ='00' </font></b> and CREATE_TIME >= <b><font color="#c41230">DATE_SUB(NOW(6), INTERVAL 7 DAY)</font></b> order by CREATE_TIME limit <b><font color="#c41230">200</font></b><br>
延时出款
30 0/2 * * * ?
select * from T_UTPP_PAYMENT_DELAY where PROCESS_TIME between <b><font color="#c41230">DATE_SUB(NOW(6), INTERVAL 14 DAY)</font></b> and <b><font color="#c41230">DATE_SUB(NOW(6), INTERVAL 1 MINUTE)</font></b> and CREATE_TIME between <b><font color="#c41230">DATE_SUB(NOW(6), INTERVAL 14 DAY) </font></b>and <b><font color="#c41230">DATE_SUB(NOW(6), INTERVAL 1 MINUTE)</font></b>and STATUS = 00 limit <b><font color="#c41230">200</font></b><br>
<b>组件</b>
接口拦截器组件(Facade、MQ、调度)
分库分表规则计算
failover数据库查询
Failover时效性:运维人工修改配置中心ops配置项(ZK节点的KEY:FAILOVER_STATUS,VALUE:tcore17opr:N, tcore18opr:F)实现切换
FailOver库和00-99库同时down掉——》UTPP只探测00-99库的可用性
日期(8)+<font color="#f15a23">4位分库分表逻辑字段</font>+流水号(16),共28位
<font color="#f1753f">4位分库分表逻辑字段</font>:0<b><font color="#c41230">|</font></b>F(Failover)+0(扩展)+两位分库分表
接口业务流程
FailOver逻辑
捕获octopus的<font color="#f15a23">数据库不可用Exception</font>
非000000错误码处理器
给保障系统发Q:q_pmcs_error_log_notify(errorType:CE)
脱敏日志打印
数据库异常,流程可恢复,给保障系统发Q:
<b>Pub/Sub组件</b>
<font color="#c41230"><b>线上</b></font>出金Pub/Sub组件(withdraw_order_pay_notify)
<b><font color="#c41230">线上</font></b>支付结果通知Pub/Sub组件(<font color="#c41230"><b>online</b></font>_pay_result_notify)
交易成功
异步
UTPP-UEMSZ
结束
同步(交易主流程已经调用uemsz)
结束
交易失败
<font color="#f15a23">资金渠道异步</font>才给保障系统发Q:q_pmcs_error_log_notify(errorType:CE)
冲正模块
参数校验
入金模块
多笔(<b><font color="#c41230">非第一笔</font></b>)指令失败&&交易类型!=<b>46(线下支付)</b>
insert:T_UTPP_OL_PAY_FAIL_RECORD
交易类型==62 && 场景码 in (300010080003,300010080004) <b><font color="#c41230">取消冲正</font></b><br>
处理方案
<b><font color="#c41230">渠道账</font></b>失败
资金对账长款
<b><font color="#c41230">渠道长款交易</font></b>请<b><font color="#c41230">运营对账组同事</font><font color="#00a650">差错调账处理</font></b>。调账方案:200元以下,差错直接调至商户05户,不扣除手续费;200元以上,待商服核实交易情况后再进行对应处理
<b><font color="#c41230">用户账</font></b>失败
账务挂销表
<b><font color="#c41230">内部户挂账</font></b>请<b><font color="#c41230">开发</font></b>提供<font color="#00a650"><b>调账模板(直接从内部户调至商户05户)</b></font>,<b><font color="#c41230">资金运营</font></b>协助调账处理。调账方案:200元以下直接调至商户05户,不扣除手续费;200元以上,待商服核实交易情况后再进行对应处理
同步
结束(同步流程已调用uemsz)
异步
<b>UTPP-UEMSZ</b>
结束
线上入金冲正调度模块
获取T_UTPP_OL_PAY_FAIL_RECORD的1000条记录
com.pinganfu.utpptamsz.common.facade.TransInternalAiFacade#onlineFundInReverse()
出金模块
<font color="#f15a23">实时调用</font>com.pinganfu.utpptamsz.common.facade.TransInternalAiFacade#onlineFundOutReverse()<br>
<font color="#c41230"><b>线下</b></font>支付结果通知Pub/Sub组件(<b><font color="#c41230">offline</font></b>_pay_result_notify)
异步
交易失败
<font color="#f15a23">资金渠道异步</font>才给保障系统发Q:q_pmcs_error_log_notify(errorType:CE)
交易成功或失败
UTPP-UEMSZ
结束
<b><font color="#c41230">调度</font></b>(支持单表,不需要依赖IP)
<b>事件</b>通知组件
交易事件通知组件(<font color="#0076b3"><b>transNotify</b></font>)
branch
<b><font color="#c41230">finally</font></b>节点:返回码000000——》调用utpp-uemsz<br>
line
transPaymentInsertDb=true——》调用utpp-uemsz
失败降级
q_utppuemsz_trans_notify
<font color="#c41230">Cat埋点</font>
通用支付事件通知组件(<b><font color="#c41230">payNotify</font></b>)
<b><font color="#c41230">finally</font></b>节点:同步失败,<b><font color="#c41230">补偿</font></b>发Q(q_utppuemsz_pay_notify)<br>
流程到Gw,调用uemsz<br>
交易和支付(明细)<b><font color="#c41230">入库</font></b>成功,<b><font color="#c41230">流程未到Gw</font></b>,调用uemsz
<b><font color="#c41230">落单并支付</font></b>,交易成功并且支付未成功,需要回滚交易单状态<br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=00 <font color="#000000">where trans_Id=? and trans_status in (03,34)</font>
<b><font color="#c41230">反向交易</font></b>,原交易更新状态和金额成功,后续数据插入失败,<b>需要回滚原交易</b><br>
监控
CAT埋点(<font color="#c41230">分钟级监控</font>)
主链路的UTPP-UEMSZ节点
埋点维度
全栈
场景码
埋点
Transaction【Transaction主要用于监控一段代码的运行情况:运行次数、QPS、错误次数、失败率、响应时间统计(平均响应时间、Tp9XXX分位值)】<br>
<b><font color="#662c90">交易</font></b>通知
落单<b><font color="#00a650">成功率</font></b>
落单<b><font color="#00a650">成功\</font><font color="#c41230">失败</font></b>数
<b><font color="#f1753f">支付</font></b>通知
支付<font color="#00a650"><b>成功率</b></font>
支付<b><font color="#00a650">成功\</font><font color="#c41230">失败</font></b>数
特殊场景
退款交易:非用户账失败,返回上游06,需要改造增加<b><font color="#c41230">2个支付埋点</font></b>和给PMCS保障推送消息
Event(总次数)
退款\撤销交易用户账异步失败
分支
交易—>支付
交易成功,支付成功
4个埋点
交易成功,支付失败
4个埋点
交易失败,支付未执行
2个埋点
交易<b><font color="#c41230">并</font></b>支付
交易成功,支付成功
4个埋点
交易成功,支付<font color="#c41230"><b>未执行</b></font>
BranchPipeline
4个埋点
LinePipeline
2个交易埋点,<font color="#c41230"><b>需要改造增加2个支付埋点</b></font>
交易成功,支付失败
BranchPipeline
4个埋点
LinePipeline
4个埋点
交易失败,支付未执行
BranchPipeline
2个埋点<br>
LinePipeline
0个埋点,<font color="#c41230"><b>需要改造增加2个支付埋点</b></font>
遗留问题
<b><font color="#381e11">UPDATE</font></b>语句控制幂等,高并发的时候会<b><font color="#381e11">失效</font></b>,目前账务保底
<b>组件</b>
接口拦截器组件(Facade、MQ、调度)
分库分表规则计算
failover数据库查询
Failover时效性:运维人工修改配置中心ops配置项(ZK节点的KEY:FAILOVER_STATUS,VALUE:tcore17opr:N, tcore18opr:F)实现切换
FailOver库和00-99库同时down掉——》UTPP只探测00-99库的可用性
日期(8)+<font color="#f15a23">4位分库分表逻辑字段</font>+流水号(16),共28位
<font color="#f1753f">4位分库分表逻辑字段</font>:0<b><font color="#c41230">|</font></b>F(Failover)+0(扩展)+两位分库分表
接口业务流程
FailOver逻辑
捕获octopus的<font color="#f15a23">数据库不可用Exception</font>
非000000错误码处理器
给保障系统发Q:q_pmcs_error_log_notify(errorType:CE)
脱敏日志打印
数据库异常,流程可恢复,给保障系统发Q:
请求外部系统拦截器<b><font color="#c41230">组件</font></b>(计算并<b><font color="#c41230">汇总</font></b>一笔交易的<font color="#c41230"><b>内部</b></font>和<b><font color="#c41230">外部</font></b>的耗时)
方法名称+请求参数
方法名称+耗时+返回参数
<b>Pub/Sub组件</b>
<font color="#c41230"><b>线上</b></font>出金Pub/Sub组件(withdraw_order_pay_notify)
<b><font color="#c41230">线上</font></b>支付结果通知Pub/Sub组件(<font color="#c41230"><b>online</b></font>_pay_result_notify)
<font color="#16884a"><b>交易成功</b></font>
异步
UTPP-UEMSZ
结束
同步(交易主流程已经调用uemsz)
结束
交易<b><font color="#c41230">失败</font></b>
<font color="#f15a23">资金渠道异步</font>才给保障系统发Q:q_pmcs_error_log_notify(errorType:CE)
冲正模块
参数校验
入金模块
多笔(<b><font color="#c41230">非第一笔</font></b>)指令失败&&交易类型!=<b>46(线下支付)</b>
线上入金失败<b><font color="#c41230">立刻冲正</font></b>(<b>T_UTPP_OL_IMMEDIATE_REVERSE</b>)
com.pinganfu.utpptamsz.common.facade.TransInternalAiFacade#onlineFundInReverse()
具体场景
寿险批量发红包
insert:T_UTPP_OL_PAY_FAIL_RECORD
交易类型==62 && 场景码 in (300010080003,300010080004) <b><font color="#c41230">取消冲正</font></b><br>
处理方案
<b><font color="#c41230">渠道账</font></b>失败
资金对账长款
<b><font color="#c41230">渠道长款交易</font></b>请<b><font color="#c41230">运营对账组同事</font><font color="#00a650">差错调账处理</font></b>。调账方案:200元以下,差错直接调至商户05户,不扣除手续费;200元以上,待商服核实交易情况后再进行对应处理
<b><font color="#c41230">用户账</font></b>失败
账务挂销表
<b><font color="#c41230">内部户挂账</font></b>请<b><font color="#c41230">开发</font></b>提供<font color="#00a650"><b>调账模板(直接从内部户调至商户05户)</b></font>,<b><font color="#c41230">资金运营</font></b>协助调账处理。调账方案:200元以下直接调至商户05户,不扣除手续费;200元以上,待商服核实交易情况后再进行对应处理
同步
结束(同步流程<b><font color="#c41230">已</font></b>调用uemsz)
异步
<b>UTPP-UEMSZ</b>
结束
线上入金冲正调度模块
获取T_UTPP_OL_PAY_FAIL_RECORD的1000条记录
com.pinganfu.utpptamsz.common.facade.TransInternalAiFacade#onlineFundInReverse()
出金模块
<font color="#f15a23">实时调用</font>com.pinganfu.utpptamsz.common.facade.TransInternalAiFacade#onlineFundOutReverse()<br>
<font color="#c41230"><b>线下</b></font>支付结果通知Pub/Sub组件(<b><font color="#c41230">offline</font></b>_pay_result_notify)
异步
交易失败
<font color="#f15a23">资金渠道异步</font>才给保障系统发Q:q_pmcs_error_log_notify(errorType:CE)
交易成功或失败
UTPP-UEMSZ
结束
<b><font color="#c41230">调度</font></b>(支持单表,不需要依赖IP)
<b>事件</b>通知组件
交易事件通知组件(<font color="#0076b3"><b>transNotify</b></font>)
branch
<b><font color="#c41230">finally</font></b>节点:返回码000000——》调用utpp-uemsz<br>
line
transPaymentInsertDb=true——》调用utpp-uemsz
失败降级
q_utppuemsz_trans_notify
<font color="#c41230">Cat埋点</font>
通用支付事件通知组件(<b><font color="#c41230">payNotify</font></b>)
<b><font color="#c41230">finally</font></b>节点:同步失败,<b><font color="#c41230">补偿</font></b>发Q(q_utppuemsz_pay_notify)<br>
流程到Gw,调用uemsz<br>
交易和支付(明细)<b><font color="#c41230">入库</font></b>成功,<b><font color="#c41230">流程未到Gw</font></b>,调用uemsz
<b><font color="#c41230">落单并支付</font></b>,交易成功并且支付未成功,需要回滚交易单状态<br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=00 <font color="#000000">where trans_Id=? and trans_status in (03,34)</font>
<b><font color="#c41230">反向交易</font></b>,原交易更新状态和金额成功,后续数据插入失败,<b>需要回滚原交易</b><br>
<b><font color="#c41230">通用</font></b>支付事件通知组件(<b><font color="#c41230">payNotify</font></b>)
<b><font color="#c41230">finally</font></b>节点<br>
同步调用uemsz失败,<b><font color="#c41230">补偿</font></b>发Q(q_utppuemsz_pay_notify)<br>
任何异常<b><font color="#c41230">降级</font></b>,不影响同步返回结果
流程到Gw,调用uemsz<br>
交易和支付(明细)<b><font color="#c41230">入库</font></b>成功,<b><font color="#c41230">流程未到Gw</font></b>,调用uemsz
<b><font color="#c41230">落单并支付</font></b>,交易成功并且支付未成功,需要回滚交易单状态<br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=00 <font color="#000000">where trans_Id=? and trans_status in (03,34)</font>
<b><font color="#c41230">线上、线下退货及撤销交易</font></b>,原交易更新状态和金额成功,后续数据插入失败,<b>需要回滚原交易</b><br>
<font color="#7dcdc2">update</font>:T_TRANSCORE_TRANSACTION set trans_status=00 <font color="#000000">where trans_Id=? and trans_status in (03,34)</font>
评论
0 条评论
下一页