#!/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())