chore: initialize tuhui repository
This commit is contained in:
69
backend/app/ysm_sdk/api.py
Normal file
69
backend/app/ysm_sdk/api.py
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import hashlib
|
||||
import aiohttp
|
||||
|
||||
class YsmPayApi:
|
||||
"""易收米支付API工具类"""
|
||||
|
||||
@staticmethod
|
||||
async def http_post(url, data):
|
||||
"""
|
||||
发送异步HTTP POST请求
|
||||
|
||||
Args:
|
||||
url: 请求地址
|
||||
data: 请求数据(JSON字符串)
|
||||
|
||||
Returns:
|
||||
str: 响应内容
|
||||
"""
|
||||
headers = {
|
||||
'Content-Type': 'application/json; charset=UTF-8',
|
||||
'Accept': 'application/json',
|
||||
'User-Agent': '*/*',
|
||||
'Authorization': 'WECHATPAY2-SHA256-RSA2048 '
|
||||
}
|
||||
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.post(url, data=data, headers=headers, ssl=False, timeout=30) as response:
|
||||
return await response.text()
|
||||
except Exception as e:
|
||||
print(f"Error: {str(e)}")
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def hash_sign(data, secret):
|
||||
"""
|
||||
生成签名
|
||||
|
||||
Args:
|
||||
data: 要签名的数据字典
|
||||
secret: 密钥
|
||||
|
||||
Returns:
|
||||
str: 签名字符串
|
||||
"""
|
||||
# 按键名升序排序
|
||||
sorted_data = dict(sorted(data.items()))
|
||||
|
||||
# 构造签名字符串
|
||||
sign_str = ""
|
||||
for key, value in sorted_data.items():
|
||||
# 跳过hash字段和空值
|
||||
if key == 'hash' or value is None or value == '':
|
||||
continue
|
||||
|
||||
# 添加分隔符
|
||||
if sign_str:
|
||||
sign_str += '&'
|
||||
|
||||
# 拼接键值对
|
||||
sign_str += f"{key}={value}"
|
||||
|
||||
# 添加密钥并计算SHA256哈希
|
||||
sign_str += secret
|
||||
return hashlib.sha256(sign_str.encode('utf-8')).hexdigest()
|
||||
Reference in New Issue
Block a user