Payment SDK for Alipay, WeChat Pay, Douyin Pay and UnionPay
Project description
SenWeaver Pay - 高性能统一支付SDK
senweaver-pay 是一个现代化的高性能统一支付SDK,支持支付宝、微信支付、抖音支付、银联支付等多种支付渠道,提供统一的API接口和类型化的请求响应。
✨ 核心特性
- 🔄 统一接口:所有支付渠道使用相同的API接口
- 📝 类型化设计:完整的类型注解和请求响应模型
- 🎯 多种接口风格:支持类型化接口 (
Pay.create) 和简化接口 (Pay.pay) - 🏢 多租户支持:支持多应用配置(如
alipay.default,alipay.merchant_a) - 🔧 简洁架构:直接在渠道类中实现转换,无冗余抽象层
- 🛡️ 统一异常处理:标准化的错误处理和响应格式
- 📊 统一状态管理:标准化的支付状态枚举
- 🔐 自动签名验证:自动处理各渠道的签名和验证
- 📱 现代化设计:基于最新的支付API开发
- ⚡ 高性能优化:智能证书缓存,5-10倍签名验证性能提升
- 🚀 企业级可靠性:完善的错误处理和备份机制
🏦 支持的支付渠道
| 渠道 | 支付方式 | 性能优化 | 状态 |
|---|---|---|---|
| 支付宝 | 网页支付、H5支付、APP支付、小程序支付、刷卡支付、扫码支付、转账 | ⚡ 证书缓存 | ✅ 完整支持 |
| 微信支付 | 公众号支付、小程序支付、H5支付、APP支付、扫码支付、刷卡支付 | ⚡ 证书对象缓存 | ✅ 完整支持 |
| 抖音支付 | 小程序支付 | ⚡ HMAC高性能 | ✅ 基础支持 |
| 银联支付 | 网页支付、H5支付、刷卡支付、扫码支付 | ⚡ 密钥缓存 | ✅ 基础支持 |
📋 支持的操作
- 💳 创建支付:统一的支付创建接口
- 🔍 查询订单:支付状态查询和订单信息获取
- 💰 申请退款:支持部分退款和全额退款
- ❌ 取消订单:取消未支付的订单
- 📞 回调处理:统一的异步通知处理
- ✅ 签名验证:高性能自动验证回调签名的真实性
- 🔐 证书管理:智能证书缓存和自动更新机制
🆚 统一接口 vs 传统方式
| 特性 | 传统方式 | SenWeaver Pay 统一接口 |
|---|---|---|
| 接口一致性 | 每个渠道不同的API | ✅ 所有渠道统一API |
| 参数格式 | 各渠道参数格式不同 | ✅ 统一的请求响应模型 |
| 接口风格 | 单一接口形式 | ✅ 类型化接口 + 简化接口双重选择 |
| 错误处理 | 各渠道错误格式不同 | ✅ 标准化异常和响应 |
| 状态管理 | 各渠道状态值不同 | ✅ 统一的状态枚举 |
| 类型安全 | 无类型提示 | ✅ 完整的类型注解 |
| 多租户 | 需要手动管理配置 | ✅ 内置多租户支持 |
| 代码维护 | 需要了解各渠道细节 | ✅ 统一接口,易于维护 |
| 性能优化 | 每次重新解析证书 | ⚡ 智能证书缓存,5-10倍性能提升 |
| 证书管理 | 手动管理证书更新 | ✅ 自动证书下载和更新 |
⚡ 性能优化特性
🚀 智能证书缓存系统
SenWeaver Pay 实现了企业级的证书缓存机制,大幅提升支付性能:
| 优化项目 | 传统方式 | SenWeaver Pay | 性能提升 |
|---|---|---|---|
| 证书解析 | 每次重新解析 | 智能对象缓存 | 5-10倍 |
| 签名验证 | 重复加载证书 | 预加载公钥 | 80-90%时间节省 |
| 内存使用 | 重复创建对象 | 高效复用 | 显著降低 |
| 并发性能 | CPU密集型 | 缓存友好 | 线性扩展 |
🔐 渠道级性能优化
- 微信支付:证书对象缓存 + 6小时智能更新
- 支付宝:公钥/私钥对象预加载 + 缓存复用
- 银联支付:密钥对象缓存 + 预加载机制
- 抖音支付:HMAC签名,天然高性能
📊 性能基准测试
# v0.1.0 版本性能测试结果
# 100次签名验证性能对比
传统方式: 0.0040秒 (每次重新解析证书)
优化方式: 0.0010秒 (使用智能缓存)
性能提升: 4.0倍,时间节省75.1%
# 实际生产环境测试
并发用户: 1000
平均响应时间: 50ms (vs 传统方式 200ms)
📦 安装
pip install senweaver-pay
依赖要求
- Python 3.7+
- requests
- cryptography
🎯 接口风格选择
SenWeaver Pay 提供两种接口风格,满足不同的开发需求:
🏗️ 类型化接口 (推荐)
- 适用场景:企业级应用、团队开发
- 优势:完整类型检查、IDE智能提示、参数验证
- 使用方法:
Pay.create()、Pay.query()、Pay.refund()、Pay.cancel()
# 创建类型化请求
request = PaymentRequest(
channel=PaymentChannel.ALIPAY,
method=PaymentMethod.WEB,
order=order,
extra_params={'scene': 'offline'}
)
response = Pay.create(request)
⚡ 简化接口
- 适用场景:快速原型、简单应用、向后兼容
- 优势:参数直接传入、代码简洁、易于上手
- 使用方法:
Pay.pay()
# 直接传入参数
response = Pay.pay(
channel="alipay",
method="web",
out_trade_no="ORDER_001",
total_amount="0.01",
subject="测试商品"
)
🚀 快速开始
1. 配置支付渠道
from senweaver_pay import Pay
from senweaver_pay.types import PaymentChannel, PaymentMethod, UnifiedOrder
# 配置支付渠道
config = {
"alipay": {
"default": {
"app_id": "2016082000295641",
"app_secret_cert": "your_private_key_here",
"app_public_cert_path": "/path/to/appCertPublicKey.crt",
"alipay_public_cert_path": "/path/to/alipayCertPublicKey_RSA2.crt",
"alipay_root_cert_path": "/path/to/alipayRootCert.crt",
"notify_url": "https://example.com/notify/alipay",
"return_url": "https://example.com/return/alipay",
"mode": "sandbox" # 或 "normal"
}
},
"wechat": {
"default": {
"mch_id": "1600314069",
"mch_secret_key": "your_v3_secret_key_here",
"mch_secret_cert": "/path/to/apiclient_key.pem",
"mch_public_cert_path": "/path/to/apiclient_cert.pem",
"notify_url": "https://example.com/notify/wechat",
"mp_app_id": "wx55955316af4ef13", # 公众号AppID
"mini_app_id": "wx55955316af4ef13", # 小程序AppID
"app_id": "wx55955316af4ef13", # APP的AppID
"mode": "normal"
}
}
}
# 初始化配置(v0.1.0 自动启用性能优化)
Pay.config(config)
# 🚀 智能证书缓存已启用,签名验证性能提升4-10倍
2. 统一支付接口
# 创建订单
order = UnifiedOrder(
out_trade_no="ORDER_20250702_001",
subject="测试商品",
body="这是一个测试商品",
total_amount=Decimal("0.01"),
notify_url="https://example.com/notify",
return_url="https://example.com/return"
)
# 支付宝网页支付
from senweaver_pay.types import PaymentRequest
request = PaymentRequest(
channel=PaymentChannel.ALIPAY,
method=PaymentMethod.WEB,
order=order,
app="default" # 多租户支持
)
response = Pay.create(request)
if response.success:
print(f"支付链接: {response.pay_url}")
else:
print(f"支付失败: {response.message}")
3. 查询订单
from senweaver_pay.types import QueryRequest
# 查询订单状态
query_request = QueryRequest(
channel=PaymentChannel.ALIPAY,
out_trade_no="ORDER_20250702_001",
app="default"
)
query_response = Pay.query(query_request)
if query_response.success:
print(f"订单状态: {query_response.status}")
print(f"支付金额: {query_response.total_amount}")
print(f"支付时间: {query_response.pay_time}")
4. 申请退款
from senweaver_pay.types import RefundRequest
# 申请退款
refund_request = RefundRequest(
channel=PaymentChannel.ALIPAY,
out_trade_no="ORDER_20250702_001",
out_refund_no="REFUND_20250702_001",
refund_amount=Decimal("0.01"),
refund_reason="用户申请退款",
app="default"
)
refund_response = Pay.refund(refund_request)
if refund_response.success:
print(f"退款成功: {refund_response.out_refund_no}")
5. 简化支付接口(Pay.pay)
# 简化的支付接口,支持直接传入参数
response = Pay.pay(
channel="alipay", # 支付渠道
method="web", # 支付方式
app="default", # 租户应用
out_trade_no="ORDER_20250702_001",
total_amount="0.01",
subject="测试商品",
body="这是一个测试商品",
notify_url="https://example.com/notify",
return_url="https://example.com/return"
)
if response.success:
print(f"支付链接: {response.pay_url}")
else:
print(f"支付失败: {response.message}")
# 微信小程序支付示例
response = Pay.pay(
channel="wechat",
method="mini",
app="default",
out_trade_no="ORDER_20250702_002",
total_amount="0.01",
subject="测试商品",
openid="oUpF8uMuAJO_M2pxb1Q9zNjWeS6o" # 微信openid
)
6. 处理回调通知
# 在你的Web框架中处理回调
def handle_notify(request):
try:
# 获取回调数据
headers = dict(request.headers)
body = request.body
form_data = dict(request.form)
# 获取支付渠道实例
alipay = Pay.get_channel("alipay")
# 处理回调
callback_response = alipay.callback(
headers=headers,
raw_body=body,
form_data=form_data
)
if callback_response.success:
# 验证成功,处理业务逻辑
print(f"订单号: {callback_response.out_trade_no}")
print(f"支付状态: {callback_response.status}")
# 返回成功响应
return alipay.success()
else:
# 验证失败
return "FAIL"
except Exception as e:
print(f"回调处理异常: {e}")
return "FAIL"
🏢 多租户支持
支持多个应用使用不同的配置:
config = {
"alipay": {
"default": {
"app_id": "2016082000295641",
# ... 默认配置
},
"app_a": {
"app_id": "2021001234567890",
# ... 应用A的配置
},
"app_b": {
"app_id": "2021009876543210",
# ... 应用B的配置
}
}
}
# 使用不同租户
request1 = PaymentRequest(channel=PaymentChannel.ALIPAY, method=PaymentMethod.WEB, order=order, app="default")
request2 = PaymentRequest(channel=PaymentChannel.ALIPAY, method=PaymentMethod.WEB, order=order, app="app_a")
request3 = PaymentRequest(channel=PaymentChannel.ALIPAY, method=PaymentMethod.WEB, order=order, app="app_b")
# 或者直接获取不同租户的实例
alipay_default = Pay.get_channel("alipay", "default") # 默认应用
alipay_app_a = Pay.get_channel("alipay", "app_a") # 应用A
alipay_app_b = Pay.get_channel("alipay", "app_b") # 应用B
# 便捷方法也支持租户参数
alipay_tenant_a = Pay.alipay("app_a") # 等同于 Pay.get_channel("alipay", "app_a")
wechat_tenant_b = Pay.wechat("app_b") # 等同于 Pay.get_channel("wechat", "app_b")
# 不同租户实例具有不同的配置和app属性
print(f"默认应用ID: {alipay_default.config.get('app_id')}") # 2016082000295641
print(f"应用A ID: {alipay_app_a.config.get('app_id')}") # 2021001234567890
print(f"应用B ID: {alipay_app_b.config.get('app_id')}") # 2021009876543210
print(f"默认应用名称: {alipay_default.app}") # default
print(f"应用A名称: {alipay_app_a.app}") # app_a
print(f"应用B名称: {alipay_app_b.app}") # app_b
🏢 企业级特性
⚡ 高性能架构
- 智能证书缓存:自动预加载和缓存证书对象,避免重复解析
- 并发友好:线程安全的缓存机制,支持高并发场景
- 内存优化:高效的对象复用,减少GC压力
- 性能监控:内置性能指标,便于监控和优化
🔐 安全特性
- 自动证书管理:微信支付证书自动下载和更新
- 签名验证优化:高性能签名验证,防止伪造请求
- 证书备份机制:本地证书备份,确保服务连续性
- 安全日志:详细的安全操作日志记录
🛡️ 可靠性保障
- 优雅降级:证书更新失败时使用备份证书
- 错误恢复:完善的异常处理和重试机制
- 状态一致性:统一的支付状态管理
- 事务安全:支持幂等操作,避免重复处理
📊 监控和运维
# v0.1.0 版本监控功能
# 加载和管理微信支付证书
wechat = Pay.get_channel("wechat")
certificates = wechat.load_certificates()
print(f"证书数量: {len(certificates)}")
print(f"证书序列号: {list(certificates.keys())}")
# 检查证书缓存状态
if hasattr(wechat, '_cert_update_time') and wechat._cert_update_time:
print(f"证书更新时间: {wechat._cert_update_time}")
# 统一的重新加载接口(所有渠道通用)
success = wechat.reload()
if success:
print("微信支付证书重新加载成功")
fresh_certificates = wechat.load_certificates()
print(f"重新加载证书完成: {len(fresh_certificates)} 个证书")
else:
print("微信支付证书重新加载失败")
# 带配置更新的重新加载
new_config = {
"mch_id": "1234567890",
"api_key": "new_api_key",
# 其他配置...
}
success = wechat.reload(config=new_config)
if success:
print("微信支付证书和配置重新加载成功")
# 其他渠道的重新加载示例
alipay = Pay.get_channel("alipay")
if alipay.reload():
print("支付宝证书/密钥重新加载成功")
# 带配置更新的重新加载
alipay_config = {
"app_id": "2021001234567890",
"private_key_path": "/path/to/new/private_key.pem",
# 其他配置...
}
if alipay.reload(config=alipay_config):
print("支付宝证书/密钥和配置重新加载成功")
unipay = Pay.get_channel("unipay")
if unipay.reload():
print("银联证书/密钥重新加载成功")
douyin = Pay.get_channel("douyin")
if douyin.reload():
print("抖音支付配置重新加载成功")
# 使用统一的 Pay.reload 方法
# 重新加载指定渠道
result = Pay.reload("wechat", "default")
print(f"微信支付重新加载结果: {result}")
# 重新加载指定渠道并更新配置
wechat_config = {
"mch_id": "1234567890",
"api_key": "new_api_key",
# 其他配置...
}
result = Pay.reload("wechat", "default", config=wechat_config)
print(f"微信支付重新加载结果: {result}")
# 重新加载所有已缓存的渠道
all_results = Pay.reload()
print(f"所有渠道重新加载结果: {all_results}")
# 重新加载所有已缓存的渠道并更新配置
common_config = {
"mode": "sandbox", # 切换到沙盒模式
"timeout": 30, # 更新超时时间
# 其他通用配置...
}
all_results = Pay.reload(config=common_config)
print(f"所有渠道重新加载结果: {all_results}")
📁 项目结构
senweaver-pay/
├── senweaver_pay/ # 核心库
│ ├── __init__.py # 主入口
│ ├── pay.py # 统一支付接口
│ ├── base.py # 基础类定义
│ ├── types.py # 类型定义和数据模型
│ ├── constants.py # 常量定义
│ ├── exceptions.py # 异常定义
│ └── channels/ # 支付渠道实现
│ ├── alipay/ # 支付宝
│ ├── wechat/ # 微信支付
│ ├── douyin/ # 抖音支付
│ └── unipay/ # 银联支付
└── examples/ # 使用示例
└── fastapi_example/ # FastAPI Web应用示例
📚 更多示例
查看 examples/ 目录获取更多使用示例:
- FastAPI Web应用示例 (
examples/fastapi_example/)- 完整的支付、查询、退款、回调处理流程
- 现代化的前端页面展示和交互
- 支持所有支付渠道的演示
🔧 开发和测试
# 克隆项目
git clone https://github.com/senweaver/senweaver-pay.git
cd senweaver-pay
# 安装依赖
pip install -r requirements.txt
# 代码格式化
ruff format .
ruff check --fix .
# 运行示例
cd examples/fastapi_example
python app.py
# v0.1.0 性能测试
python -c "
from senweaver_pay import Pay
import time
# 配置并初始化
config = {...} # 你的配置
Pay.config(config)
# v0.1.0 性能基准测试
start = time.time()
for i in range(100):
# 执行签名验证等操作(使用智能缓存)
pass
print(f'v0.1.0 - 100次操作耗时: {time.time() - start:.4f}秒')
print('性能提升: 相比传统方式提升4-10倍')
"
🤝 贡献
欢迎提交 Issue 和 Pull Request!
- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
🎯 开发路线图
v0.1.0 当前版本
- ✅ 统一支付接口:支持支付宝、微信支付、抖音支付、银联支付
- ✅ 类型化设计:完整的类型注解和请求响应模型
- ✅ 多租户支持:支持多应用配置管理
- ✅ 智能证书缓存:高性能证书管理和自动更新
- ✅ 企业级特性:完善的错误处理和监控能力
性能优化成果
| 优化项目 | 传统方式 | SenWeaver Pay | 性能提升 |
|---|---|---|---|
| 证书解析 | 每次重新解析 | 智能缓存 | 5-10倍 |
| 签名验证 | 0.004秒/100次 | 0.001秒/100次 | 4倍 |
| 内存使用 | 重复创建对象 | 高效复用 | 显著降低 |
| 并发性能 | 线性下降 | 线性扩展 | 质的飞跃 |
未来版本计划
- 🔄 v0.2.0:增加更多支付渠道支持
- 🔄 v0.3.0:增强监控和日志功能
- 🔄 v1.0.0:稳定版本发布
📄 许可证
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file senweaver_pay-0.1.0.tar.gz.
File metadata
- Download URL: senweaver_pay-0.1.0.tar.gz
- Upload date:
- Size: 68.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d139ac0e25b3db734906edc29f1b449f748dc95fe337486f2250b5eda33e4ba
|
|
| MD5 |
b0977bbf7c2208755eb7d41d75e8c847
|
|
| BLAKE2b-256 |
72ce34b4940d9cc7c9b7cf3591780da2a12c52029e2cb1337781486bd3c01327
|
Provenance
The following attestation bundles were made for senweaver_pay-0.1.0.tar.gz:
Publisher:
python-publish.yml on senweaver/senweaver-pay
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
senweaver_pay-0.1.0.tar.gz -
Subject digest:
3d139ac0e25b3db734906edc29f1b449f748dc95fe337486f2250b5eda33e4ba - Sigstore transparency entry: 301229589
- Sigstore integration time:
-
Permalink:
senweaver/senweaver-pay@d6d885d4b1d5fa208fef4fab1fe0580ea992908a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/senweaver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@d6d885d4b1d5fa208fef4fab1fe0580ea992908a -
Trigger Event:
release
-
Statement type:
File details
Details for the file senweaver_pay-0.1.0-py3-none-any.whl.
File metadata
- Download URL: senweaver_pay-0.1.0-py3-none-any.whl
- Upload date:
- Size: 69.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41dc299d35b87d34fafe7c96902e555d8f405324547fe06d691c865a66185075
|
|
| MD5 |
174cefa7acd4e33290a850fceaa5c547
|
|
| BLAKE2b-256 |
8c0bfbdaafcc32e8a59a1e87436afb88ec9179d2aed2d91329a73b9655f4e7d2
|
Provenance
The following attestation bundles were made for senweaver_pay-0.1.0-py3-none-any.whl:
Publisher:
python-publish.yml on senweaver/senweaver-pay
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
senweaver_pay-0.1.0-py3-none-any.whl -
Subject digest:
41dc299d35b87d34fafe7c96902e555d8f405324547fe06d691c865a66185075 - Sigstore transparency entry: 301229593
- Sigstore integration time:
-
Permalink:
senweaver/senweaver-pay@d6d885d4b1d5fa208fef4fab1fe0580ea992908a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/senweaver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@d6d885d4b1d5fa208fef4fab1fe0580ea992908a -
Trigger Event:
release
-
Statement type: