Debug Hacks

谦虚其心,宏大其量.

一周打造支付系统

获取食物的最佳方式就是处于食物链的顶端,以捕食该链条之下的所有动植物。不言而喻,搭建处于资金流顶端的支付系统,伴随资金的转移过程,也是积累财富的绝佳手段。

一般网购流程

一般的网购流程如上图:

  • 商品筛选
  • 将选中的商品添加到购物车(顾名思义,推着车去购物。如果只卖一个商品的话,可以省略这步)
  • 确认要购买物品,去结算
  • 下订单,即提交要结算物品的清单
  • 网上支付该订单

支付流程

一个典型的支付流程如上图。

用户下单时,订单系统需要和产品库交互,生成支付连接。支付系统对请求地址进行验签之后,调用第三方平台的支付接口进行支付,然后更新订单状态。在订单成功支付之后,更新产品库存信息。

属于支付系统的功能有:

  • 请求参数验签
  • 第三方支付接口对接
  • 订单系统对接

只要完成与第三方支付接口的对接,即可解决搭建支付系统中最难啃的一块硬骨头。

第三方支付平台

目前比较流行的第三方支付平台主要有:

  • 支付宝
  • 财付通
  • 快钱
  • 网银在线
  • 微信支付

对于网银支付,可以调用银联的接口,或者直接对接银行(可以降低手续费,支持大额等个性化支付方法。但是实现成本较高)。

虽然支付宝的手续费不是最实惠的,但是支付宝本身对接了个大银行的网银支付,而我们的目标是一周打造支付系统,当然选择最省事的。

对接支付宝支付接口的流程如下:

完成技术集成之前的工作,理论上需要8-10个工作日,所以需要提前申请。

最好找商务部的同事出马,不要怕麻烦boss。有问题,及时向组织反馈。

支付宝接口

与支付宝接口的交互流程如下

支付宝提供的sdk,主要包含如下文件

1
2
3
4
alipay_core.function.php -- 支付宝接口公用函数,是请求、通知返回两个文件所调用的公用函数核心处理文件
alipay_md5.function.php  -- MD5加密
alipay_notify.class.php  -- 支付宝通知处理类,处理支付宝各接口通知返回
alipay_submit.class.php  -- 支付宝各接口请求提交类,构造支付宝各接口表单HTML文本,获取远程HTTP数据

要调用的方法

  • 提交订单时,调用alipay_submit.class.php中的buildRequestUrl方法,同时,需要注册通知回调return_urlnotify_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等安全漏洞。推荐XSScrapySqlMap

  • 日志

在整个交易过程中,需要有完善详尽的日志记录。