位置: 编程技术 - 正文

PHP支付系统设计与典型案例分享(php支付接口对接教程)

编辑:rootadmin

推荐整理分享PHP支付系统设计与典型案例分享(php支付接口对接教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php支付宝支付流程原理,php支付模块,php支付模块,php支付系统设计流程图,php支付平台,php支付模块,php 支付系统,php 支付系统,内容如对您有帮助,希望把文章链接给更多的朋友!

由于公司业务需要,花两周时间实现了一个小型的支付系统,麻雀虽小五脏俱全,各种必须的模块如账户加锁,事务性保证,流水对帐等都是有完整实现的,整个开发过程中有很多经验积累,再加上在网上搜索了一下,大部分都是些研究性的论文,对实际使用价值不大,所以这次特意拿出来和大家分享一下。这个系统可以用作小型支付系统,也可以用做第三方应用接入开放平台时的支付流水系统。原来的需求比较负责,我简化一点说:

对每个应用,对外需要提供 获取余额,支付设备,充值 等接口后台有程序,每月一号进行清算账户可以被冻结需要记录每一次操作的流水,每天的流水都要和发起方进行对账

针对上面的需求,我们设置如下数据库:

详细解释如下:tb_status 应用的状态表。负责账户是否被冻结,账户的类型是什么(真实的需求是应用可能有两种账户,这里为简单所以没有列出)appid 应用idfreeze 是否冻结create_time 创建时间change_time 最后一次修改时间tb_account_earn 应用的账户余额表appid 应用idbalance 余额(单位为分,不要用小数存储,因为小数本身不精确;另外php要在位机下才能支持bigint)create_time 创建时间change_time 最后一次修改时间seqid 操作序列号(防并发,每次update都会+1)tb_assign 分配流水id的表,tb_bill的bill_id必须是有tb_assign分配的id 自增idcreate_time 创建时间tb_bill 流水表。负责记录每一条操作流水,这里的bill_id不是主键,因为同一个bill_id可能会有支付和回滚两条流水id 自增序列号bill_id 流水号amt 操作的金额(这个是要区别正负的,主要是为了select all的时候可以直接计算出某段时间的金额变化)bill_info 操作的详细信息,比如3台webserver,2台dbbill_user 操作用户bill_time 流水时间bill_type 流水类型,区分是加钱还是减钱bill_channel 流水来源,如充值,支付,回滚,结算还是其他bill_ret 流水的返回码,包括未处理、成功、失败,这里的逻辑会在后面讲解appid 应用idold_balance 操作发生前的账户余额price_info 记录操作发生时,记录被支付物品的单价src_ip 客户端iptb_price 单价表,记录了机器的单价name 机器唯一标识price 价格info 描述tb_applock 锁定表,这是为了避免并发对某一个应用进行写操作设计的,具体的代码会在后面展示appid 应用idlock_mode 锁定状态。为0则为锁定,为1则为锁定change_time 最后一次修改时间OK,库表设计出来之后,我们就来看一下最典型的几个操作.

一. 支付操作我这里只列出了我目前实现的方式,可能不是最好的,但应该是最经济又满足需求的。先说调用方这里,逻辑如下:

PHP支付系统设计与典型案例分享(php支付接口对接教程)

然后对应的支付系统内部逻辑如下(只列出支付操作,回滚逻辑差不多,流水检查是要检查对应的支付流水是否存在):

常用的错误返回码可能如下就足够了:

对于大于0的错误都算是逻辑错误,执行支付操作,调用方是不用记录流水的。因为账户并没有发生任何改变。对于小于0的错误是系统内部错误,因为不知道是否发生了数据更改,所以调用方和支付系统都要记录流水。对于等于0的返回,代表成功,两边也肯定要记录流水。而在支付系统内部,之所以采用先写入流水,再进行账户更新的方式也是有原因的,简单来说就是尽量避免丢失流水。最后总结一下,这种先扣钱,再发货,出问题再回滚的方式是一种模式;还有一种是先预扣,后发货,没有出问题则调用支付确认来扣款,出了问题就调用支付回滚来取消,如果预扣之后很长时间不做任何确认,那么金额会自动回滚。

二. 账户锁定的实现这里利用了数据库的加锁机制,具体逻辑就不说了,代码如下:

为了防止死锁的问题,获取锁的逻辑中加入了超时时间的判断,大家看代码应该就能看懂

三. 对帐逻辑如果按照上面的系统来设计,那么对帐的时候,只要对一下两边成功(即bill_ret=0)的流水即可,如果完全一致那么账户应该是没有问题的,如果不一致,那就要去查问题了。关于保证账户正确性这里,也有同事跟我说,之前在公司做的时候,是采取只要有任何写操作之前,都先取一下流水表中所有的流水记录,将amt的值累加起来,看得到的结果是否和余额相同。如果不相同应该就是出问题了。select sum(amt) from tb_bill where appid=1;所以这也是为什么我在流水表中,amt字段是要区分正负的原因。

标签: php支付接口对接教程

本文链接地址:https://www.jiuchutong.com/biancheng/301539.html 转载请保留说明!

上一篇:比较完整的微信开发php代码(比较好的微信名称有哪些)

下一篇:php微信开发之带参数二维码的使用(php wechat)

  • 预收货款需要缴纳消费税吗?缴纳消费税的时间应该是?
  • 贴现手续费计入投资收益
  • 小规模差额征税会计分录实例
  • 发票报送日志不完整
  • 事业单位财政拨款取得方式
  • 盈亏平衡点产量越高,项目风险越大
  • 以合并方式成立的新企业,新启用
  • 接受实物投资纳印花税怎么缴纳?
  • 借款转资本公积怎么算税
  • 不动产进项税额抵扣最新通知2023
  • 员工宿舍需要缴纳房产税么
  • 非增值税应税项目有哪些2023
  • 工程项目分包需要缴纳企业所得税吗
  • 通用机打发票单位名称打不下怎么办
  • 同一控制下企业合并入账价值
  • 技术服务费收入属于提供劳务收入吗
  • 高铁票财务怎么报销
  • 房租费属于无形资产吗
  • 其他应付款借贷方分别表示什么
  • 报税残疾人保障金怎么算
  • 个人劳务费几个点
  • 长期待摊费用挂账原因
  • 汇算清缴是哪个报表
  • 查补以前年度所得税如何申报
  • 顺流交易合并抵消 chenyiwei
  • 贷款的账务处理
  • 代开专用发票的流程资料要求
  • 支付工资属于费用吗
  • 高新技术企业在哪申报年报
  • php时间戳转换中国标准时间
  • 员工每月补助表怎么做
  • 完美解决在ThinkPHP控制器中命名空间的问题
  • php验证身份证号
  • 财政专户资金是专项资金吗
  • 前端进阶路线
  • element ui table
  • sysstat命令
  • 企业利息支出怎么算
  • 入库税款异常怎么处理
  • 职工教育经费扣除限额怎么算
  • 建筑业营改增前后区别
  • 分公司可以独立签约吗
  • 个人所得税劳务所得
  • 伤残鉴定中心流程
  • 账面价值和公允价值的关系
  • 社保缴费如何做账
  • 房屋预售收入
  • 投标代理费如何入账
  • 外出经营预交企业所得税税率
  • 房屋租赁合同印花税谁交
  • 行政单位的财务报表包括哪些
  • 购进农产品抵扣的税率
  • 个体工商户纳税申抿
  • 承租人对融资租赁业务进行会计处理的方法有( )
  • t3用友年底结束怎么建下一年
  • 企业零申报要报哪些税
  • 事业单位对公账户和零余额账户一样么
  • 计入福利费
  • 固定资产一次性扣除账务处理
  • 安装nfs命令
  • win8怎么查看系统版本
  • 有备而来有备而去
  • linux的ntp服务
  • ubuntu安装教程20.04 u盘
  • 如何把xp系统的软件删除
  • linux系统ln命令
  • 桌面的word
  • win8 蓝牙
  • win8系统的应用程序在哪里
  • nodejs 插件开发
  • ai人工智能python
  • js中的call方法和apply方法
  • [置顶]bilinovel
  • jquery层级选择器
  • android天气预报开发极简
  • 国际货运怎么代理
  • 工会的会费收入是什么意思
  • 担保费属于什么服务
  • 在深圳居住的香港居民怎样办理边境地区通行证
  • 落实措施对吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设