Files
tuhui/backend/app/ysm_sdk/pay.py
2026-03-08 19:28:32 +08:00

100 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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())