零基础实践Python调用支付宝沙箱生成收款二维码并扫码支付
一、概述
本文将引导您一步步实现使用Python语言,通过支付宝开放平台的 alipay.trade.precreateAPI,在沙箱环境中生成一个收款二维码,并使用沙箱买家账号进行扫码支付的全过程。这非常适合初次接触第三方支付集成的开发者,帮助您理解支付流程的核心步骤。
二、准备工作
在开始编码之前,您需要完成以下准备工作:
1.注册支付宝开放平台账号:使用您的手机号注册一个开发者账号。
2.创建应用:登录后,在控制台创建一个应用。在“开发信息”或“沙箱应用”页面,您可以找到该应用对应的沙箱APPID、沙箱买家账号(通常是一个邮箱或ID)和固定登录密码。

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


4.安装必要的 Python 库:在您的开发环境中安装 alipay-sdk-python 和 qrcode[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():- 创建
AlipayTradePrecreateRequest和AlipayTradePrecreateModel对象。 - 在
model中设置out_trade_no(商户订单号),total_amount(金额),subject(商品标题) 等必要参数。 - 调用
alipay.execute(request)发送请求。 - 成功后 (
code == '10000'),从响应中提取qr_code字符串。 - 使用
qrcode库将该字符串生成二维码图片,并保存到本地。
- 创建
query_payment_status(out_trade_no):- 类似地,创建
AlipayTradeQueryRequest和AlipayTradeQueryModel。 - 设置
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调用支付宝沙箱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Appium+python自动化怎么查看程序所占端口号和IP
这篇文章主要介绍了Appium+python自动化怎么查看程序所占端口号和IP,本文以FQ工具 Lantern 为例,通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下2019-06-06


最新评论