前言:
本文主要向大家介绍python做后台的移动端H5接入支付宝支付的全部流程, 所有步骤经过本人测试
近期公司项目临近尾声, 需要接入支付宝支付功能, 公司项目是一个移动端的网页项目, 后台用的是Django, 作者在接到需求的时候先去搜索了一波教程, 发现网上对于python+移动端网页接入支付宝的教程几乎没有, 官方的文档对python也不是很友好, 遂自行踩坑, 踩坑结束也就有了这篇文章, 希望能给大家一些帮助
环境及文档地址:
python3.6.5
Django 3.0.4 (接入支付宝实际上对django版本没有限制)
alipay-sdk-python 3.3.398 (支付宝官方SDK)
由于官方文档对python不甚友好, 所以大家最好文档结合本文一起品尝, 效果更佳, 下面贴出本文对应的一些文档地址:
安装SDK
pip install alipay-sdk-python==3.3.398
官方SDK, 安装没什么可说的
支付的流程详解
此处借用官方的一张图来给大家介绍支付的整个流程
用户实际操作流程(也是官方的图):
- 用户再页面上点击去付款(图1)
- 后端接到请求后, 调用SDK生成订单信息, 最后生成一个跳转到支付宝的链接, 返回此链接给前端用户页面
- 前端通过js代码访问跳转链接, 跳转到支付宝界面(图2)
- 如果用户手机安装有支付宝, 网页会自动唤醒支付宝并进入支付界面(图3)
- 用户完成支付
- 支付宝回跳到你指定的页面并携带支付的信息(前端回跳毕竟不可靠, 不要太依赖)
- 支付宝post请求你指定的接口并携带支付的信息(在这个接口内执行保存数据库等相关逻辑)
至此, 整个支付流程结束, 下面我们来详细说说代码层面的东西
接入支付宝需要准备的东西
正式项目需要一个实名认证过的支付宝账号登录支付宝开放平台并根据自己的需求创建应用并签约对应功能(此动作是为了获取接入所必须的appid, 支付宝公钥, 并授权回调地址)
支付宝开放平台
支付宝也提供了一个沙箱环境供开发者在测试开发阶段调试等等, 本文就是基于沙箱环境的一个教程, 不过请大家放心, 沙箱环境跟正式环境可以无缝切换,无需更改代码逻辑, 只需要更换appid及支付宝网关即可
支付宝沙箱应用
- 登录沙箱应用并获取自己的沙箱appid 并写入自己的后台代码中
ALIPAY_APPID = '2016100xxxx39412' # 自己的沙箱appid
ALIPAY_DEBUG = True # 是否为沙箱, 后续创建alipay对象会用到
- 创建自己的公私钥
在你的代码目录下创建keys文件夹, 进入keys目录, 然后执行如下两条命令
genrsa -out app_private_key.pem 2048
rsa -in app_private_key.pem -pubout -out app_public_key.pem
- 把自己的公钥给支付宝,并获取支付宝的公钥
在沙箱环境下点击
此时你的keys目录应该是这样的:
好啦, 此时所需要的一切都已经准备好了, 我们开始写代码
开始写代码
为了节省篇幅, 直接贴出我的代码, 注释的非常清楚
import os # 用于获取keys下秘钥文件路径
from django.conf import settings # 用于使用ALIPAY_APPID 及 APLPAY_DEBUG 动态调节沙箱环境或者正式环境
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig # 用于创建客户端对象所需的配置类
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient # 用于创建客户端对象
from alipay.aop.api.request.AlipayTradeWapPayRequest import AlipayTradeWapPayModel, AlipayTradeWapPayRequest # 手机网站支付所需的类
class Payment(View):
def post(self, request):
# 实例化客户端
alipay_client_config = AlipayClientConfig(settings.ALIPAY_DEBUG) # 创建配置类, True: 沙箱环境, False: 正式环境
alipay_client_config.app_id = settings.ALIPAY_APPID # 指定appid
# 指定自己的私钥, 用于支付宝验签
alipay_client_config.app_private_key = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"), "r").read()
# 指定支付宝的公钥, 用于支付宝验签
alipay_client_config.alipay_public_key = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/alipay_public_key.pem"), "r").read()
client = DefaultAlipayClient(alipay_client_config) # 实例化客户端对象
# 构造跳转链接所需的参数(此处我只填了必填的几个参数, 具体可参考开发文档的请求参数说明)
model = AlipayTradeWapPayModel() #
model.out_trade_no = "20200410182552613" # 订单编号, 自己的后台生成(不能重复)
model.total_amount = "100.00" # 需要支付的价格
model.subject = "大梦_damon的python课程" # 订单抬头信息说明
model.product_code = "QUICK_WAP_WAY" # 手机网站支付的固定参数
request = AlipayTradeWapPayRequest(biz_model=model) # 创建请求对象
request.return_url = "http://127.0.0.1:8000/payment_success/" # 支付成功后的回跳地址
request.notify_url = "http://127.0.0.1:8000/payment_notify/" # 支付成功后的通知地址
# 执行API调用
alipay_url = client.page_execute(request, "GET") # 生成跳转链接url, 也可以指定POST方式的跳转, 不过前端处理起来比GET方式稍复杂
return JsonResponse({"alipay_url": alipay_url}) # 返回跳转链接给前端页面
前端收到响应后可以通过以下代码实现跳转
location.href = alipay_url
不出意外你就会看到图2的样子了
至此, 我们算是正式的接入了支付宝的支付, 至于用户支付成功后的回调逻辑等我下一篇文章再给大家详细介绍
欢迎大家评论或者指出文章中写的模糊或者逻辑错误的地方!
如果帮助到了你, 可否给我点个赞呢?