django实用配置2:用户支付测试
引言
这里做的是想要在django项目中想要使用支付宝加入用户支付功能,但是在接入支付宝开放平台时,由于我们并没有企业资质等,所以需要使用沙箱环境进行测试,下面在查找文档时会做相关解释。
支付介绍
现在我们在网站中选择支付时,较多使用的都是支付宝支付 / 微信支付 / 银行卡支付 / 各种钱包支付等,最多使用还是支付宝和微信,但是如果在测试中,我们可能还是会选择支付宝较多,这是由于微信需要200/年的认证,毕竟我们只是测试使用,所以这里是使用支付宝开放平台进行测试。
平台准备步骤
第一步
进入支付宝开放平台:支付宝开放平台
https://open.alipay.com/(在支付宝整合之后支付功能已经到了蚂蚁金服,所以准确来说应该是进入蚂蚁金服开放平台,但是从老平台也可以找到文档等)
蚂蚁金服网址:蚂蚁金服开放平台
https://ds.alipay.com/fd-irng3zgw/index.html(其实最终跳转都是一样的)
第二步
在进入开放平台后,下拉然后点击网页/移动应用开发其实也就是网页开发配置:支付宝开放平台
https://open.alipay.com/module/webApp
第三步
继续下来,找到开发支持——开放API,点击进去后便是文档中心:小程序文档 - 支付宝文档中心支付宝文档中心
https://opendocs.alipay.com/open/00a0ut

第四步
在左侧导航栏找到支付产品——电脑网站支付——然后下边的便可以进行了解具体功能以及如何搭建。

但是在这里如果按照它的步骤先创建应用,然后配置密钥等,后面是需要验证企业执照的,由于我们还没有企业执照,所以这里找到沙箱环境接入进行测试。
先在左侧的导航栏中找到支付产品——电脑网站支付——接入指南——基础功能——电脑网站支付快速接入,然后在右侧的导航栏便可以看到沙箱环境接入,其实进入电脑网站支付快速接入文档后一直下翻也就可以找到。

点击沙箱环境接入后可以看到沙箱环境的简要介绍

点击沙箱环境链接便可以进入沙箱环境介绍与使用:小程序文档 - 支付宝文档中心支付宝文档中心
https://opendocs.alipay.com/common/02kkv7 简言之沙箱环境其实就是给开发者测试功能使用的,支付宝给出的沙箱环境介绍:
沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境,开发者在沙箱环境中调用接口无需具备所需的商业资质,无需绑定和开通产品,同时不会对生产环境中的数据造成任何影响。合理使用沙箱环境,可以让研发流程与商业流程并行,降低联调资损风险,加速项目的交付。
下方图片也指出了使用为什么建议开发者沙箱环境

如果之前没有使用过支付宝开放平台,需要在下方的前提条件中进行配置等工作。

第五步
在配置完成之后我们便可以进入我们的沙箱环境中进行查看,点击左上角回到首页——右上角控制台。

下拉到最后,找到沙箱,点击进去,注意如果没有自动创建沙箱环境就应该是没有配置好,应该会有提示,一步一步来就好。

然后便会看到为我们自动创建的沙箱环境



接入python步骤
第一步:下载包
在这里需要注意,由于目前为止,SDK文档中还是只有Java的接入教程,所以我们需要python第三方接入包,也就是进入pypi:PyPI · The Python Package Index中搜索网上的支付宝接入包与教程。
在pypi中搜索:alipay-sdk-python 后回车找到我们需要的包

点击进去后复制包下载命令到我们的项目终端

下载完成

第二步:查看包文档homepage
在pypi包的页面中找到homepage也就是包的首页查看文档配置等

然后我们便进入了它的GitHub项目地址(如果无法进入自行查找科学上网),在下方可以看到文档说明,点入中文文档进行查看。

第三步:根据文档进行配置
点击准备之后便进入了配置教程
1,安装
刚才我们已经安装过了,所以这一步可以忽略

