96SEO 2026-08-12 07:42 5
上一篇我们完成了从购物车到订单的全流程——使用者勾选商品、选择地址、提交订单,数据库里已经有了待支付的订单。但使用者还没有付钱,今天我们要打通电商的“最终一公里”——集成支付宝沙箱支付让使用者真正扫码付款,完成交易闭环。
支付宝沙箱环境是支付宝官方提供的测试环境。不需要真实资金,不需要营业执照,任何人都可以免费申请。阶段用它来调试支付流程,完全够用。本篇我会手把手带你申请沙箱、配置密钥、安装 SDK、编写支付视图,并处理好同步回跳和异步通知两个回调逻辑。

支付宝沙箱是支付宝提供给开发者的测试环境它拥有独立的 APPID、独立的密钥、独立的网关地址,还有专属的测试账号。所有支付操作都不会产生真实资金流动余额可以随意设置,支付密码也是固定的。
使用者痛点一:很多新人不知道沙箱和正式环境有什么区别。以为直接用正式 APPID 就能调试,导致调试失败甚至资金风险。
步骤 1 :登录支付宝开放网站
访问 支付宝开放网站,用你的支付宝账号登录。
步骤 2 :进入沙箱环境
登录后点击右上角「控制台」→ 在左侧菜单或页面底部找到「沙箱环境」,进入沙箱应用页面。沙箱环境的链接是:
进入后你会看到程序已自动为你创建了一个沙箱应用,页面上展示了:
步骤 3 :获取密钥
步骤 4 :保存关键信息
申请完成后你需要保存以下信息备用:
至于APPID,你的沙箱APPID
从应用私钥来看,MIIEpQIBAAKCAQEA...
说到支付宝公钥,MIIBIjANBgkqhkiG...
再看网关地址。https://openapi-sandbox.dl.alipaydev.com/gateway.do
再看沙箱买家账号,买家登录密码: ********
买家支付密码的观点是,********
进入项目虚拟环境,执行:
pip install python-alipay-sdk==0.9.0
# 如需指定版本,可自行替换
SdK 已经封装了签名/验签等复杂逻辑,我们只需要调用几个关键方法即可。
SdK 同时依赖 pycryptodome,如未自动安装。请手动执行:
pip install pycryptodome
中配置阿里支付参数
# ==================== 支付宝沙箱环境配置 ====================
ALIPAY_APPID = '你的沙箱APPID' # 替换为真实 APPID
ALIPAY_DEBUG = True # 沙盒模式请设 True
ALIPAY_GATEWAY = 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'
# 回调地址
ALIPAY_RETURN_URL = 'http://127.0.0.1:8000/payment/return/'
ALIPAY_NOTIFY_URL = 'http://127.0.0.1:8000/payment/notify/'
# 应用私钥
ALIPAY_APP_PRIVATE_KEY = '''
-----BEGIN RSA PRIVATE KEY-----
你的应用私钥内容...
-----END RSA PRIVATE KEY-----
'''
# 支付宝公钥
ALIPAY_PUBLIC_KEY = '''
-----BEGIN PUBLIC KEY-----
你的支付宝公钥内容...
-----END PUBLIC KEY-----
'''
ALIPAY_NOTIFY_URL 替换为公网 URL。
# apps/payment/urls.py
from django.urls import path
from . import views
app_name = 'payment'
urlpatterns =
在项目根路由中加入:
# django_ecommerce/urls.py
from django.urls import path,include
urlpatterns =
# apps/orders/views.py
# 原来:
# return redirect
# 改为:
return redirect
import logging
from django.shortcuts import render,redirect。get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.conf import settings
from alipay import AliPay,AliPayConfig
from orders.models import Order
from .models import Payment
logger = logging.getLogger
def get_alipay_client:
"""创建并返回 AliPay 实例"""
alipay = AliPay(
appid=settings.ALIPAY_APPID,app_notify_url=settings.ALIPAY_NOTIFY_URL,app_private_key_string=settings.ALIPAY_APP_PRIVATE_KEY,alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY,sign_type='RSA2',debug=settings.ALIPAY_DEBUG,verbose=True,config=AliPayConfig,)
return alipay
@login_required
def payment_go:
"""发起支付——跳转到 Alipay 收银台"""
user = request.user
order = get_object_or_404
if order.status!= Order.Status.PENDING_PAYMENT:
messages.warning(
request。f'该订单当前状态为「{order.get_status_display}」,无法支付。')
return redirect
# 创建或更新 Payment 对象
payment,created = Payment.objects.get_or_create(
order=order,defaults={'amount': order.total_amount。'status': Payment.Status.PENDING}
)
alipay = get_alipay_client
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order.order_no,total_amount=float,subject=f'Django商城订单-{order.order_no}',return_url=settings.ALIPAY_RETURN_URL,)
pay_url = f"{settings.ALIPAY_GATEWAY}?{order_string}"
return redirect
@login_required
def payment_return:
"""同步回跳页面仅用于展示结果"""
alipay = get_alipay_client
data = request.GET.dict
sign = data.pop
if not sign or not alipay.verify:
messages.error
return redirect
out_trade_no = data.get
trade_no = data.get
从try来看,order = Order.objects.get
payment = order.payment
if payment.status!= Payment.Status.SUCCESS:
payment.trade_no = trade_no
payment.status = Payment.Status.SUCCESS
payment.save
if order.status == Order.Status.PENDING_PAYMENT:
order.set_status
return render(request。'payment/pay_success.html',{
'order': order,'trade_no': trade_no,})
except Order.DoesNotExist:
messages.error
return redirect
同步回跳不可靠——若使用者关闭浏览器或网络异常,同步页面根本不会被访问。业务状态必须依赖异步通知来最终确定。
@csrf_exempt
def payment_notify:
"""Alipay 异步通知视图"""
if request.method!= 'POST':
return HttpResponse
alipay = get_alipay_client
data = request.POST.dict
sign = data.pop
# 验签
if not sign or not alipay.verify:
logger.error
return HttpResponse
out_trade_no = data.get
trade_no = data.get
trade_status = data.get
total_amount = data.get
logger.info
至于try,# 加锁防止并发重复处理
order = Order.objects.select_for_update.get
if order.status!话说回来,= Order.Status.PENDING_PAYMENT:
logger.info
return HttpResponse
# 金额校验防止被篡改
if float!= float:
logger.error
return HttpResponse
if trade_status in :
payment = order.payment
payment.trade_no = trade_no
payment.status = Payment.Status.SUCCESS
payment.save
order.set_status
logger.info
except Order.DoesNotExist:
logger.error
return HttpResponse
# 必须返回 success,否则 Alipayi 会重试最多25小时。return HttpResponse
notify_url ;方法:使用 ngrok 等内网穿透工具。将外网 URL 填入 ALIPAY_NOTIFY_URL
{% raw %}
{% extends 'base.html' %}
{% block title %}支付成功{% endblock %}
{% block content %}
✅️ 支付成功!🎉️‑‑
‖↔↔↔↔←←←←←↑↑↑↑↓↓↓↓←←←←⬇⬇⬇⬆⬅🈚🈚🈚🈚🈚🈚🈚🈚🈚🈚🈚��
👏🏻恭喜您!您的订单已成功付款 🎉
您可以在 “我的订单” 中查看详细信息。⬇️👇👇👇 👇👇👇 👇👆👇👆👇👇 👆🙌 🙌 🙌 🙌 🙌 🙌 🙌 🙌🙁🙁🙁🙁🙁🙁😎😀🤗🤗🤩😜😂😂🤣👍💯🔥🚀🌟💰🔒🔐🔑✨🌍🌎🌏✴️✴️✴️✴️✴️✴️✴️❣︎❣︎❣︎❣︎❣︎❣︎❕❕⚙⚙⚙⚙⚙⛽⛽⛽⛽⛽⛽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
📦 请耐心等待发货,我们将在第一时间安排配送。话说回来,✍🏻 如有疑问,请联系客服。💳 支付流水号:
{{ trade_n }}
↘ ⇧ ⇧ ⇧ ⇧ ‑‑‑‑‑−−−—–—–—–
{% endblock %}
{% endraw %}{% endraw %}
说到**注**。模板代码仅供参考,可根据实际 UI 框架自行调整。老实说,
七、完整流程测试
-
启动本地服务器:
python manage.py runserver
-
准备一笔待付款订单:
确保已有状态为「待付款」的订单;如果没有,请先走一次购物车 → 下单流程。-
打开浏览器访问对应链接:
http的观点是,//127.0.0.1:8000/payment/go//
浏览器会自动跳转到 **Alipayi 沙盒收银台**。老实说,-
使用 **sandbox 买家** 登录收银台:
账户信息在前面「保存关键信息」章节中已有记录。-
确认金额 → 点击 **确认付款** :
程序将弹出 **验证码**,输入后完成付款。-
同步回跳显示 “支付成功” 页面 :
URL 类似:
至于http,//127.0.0.1:8000/payment/return/?charset=utf-8&...
页面展示 **订单号** 与 **Alipayi 交易号**。-
检查数据库状态 :
sql
SELECT id。order_no,status FROM tb_order WHERE order_no='';SELECT * FROM tb_payment WHERE order_id=;怎么说呢,
-
status 应为 待发货;
-
tb_payment 中 status 为 SUCCESS 且 trade_no 有值。
八、常见问题与避坑教程
问题描述 方法 / 建议
① 私钥粘贴错误导致签名失败
② 报错 “Invalid private key format”。其实, 确保 PEM 内容完整且保留首尾标记及所有换行;建议复制后用编辑器检查是否出现额外空格或换行丢失。
② 本地无法收到 Alipayi 异步通知
③ “Method Not Allowed” 或 “500 Internal Server Error”。 使用 ngrok 将本机端口映射到公网,如:
ngrok http 8000。得到类似 https://abcd1234.ngrok.io 的 URL;将此 URL 替换至 ALIPAY_NOTIFY_URL 并重新开启服务。话说回来,
③ 同步回跳出现 “验签失败”。 确认 return_url 与后台设置的一致;检查是否在返回参数中遗漏 sign_type 参数导致验签不通过。
④ 多次收到相同交易通知导致重复扣费或状态错乱。 实现幂等性:在业务层先查询当前订单状态,只对 “待付款” 状态进行更新;使用数据库事务 防止并发竞争。其实,
⑤ 上线后忘记切换网关地址与 APPID。 在 settings.py 中添加开关变量,例如 ALIPAY_DEBUG=False 自动切换正式网关 并替换对应 APPID 与密钥;部署前务必检查该变量,
⑥ 沙盒账户余额不足导致模拟扣款失败。 登录阿里巴巴开放网站 → 沙盒管理 → “充值”,可自由给买家账户充值任意金额测试。按理说,
⑦ 想要支持移动端 H5 扫码付款但不知道如何改造链接。
使用 SDK 的 api_alipy_trade_wap_pay 方法生成 WAP 页面链接,将前端 或 指向该链接就可以移动端快捷扫码。
python
alipy.api_alipy_trade_wap_pay
如果仍想自定义二维码,可把返回参数中的 提取出来自行渲染二维码图片。
i>
-
"我们已经完成电商闭环中的最终一步——接入 ="" :=""
-
申请 Sandbox 环境 &&& 获取 APP ID / 密匙&&& 配置 Settings
-
安装 python-alpay-sdk 并验证依赖
-
编写 PayView 完成“去付款” 重定向
-
实现 Return View 展示“成功页”,兜底更新状态
-
实现 Notify View 完整验签 + 幂等处理 + 数据库事务更新 &,&,>
"我们已经完成电商闭环中的最终一步——接入>
...
…
........
…,..
….
…,
…....
.....
.. .. ......
...
END OF CONTENT
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback