支付系统设计三:渠道网关设计04-渠道数据补全

news2025/6/20 7:10:39

文章目录

  • 前言
  • 一、交易信息准备
    • 1. MessageDescription内容
    • 2. 交易信息填充
    • 3. 开户机构信息填充
    • 4. 省市区域信息填充
    • 5. 银行信息填充
  • 二、路由处理
  • 三、支付渠道数据补全
    • 1.服务端支付渠道获取
    • 2. 支付渠道通用数据补全
      • 2.1 支付渠道账户信息补全
      • 2.1 商户信息补全结束
    • 3. 支付渠道差异数据补全
  • 四、MessageDescription内容
  • 总结


前言

在这里插入图片描述
在《支付系统设计三:渠道网关设计03-参数验证》之后需要进行交易信息准备、路由处理、支付渠道数据补全操作。


一、交易信息准备

补充在订单持久化、请求外部支付渠道等业务操作时候需要的参数,补充到MessageDescription中的datas属性中。
根据 transCode+PrepareDataServiceImpl 获取到准备数据service bean进行交易信息的补全准备。

1. MessageDescription内容

经过客户端报文解析处理后paycore上送的报文内容经过解析脚本处理被解析填充到MessageDescription中的datas属性中。
在这里插入图片描述

2. 交易信息填充

主要补充的内容有:支付网关交易处理状态、支付网关交易对账状态、支付网关交易状态、支付渠道交易日期等参数。

3. 开户机构信息填充

根据上送的账户开户机构编码补充完整账户开户机构名称等信息(部分交易需要这些参数)。

4. 省市区域信息填充

根据上送的省编码补充完整省名称、银行区域码;根据市编码补充完整市名称等信息(部分交易需要这些参数)。

5. 银行信息填充

联行号、清算行号、支行名称等参数补全。

二、路由处理

请求支付路由获取支付渠道信息,如果MessageDescription的datas属性中instTransId(支付渠道交易id)为空则请求支付路由,如果不为空则说明paycore已经请求过支付路由了,在paycore主要是对paygw提供的原子话交易进行产品化封装,在封装产品的时候可能需要确定支付渠道,如在轮询扣款中支付核心系统paycore就会请求支付渠道获取支付渠道信息,paycore在请求支付路由后会将支付路由payrouter返回的命中渠道信息:instCode渠道编码,instTransId支付渠道交易id、对应的账户信息添加到请求支付网关的报文中。
关于路由的处理见《支付路由系统设计》系列文章讲解其设计。

如下是支付路由系统响应报文:

{
    "header": {
        "success": true,
        "errorCode": "",
        "errorMsg": "",
        "channelCode": "test_postman",
        "channelTransNo": "202311100009000001",
        "sceneCode": "test_postman",
        "transCode": "routerRule",
        "transType": "route"
    },
    "body": {
        "instCode": "payCib",
        "instTransId": "deduct_2022101023440770",
        "otherMap": {
            "instAcctNo": "140562008901"
        },
        "ruleId": "中金-单笔代扣",
        "ruleScene": "routerRule",
        "transOrgId": ""
    }
}

将获取到的instCode、instTransId、otherMap参数填充到MessageDescription中的datas属性中。

根据支付路由系统输出的服务端支付渠道信息(instCode、instTransId),后面就就可以找到后台管理系统配置的支付渠道信息了,同获取客户端支付渠道信息一样,只是此时获取到的支付渠道属于服务端,即paygw要请求的支付渠道,也就是我们对接的外部支付渠道,如下图的2的通讯交互部分。

在这里插入图片描述

三、支付渠道数据补全

transCode+CompletionDataServiceImpl从交易数据补全服务工厂中获取到service bean进行支付渠道数据补全。

/**
 * @author Kkk
 * @Describe: 交易数据补全服务默认实现(单笔交易)
 */
@Service("defaultCompletionDataService")
public class DefaultCompletionDataServiceImpl extends AbstractCompletionDataService {

    @Override
    public void execute(PayGwContext context) {
        String transNo = StringUtils.valueOf(context.getMessageDescription().getData(PayGwConstant.PAYGW_TRANS_NO));
        LoggerUtil.info(logger, "交易({})-网关流水号({})-数据补全-开始", context.getClientTransCode(), transNo);

        //1、服务端信息
        MessageDescription messageDescription = context.getMessageDescription();
        String instCode = StringUtils.valueOf(messageDescription.getData(PayGwConstant.INST_CODE));
        PayInstitution serverPayInstitution = payInstitutionService.getByInstCode(instCode);
        AssertUtils.isNotNull(serverPayInstitution, SystemErrorCode.UNFOUND_CONFIG, new Object[]{"服务端支付渠道"});
        context.setServerInstCode(instCode);//支付渠道
        messageDescription.setServerPayInstitution(serverPayInstitution);

        String instTransId = StringUtils.valueOf(messageDescription.getData(PayGwConstant.INST_TRANS_ID));
        InstTransTypeEntity instTransTypeEntity = serverPayInstitution.getInstTransTypeEntityByTransId(instTransId);
        AssertUtils.isNotNull(instTransTypeEntity, SystemErrorCode.UNFOUND_CONFIG, new Object[]{"服务端支付渠道交易"});
        context.setServerTransId(instTransId);//支付渠道交易id

        String instTransCode = instTransTypeEntity.getTransCode();
        context.setServerTransCode(instTransCode);//支付渠道交易码

        //2、支付渠道通用数据补全
        super.complete(context, messageDescription.getDatas());

        //3、支付渠道差异数据补全(通过脚本实现)
        instDataCompleteService.complete(context, messageDescription.getDatas());

        LoggerUtil.info(logger, "交易({})-网关流水号({})-数据补全-结束", context.getClientTransCode(), transNo);
    }
}

1.服务端支付渠道获取

根据支付路由返回的instCode、instTransId获取到后端管理系统配置的服务端支付渠道相关信息,填充到MessageDescription:
在这里插入图片描述

2. 支付渠道通用数据补全

2.1 支付渠道账户信息补全

对支付路由返回的otherMap中instAcctNo支付渠道账户关联信息的补全,如下后端配置的参数,填充到MessageDescription的datas中:

在这里插入图片描述

2.1 商户信息补全结束

根据路由出得账户信息找到对应的商户信息,即如下的配置:
在这里插入图片描述

3. 支付渠道差异数据补全

根据支付路由返回的instCode、instTransId获取到后端管理系统配置的服务端支付渠道通讯配置信息,注意此处的通讯可能对应多次,即有的业务需要和渠道通讯多次,如对接的某银行对账文件下载交互过程:

第一次通信:每天9:00调用[KHKF05]接口查询对账文件生成状态、文件名、密码;
第二次通信:拿着[KHKF05]返回的文件名与密码,调用[FILE03]请求下载对账文件;
第三次通信:调用[FILE02]查询对账文件下载状态,若下载完成,处理接下来流程。

针对各个渠道通讯所需的特定参数进行补全,将补的参数添加到MessageDescription的datas中,在组装支付渠道请求报文时获取。

/**
 * @author Kkk
 * @Describe: 兴业银行代扣补全脚本
 */
class CIBDeductCompleter implements InstDataCompleter{

    @Autowired
    SequenceService sequenceService

    @Override
    void complete(PayGwContext context, Map<String, Object> data) {
        def remark=data.get(PayGwConstant.PAYGW_REMARK);
        remark=StringUtils.isEmpty(remark)?"用户还款支付":remark;
        data.put("remark",remark);
        def transDate = DateUtil.format(data.get(PayGwConstant.PAYGW_TRANS_DATE),"yyyyMMddHHmmss")
        def seq = sequenceService.generate(SeqTypeEnum.SEQ_DEDUCT, 16, DecimalTypeEnum.DECIMAL)
        data.put(PayGwConstant.INST_REQ_NO,SeqTypeEnum.SEQ_DEDUCT.getCode().concat(transDate).concat(seq))
    }
}

四、MessageDescription内容

经过渠道数据补全后的MessageDescription内容如下:在这里插入图片描述
主要是补全服务侧机构相关信息,和待持久化信息,账户信息,商户信息。


总结

主要介绍了对交易上下文MessageDescription属性的数据补全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

具有噪声标签的鲁棒医学图像分割的点类仿射损失校正

文章目录 Joint Class-Affinity Loss Correction for Robust Medical Image Segmentation with Noisy Labels摘要本文方法Differentiated Affinity Reasoning (DAR)Class-Affinity Loss Correction (CALC)Class-Level Loss CorrectionAffinity-Level Loss CorrectionClass-Affi…

AcWing算法提高课-1.3.4数字组合

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 给定 N N N 个正整数 A 1 , A 2 , … , A N A_1,A_2,…,A_N A1​,A2​,…,AN​&#xff0c;从中选出若干个数&#xff0c;使它们…

轻松搭建冒险岛服务器-冒险岛私服搭建详细教程

想要拥有一个属于自己的冒险岛世界吗&#xff1f;想要一步步学习如何架设冒险岛服务器吗&#xff1f;本文将从如何选择服务器、安装系统、配置环境、搭建数据库、部署网站、上传文件、启动服务等8个方面&#xff0c;一步步为大家详细讲解冒险岛架设教程。让你轻松打造属于自己的…

sql 性能优化基于explain调优

文章目录 Explain分析&#xff1f;问题描述解决方案 Explain分析&#xff1f; 关于Explain具体可以干什么&#xff0c;有哪些优缺点&#xff0c;本博主的文章有写到&#xff0c;这是链接地址: 点击这里查看. 下面来说下Explain在项目实战中&#xff0c;如何去进行优化。 问题…

7年老人,30岁的测试说辞就辞,“人员优化”4个字,泰裤辣...

前几天&#xff0c;一个认识了好几年在大厂做测试的程序员朋友&#xff0c;年近30了&#xff0c;在公司做了7年了&#xff0c;一直兢兢业业&#xff0c;最后还是却被大厂以“人员优化”的名义无情被辞&#xff0c;据他说&#xff0c;有一个月散伙饭都吃了好几顿…… 在很多企业…

【ChatGPT】国内免费使用ChatGPT镜像

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 什么是ChatGPT镜像&#xff1f; 亲测&#xff1a; 一、二狗问答(AI对话) 二、AiDuTu 三、WOChat 四、ChatGPT(个人感觉最好用) 我们可以利用ChatGPT干什么&#xff1f; 一、三分…

薪人薪事 java开发实习一面

目录 1.常用数据结构&#xff0c;区别及使用场景2.数组和链表在内存中数据的分布情况3.HashMap底层数据结构4.put操作5.JVM内存区域6.各个区域存放什么东西7.创建一个对象&#xff0c;内存怎么分配的8.堆中内存怎么划分&#xff0c;gc怎么回收9.IOC 原理10.Bean存放在哪里11.AO…

支付系统设计三:渠道网关设计05-交易持久化

文章目录 前言一、领域模型持久化服务工厂二、聚合创建工厂1. 模型创建1.1 获取域模型Class1.2 新建模型1.3 数据填充 2. 模型持久化2.1 获取域模型对应的仓储2.2 调用域模型仓储进行持久化 总结 前言 本篇将解析交易信息入库&#xff0c;即对上送的参数&#xff0c;在进行校验…

关于ASA广告归因接入方法

投放苹果ASA广告&#xff0c;提高 app 曝光率、下载量的增长&#xff0c;那么我们该如何从后台看到投放广告的效果呢&#xff1f; 我们可以借助Apple Ads归因API。那什么是归因&#xff1f;什么又是API呢&#xff1f; 归因&#xff1a;可以给用户打标签&#xff0c;然后看他在…

[GUET-CTF2019]encrypt 题解

本题是输入了一个字符串&#xff0c;进行了rc4加密&#xff0c;和魔改的base64加密 RC4算法初始化函数 RC4加密过程 魔改的base64加密 最后加密的字符串是byte_602080 我们可以将byte_602080提取出来&#xff0c;下面是提取数据的IDC脚本&#xff0c;得到了密文 #include<…

赫夫曼树和赫夫曼编码详解

