千家信息网

Python项目实战之如何使用Django框架实现支付宝付款

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍"Python项目实战之如何使用Django框架实现支付宝付款",在日常操作中,相信很多人在Python项目实战之如何使用Django框架实现支付宝付款问题上存在疑惑,小编查阅了各式资
千家信息网最后更新 2025年11月07日Python项目实战之如何使用Django框架实现支付宝付款

这篇文章主要介绍"Python项目实战之如何使用Django框架实现支付宝付款",在日常操作中,相信很多人在Python项目实战之如何使用Django框架实现支付宝付款问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python项目实战之如何使用Django框架实现支付宝付款"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、前言

小编相信大家在支付时候,微信、支付宝支付肯定是优先选择。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用Python web框架Django来实现支付宝支付,废话不多说,一起来看看如何实现吧。

二、建立django应用

我们来建立一个Django项目然后在里面创建一个应用,如图:

三、配置并启动

然后我们设置urls文件的内容,如图:

然后再在子应用中创建一个urls.py文件,当然你也可以直接将一些视图函数写在项目中的urls.py文件中。最后我们编写视图函数并把视图函数添加到urls.py文件中,如图:

最后我们需要提交更改,打开该项目manage.py文件所在的目录并打开cmd,输入如下命令:

python manage.py migrate

现在让我们来本地跑跑这个项目,还是在该目录中,如下:

python manage.py runserver

看到输出的结果表明这个子应用已经启动并返回了结果。我们也可以不用经过子应用直接在创建的项目根目录下运行启动Django应用,首先在pay目录下新建一个view.py文件,然后将其添加到该目录下的urls.py文件中,如下:

运行下看图:

四、登录支付宝并生成rsa密钥

首先登录咱们要收款的支付宝,地址:

https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fplatform%2FappDaily.htm%3Ftab%3Dinfo

然后进行登录,如图:

然后点击RSA2(SHA256)后面的设置,点击公钥并下载支付宝密钥生成器或者openssl来生成密钥,这里我选择支付宝密钥生成器,如图:

然后点击它之后跳转到下载界面下载,如图:

下载好后打开该工具,选择好密钥长度和密钥格式并生成密钥,如图:

然后进入公私钥的目录,将这个复制到我们的Django项目的子应用目录中,并重命名,等下用的着,如图:

紧接着我们进入自己的开发者中心控制台,地址:

https://open.alipay.com/platform/developerIndex.htm

然后我们去创建一个应用,如图:

按照要求如实填写即可。然后我们来设置它的接口加密方式,如图:


验证好了之后填写刚刚生成的应用公钥,如图:

此时会出现应用公钥和支付宝公钥,将支付宝公钥保存起来,如图:

然后我们将产生的额应用公私钥和支付宝公钥保存为下列内容形式的文件,如图:

将这三个文件都保存在rsakey这个文件夹中。现在准备工作都做好了,下面开始编写支付宝支付接口。

注:项目审核通过后才可以使用密钥调用支付宝接口噢!

四、PC端支付宝支付接口

这里我们使用一个类将它封装起来,如下:

from datetime import datetime from Crypto.PublicKey import RSA from Crypto.Signature import PKCS1_v1_5 from Crypto.Hash import SHA256 from urllib.parse import quote_plus from urllib.parse import urlparse, parse_qs from base64 import decodebytes, encodebytes import json   class AliPay(object):     """     支付宝支付接口(PC端支付接口)     """      def __init__(self, appid, app_notify_url, app_private_key_path,                  alipay_public_key_path, return_url, debug=False):         self.appid = appid         self.app_notify_url = app_notify_url         self.app_private_key_path = app_private_key_path         self.app_private_key = None         self.return_url = return_url         with open(self.app_private_key_path) as fp:             self.app_private_key = RSA.importKey(fp.read())         self.alipay_public_key_path = alipay_public_key_path         with open(self.alipay_public_key_path) as fp:             self.alipay_public_key = RSA.importKey(fp.read())          if debug is True:             self.__gateway = "https://openapi.alipaydev.com/gateway.do"         else:             self.__gateway = "https://openapi.alipay.com/gateway.do"      def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):         biz_content = {             "subject": subject,             "out_trade_no": out_trade_no,             "total_amount": total_amount,             "product_code": "FAST_INSTANT_TRADE_PAY",             # "qr_pay_mode":4         }          biz_content.update(kwargs)         data = self.build_body("alipay.trade.page.pay", biz_content, self.return_url)         return self.sign_data(data)      def build_body(self, method, biz_content, return_url=None):         data = {             "app_id": self.appid,             "method": method,             "charset": "utf-8",             "sign_type": "RSA2",             "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),             "version": "1.0",             "biz_content": biz_content         }          if return_url is not None:             data["notify_url"] = self.app_notify_url             data["return_url"] = self.return_url          return data      def sign_data(self, data):         data.pop("sign", None)         # 排序后的字符串         unsigned_items = self.ordered_data(data)         unsigned_string = "&".join("{0}={1}".format(k, v) for k, v in unsigned_items)         sign = self.sign(unsigned_string.encode("utf-8"))         # ordered_items = self.ordered_data(data)         quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)          # 获得最终的订单信息字符串         signed_string = quoted_string + "&sign=" + quote_plus(sign)         return signed_string      def ordered_data(self, data):         complex_keys = []         for key, value in data.items():             if isinstance(value, dict):                 complex_keys.append(key)          # 将字典类型的数据dump出来         for key in complex_keys:             data[key] = json.dumps(data[key], separators=(',', ':'))          return sorted([(k, v) for k, v in data.items()])      def sign(self, unsigned_string):         # 开始计算签名         key = self.app_private_key         signer = PKCS1_v1_5.new(key)         signature = signer.sign(SHA256.new(unsigned_string))         # base64 编码,转换为unicode表示并移除回车         sign = encodebytes(signature).decode("utf8").replace("\n", "")         return sign      def _verify(self, raw_content, signature):         # 开始计算签名         key = self.alipay_public_key         signer = PKCS1_v1_5.new(key)         digest = SHA256.new()         digest.update(raw_content.encode("utf8"))         if signer.verify(digest, decodebytes(signature.encode("utf8"))):             return True         return False      def verify(self, data, signature):         if "sign_type" in data:             sign_type = data.pop("sign_type")         # 排序后的字符串         unsigned_items = self.ordered_data(data)         message = "&".join(u"{}={}".format(k, v) for k, v in unsigned_items)         return self._verify(message, signature)

为了便于调用,我们将这个Python文件放在子应用的目录中,命名为pay.py。

五、编写前端页面

我们通过前端的商品的名称和价格来生成对应的商品信息并发起付款请求,如下:

index.html(商品主页)

            Document             

欢迎来到购物商场

商品目录
商品名 商品单价 商品数量 是否购买
梨子 0.1 1 购买

show.html(支付结果显示页)

            Document       

支付结果:{{msg}}

六、编写视图函数处理渲染

from django.shortcuts import render,redirect from django.http import HttpResponse,JsonResponse from .pay import AliPay import uuid from urllib.parse import parse_qs # Create your views here. def index(request):      return render(request,'index.html')  def dingdan(request):     # 实例化AliPay     alipay = AliPay(         appid="自己的APPID",         app_notify_url='http://127.0.0.1:8000/paypay/check/',#支付宝会向这个地址发送post请求         return_url='http://127.0.0.1:8000/paypay/show/',#支付宝会向这个地址发送get请求         app_private_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\private2048.txt',  # 应用私钥         alipay_public_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\paypublic.txt',  # 支付宝公钥         debug=True,  # 默认是False     )     # 定义请求地址传入的参数     res=alipay.direct_pay(         subject='梨子',  # 商品描述         out_trade_no=str(uuid.uuid4()),  # 订单号         total_amount='0.1',  # 交易金额(单位是元,保留两位小数)     )     #生成跳转到支付宝支付页面的url     url='https://openapi.alipaydev.com/gateway.do?{0}'.format(res)     return redirect(url)    def show(request):     if request.method == 'GET':         alipay = AliPay(             appid="自己的APPID",               app_notify_url='http://127.0.0.1:8000/paypay/check/',             return_url='http://127.0.0.1:8000/paypay/show/',             app_private_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\private2048.txt',  # 应用私钥             alipay_public_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\paypublic.txt',  # 支付宝公钥             debug=True,  # 默认是False         )         param=request.GET.dict()  # 获取请求携带的参数并转换成字典类型         sign=param.pop('sign', None)  # 获取sign的值         # 对sign参数进行验证         statu = alipay.verify(param,sign)         if statu:             return render(request, 'show.html', {'msg': '支付成功'})         else:             return render(request, 'show.html', {'msg': '支付失败'})     else:         return render(request, 'show.html', {'msg': '只支持GET请求,不支持其它请求'})  def check(request):     if request.method=='POST':         alipay=AliPay(appid="自己的APPID",             app_notify_url='http://127.0.0.1:8000/paypay/check/',  # 支付宝会向这个地址发送post请求             return_url='http://127.0.0.1:8000/show_msg/',  # 支付宝会向这个地址发送get请求             app_private_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\private2048.txt',  # 应用私钥             alipay_public_key_path=r'C:\Users\Administrator\Desktop\pay\paypay\rsakey\paypublic.txt',  # 支付宝公钥             debug=True,         )         body=request.body.decode('utf-8')  # 转成字符串         post_data = parse_qs(body)  # 根据&符号分割         post_dict = {}         for k, v in post_data.items():             post_dict[k] = v[0]         sign = post_dict.pop('sign', None)         status = alipay.verify(post_dict, sign)         if status:  # 支付成功             return HttpResponse('支付成功')         else:             return HttpResponse('支付失败')     else:         return HttpResponse('只支持POST请求')

七、添加路由函数到url规则中

from django.urls import path from . import views urlpatterns=[   path('',views.index,name='index'),   path('dingdan/',views.dingdan,name='dingdan'),   path('show/',views.show,name='show'),   path('check/',views.check,name='check'), ]

八、运行项目

所有准备工作都做好了,我们赶紧来试着运行下项目吧,如下:

可以看到我们购买商品后链接成功跳转到支付界面。

到此,关于"Python项目实战之如何使用Django框架实现支付宝付款"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

支付 应用 项目 如图 文件 公钥 商品 密钥 目录 生成 地址 接口 框架 函数 实战 成功 字符 字符串 结果 视图 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 招标网络技术方案怎么写 视频聊天app软件开发技术 安徽传统网络安全 小型聊天软件开发项目概述 辽宁特色软件开发管理模式 涉农信用信息数据库说明 五年级网络安全的语句 最容易学的数据库开发软件 数据库密码采用什么加密 郴州学计算机软件开发培训多少钱 360网络安全认证考试题库 葫芦娃网络技术 360网络安全学院李洋 网络安全方向和大数据方向 可行性分析在软件开发的哪个阶段 数据库连接池java 深圳市金和盛软件开发 网络安全管理措施分享 网络安全知识竞赛答题抽奖 网络安全主题手抄报三年级上册 网络安全小报 手抄报 数据库算不算小文件 多线程更新数据库发生死锁 与服务器修改管理员信息 服务器cpu可以在家玩吗 网络安全研究生课程 华为云服务器操作记录在哪看 梦圆云数据库安全吗 当今最先进的网络技术 安塞分局网络安全大检查
0