支付部分
基本功能:使用支付宝支付
创建数据库模型类,用来保持订单 id 和对应当前订单在支付宝那里的支付编号
支付流程类似于 QQ 登录
使用支付宝支付,需要先注册应用 ID,不过开发过程中也可以先使用沙箱环境进行开发,
支付宝开发文档
支付宝开发没有对应的 python 的 SDK ,不过 python 的大佬在 github 上写出了 python 的 SDK,直接使用即可
- 文档主页:https://openhome.alipay.com/developmentDocument.htm
- 产品介绍:https://docs.open.alipay.com/270
- 快速接入:https://docs.open.alipay.com/270/105899/
- SDK:https://docs.open.alipay.com/270/106291/
- python对接支付宝SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
- python对接支付宝SDK安装:
pip install python-alipay-sdk --upgrade
- API列表:https://docs.open.alipay.com/270/105900/
支付流程
- 用户点击去支付按钮
- 浏览器向服务器发送请求,服务器拼接出支付宝支付地址,将地址和对应的参数返回
- 浏览器根据返回的地址加载支付界面,此时就是前端与用户和支付宝之间的交互
- 用户进行登录支付宝,根据支付宝的页面进行结算
- 支付成功有三种通知服务器的方式,服务器好进行更新数据库
- 第一种:支付成功,前端根据回调地址页发生请求告诉服务器,将相关数据传过去
- 第二种:支付宝服务器判断支付成功,通过 notify 地址通知服务器
- 第三种:服务器比较着急,会自己向支付宝服务器发个请求过去,问一下支付完了没有
- 这里我们只使用了第一种方式,前端发送请求过来后,更新数据库,更新订单状态为发货,支付流程结束
接入支付宝服务器步骤
- 创建应用
- 配置密钥
- 搭建和配置开发环境
- 接口调用
配置密钥
和支付宝之间进行通信,肯定是需要一种更安全的方式
目前的加密的模式有:
- 单向加密技术:sha1, sha256, md5 这种是只能加密不能解密
- 双向加密技术:base64 即能加密也能解密,不过很容易解密
- 对称加密算法:DES 加密和解密用的是一个密钥
- 非对称加密算法:RSA 加密和解密用的密钥不同,公钥和私钥,用公钥加密,用私钥解密;或用私钥加密,公钥解密
服务器和支付宝服务器是双向的,所以使用的是 RSA 非对称加密
- 在服务器端生成公钥和私钥,支付宝端会自己生成公钥和私钥
- 将公钥互相交换
- 服务器端拥有:支付宝公钥、美多公钥、美多私钥
- 支付宝端拥有:美多公钥、支付宝公钥、支付宝私钥
- 服务器端用支付宝公钥进行加密,传输数据,支付宝端用支付宝私钥进行解密
- 支付宝端用美多公钥进行加密,传输数据,服务器端用美多私钥进行解密
- 这样就可以实现数据的安全传输
本地生成应用的私钥和公钥
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥RSA2
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
发起支付
- 用户点击去支付按钮,向后端发送请求,带上当前的订单编号
- 后端判断订单是否正确
- 根据 SDK 中支付宝需要的参数构造拼接支付链接地址
- 返回给前端
保存支付结果
- 支付成功后会跳转到回调地址,
- 向后端发送请求,支付宝参数会在拼接在 url 后面,并带上支付宝流水号
- 主要是为了校验支付宝参数是否正确
- 取出参数,从参数中先去掉 sign 签名并保存,
- 先取出 Alipay 对象,提供了 verify 方法对数据进行校验
- 该方法需要两个参数,支付宝去掉 sign 的数据 data 和 sign 签名,它会使用 data 重新生成一下签名,然后和传过来的前面进行对比,
- 如果一致,说明没有问题,取出订单编号和支付流水号,进行保存,并更新订单状态,返回 支付宝流水号,前端进行展示
- 如果出错,说明是非法请求,保存并返回