目录 何为赫夫曼树&#xff1f; 赫夫曼树算法 赫夫曼编码 编程实现赫夫曼树 编程实现赫夫曼编码 编程实现WPL 总代码及分析 何为赫夫曼树&#xff1f; 树的路径长度&#xff1a;从树根到每一结点的路径长度之和 结点的带权路径长度&#xff1a;从树根到该结点的路径长度…

2023网络安全十大顶级工具

从事网络安全工作&#xff0c;手上自然离不开一些重要的网络安全工具。今天&#xff0c;分享10大网络安全工具。 一、Kali Linux Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单&#xff1a;在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这…

【AI面试】CNN 和 transformer 的问题汇总

​ CNN卷积神经网络和transformer相关的知识&#xff0c;是AI的一个基础的&#xff0c;也是前言的知识点。一般面试官会从以下这些问题入手&#xff1a; 卷积神经网络&#xff0c;有什么特点&#xff1f;1*1卷积核有什么作用&#xff1f;计算经过卷积的输出尺寸大小空洞卷积你…

机器学习之朴素贝叶斯三、拉普拉斯平滑技术、优化改进情感分析

文章目录 一、前文问题1. 先看下改进前我们的代码计算部分2. 问题分析&#xff1a; 二、针对问题进行解决1. 什么是拉普拉斯平滑技术2. 拉普拉斯优化-下溢上溢问题3. 改进地方分析&#xff1a;4.改进优化1.优化一&#xff0c;对条件概率计算进行优化2.优化二&#xff0c;对后延…

从小白到黑客高手:一份全面详细的学习路线指南

前言 黑客从入门到精通需要经过深入的学习和实践&#xff0c;这是一个需要长时间投入和大量精力的过程。在这份学习路线中&#xff0c;我将为你介绍黑客学习的基本知识和技能&#xff0c;帮助你逐步掌握黑客技能。 黑客 一、入门阶段 1.了解计算机基础知识 学习计算机基础知…

红黑树(小白教学)

分享一个动画展示的网址&#xff1a;Red/Black Tree Visualization (lerogo.com) 将红黑树之前&#xff0c;我们先来了解一下什么叫做2-3树&#xff01;&#xff01;&#xff01; 在我们以前学习的过程中&#xff08;二分搜索树、完全二叉树等&#xff09;结点都是存放了一个元…

Auto_GPT:如何使用Auto-GPT、安装、开发

文章目录 前言一、使用前提二、如何在您的 PC 上安装 Auto-GPT第 1 步&#xff1a;安装 Python第 2 步&#xff1a;获取 Auto-GPT 源代码和 OpenAI API 密钥第 3 步&#xff1a;在 Windows、MacOS和 Linux上安装 Auto-GPT 三、如何在你的 PC 上运行Auto-GPT总结 前言 Auto-GPT…

Redis消息队列(1)

一)消息队列:从字面意思上来看是存储消息的队列&#xff0c;最简单的消息队列包含三个元素: 1)消息队列:存储和管理消息&#xff0c;也被称之为是消息代理 2)生产者:发送消息到消息队列 3)消费者:从消息队列中获取消息并处理消息 4)当有用户想要进行秒杀下单的时候&#xff0c;…

CENTO OS上的网络安全工具(二十一)Hadoop HA swarm容器化集群部署

如果使用swarm来构建Hadoop、Spark之类的集群&#xff0c;一个绕不过去的问题每个容器都需要支持SSH免密互联——因为Hadoop需要。这就需要事先准备可以一键进行集群化部署的SSH镜像。 一、SSH集群及镜像的构建 1. 准备更换镜像源的Centos7 由于Centos7已经停止维护&#xff0c…

stm32 iic驱动ds1307实际使用驱动

本文使用的工程代码如下&#xff1a; (1条消息) stm32iic驱动ds1307实际使用驱动&#xff0c;参考博客&#xff1a;资源-CSDN文库 上次我记得写了一个使用开发板测试DS1307的测试例程&#xff0c;DS1307也是使用测试板&#xff0c;后面项目上具体使用了&#xff0c;又优化了驱…