接入支付宝支付逻辑
支付流程:
return_url:用户支付成功返回的页面
notify_url:通知商户用户支付成功与否的页面
1-用户点击支付,调用支付宝登录的接口(携带订单编号,总金额,return_url,notify_url参数),获取到支付宝登录的url参数,拼接到支付宝支付的url中
2-登录支付宝,登录成功后输入支付密码
3-支付,支付成功后跳转到支付成功页面
4-支付宝携带支付结果数据重定向到商户指定的return_url页面,显示订单支付成功
5-浏览器携带支付结果数据访问notify_url页面,后端保存支付结果
对称/非对称加密
对称:公钥和私钥的加密方法一样
非对称:公钥和私钥的加密方法不一样
商户和支付宝互相存储对方的公钥,双方发送消息给对方时用各自的私钥验证身份是否合法
支付宝接入
- 创建应用
- 配置密钥
- 搭建和配置开发环境
- 接口调用
创建数据库模型类
创建应用payment
from django.db import models
from meiduo_mall.utils.models import BaseModel
from orders.models import OrderInfo
class Payment(BaseModel):
"""
支付信息
"""
order = models.ForeignKey(OrderInfo, on_delete=models.CASCADE, verbose_name='订单')
trade_id = models.CharField(max_length=100, unique=True, null=True, blank=True, verbose_name="支付编号")
class Meta:
db_table = 'tb_payment'
verbose_name = '支付信息'
verbose_name_plural = verbose_name
python对接支付宝SDK安装:
pip install python-alipay-sdk --upgrade`
配置秘钥
①生成应用的私钥和公钥
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
②保存应用私钥文件
在payment应用中新建keys目录,用来保存秘钥文件。
将应用私钥文件app_private_key.pem复制到payment/keys目录下。
③ 查看公钥
cat app_publict_key.pem
将公钥内容复制给支付宝
④保存支付宝公钥
在payment/keys目录下新建alipay_public_key.pem文件,用于保存支付宝的公钥文件。
将支付宝的公钥内容复制到alipay_public_key.pem文件中
注意,还需要在公钥文件中补充开始与结束标志
-----BEGIN PUBLIC KEY-----
此处是公钥内容
-----END PUBLIC KEY-----
发起支付的接口
接口设计
1-请求方式:GET /orders/?P<order_id>\d+/payment/
2-请求参数:路径参数order_id
3-返回参数:支付宝支付的url
具体实现
1-校验order_id
2-调用sdk中api获取支付参数
3-将支付参数拼接到支付宝的url
4-返回
# 发起支付接口,获取支付宝支付的url
# GET /orders/(?P<order_id>\d+)/payment/
class PayMentView(APIView):
permission_classes = [IsAuthenticated] # 仅登陆认证的用户才能访问
def get(self, request, orde