零基础实践Python调用支付宝沙箱生成收款二维码并扫码支付

 更新时间:2026年02月28日 08:30:06   作者:幸福清风  
本文将引导您一步步实现使用Python语言,通过支付宝开放平台的 alipay.trade.precreateAPI,在沙箱环境中生成一个收款二维码,并使用沙箱买家账号进行扫码支付的全过程,感兴趣的小伙伴可以了解下

一、概述

本文将引导您一步步实现使用Python语言,通过支付宝开放平台的 alipay.trade.precreateAPI,在沙箱环境中生成一个收款二维码,并使用沙箱买家账号进行扫码支付的全过程。这非常适合初次接触第三方支付集成的开发者,帮助您理解支付流程的核心步骤。

二、准备工作

在开始编码之前,您需要完成以下准备工作:

1.注册支付宝开放平台账号:使用您的手机号注册一个开发者账号。

2.创建应用:登录后,在控制台创建一个应用。在“开发信息”或“沙箱应用”页面,您可以找到该应用对应的沙箱APPID沙箱买家账号(通常是一个邮箱或ID)和固定登录密码

3.获取密钥:在应用的“开发设置”中,按照指引生成 RSA2 密钥对。您需要将应用私钥保存好,并将应用公钥上传到平台。同时,从平台获取支付宝公钥

4.安装必要的 Python 库:在您的开发环境中安装 alipay-sdk-pythonqrcode[pil] 库。

pip install alipay-sdk-python qrcode[pil]

三、核心代码实现

我们将使用支付宝官方推荐的 alipay.aop.api 模块来实现。以下是完整的 Python 代码,包含了生成二维码、保存图片和查询支付状态的功能。

import qrcode
# 注意:根据源码路径导入 DefaultAlipayClient 类
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.domain.AlipayTradePrecreateModel import AlipayTradePrecreateModel
from alipay.aop.api.request.AlipayTradePrecreateRequest import AlipayTradePrecreateRequest
import json

# ====================== 配置沙箱环境参数 ======================
# 线上应用同步到沙箱后的APPID,该APPID跟线上应用一致
APP_ID = "YOUR_SANDBOX_APP_ID" # <--- 请替换为你的沙箱APPID
# 沙箱分配的默认应用私钥(完整字符串,无需额外格式转换)
APP_PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END RSA PRIVATE KEY-----""" # <--- 请替换为你的应用私钥
# 沙箱分配的默认支付宝公钥
ALIPAY_PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
YOUR_ALIPAY_PUBLIC_KEY_HERE
-----END PUBLIC KEY-----""" # <--- 请替换为你的支付宝公钥

# 全局变量,用于存储订单号
OUT_TRADE_NO = "qr_test_order_" + str(int(time.time())) # 使用时间戳生成唯一订单号,避免重复


def get_client():
    """
    初始化 Alipay 客户端
    """
    # ====================== 初始化支付宝客户端配置 ======================
    # 创建客户端配置对象
    client_config = AlipayClientConfig()
    # 设置沙箱环境网关
    client_config.server_url = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"
    client_config.app_id = APP_ID
    client_config.app_private_key = APP_PRIVATE_KEY
    client_config.alipay_public_key = ALIPAY_PUBLIC_KEY
    client_config.charset = "utf-8"  # 建议使用 utf-8
    client_config.sign_type = "RSA2"  # 签名方式

    # ====================== 初始化支付宝客户端 ======================
    # 创建DefaultAlipayClient实例
    alipay = DefaultAlipayClient(client_config)

    return alipay


