python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python调用支付宝沙箱

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

作者:幸福清风

本文将引导您一步步实现使用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--- 示例结束 ---")

四、代码详解

五、测试流程

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

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

扫码支付

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

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

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

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

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

六、常见问题与注意事项

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

您可能感兴趣的文章:
阅读全文