一周打造支付系统
获取食物的最佳方式就是处于食物链的顶端,以捕食该链条之下的所有动植物。不言而喻,搭建处于资金流顶端的支付系统,伴随资金的转移过程,也是积累财富的绝佳手段。
一般网购流程
一般的网购流程如上图:
- 商品筛选
- 将选中的商品添加到购物车(顾名思义,推着车去购物。如果只卖一个商品的话,可以省略这步)
- 确认要购买物品,去结算
- 下订单,即提交要结算物品的清单
- 网上支付该订单
支付流程
一个典型的支付流程如上图。
用户下单时,订单系统需要和产品库交互,生成支付连接。支付系统对请求地址进行验签之后,调用第三方平台的支付接口进行支付,然后更新订单状态。在订单成功支付之后,更新产品库存信息。
属于支付系统的功能有:
- 请求参数验签
- 第三方支付接口对接
- 订单系统对接
只要完成与第三方支付接口的对接,即可解决搭建支付系统中最难啃的一块硬骨头。
第三方支付平台
目前比较流行的第三方支付平台主要有:
- 支付宝
- 财付通
- 快钱
- 网银在线
- 微信支付
对于网银支付,可以调用银联的接口,或者直接对接银行(可以降低手续费,支持大额等个性化支付方法。但是实现成本较高)。
虽然支付宝的手续费不是最实惠的,但是支付宝本身对接了个大银行的网银支付,而我们的目标是一周打造支付系统,当然选择最省事的。
对接支付宝支付接口的流程如下:
完成技术集成
之前的工作,理论上需要8-10个工作日,所以需要提前申请。
最好找商务部的同事出马,不要怕麻烦boss。有问题,及时向组织反馈。
支付宝接口
与支付宝接口的交互流程如下
支付宝提供的sdk,主要包含如下文件
1 | alipay_core.function.php -- 支付宝接口公用函数,是请求、通知返回两个文件所调用的公用函数核心处理文件 |
要调用的方法
- 提交订单时,调用
alipay_submit.class.php
中的buildRequestUrl
方法,同时,需要注册通知回调return_url
和notify_url
。
其中:
return_url是同步回调,一般用于在支付成功后,调转至支付成功页。
notify_url是异步回调,一般用于更新订单状态等等(支付宝有相关队列服务运行异步回调,回调失败后,会以不定的间隔进行重试)。
- 在通知回调时,都需要调用
alipay_notify.class.php
中的verifyReturn
验证回调的合法性。
ssl证书
俗话说,没有买卖就没有杀戮。凡是涉及利益的地方,就不会很安全。使用采用http进行数据通讯,难免发生如下问题:
但是换成https,会有如下好处:
申请ssl证书,推荐数字公司使用的WoSign超真 SSL。
请求验签
请求参数签名,需要使用可逆加密算法。其中又分为:
- 对称加解密算法
- 非对称加解密算法
对称加解密算法,在加密和解密时都使用一个密钥,加解密性能较好。但安全性较低(密钥只要被拿到,就gameover)。
非对称加解密算法,一般使用私钥加密,公钥解密。其安全性较好(只要保存好私钥就行),但是性能较差。
所以可以使用对称加解密算法加密请求参数。但加解密时,不使用同一个密钥。相关密钥,通过非对称加解密算法加密后,在请求参数中传递。
解密流程如下:
1. 在请求参数中获取使用非对称加解密算法加密的密钥ekey
2. 使用非对称加解密算法解密密钥ekey为dkey
3. 使用对称加解密算法和dkey,解密请求参数
订单
我们用一周打造的支付系统,不能是一个远在云端的架构,而要是一个可运行的系统。那么,订单自然也少不了。
订单是按照如下对应关系产生的:
用户 -> 商品 -> 订单
在整个支付过程中,一般要存在两个订单号:
- 用于在内部系统(订单,支付,个人中心)中流通的订单号
order_no
,在每一次下单时产生。 - 用于支付的订单号
pay_order_no
,由order_no
+ 时间戳 + salt等,在每一次支付时产生。
联调部署
开发阶段涉及的模块可做如下划分:
- 产品页
- 支付页
- 支付
- 订单
- 个人中心
- 测试,部署上线
衡量一个互联网的标准有:功能,交互,ui。
因为我们的目标是一周内打造支付,那么,优先是完成支付和订单。至于是否要在产品页添加购物车,是否要在订单支付页面保存配送地址,是否要在个人中心对接物流,以及退款等等,都可以暂时砍掉。
互联网产品,唯快不破。快速上线,快速迭代。
The Hole
开发过程中,难免会遇到不少坑,特此纪录,希望帮助有缘人。
- 产品金额存储
为了避免因退款,对账时,和银行或者第三方支付平台产生因为数据精度而舍入等问题,可以将产品金额以分
为单位存储,前台展示时除以100。
- 需要两个订单号
支付宝等第三方平台,对订单号有验证,一个订单号只能支付一次。所以系统中需要存在两个订单号,一个用于内部系统流通,一个用于支付,每次支付时都产品一个最新的(与内部系统流通的订单号有对应关系)。
- 权限验证
下单,或者支付完成后,在个人中心等位置,一般可以查看订单状态。此时需要注意,需要增加权限验证。否则会产生平行权限安全漏洞(可查看别人的订单等信息)
- 系统安全性
在支付和个人中心等页面,因为存在前后端交互。所以需要排查,是否存在sql注入或者xss等安全漏洞。推荐XSScrapy
和SqlMap
。
- 日志
在整个交易过程中,需要有完善详尽的日志记录。
Author: GaoYuan
Link: http://jqlblue.github.io/2014/11/23/build-payment-system-in-one-week/
License: 知识共享署名-非商业性使用 4.0 国际许可协议