2,生成密钥文件
这里所谓的生成密钥文件其实也就是加密和解密,这里略讲一下加密方式。
加密方式种族要分为两种:对称加密(加密解密密码一致)和非对称加密(加密解密密码不一致)。
- 对称加密:在对称加密中,相同的密钥(也称为秘密密钥)用于加密和解密数据。这意味着发送方和接收方必须共享相同的密钥。常见的对称加密算法包括AES(高级加密标准)和DES(数据加密标准)。对称加密速度通常很快,但存在一个关键问题,即如何在安全地传输密钥的过程中保持安全性。
- 非对称加密:在非对称加密中,有一对密钥,一个是公钥,另一个是私钥。公钥用于加密数据,而私钥用于解密数据。与对称加密不同,这意味着发送方可以使用接收方的公钥加密消息,但只有接收方拥有与之关联的私钥才能解密它。这种方法解决了密钥传输的问题,因为公钥可以公开分享,而私钥必须保持安全。常见的非对称加密算法包括RSA和ECC。

而这里所谓的生成密钥文件也就是使用算法生成加密。而由于我们现在只是使用沙箱环境进行测试,所以不需要自行生成密钥文件,沙箱环境已经为我们的账号配置好了密钥文件。
进入沙箱环境,可以看到我们可以使用系统默认密钥或自定义密钥,这里建议使用系统默认密钥即可。

点击查看,即可查看相关公钥与私钥的信息。最下方还有支付宝的应用公钥,这是我们待会需要使用的。

3,配置密钥文件
再次回到使用教程,点击初始化

发现初始化中需要提供我们应用的私钥和alipay的公钥。

再次回到准备教程中,最下方有证书格式参考,点击进去。

然后我们便进入了tests——certs——ali——ali_public_key.pem中,我们需要下载 ali——ali_public_key.pem和app——app_private_key.pem两个文件。

下载完成后,在我们项目下方新建一个证书文件夹cert(自行起名和位置),然后将两个文件复制进去。

在沙箱环境中复制阿里的公钥和应用的私钥,将文件中原本的公钥和私钥替换一下(注意替换的时候只需要替换密钥内容)。

第四步:创建支付应用
1,新建应用
再创建一个测试支付的应用,使用命令:python manage.py startapp pay(应用名,自行修改)
然后在settings中注册一下pay应用

2,编写urls
在pay应用中新建urls.py文件,并用以下代码进行测试。
from django.urls import path
from .views import *
app_name = "pay"
urlpatterns = [# 商品列表path('goodlist/', goodlist, name="goodlist"),path('alipay/', alipay, name="alipay"),path('alipayback/', alipayback, name="alipayback"),]
将pay下的urls文件关联到总路由,在总路由下加入pay.urls

3,编写views视图函数
进入pay/views中编写三个对应的视图函数,函数内暂时先不写东西,待会儿再编写templates后进行连接。
from django.shortcuts import render# Create your views here.# 商品列表视图
def goodlist(request):pass# 支付视图
def alipay(request):pass# 支付完返回视图
def alipayback(request):pass
4,编写templates模板
在pay下新建templates目录,里面新建goodlist.html文件并写入以下内容,注意这里也使用了模板的继承与包含的写法,在后续会进行讲解,可以直接在html中写入三个a标签即可。
第一种,直接写入
Title
购买10个金币
购买100个金币
购买1000个金币
第二种,使用了模板的继承等
{% extends 'base.html' %}{% block main %}{% include 'nav.html' %}
购买10个金币
购买100个金币
购买1000个金币
{% endblock %}
然后将goodlist视图函数关联到goodlist模板,将goodlist和alipay视图修改一下:
def goodlist(request):return render(request,'goodlist.html')def alipay(request, id):return HttpResponse(id)
最后启动服务:python manage.py runserver,再在后面加上/pay/goodlist后,如下所示,点击后应分别返回10,100,1000

第五步:配置付款
再次进入初始化中,将一下代码复制到alipay视图中,注意只需要复制选中部分,下面不需要用(注意复制的导包位置等)。

修改为以下代码:
from django.shortcuts import render,HttpResponse
from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
# Create your views here.def goodlist(request):return render(request,'goodlist.html')def alipay(request, id):# 支付宝网页下载的证书不能直接被使用,需要加上头尾# 你可以在此处找到例子: tests/certs/ali/ali_private_key.pem# 找到cert下的两个对应文件app_private_key_string = open("cert/app_private_key.pem").read()alipay_public_key_string = open("cert/ali_public_key.pem").read()# 创建实例,里面大部分内容还是在沙箱环境中进行查找alipay = AliPay(# 换成自己沙箱环境中国的APPIDappid="9021000129608132",# 现在测试get请求还用不到app_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,# 现在都是RSA2,所以要修改为RSA2# sign_type="RSA", # RSA 或者 RSA2sign_type="RSA2", # RSA 或者 RSA2debug=False, # 默认 Falseverbose=False, # 输出调试数据config=AliPayConfig(timeout=15) # 可选,请求超时时间)return HttpResponse(id)def alipayback(request):pass
然后还需要使用GitHub上的项目接口,在使用教程中找到接口,点击进去选择电脑网站支付,将代码也复制到alipay视图函数中。

按照要求进行修改:
from django.shortcuts import render,HttpResponse,redirect
from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
import time
# Create your views here.def goodlist(request):return render(request,'goodlist.html')def alipay(request, id):# 支付宝网页下载的证书不能直接被使用,需要加上头尾# 你可以在此处找到例子: tests/certs/ali/ali_private_key.pem# 找到cert下的两个对应文件app_private_key_string = open("cert/app_private_key.pem").read()alipay_public_key_string = open("cert/ali_public_key.pem").read()# 创建实例,里面大部分内容还是在沙箱环境中进行查找alipay = AliPay(# 换成自己沙箱环境中国的APPIDappid="9021000129608132",# 现在测试get请求还用不到app_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,# 现在都是RSA2,所以要修改为RSA2,不修改会报错# sign_type="RSA", # RSA 或者 RSA2sign_type="RSA2", # RSA 或者 RSA2debug=False, # 默认 Falseverbose=False, # 输出调试数据config=AliPayConfig(timeout=15) # 可选,请求超时时间)# 如果你是 Python3 的用户,使用默认的字符串即可subject = f"测试订单:{id}"# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string# 提供这个地址其实是上线之后的地址,修改为沙箱环境中的支付宝网关地址:https://openapi-sandbox.dl.alipaydev.com/gateway.do# 后面也一样,所以我们的拼接地址应该是https://openapi-sandbox.dl.alipaydev.com/gateway.do? + order_string# order_string返回的就是一个网址order_string = alipay.api_alipay_trade_page_pay(# 订单# 订单号,使用time模块进行测试设置out_trade_no=f"{id}:{int(time.time())}",total_amount=0.01,subject=subject,# 支付的结果return_url="http://127.0.0.1:8000/pay/alipayback/",# notify_url="https://example.com/notify" # 可选,不填则使用默认 notify url)# 使用重定向return redirect(f"https://openapi-sandbox.dl.alipaydev.com/gateway.do?{order_string}")def alipayback(request):pass
appid和网址信息都可以在沙箱环境中找到

再次点击a标签,出现下面就算配置成功

使用沙箱环境中的买家账号密码进行登陆后付款如图所示:

输入支付密码并确认交易


最终会显示错误是因为我们没有配置alipayback的视图函数
第六步:配置支付后的视图函数
支付完成后我们需要再配置alipayback视图函数来返回支付结果,这里也使用包文档提供的api接口进行配置,可以使用同步或者异步,这里使用同步。
在刚才的接口文档中找到通知验证并点击,在这里使用Django版本。


然后将以下代码复制到我们的alipayback路由函数中
from django.shortcuts import render, HttpResponse, redirect
from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
import time# Create your views here.def goodlist(request):return render(request, 'goodlist.html')def alipay(request, id):# 支付宝网页下载的证书不能直接被使用,需要加上头尾# 你可以在此处找到例子: tests/certs/ali/ali_private_key.pem# 找到cert下的两个对应文件app_private_key_string = open("cert/app_private_key.pem").read()alipay_public_key_string = open("cert/ali_public_key.pem").read()# 创建实例,里面大部分内容还是在沙箱环境中进行查找alipay = AliPay(# 换成自己沙箱环境中国的APPIDappid="9021000129608132",# 现在测试get请求还用不到app_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,# 现在都是RSA2,所以要修改为RSA2,不修改会报错# sign_type="RSA", # RSA 或者 RSA2sign_type="RSA2", # RSA 或者 RSA2debug=False, # 默认 Falseverbose=False, # 输出调试数据config=AliPayConfig(timeout=15) # 可选,请求超时时间)# 如果你是 Python3 的用户,使用默认的字符串即可subject = f"测试订单:{id}"# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string# 提供这个地址其实是上线之后的地址,修改为沙箱环境中的支付宝网关地址:https://openapi-sandbox.dl.alipaydev.com/gateway.do# 后面也一样,所以我们的拼接地址应该是https://openapi-sandbox.dl.alipaydev.com/gateway.do? + order_string# order_string返回的就是一个网址order_string = alipay.api_alipay_trade_page_pay(# 订单# 订单号,使用time模块进行测试设置out_trade_no=f"{id}:{int(time.time())}",total_amount=0.01,subject=subject,# 支付的结果return_url="http://127.0.0.1:8000/pay/alipayback/",notify_url="https://example.com/notify" # 可选,不填则使用默认 notify url)# 使用重定向return redirect(f"https://openapi-sandbox.dl.alipaydev.com/gateway.do?{order_string}")def alipayback(request):# for django users return url是同步的get请求data = request.GET.dict()signature = data.pop("sign")app_private_key_string = open("cert/app_private_key.pem").read()alipay_public_key_string = open("cert/ali_public_key.pem").read()alipay = AliPay(# 换成自己沙箱环境中国的APPIDappid="9021000129608132",# 现在测试get请求还用不到app_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,# 现在都是RSA2,所以要修改为RSA2,不修改会报错# sign_type="RSA", # RSA 或者 RSA2sign_type="RSA2", # RSA 或者 RSA2debug=False, # 默认 Falseverbose=False, # 输出调试数据config=AliPayConfig(timeout=15) # 可选,请求超时时间)# verification# 又用到了alipay,从alipay函数中复制过来或包装成函数或类success = alipay.verify(data, signature)# if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):# print("trade succeed")print(success, data)if success:s = data['out_trade_no']good = s[:s.index(':')]success_msg = f"购买{good}成功"return HttpResponse(success_msg)else:return HttpResponse("未知错误!")
然后再次运行进行测试,基本就可以完成,支付成功后可以返回我们的alipayback视图函数。

用户增加充值功能
这一步没太大必要,只是了解一下流程。
第一步:添加字段
在测试完成后,便可以对用户系统增加重置了,先在用户模型中添加money字段,如下:
然后生成迁移文件并重新进行迁移:python manage.py makemigrations
python manage.py migrate
第二步:修改pay应用视图函数
在这里由于我们的逻辑是必须登录过的用户才能充值,所以可以用django自带的路由守卫装饰器。
from django.shortcuts import render, HttpResponse, redirect
from alipay import AliPay, DCAliPay, ISVAliPay
from alipay.utils import AliPayConfig
import time
# 导入自带的路由守卫
from django.contrib.auth.decorators import login_required# Create your views here.def goodlist(request):return render(request, 'goodlist.html')# 给支付添加路由守卫
@login_required()
def alipay(request, id):# 支付宝网页下载的证书不能直接被使用,需要加上头尾# 你可以在此处找到例子: tests/certs/ali/ali_private_key.pem# 找到cert下的两个对应文件app_private_key_string = open("cert/app_private_key.pem").read()alipay_public_key_string = open("cert/ali_public_key.pem").read()# 创建实例,里面大部分内容还是在沙箱环境中进行查找alipay = AliPay(# 换成自己沙箱环境中国的APPIDappid="9021000129608132",# 现在测试get请求还用不到app_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,# 现在都是RSA2,所以要修改为RSA2,不修改会报错# sign_type="RSA", # RSA 或者 RSA2sign_type="RSA2", # RSA 或者 RSA2debug=False, # 默认 Falseverbose=False, # 输出调试数据config=AliPayConfig(timeout=15) # 可选,请求超时时间)# 如果你是 Python3 的用户,使用默认的字符串即可subject = f"测试订单:{id}"# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string# 提供这个地址其实是上线之后的地址,修改为沙箱环境中的支付宝网关地址:https://openapi-sandbox.dl.alipaydev.com/gateway.do# 后面也一样,所以我们的拼接地址应该是https://openapi-sandbox.dl.alipaydev.com/gateway.do? + order_string# order_string返回的就是一个网址order_string = alipay.api_alipay_trade_page_pay(# 订单# 订单号,使用time模块进行测试设置out_trade_no=f"{id}:{int(time.time())}",total_amount=0.01,subject=subject,# 支付的结果return_url="http://127.0.0.1:8000/pay/alipayback/",notify_url="https://example.com/notify" # 可选,不填则使用默认 notify url)# 使用重定向return redirect(f"https://openapi-sandbox.dl.alipaydev.com/gateway.do?{order_string}")def alipayback(request):# for django users return url是同步的get请求data = request.GET.dict()signature = data.pop("sign")app_private_key_string = open("cert/app_private_key.pem").read()alipay_public_key_string = open("cert/ali_public_key.pem").read()alipay = AliPay(# 换成自己沙箱环境中国的APPIDappid="9021000129608132",# 现在测试get请求还用不到app_notify_url=None, # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,# 现在都是RSA2,所以要修改为RSA2,不修改会报错# sign_type="RSA", # RSA 或者 RSA2sign_type="RSA2", # RSA 或者 RSA2debug=False, # 默认 Falseverbose=False, # 输出调试数据config=AliPayConfig(timeout=15) # 可选,请求超时时间)# verification# 又用到了alipay,从alipay函数中复制过来或包装成函数或类success = alipay.verify(data, signature)# if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):# print("trade succeed")print(success, data)if success:s = data['out_trade_no']good = s[:s.index(':')]# 购买成功后用户money增加request.user.money += int(good)request.user.save()# 重定向个人中心return redirect("/user/center/")
第三步:更新用户个人中心
在添加了money字段后,在用户的个人中心添加money显示(这里大部分都是之前已经写过的,所以不用刻意关注,只需了解流程)。
{% extends 'base.html' %}
{% block title %}
新闻网-个人中心
{% endblock %}{% block css %}{% endblock %}{% block main %}
{% include 'nav.html' %}个人中心
- 用户名:
修改 - 注册时间: {{ request.user.date_joined }}
- 拥有金币: {{ request.user.money }} 去充值
- 上次登录时间: {{ request.user.last_login }}
{% if request.user.telephone %}- 手机号:{{ request.user.telephone }}
{% else %}- 手机号:尚未绑定
{% endif %}-
-
{% csrf_token %}点击头像可以更换
{% endblock %}{% block js %}
{% endblock %}
进入网页后进入个人中心 可以看到用户显示金币数量并有了充值按钮。

点击去充值,跳转到/pay/goodlist

随便点击一个,进行充值,在充值完成后再次跳转到个人中心,可以看到充值完成。

补充
这里还有很多可以进行加工完善,比如并设置充值金币数量对应相应的金额,美化充值页面,设置自定义充值等等,这里不再做一一展示,这里只是为了简单了解配置流程。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

