一、业务场景
1.1 场景假设
我们以一个简单的场景进行说明:假设有一张订单需要支付,并且支付状态要显示在订单上。
1.2 分析问题
1、由订单生成支付单。
2、对支付单进行支付,并记录支付状态(支付失败、支付成功、支付中)。
3、针对未及时支付的订单,需要自动更新支付状态。
二、业务逻辑设计
2.1 基本信息说明
2.1.1系统模版“SYS_支付单”说明
开通“云表支付”服务后,系统会自动生成系统模版“SYS_支付单”(简称:支付单模版)。
支付单模版的作用是根据传入的订单信息和支付类型,生成支付单。
支付单模版提供3个全局的数据接口:
1、获取支付成功次数(订单类型,订单编号)
用于判断订单是否支付成功,返回“1”则已经支付成功,返回“0”则未支付成功。
2、查询支付单列表(订单类型,订单编号,支付状态)
用于查询某个订单的所有支付单,支付状态非必填项,填写支付状态,则只返回该状态的支付单数据。
3、获取支付单详情(支付单UUID)
用于查询指定支付单的数据。
2.1.2 支付类型说明
云表支付支持2种支付类型:H5支付 和 扫一扫支付
H5支付:
通过网页发起支付请求,可以请求打开第三方支付平台App进行支付,即在手机端操作时,会打开手机上的支付宝/微信进行支付。
扫一扫支付:
指生成支付单对应的支付二维码,付款方进行扫码支付,如是是微信支付的支付单,需要用微信扫码支付,如果是支付宝的支付单,则需要支付宝扫码支付。
2.2 订单生成支付单
2.2.1 逻辑说明
1、我们要用订单数据生成支付单,可以通过系统模版“SYS_支付单”生成。
2、生成订单前先进行判断,如果本订单已经支付成功或已经生成了支付单(待支付),则不需要生成支付单。
3、生成订单同时对本表单进行回写。
2.2.2 数据项说明
生成支付单必须有下表中前5个数据项(均为必填项)的信息,后3个数据项为需要回写到订单的支付状态信息:
2.2.3 填表公式说明
开发者可根据实际情况设计生成订单的动作,如工具栏按钮、单元格按钮等,文档中仅以工具栏按钮事件为例。
2.2.3.1 添加生成支付单的按钮
添加工具栏按钮“H5支付”
2.2.3.2 保存表单
添加“保存”公式,先保存一次订单,确保订单编号生成(自动编号保存后生成),不影响支付单生成。
2.2.3.3 生成支付单,并回写支付信息
添加“赋值”公式,新建“SYS_支付单”,并填充初始值,但是根据支付类型不同,需要填充的初始值有所不同。
【H5支付】
需要填充的数据项有6项:“订单编号”、“订单标题”、“订单类型”、“订单金额”、“支付类型”、“不打开支付页面”,如下图。
【扫一扫支付】
需要填充的数据项有5项:“订单编号”、“订单标题”、“订单类型”、“订单金额”、“支付类型”,如下图。
其他公式设置则不需要区分支付类型。
返回结果选择“SYS_支付单的基本信息”,不需要过滤条件。
回写支付单信息“支付单号”、“支付状态”、“支付URL”,如下图所示,分别为数据源的支付单UUID、支付状态、跳转URL
2.2.3.4 再次保存表单
因为赋值操作是填表公式执行的,需要保存表单才会录入数据库,添加“保存”公式,保存支付单回写到订单的信息。
以上,我们就完成了生成支付单并回写支付状态的业务逻辑。
接下来,我们需要增加生成支付单前的判断。
2.2.3.5 判断订单是否已经支付成功
新增“提示框”公式,判断本表单的支付状态是否为支付成功,是则弹出提示框,提示“本订单已支付”,如下图。
2.2.3.6 判断订单是否存在“支付中”的支付单
同样新增“提示框”公式,当本表单支付状态不等于“支付成功”的时候才执行。
我们需要知道本订单对应的支付单状态,所以需要调用“支付单模版”提供的接口“查询支付单列表”,查询“支付中”的支付单,如果返回值不为空,即本订单存在支付中的支付单。
注意事项:此处不要写提示框的执行条件,如果返回值为空,系统默认不满足执行条件,不弹出提示框。
公式设计如下图:
2.3 自动更新支付单状态
2.3.1 逻辑说明
1、当本订单对应的支付单状态为“支付中”,需要自动更新支付单状态,直到支付单“支付成功”或者“支付关闭”。
对于自动循环的动作,可以使用定时器实现。
2、什么时候需要启动定时器来更新支付单状态?
生成支付单的赋值动作只执行1次,需要启动定时器更新支付状态;
支付单没有及时支付,订单页面被关闭,填表公式不会继续执行,所有再次打开表单的时候需要更新;
3、定时器属于填表公式,不打开表单就不执行,有没有不打开表单也能更新状态的办法?
使用计划任务进行状态更新。
2.3.2 填表公式说明
2.3.2.1 创建定时器“更新支付状态”
支付单不一定会被立即支付,且第三方平台不主动推送支付状态,所以需要开发者主动请求更新支付状态。系统需要持续请求更新支付状态,所以我们需要用“定时器”自动循环执行这个操作。
1、添加定时器
在填表公式中,找到“定时器”,添加一个定时器,可以命名为“定时器_更新支付状态”,时间间隔自行设置频率,取消“表单打开后自动运行”的选项
2、更新支付状态
支付单有3种状态——“支付成功”“支付中”“支付关闭”,我们需要逐个状态进行判断。
2-1 支付成功
系统模版SYS_支付单提供的数据接口,可以查询订单是否完成支付。
添加“赋值”公式,选择系统模版“SYS_支付单”的“查询支付单列表”接口,接口参数为订单编号、订单类型和支付状态,其中支付状态的参数值为“支付成功”,如下图。
然后对本表单的“支付状态”、“支付单号”、“支付完成时间”进行赋值。
2-2 支付中
添加“赋值”公式,选择系统模版“SYS_支付单”的“查询支付单列表”接口,接口参数为订单编号、订单类型和支付状态,其中支付状态的参数值为“支付中”,如下图。
当本表单的支付状态不等于“支付成功”时执行,对本表单的“支付状态”、“支付单号”、“支付完成时间”进行赋值。
2-3 支付关闭
和“支付中”的公式基本相同,只是执行条件和接口参数值不一样,详见下图。
3、保存表单
更新状态信息后,再次保存表单。
4、停止定时器
定时器是为了更新支付状态,当支付单状态不等于支付中时,定时器停止。
添加公式“设置控件属性”,添加定时器控件,选择“定时器_更新支付状态”;
执行条件 本表单.支付状态<>"支付中" ,
这样,更新支付状态的定时器就设计好了。
接下来,添加启动定时器的公式。
2.3.2.2 启用定时器
1、生成支付单后启动定时器
在“H5支付”按钮的公式下方添加“设置控件属性”公式,命名为“运行定时器”
添加定时器控件“定时器_更新支付状态”,运行的值改为“常量.是”
2、修改打开表单后时启动定时器
在“修改打开表单后”事件中,直接引用公式“运行定时器”即可
补充说明一下,为什么这里没有执行条件?
因为支付单回写状态到订单是填表公式执行的动作,为了避免表单异常导致回写失败,所以不管表单状态是什么,都启动定时器,如果满足定时器停止的条件,定时器会自动停止,不会占用系统性能。
2.4 用计划任务自动更新
计划任务本身不能设置业务公式,所以需要一个中间模版来设置业务公式。
2.4.1 中间模版的业务公式
可以参考定时器查询订单支付状态的逻辑,通过调用SYS_支付单的“查询支付单列表”接口进行查询,需要3个参数“订单类型”“订单编号”和“支付状态”,其中订单类型和订单编号需要订单模版提供,所以先要增加一个“查询订单信息”接口,然后再设计中间模版。
2.4.1.1 查询订单信息接口
在订单模版中添加数据接口,数据源为本模版,数据列选择“订单类型”“订单编号”,过滤条件设置为支付状态=“支付中”
2.4.1.2 中间模版的业务公式
中间模版命名为“计划任务_更新支付状态”,这个模版只执行业务公式,所以不需要设置数据项或者表单样式。
——业务公式【计划任务更新状态】
添加业务公式“计划任务更新状态”,选择目标模版为订单模版,在“新建时”标签页下设计逻辑。
case1针对支付关闭的情况,添加“同级数据源”选择订单模版的接口“查询订单信息”,勾选“多记录”,然后添加“子数据源”,选择SYS_支付单的“查询支付单列表”,设置参数。
对目标模版进行更新表单操作,匹配条件用“查询订单信息”的返回值和目标模版进行匹配,然后赋值,具体设计如下图所示。
注意:当订单支付状态为“支付成功”时,不需要再判断其他情况,所以左下角要勾选“执行后不再执行后续case”
case2和case1的设置基本相同,只是在子数据源传参数时,支付状态的值为“支付关闭”,如下图。
——业务公式【删除表单】
中间模版是保存后执行业务公式,即计划任务每执行一次,就会生成1张表单,这些表单没有实际意义,可以增加一个删除表单的业务公式。 匹配条件“1=1”,“1=1”恒为真,所以该模版的所有表单都会被删除。
2.4.2 设置计划任务
新建计划任务“更新支付状态”,选择模版“计划任务_更新支付状态”,设置开始时间、重复间隔和持续时间,选择“启用”后点击确定即可。
三、相关文档
点击阅读 ——
云表支付功能开通流程