chore: initialize tuhui repository
This commit is contained in:
100
backend/app/ysm_sdk/pay.py
Normal file
100
backend/app/ysm_sdk/pay.py
Normal file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
发起支付模块
|
||||
"""
|
||||
|
||||
import json
|
||||
import time
|
||||
import random
|
||||
import string
|
||||
import asyncio
|
||||
from .api import YsmPayApi
|
||||
|
||||
def generate_nonce_str(length=10):
|
||||
"""生成随机字符串"""
|
||||
chars = string.ascii_letters + string.digits
|
||||
return ''.join(random.choice(chars) for _ in range(length))
|
||||
|
||||
async def create_payment(appid, appsecret, order_id, description, amount,
|
||||
notify_url, nopay_url, callback_url, pay_type=1):
|
||||
"""
|
||||
创建支付请求(异步)
|
||||
|
||||
Args:
|
||||
appid: 支付通道ID
|
||||
appsecret: 密钥
|
||||
order_id: 商户订单号
|
||||
description: 订单描述
|
||||
amount: 支付金额(单位:分)
|
||||
notify_url: 异步回调地址
|
||||
nopay_url: 未支付跳转地址
|
||||
callback_url: 支付成功跳转地址
|
||||
pay_type: 支付类型,默认为1(微信内)
|
||||
|
||||
Returns:
|
||||
str: 支付链接
|
||||
"""
|
||||
# 构造支付请求数据
|
||||
data = {
|
||||
'appid': appid, # 支付通道ID
|
||||
'mch_orderid': order_id, # 商户网站订单号
|
||||
'description': description, # 订单标题
|
||||
'total': amount, # 订单金额(分)
|
||||
'notify_url': notify_url, # 异步通知地址
|
||||
'nopay_url': nopay_url, # 未支付跳转地址
|
||||
'callback_url': callback_url, # 支付成功跳转地址
|
||||
'time': int(time.time()), # 时间戳
|
||||
'nonce_str': f"abc{int(time.time())}", # 随机字符串
|
||||
'payType': pay_type, # 支付类型
|
||||
}
|
||||
|
||||
# 生成签名
|
||||
data['sign'] = YsmPayApi.hash_sign(data, appsecret)
|
||||
|
||||
# 发起支付请求
|
||||
url = 'https://www.yishoumi.cn/u/payment' # 支付网关
|
||||
response = await YsmPayApi.http_post(url, json.dumps(data))
|
||||
|
||||
# 解析响应
|
||||
result = json.loads(response) if response else None
|
||||
|
||||
# 返回支付链接
|
||||
if result and 'url' in result:
|
||||
return result['url']
|
||||
else:
|
||||
# 返回错误信息以便调用者处理
|
||||
if result and 'msg' in result:
|
||||
raise Exception(f"支付创建失败: {result['msg']} (错误代码: {result.get('code', 'unknown')})")
|
||||
else:
|
||||
raise Exception("支付创建失败: 无响应或响应格式错误")
|
||||
|
||||
async def main():
|
||||
# 示例使用
|
||||
appid = 'YSMcd16b45d' # 支付通道ID
|
||||
appsecret = '899850e778e8d2b53e4c4a4e88695688' # AppSecret
|
||||
|
||||
# 生成订单号
|
||||
order_id = f"123321{int(time.time())}"
|
||||
|
||||
# 创建支付
|
||||
pay_url = await create_payment(
|
||||
appid=appid,
|
||||
appsecret=appsecret,
|
||||
order_id=order_id,
|
||||
description="快充数据线",
|
||||
amount=100, # 1元
|
||||
notify_url="http://abc.com/notify.php",
|
||||
nopay_url="http://abc.com/notify.php",
|
||||
callback_url="http://abc.com/notify.php",
|
||||
pay_type=1 # 微信内支付
|
||||
)
|
||||
|
||||
if pay_url:
|
||||
print(f"支付链接: {pay_url}")
|
||||
else:
|
||||
print("创建支付失败")
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user