支付是很多项目都会用到的,今天我们就好好聊一聊支付这个问题。
常见的支付有微信,支付宝,有一定基础的同学可以去看看对应的官方文档
今天我们这里仅提供一个思路,拿微信支付举例子
第一步,设计出我们的订单的这个数据库表
分析一下订单表该有的信息:
1.谁的订单:用户(user_id)
2.买的什么:商品(product_id)
3.哪家店的东西:商铺(store_id)
4.一般会定义一个自己的本站唯一订单号:trade_no
5.外部支付单号:out_trade_no 这是微信支付的返回的订单号:(transaction_id)
6.主键自增长的订单id
7.支付金额:pay_money
8.支付方式,如(1=支付宝,2=微信,...):pay_type
9.订单状态,一般情况下有(0=等待支付,1=已经付款,2=已取消)
10.订单创建时间:cdate
11.完成支付的时间:pay_time
12.订单未支付的失效时间:expires
13.更新时间:update
14.预支付订单id:prepay_id
15.预支付订单创建时间:prepay_time
16.删除时间:deldate
以上,基本就是一般订单表设计的所有字段了
带_id后缀的意思是外键,关联其他表的主键
第二步,代码的编写
编程我们最重要的是思路,我们把思路理清了,代码自然就出来了
1.先创建本地订单
写代码的时候一定要把情况考虑完备,具体的业务具体分析,在做订单的创建的时候,
要考虑订单什么时候不能创建,创建是否成功,是否有其他信息需要绑定,有没有反复创建等。
这里一般是要事务操作的,失败就回滚,初学者的话,先忽略,创建起订单就算成功。
创建本地订单添加以下字段
1,2,3,4,6,7,9,10,12
其中trade_no自己视情况生成唯一,订单状态默认为0,pay_money保留两位小数,不同语言不同处理方式,自行百度,订单超期未支付expires是根据业务计算得出,比如你们是要订单创建半小时后自动关闭,那就是创建时间往后推半小时。
ok,到这里本地订单创建完毕。
2.支付
这里主要就是需要根据微信的支付文档,去拼一个他们要的数据,然后生成一个预支付订单,将预处理订单id生成小程序调用的参数,进行支付签名,这些一般是现成的sdk,调一下就行,
预支付订单所填的参数如下
直接看文档吧
最后还有一个微信支付的回调,微信调用你的回调接口,你去查看这个订单的支付状态,成功的话就更新一下本地的订单状态,添加商户收入日志,更新商户总额,同步订单消息啥的一系列操作。
3.定时任务删除超期未支付的订单
如标题一样,后台定时任务每分钟去删除数据库超期未支付的订单,一般都是软删,也就是将deldate字段从0修改为删除时间