1、项目中使用的微信支付版本?

我们使用的是官方推荐的V3版本,相对V2版本,V3版本具有如下优点:
1、参数和返回值基于JSON格式传输(V2是基于xml,之前有出过风险);
2、有类似支付宝的公钥/私钥非堆成加密方式;
3、通过http协议发起restful风格请求;

2、微信支付平台-接入准备?

1、接入模式
1.1直连模式:信息、资金流:微信支付—>直连商户,商户自行申请入驻微信支付,无需服务商协助。
1.2服务商模式
image.png
服务商模式,商户申请成为微信支付服务商,服务商自身无法作为一个普通商户直接发起交易,其发起交易必须传入相关特约商户商户号的参数信息。
2、参数申请
申请APPID(载体如公众号、小程序)、申请mchid(商户)、绑定APPID及mchid、配置APIkey、配置商户证书

3、完整的支付流程?

day10交易平台服务-微信支付、xxljob任务调度 - 图2
1、收银员发起收银请求;
2、根据订单生成交易单,注意此时交易单中还未生成交易单号;
3、发起支付请求;
4、交易单加锁,交易适配路由:适配器模式根据交易渠道适配不同的三方支付系统的实现,交易渠道由前端传递
5、校验交易单完整性:必备参数—>订单编号、支付金额、交易渠道、商家信息、交易类型(FK/TK)
三方系统(支付宝、微信)安全性校验:大额交易、常用支付地变更(IP)、频繁交易、密码变更……
6、幂等性:确保同一个交易单不会重复支付
解决:首次支付、重新支付(QXDD取消订单、GZ挂账)、重复支付问题(查询到交易单状态为YJS、MD,即终止)
支付幂等性:
支付服务幂等性校验—>订单编号orderNo
三方系统幂等性保证—>交易单编号-雪花算法
7、生成交易单号,修改交易单;
8、统一下单,通过三方提供的公钥加密发送;
9、三方响应二维码链接,通过我们提供的公钥加密响应【异步】;
10、通过万维易源/hutool生成二维码,封装支付路径【异步】;
11、向用户展示二维码,用户扫码支付;
12.1、三方返回支付结果商家&用户:支付成功/支付失败【异步】;
12.2、可能因为网络等原因,响应不及时,未能收到结果,三方会按照某个频率发消息给我们的服务,直到我们获取到数据(幂等性操作);此外,我们可采用主动轮询,但要限定频率,项目中我们采用xxljob每隔10s发起请求查询支付结果:
成功:1、修改订单状态 2、修改交易单状态
失败:未支付
定时任务:主动轮询(考虑三方系统限流,如微信限定150QPS)
13、验签、修改交易单状态;
14、修改订单状态【异步】;

4、XXL-JOB

4.1、你们项目中是否使用到定时任务?

我们在项目中使用xxl-job定时查询支付结果、查询退款结果

4.2、为什么用? 业务背景?

我们在支付服务中,有两种方式获得支付结果:
1、三方推送消息:一种是三方(支付宝、微信)把支付结果推送给我们设置的回调地址和用户,三方会以某种频率发送消息直到我们获取,但可能会因为网络延迟或抖动,我们未能及时获取结果;
2、主动轮询:鉴于以上原因,我们在项目中配合使用xxl-job发起请求,查询支付结果,考虑到三方限流,以及数据库的承受压力,我们设置频率为间隔10s。

4. 3、怎么用 xxl-job具体配置?

day10交易平台服务-微信支付、xxljob任务调度 - 图3
如上图,
1、执行器:我们先配置一个model-trading-job-listen执行器(app_name与配置文件上的名称保持一致);
2、路由策略:我们采用的主动轮询,可在指定间隔时间内重复执行查询结果;
3、阻塞处理策略:单机穿行;
4、cron表达式:间隔10s,考虑三方限流、数据库更新压力;
5、JobHandler:跟项目中使用@XXljob(“”)的值保持一致;
6、失败重试次数:设置为0,避免给数据库造成太大,也是考虑到三方限流;

4. 4、路由策略是轮询? 为什么选择? 你是怎么考虑的? — 业务

我们项目中为了及时获取支付和退款的结果,我们使用xxl-job主动轮询策略,间隔10s查询一次数据库状态为支付中的订单,可解决代码不能重复执行的问题,能及时更新订单、交易单状态;并且我们设置的间隔时间稍长,在一定程度上减轻数据库的压力。

4.5、如果任务执行失败了? — 业务考虑是否需要重试

我们设置的失败重试次数为0,即任务执行失败不考虑重新;
原因:
1、三方可能限流;
2、支付或退款请求,重试后会给数据库造成太大压力;
3、我们主动轮询是配合三方推送消息的使用,就算我们主动轮询失败了,三方依然以某个频率发送消息,直到我们获取结果;

4.6、任务满了怎么办?

当任务满了时,会触发阻塞处理策略,我们项目中采用的是单机串行,即任务会依次排序执行,每一个任务内容是一致的。

5、思考题

假设 10w个商家, 每个商家有2个门店, 每个门店 20个桌台,每个桌台至少可以每天使用4次,每天订单成交量 70%, 问每天会产生多少条订单? 每月多少条订单? 一年多少条订单?
假设每条订单数据大小是 2kb, 问一年产生多大数据量,单位:GB? 1TB=1024GB 1GB=1024MB

  1. 每天会产生多少条订单 : 11,200,000条订单
  2. 每月多少条订单: 336,000,000条订单
  3. 一年产生多少条订单: 4,032,000,000条订单
  4. 一年产生多大数据量: 7690.4296875G