def generate_qr_code_for_payment():
    """
    使用 alipay.trade.precreate 接口生成收款二维码
    """
    alipay = get_client()

    # ====================== 构造交易创建请求 ======================
    # 创建请求对象
    request = AlipayTradePrecreateRequest()
    # 设置异步通知地址(可选)
    request.notify_url = None  # 或者设置你的服务器地址

    # 创建业务参数模型对象
    biz_model = AlipayTradePrecreateModel()
    # 设置订单号
    biz_model.out_trade_no = OUT_TRADE_NO
    # 设置订单金额
    biz_model.total_amount = "0.01"  # 字符串格式,单位元
    # 设置订单标题
    biz_model.subject = "沙箱测试商品-扫码支付"
    # 设置订单超时时间 (可选)
    biz_model.timeout_express = "5m"  # 例如 5分钟

    # 将业务模型绑定到请求对象
    request.biz_model = biz_model

    try:
        # 执行请求,获取响应对象
        response = alipay.execute(request)

        print("--- API 响应 ---")
        print(response)

        # 解析 JSON 响应
        response_dict = json.loads(response)

        # 检查响应是否成功
        if response_dict.get('code') == '10000':
            qr_code_str = response_dict['qr_code']
            print(f"\n获取到的 QR Code 字符串:\n{qr_code_str}")

            # --- 生成二维码图片 ---
            # 1. 创建二维码实例
            qr = qrcode.QRCode(
                version=1,  # 控制大小,1是最小的
                error_correction=qrcode.constants.ERROR_CORRECT_L,  # 错误纠正级别
                box_size=4,  # 每个小格子包含的像素数
                border=4,  # 边框的格子厚度
            )
            # 2. 添加数据
            qr.add_data(qr_code_str)
            qr.make(fit=True)

            # 3. 创建图像
            img = qr.make_image(fill_color="black", back_color="white")

            # 4. 保存图片到本地
            qr_filename = f"payment_qr_{biz_model.out_trade_no}.png"
            img.save(qr_filename)
            print(f"\n二维码已生成并保存为: {qr_filename}")
            print("请使用支付宝手机 App 扫描此二维码进行支付测试。")
            return qr_filename # 返回文件名以供后续使用

        else:
            # 如果 API 返回失败
            sub_code = response_dict.get('sub_code')
            sub_msg = response_dict.get('sub_msg')
            print(f"\nAPI 调用失败。子错误码: {sub_code}, 子错误信息: {sub_msg}")
            return None

    except Exception as e:
        # 捕获其他可能的异常
        print(f"\n调用 API 时发生异常: {e}")
        return None


def query_payment_status(out_trade_no):
    """
    查询交易状态
    :param out_trade_no: 商户订单号
    """
    # 注意:新版 aop api 可能没有直接封装 api_alipay_trade_query
    # 我们需要手动构造请求
    alipay = get_client()

    from alipay.aop.api.request.AlipayTradeQueryRequest import AlipayTradeQueryRequest
    from alipay.aop.api.domain.AlipayTradeQueryModel import AlipayTradeQueryModel

    request = AlipayTradeQueryRequest()
    biz_model = AlipayTradeQueryModel()
    biz_model.out_trade_no = out_trade_no
    # 或者使用支付宝交易号 (trade_no) 查询
    # biz_model.trade_no = "2021030122001234567890"
    request.biz_model = biz_model

    try:
        result = alipay.execute(request)
        print("\n--- 查询结果 ---")
        print(result)

        result_dict = json.loads(result)
        if result_dict.get('code') == '10000':
            trade_status = result_dict.get('trade_status')
            if trade_status:
                print(f"订单状态: {trade_status}")
                if trade_status in ['TRADE_SUCCESS', 'TRADE_FINISHED']:
                    print("支付成功!")
                    return True
                elif trade_status == 'WAIT_BUYER_PAY':
                    print("等待买家付款...")
                    return False
                else:
                    print(f"其他状态: {trade_status},请查阅文档。")
                    return False
            else:
                print("未找到交易状态。")
                return False
        else:
            sub_code = result_dict.get('sub_code')
            sub_msg = result_dict.get('sub_msg')
            print(f"查询失败: {sub_msg} ({sub_code})")
            return False

    except Exception as e:
        print(f"\n查询失败: {e}")
        return False


if __name__ == "__main__":
    import time # 引入time模块用于生成唯一订单号和延时
    print("--- 开始支付宝沙箱扫码支付API调用示例 (使用 aop.api) ---")

    # 生成收款二维码
    qr_file = generate_qr_code_for_payment()
    if not qr_file:
        print("二维码生成失败,程序退出。")
        exit()

    # 提示用户支付后,可以手动查询状态
    print("\n请扫描生成的二维码完成支付,支付完成后按 Enter 键查询支付结果...")
    input()  # 等待用户按键

    # 查询刚刚生成的订单状态 (需要将订单号传入)
    query_payment_status(OUT_TRADE_NO)

    print("\n--- 示例结束 ---")

