Django集成支付宝SDK实现订单支付流程

唐可
唐可
发布时间:2026-10-13| 5人浏览过
原创

本文详细讲解如何在Django项目中集成python-alipay-sdk以实现支付宝支付功能。内容涵盖SDK安装、核心配置参数设置、订单支付视图函数的编写逻辑,包括用户身份校验、订单状态查询及支付链接生成,最后介绍URL路由配置方法,帮助开发者快速完成支付模块对接。

安装支付宝SDK

首先,需要在项目中安装并升级python-alipay-sdk库,以确保使用最新版本的SDK支持。


pip install python-alipay-sdk --upgrade

支付环境配置

接下来进行相关配置工作,确保支付环境参数设置正确。

订单支付视图实现

在视图函数orders/views.py中实现订单支付逻辑。具体代码节选如下: ```python # 订单支付接口 # 路由: /order/pay from alipay import AliPay, ISVAliPay import os from django.conf import settings class OrderPayView(View): def post(self, request): '''处理支付页面请求''' # 1. 校验用户登录状态 user = request.user if not user.is_authenticated(): return JsonResponse({'res': 0, 'errmsg': '用户尚未登录'}) # 2. 接收并校验订单ID order_id = request.POST.get('order_id') if not order_id: return JsonResponse({'res': 1, 'errmsg': '无效的订单id'}) # 3. 查询订单信息 try: # 查询条件:指定用户、支付方式为3、订单状态为1(未支付) order = OrderInfo.objects.get(order_id=order_id, user=user, pay_method=3, order_status=1) except OrderInfo.DoesNotExist: return JsonResponse({'res': 2, 'errmsg': '订单错误'}) # 4. 调用支付宝SDK生成支付链接 # 注意:支付宝配置信息不应直接放在settings文件中,以免引发报错 alipay = AliPay( appid="2016101200665304", app_notify_url=None, # 默认回调URL,若为空必须设为None而非空字符串 # 此处省略部分个人配置参数... ) # 生成支付请求字符串 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # 商户订单号 total_amount=str(total_price), # 支付总金额,Decimal类型需转为字符串以便序列化 subject='天天生鲜%s' % order_id, # 商品标题 return_url=None, # 同步回调地址 notify_url=None # 异步回调地址,可选,不填则使用默认notify url ) # 5. 返回支付跳转链接 pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url}) ``` 该视图函数首先验证用户是否已登录,若未登录则返回错误提示。随后接收前端传来的订单ID并进行有效性校验。接着从数据库查询对应的订单信息,确保订单属于当前用户且状态符合支付要求(支付方式为3,状态为1)。业务处理部分使用python-alipay-sdk调用支付宝接口,注意appid等敏感信息不宜硬编码在settings中。通过`api_alipay_trade_page_pay`方法生成支付请求字符串,其中订单金额需转换为字符串格式。最后拼接支付宝网关地址并返回包含支付链接的JSON响应。


# 订单支付
# /order/pay
from alipay import AliPay, ISVAliPay
import os
from django.conf import settings
class OrderPayView(View):
  def post(self, request):
    '''支付页面'''
    # 判断用户是否登录
    user = request.user
    if not user.is_authenticated():
      return JsonResponse({'res':0, 'errmsg':'用户尚未登录'})
    # 接收订单id
    order_id = request.POST.get('order_id')
    # 校验订单id
    if not order_id:
      return JsonResponse({'res':1, 'errmsg':'无效的订单id'})
    # 查询订单信息
    try:
      order = OrderInfo.objects.get(order_id=order_id, user=user, pay_method=3, order_status=1)
    except OrderInfo.DoesNotExist:
      return JsonResponse({'res':2, 'errmsg':'订单错误'})

    # 业务处理 使用python sdk调用支付宝的支付接口
    # 支付宝信息  不能放在settings里 会报错
    alipay = AliPay(
      appid="2016101200665304",
      app_notify_url=None, # 默认回调url 如果为空的话不能用'' 要用None
      # 个人私钥
      app_private_key_string=os.path.join(settings.BASE_DIR, 'apps/orders/app_private_key.pem'),
      # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
      alipay_public_key_string=os.path.join(settings.BASE_DIR, 'apps/orders/alipay_public_key.pem'),
      # 加密方式
      sign_type="RSA2", # RSA 或者 RSA2
      # 沙箱是True 正式环境是False
      debug=True # 默认False
    )
    # 调用支付接口
    # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string 实际地址
    # 沙箱地址 https://openapi.alipaydev.com/gateway.do? + order_string 沙箱地址在alipay后面加上dev
    total_price = order.total_price + order.transit_price # Decimal
    order_string = alipay.api_alipay_trade_page_pay(
      out_trade_no=order_id, # 订单id
      total_amount=str(total_price), # 支付总金额 因为Decimal格式不能序列化 所以先转成字符串
      subject='天天生鲜%s'%order_id,
      return_url=None,
      notify_url=None # 可选, 不填则使用默认notify url
    )
    # 返回应答
    pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
    return JsonResponse({'res':3, 'pay_url':pay_url})

路由配置

配置路由urls.py,将支付视图映射到具体URL路径。相关代码节选如下: ```python from django.conf.urls import url from orders.views import OrderPlaceView, OrderCommitView, OrderPayView urlpatterns = [ url(r'^place$', OrderPlaceView.as_view(), name='place'), # 提交订单页面 url(r'^commit$', OrderCommitView.as_view(), name='commit'), # 提交订单处理 url(r'^pay$', OrderPayView.as_view(), name='pay'), # 订单支付 ] ``` 在urls.py中,通过`url`函数将`OrderPayView`类视图绑定到`^pay$`路径,并命名为'pay',以便前端通过该名称发起支付请求。


from django.conf.urls import url
from orders.views import OrderPlaceView, OrderCommitView, OrderPayView


urlpatterns = [
  url(r'^place$', OrderPlaceView.as_view(), name='place'), # 提交订单页面
  url(r'^commit$', OrderCommitView.as_view(), name='commit'), # 提交订单处理
  url(r'^pay$', OrderPayView.as_view(), name='pay'), # 订单支付

]

以上就是本次介绍的相关知识点以及实例代码,更多内容可以参考本站相关栏目。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。