Download as pdf or txt
Download as pdf or txt
You are on page 1of 1

主订单对象数据结构 订单明细表数据结构 支付记录表数据结构

public class XcOrders implements Serializable { public class XcOrdersGoods implements Serializable { public class XcPayRecord implements Serializable { 参数 类型 描述
private static final long serialVersionUID = 1L; trade_no String 支付宝交易号,支付宝交易凭证号。
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
app_id String 支付宝应用的APPID。支付宝分配给开发者的应用 ID
/** out_trade_no String 商家订单号。原支付请求的商家订单号 这就是我们的交易记录ID
* 订单号 @TableId(value = "id", type = IdType.AUTO) /**
*/ private Long id; * 支付记录号 out_biz_no String 商家业务号。商家业务ID,通常是退款通知中返回的退款申请流水号
private Long id; */ buyer_id String 买家支付宝账号 ID。以 2088 开头的纯 16 位数字
/** private Long id; seller_id String 卖家支付宝账号 ID。以 2088 开头的纯 16 位数字
/** * 订单号
* 总价 trade_status String 交易状态。交易目前所处状态,详情可查看下表 交易状态说明
*/ /**
*/
private Long orderId; * 本系统支付交易号 total_amount Number 订单金额。本次交易支付订单金额,单位为人民币(元),精确到小数点后 2 位
private Float totalPrice; receipt_amount Number 实收金额。商家在交易中实际收到的款项,单位为人民币(元),精确到小数点后 2 位
*/
/** /** private Long payNo; invoice_amount Number 开票金额。用户在交易中支付的可开发票的金额,单位为人民币(元),精确到小数点后 2 位
* 创建时间 * 商品id buyer_pay_amount Number 用户在交易中支付的金额,单位为人民币(元),精确到小数点后 2 位
*/ */ /**
point_amount Number 使用集分宝支付金额,单位为人民币(元),精确到小数点后 2 位
@TableField(fill = FieldFill.INSERT) private String goodsId; * 第三方支付交易流水号
private LocalDateTime createDate; */ refund_fee Number 总退款金额。退款通知中,返回总退款金额,单位为人民币(元),精确到小数点后 2 位
/** private String outPayNo; subject String 订单标题/商品标题/交易标题/订单关键字等,是请求时对应参数,会在通知中原样传回
/** * 商品类型 body String 商品描述。该订单的备注、描述、明细等。对应请求时的 body 参数,会在通知中原样传回
* 交易状态 /**
*/ gmt_create Date 交易创建时间。格式为 yyyy-MM-dd HH:mm:ss
*/
private String goodsType; * 第三方支付渠道编号
private String status; gmt_payment Date 交易付款时间。格式为 yyyy-MM-dd HH:mm:ss
*/
/** private String outPayChannel; gmt_refund Date 交易退款时间。格式为 yyyy-MM-dd HH:mm:ss.S
/**
* 用户id * 商品名称 gmt_close Date 交易结束时间。格式为 yyyy-MM-dd HH:mm:ss
*/ */ /** fund_bill_list String 支付金额信息。支付成功的各个渠道金额信息。详情可查看下文 资金明细信息说明
private String userId; private String goodsName; * 商品订单号 vocher_detail_list String 优惠券信息。本交易支付时所使用的所有优惠券信息。详情可查看下表 优惠券信息说明
*/
passback_params String 回传参数,公共回传参数,如果请求时传递了该参数,则返回的异步通知会原样传回。本参数必须进行 UrlEncode 之后才可传入。
/** private Long orderId;
/**
* 商品交易价,单位分 公共参数
* 订单类型 notify_time Date 通知的发送时间。格式为 yyyy-MM-dd HH:mm:ss
*/ */ /**
private String orderType; private Float goodsPrice; * 订单名称 notify_type String 通知类型
*/ notify_id String 通知校验 ID
/** /** private String orderName;
charset String 编码格式。如 utf-8、gbk、gb312等。
* 订单名称 * 商品详情json,可为空 /**
*/ */ * 订单总价单位元 version String 调用的接口版本。固定为1.0
private String orderName; private String goodsDetail; */ sign_type String 签名类型。签名算法类型,目前支持RSA2和RSA,推荐使用 RSA2
private Float totalPrice; sign String 签名。详情可查看 异步返回结果的验签
/**
* 订单描述 auth_app_id String 授权方的APPID。由于本接口暂不开放第三方应用授权,因此 auth_app_id=app_id
*/ } /**
private String orderDescrip; * 币种CNY
*/
/** private String currency;
* 订单明细json
*/ /**
private String orderDetail; * 创建时间
*/
/** @TableField(fill = FieldFill.INSERT)
* 外部系统业务id
*/
private LocalDateTime createDate;
private String outBusinessId;
} /**
* 支付状态
*/
private String status;

/**
* 支付成功时间
*/
private LocalDateTime paySuccessTime;

/**
* 用户id
*/
private String userId;

创建商品订单,根据选课记录查询
发起请求 是否已经有对应的订单,
有就直接返回以保证幂等性

插入订单 否则创建订单,使用雪花算
法生成订单号设置的是总价
格,插入订单表中
在请求微信或支付宝下单接口时需要传入 商品订单号,在与第三
方支付平台对接时发现,当用户支付失败或因为其它原因最终该
创建订单明细, 订单没有支付成功,此时再次调用第三方支付平台的下单接口发
使用订单号和每个课程的详细信息 现报错“订单号已存在”,此时如果我们传入一个没有使用过的
(课程id,类型,名称,价格) 订单号就可以解决问题,但是商品订单已经创建,因为没有支付
插入订单表中 成功重新创建一个新订单是不合理的。

解决以上问题的方案是:
根据订单号,查询订单,不
存在直接返回 1、用户每次发起都创建一个新的支付交易记录 ,此交易记录与
插入订单、支付记录、生 商品订单关联。
成支付二维码
插入支付记录
根据订单,查询订单状态, 2、将支付交易记录的流水号传给第三方支付系统下单接口,这样
如果已经支付了直接返回 就即使没有支付成功就不会出现上边的问题

生成支付记录,也是使用雪
花算法生成支付ID

生成支付二维码
(二维码是路径 + 请求 + 支付记录ID)
(路径和请求被封装在nacos服务配置里面,直接取出)
(添加了登录判断)

将二维码和其他属性复制给新的支付记录中

判断支付ID是否存在,不
存在直接返回

根据支付记录判断是否已
经支付,已经支付就返回
扫码下单
生成了支付二维码,用户
扫码请求第三方支付平台
填充支付宝API字段
下单、支付。 支付宝支付功能对单个用户QPS为20!!!!

将支付宝返回的页面直接
返回给用户

获取支付宝POST回来的消 或用户主动查询,根据支付记录
息 ID查询是否交易成功

验证是否真的是支付宝返 根据支付号找到对应的支
支付成功,支付宝回传消息
回的消息 付记录

根据支付记录找到找到对
是则更新 应的订单
支付记录中的状态为成功
订单表的状态为成功 查询支付状态,如果已经
是成功的了,那么就不需 创建一个持久化信息以保证消息的
要再继续操作了 可靠性

否则,查询支付是否成功,
获取消息id
成功则更新订单表为成功,
将消息写到数据库,使用消
息队列通知其他服务
CorrelationData获取全局消息id
订单服务

设置回调方法
消息队列同步订单消息
成功:将消息从待发送表中移除
(使用发布订阅模式) 失败:报错,等待下一次定时任务
(同步选课记录ID和订单类型)

根据选课记录ID查询选课记
录,如果没有直接返回
学习中心服务

根据选课记录更新选课记录并 获取选课的状态,如果当前状
向课程表内插入记录 态是未支付的话修改为已支
付,否则直接返回
消息失败会重新进入队列
修改为已支付的同时,向课程
表插入记录,如果修改失败直
接退出

You might also like