四、代码详解

  • 配置参数APP_ID, APP_PRIVATE_KEY, ALIPAY_PUBLIC_KEY 必须替换为你自己应用的实际值。OUT_TRADE_NO 使用时间戳生成,确保每次运行都是一个新订单。
  • get_client():该函数负责创建一个 AlipayClientConfig 对象,配置沙箱网关地址、应用ID、密钥等信息,然后用它初始化 DefaultAlipayClient 实例。这是后续所有 API 调用的基础。
  • generate_qr_code_for_payment()
    • 创建 AlipayTradePrecreateRequestAlipayTradePrecreateModel 对象。
    • model 中设置 out_trade_no (商户订单号), total_amount (金额), subject (商品标题) 等必要参数。
    • 调用 alipay.execute(request) 发送请求。
    • 成功后 (code == '10000'),从响应中提取 qr_code 字符串。
    • 使用 qrcode 库将该字符串生成二维码图片,并保存到本地。
  • query_payment_status(out_trade_no)
    • 类似地,创建 AlipayTradeQueryRequestAlipayTradeQueryModel
    • 设置 out_trade_no 来查询特定订单的状态。
    • 调用 execute 并解析结果,判断订单是成功、失败还是仍在等待支付。
  • 主程序 (if __name__ == "__main__":):按顺序执行生成二维码、等待用户操作、查询结果的逻辑。

五、测试流程

运行代码:在你的 Python 环境中运行上述脚本。

生成二维码:脚本会成功调用 API,并在当前目录下生成一个名为 payment_qr_*.png 的二维码图片文件。

扫码支付

下载沙箱版 App:强烈建议下载并安装支付宝沙箱版 App。

登录:使用在沙箱应用页面获取的 沙箱买家账号固定登录密码 登录沙箱版 App。

扫描:在沙箱版 App 中点击“扫一扫”,扫描电脑上生成的二维码图片。

确认支付:在手机上确认支付信息并完成支付流程。

查询结果:回到电脑端,按回车键,脚本会调用查询接口,打印出该笔订单的最终状态(通常是 TRADE_SUCCESS)。

六、常见问题与注意事项

  • 字符编码:务必设置 client_config.charset = "utf-8",以避免因中文字符导致的签名错误。
  • 订单号 (out_trade_no):必须在你的应用内保持唯一,不能重复提交相同订单号。
  • 二维码有效期precreate 接口生成的二维码有有效期(如 timeout_express 所设,默认2分钟,最长15分钟)。如果提示“二维码失效”,很可能是超过了有效期。
  • 沙箱环境:确保所有参数(APPID, 密钥, 网关地址)都指向沙箱环境,不要与生产环境混淆。

到此这篇关于零基础实践Python调用支付宝沙箱生成收款二维码并扫码支付的文章就介绍到这了,更多相关Python调用支付宝沙箱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python生成以及打开json、csv和txt文件的实例

    python生成以及打开json、csv和txt文件的实例

    今天小编就为大家分享一篇python生成以及打开json、csv和txt文件的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 自定义Django默认的sitemap站点地图样式

    自定义Django默认的sitemap站点地图样式

    这篇文章主要介绍了自定义Django默认的sitemap站点地图样式,通过代码给大家介绍了使用Django的sitemap功能,代码很简单非常不错对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Matplotlib 3D 绘制小红花原理

    Matplotlib 3D 绘制小红花原理

    这篇文章主要介绍了Matplotlib 3D 绘制小红花原理,小编上一篇文章一家介绍了绘制小红化,本篇博文主要介绍一下3D小红花的绘制原理,看过上篇博文的朋友可以参考一下
    2022-02-02
  • Appium+python自动化怎么查看程序所占端口号和IP

    Appium+python自动化怎么查看程序所占端口号和IP

    这篇文章主要介绍了Appium+python自动化怎么查看程序所占端口号和IP,本文以FQ工具 Lantern 为例,通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2019-06-06
  • python基础知识之私有属性和私有方法

    python基础知识之私有属性和私有方法

    这篇文章主要介绍了python基础知识之私有属性和私有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python(PyS60)实现简单语音整点报时

    Python(PyS60)实现简单语音整点报时

    这篇文章主要为大家详细介绍了Python(PyS60)实现简单语音整点报时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Python OpenCV读取显示视频的方法示例

    Python OpenCV读取显示视频的方法示例

    这篇文章主要介绍了 Python OpenCV读取显示视频的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 一些Centos Python 生产环境的部署命令(推荐)

    一些Centos Python 生产环境的部署命令(推荐)

    这篇文章主要介绍了一些Centos Python 生产环境的部署命令,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • Python随机生成数据后插入到PostgreSQL

    Python随机生成数据后插入到PostgreSQL

    本文主要介绍利用python的random库生成随机数,然后插入到PostgreSQL数据库中,有需要的可以参考学习。
    2016-07-07
  • Python自动化运维和部署项目工具Fabric使用实例

    Python自动化运维和部署项目工具Fabric使用实例

    Fabric是一个Python库,只要目标机器支持ssh访问,就可以借助fabric来进行远程操作(如在host1上对host2远程运行shell命令),显然,由于fabric是个Python package,故其它Python package都可以被import到fabric特有的fabfile.py脚本中
    2016-09-09

最新评论