chore: initialize tuhui repository
This commit is contained in:
210
backend/app/ysm_sdk/tmp/demo.py
Normal file
210
backend/app/ysm_sdk/tmp/demo.py
Normal file
@@ -0,0 +1,210 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
易收米支付SDK使用演示
|
||||
|
||||
这个demo展示了如何使用易收米支付SDK的各个功能:
|
||||
1. 创建支付订单
|
||||
2. 查询订单状态
|
||||
3. 处理支付回调
|
||||
|
||||
运行前请确保安装依赖:
|
||||
pip install aiohttp fastapi uvicorn
|
||||
|
||||
使用方法:
|
||||
python demo.py
|
||||
"""
|
||||
|
||||
import json
|
||||
import time
|
||||
import asyncio
|
||||
from pay import create_payment
|
||||
from query import query_order
|
||||
from notify import PaymentNotify
|
||||
|
||||
class YsmPayDemo:
|
||||
"""易收米支付演示类"""
|
||||
|
||||
def __init__(self):
|
||||
# 配置信息 - 请替换为你的真实配置
|
||||
self.appid = 'YSMcd16b45d' # 支付通道ID
|
||||
self.appsecret = '899850e778e8d2b53e4c4a4e88695688' # AppSecret
|
||||
|
||||
# 回调地址配置
|
||||
self.notify_url = "http://your-domain.com/notify"
|
||||
self.nopay_url = "http://your-domain.com/cancel"
|
||||
self.callback_url = "http://your-domain.com/success"
|
||||
|
||||
async def demo_create_payment(self):
|
||||
"""演示创建支付订单"""
|
||||
print("\n=== 创建支付订单演示 ===")
|
||||
|
||||
# 生成唯一订单号
|
||||
order_id = f"demo_{int(time.time())}"
|
||||
|
||||
try:
|
||||
# 创建支付
|
||||
pay_url = await create_payment(
|
||||
appid=self.appid,
|
||||
appsecret=self.appsecret,
|
||||
order_id=order_id,
|
||||
description="演示商品 - 快充数据线",
|
||||
amount=100, # 1元 = 100分
|
||||
notify_url=self.notify_url,
|
||||
nopay_url=self.nopay_url,
|
||||
callback_url=self.callback_url,
|
||||
pay_type=1 # 微信内支付
|
||||
)
|
||||
|
||||
if pay_url:
|
||||
print(f"✅ 支付订单创建成功")
|
||||
print(f"📋 订单号: {order_id}")
|
||||
print(f"💰 金额: 1.00元")
|
||||
print(f"🔗 支付链接: {pay_url}")
|
||||
return order_id, pay_url
|
||||
else:
|
||||
print("❌ 支付订单创建失败")
|
||||
return None, None
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 创建支付时出错: {str(e)}")
|
||||
return None, None
|
||||
|
||||
async def demo_query_order(self, order_id):
|
||||
"""演示查询订单状态"""
|
||||
print(f"\n=== 查询订单状态演示 ===")
|
||||
print(f"🔍 查询订单: {order_id}")
|
||||
|
||||
try:
|
||||
# 查询订单
|
||||
order_info = await query_order(
|
||||
appid=self.appid,
|
||||
mch_orderid=order_id
|
||||
)
|
||||
|
||||
if order_info:
|
||||
print("✅ 订单查询成功")
|
||||
print(f"📊 订单信息:")
|
||||
print(json.dumps(order_info, ensure_ascii=False, indent=2))
|
||||
|
||||
# 解析订单状态
|
||||
state = order_info.get('state', 'UNKNOWN')
|
||||
status_map = {
|
||||
'SUCCESS': '✅ 支付成功',
|
||||
'REFUND': '🔄 转入退款',
|
||||
'NOTPAY': '⏳ 未支付',
|
||||
'CLOSED': '❌ 已关闭',
|
||||
}
|
||||
|
||||
# 检查是否是错误响应
|
||||
if 'code' in order_info and order_info.get('code') == 'ORDER_NOT_EXIST':
|
||||
print(f"💡 订单状态: ⚠️ 订单不存在(演示订单,正常现象)")
|
||||
else:
|
||||
print(f"💡 订单状态: {status_map.get(state, f'未知状态({state})')}")
|
||||
|
||||
return order_info
|
||||
else:
|
||||
print("❌ 订单查询失败")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 查询订单时出错: {str(e)}")
|
||||
return None
|
||||
|
||||
async def demo_payment_notify(self):
|
||||
"""演示支付回调处理"""
|
||||
print(f"\n=== 支付回调处理演示 ===")
|
||||
|
||||
# 模拟支付成功的回调数据
|
||||
mock_notify_data = {
|
||||
"appid": self.appid,
|
||||
"mch_orderid": "demo_1234567890",
|
||||
"ysm_orderid": "YSM20240101123456",
|
||||
"total": 100,
|
||||
"state": "SUCCESS",
|
||||
"time": int(time.time()),
|
||||
"nonce_str": "abc123456"
|
||||
}
|
||||
|
||||
# 添加签名
|
||||
from api import YsmPayApi
|
||||
mock_notify_data['hash'] = YsmPayApi.hash_sign(mock_notify_data, self.appsecret)
|
||||
|
||||
print(f"📨 模拟回调数据:")
|
||||
print(json.dumps(mock_notify_data, ensure_ascii=False, indent=2))
|
||||
|
||||
# 创建通知处理器
|
||||
notify_handler = PaymentNotify(self.appid, self.appsecret)
|
||||
|
||||
# 处理回调
|
||||
try:
|
||||
# 使用异步调用
|
||||
success, message = await notify_handler.process(mock_notify_data)
|
||||
|
||||
if success:
|
||||
print(f"✅ 回调处理成功: {message}")
|
||||
else:
|
||||
print(f"❌ 回调处理失败: {message}")
|
||||
|
||||
return success, message
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 处理回调时出错: {str(e)}")
|
||||
return False, str(e)
|
||||
|
||||
def demo_payment_types(self):
|
||||
"""演示不同支付类型"""
|
||||
print(f"\n=== 支付类型说明 ===")
|
||||
|
||||
payment_types = {
|
||||
1: "微信内支付 - 适用于在微信内打开的页面",
|
||||
2: "微信扫码支付 - 生成二维码供用户扫码支付",
|
||||
3: "微信H5支付 - 适用于手机浏览器(非微信内)",
|
||||
11: "支付宝H5支付 - 适用于手机浏览器跳转支付宝"
|
||||
}
|
||||
|
||||
for pay_type, description in payment_types.items():
|
||||
print(f"💳 pay_type={pay_type}: {description}")
|
||||
|
||||
async def run_full_demo(self):
|
||||
"""运行完整演示"""
|
||||
print("🚀 易收米支付SDK演示开始")
|
||||
print("=" * 50)
|
||||
|
||||
# 显示配置信息
|
||||
print(f"📋 当前配置:")
|
||||
print(f" AppID: {self.appid}")
|
||||
print(f" AppSecret: {self.appsecret[:8]}***{self.appsecret[-8:]}")
|
||||
|
||||
# 1. 演示支付类型
|
||||
self.demo_payment_types()
|
||||
|
||||
# 2. 创建支付订单
|
||||
order_id, pay_url = await self.demo_create_payment()
|
||||
|
||||
if order_id:
|
||||
# 3. 查询订单状态
|
||||
await self.demo_query_order(order_id)
|
||||
|
||||
# 4. 演示回调处理
|
||||
await self.demo_payment_notify()
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("✅ 演示完成")
|
||||
|
||||
# 提示用户
|
||||
if pay_url:
|
||||
print(f"\n💡 提示:")
|
||||
print(f" 1. 可以访问支付链接进行测试: {pay_url}")
|
||||
print(f" 2. 支付成功后可以再次查询订单状态")
|
||||
print(f" 3. 实际使用时请替换为真实的回调地址")
|
||||
|
||||
async def main():
|
||||
"""主函数"""
|
||||
demo = YsmPayDemo()
|
||||
await demo.run_full_demo()
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 运行演示
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user