1 聚合支付平台架构课程内容安排
今日课程任务
- 聚合支付平台架构设计思想
- 对接第三方支付接口设计的思想
- 支付同步回调与异步回调的区别
- 支付宝沙箱支付环境用法的介绍
- 如何理解对接支付宝RSA配置介绍
- 如何保证提交支付的参数的安全性
2 聚合支付平台核心的设计思想
支付渠道整合支付宝、微信、银联、QQ钱包、京东等多种渠道。 聚合支付模块 聚合支付接口 如ping++ 如果公司规模是不是很大情况下可以采用第三方聚合支付平台ping++
聚合支付平台核心模块
- 对接第三方支付渠道 支付宝、微信支付
- 支付服务与积分服务存在一个分布式事务问题 seata
- 支付订单超时设计–Redis和MQ
- 定时对账模块的设计 支付补偿
3 支付宝官方Demo运行测试
对接第三方支付接口设计的思想 对接第三方支付 支付宝、银联、微信支付、其他支付接口。它们的设计支付思想都是相同的,就是对接支付代码不同,基于策略模式重构聚合支付平台。
以对接支付宝案例介绍 沙箱环境:支付宝提供的sit测试环境
支付宝开发测试环境搭建 支付宝沙箱环境申请地址:https://openhome.alipay.com/platform/appDaily.htm
支付宝中的应用公钥和支付宝公钥分别表达什么意思? 同步地址与异步回调分别表达什么意思? 在沙箱环境中,以form表单形式提交支付的参数给支付宝的时候,浏览器报错“支付存在钓鱼风险!防钓鱼网站的方法”。 建议直接使用360安全浏览测试即可。
对接第三方支付的原理
- 以form表单的形式提交参数给第三方支付接口 采用的是post请求
如何保证传递参数安全性 1 验证签名防止数据被抓包篡改. 2 采用RSA公钥与私钥互换的机制实现数据的加密
官方Demo下载地址: 电脑网站支付 Demo https://opendocs.alipay.com/open/270/106291/
4 支付宝接口采用验证签名保证接口参数安全性
采用验证签名防止数据被抓包篡改 商品以form表单提交参数给支付宝 对参数Money=1000&orderNumber=10000生成一个md5值sign=YP8CFwTwTcEIdfcxZ1NmMZ%2FiV5%2BSw8Ihn8sorz6lVdENKbQDf5I,参数一起提交给支付宝。 支付宝服务器端接收参数同样用参数Money=1000&orderNumber=10000生成md5 mysign 比对两个md5值是否一致,如果一致说明参数没有发生变更,否则可能被人篡改 注意:修改支付参数一定要修改参数签名 如何判断文件内容是否发生变化?MD5
5 支付宝接口同步回调(浏览器重定向)实现原理
- 同步回调 在支付宝支付成功之后,会以浏览器重定向的形式跳转到商户地址,同时会发送支付报文结果,商户可以解析该报文判断是否有支付成功。
注意:只能解析报文结果给用户提示是否支付成功,但是不能修改数据库的订单状态。
6 支付宝异步回调的实现原理
- 异步回调 支付宝以发送类似于http请求的形式将支付结果告诉给商户,商户实现解析数据的报文,如果支付成功同时修改数据库的订单状态。
注意:异步回调本地开发环境测试的时候,需要提供外网映射工具,同步回调的时候本地开发是不需要,但是生产环境还是需要的。
7 深入理解支付宝公钥与私钥加密模式
对称加密 des 加密和解密都是采用同一个秘钥,不安全 目前公认安全的加密算法 RSA 非对称加密
RSA就是一对秘钥对 由公钥和私钥组成 使用公钥对数据加密的情况,必须要使用私钥对数据解密 公钥提供:给商户或者是客户端 私钥提供:给服务器端对数据实现解密
支付宝的公钥、应用的公钥 两个秘钥对-公钥和私钥:支付宝的公钥和支付宝的私钥、商户的公钥和商户的私钥
中间过程:
- form提交参数给支付宝
商户(蚂蚁课堂)使用支付宝的公钥对提交参数实现RSA加密 给支付宝服务器的时候(支付宝的私钥对数据实现解密) - 支付宝采用回调的方式(商户的公钥)将支付结果以RSA加密的方式发送给商户,商户使用对应的私钥实现对数据解密。
RSA生成工具 https://opendocs.alipay.com/open/291/105971#LDsXr 生成好的公钥私钥在支付宝沙箱环境RSA2(SHA256)密钥(推荐)进行配置,修改AlipayConfig参数,启动测试demo。测试付款场景将返回结果以html文本形式保存,用360浏览器打开进行验证。
测试效果:
8 聚合支付数据库表结构设计
支付渠道表
CREATE TABLE `payment_channel` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`CHANNEL_NAME` varchar(32) NOT NULL COMMENT '渠道名称',
`CHANNEL_ID` varchar(32) NOT NULL COMMENT '渠道ID',
`MERCHANT_ID` varchar(32) NOT NULL COMMENT '商户id',
`SYNC_URL` text NOT NULL COMMENT '同步回调URL',
`ASYN_URL` text NOT NULL COMMENT '异步回调URL',
`PUBLIC_KEY` text COMMENT '公钥',
`PRIVATE_KEY` text COMMENT '私钥',
`CHANNEL_STATE` int(11) DEFAULT '0' COMMENT '渠道状态 0开启1关闭',
`REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
`CREATED_TIME` datetime DEFAULT NULL COMMENT '创建时间',
`UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
`UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
`pay_bean_id` varchar(255) DEFAULT NULL,
`request_address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`,`CHANNEL_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='支付渠道 ';
支付交易表
CREATE TABLE `payment_transaction` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`PAY_AMOUNT` int(11) NOT NULL COMMENT '支付金额',
`PAYMENT_STATUS` int(11) NOT NULL DEFAULT '0' COMMENT '支付状态 0待支付1已经支付2支付超时3支付失败',
`USER_ID` int(11) NOT NULL COMMENT '用户ID',
`ORDER_ID` varchar(32) NOT NULL COMMENT '订单号码',
`REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
`CREATED_TIME` datetime DEFAULT NULL COMMENT '创建时间',
`UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
`UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
`partypay_Id` varchar(255) DEFAULT NULL,
`payment_Id` varchar(255) DEFAULT NULL,
`payment_channel` varchar(255) DEFAULT NULL,
`order_Name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 COMMENT='支付交易 ';
支付交易日志表
CREATE TABLE `payment_transaction_log` (
`ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`SYNCH_LOG` text COMMENT '同步回调日志',
`ASYNC_LOG` text COMMENT '异步回调日志',
`CHANNEL_ID` int(11) DEFAULT NULL COMMENT '支付渠道ID',
`TRANSACTION_ID` int(11) DEFAULT NULL COMMENT '支付交易ID',
`REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',
`CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',
`CREATED_TIME` datetime DEFAULT NULL COMMENT '创建时间',
`UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',
`UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',
`untitled` varchar(32) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='支付交易日志表 ';
|