背景
ERP直连国税平台开数电票,涉及到预赋码下载,额度查询,风险信息查询等等步骤, 实现一个接口调用的工具类,统一管理加密,调用,异常返回工具类,方便其他脚本使用.
直接上代码
# 文件: lq_request_util.py
# encoding: utf-8
# @author: Evan#chengwenit.com
# 乐企接口调用工具类
import requests
import json
from cjc_sm4_encrypt import SM4ECBUtils
class LQRequestUtil:
def __init__(self, base_url, headers, key):
"""
初始化请求工具类
:param base_url: 基础URL地址
:param headers: 请求头信息
:param key: SM4加密使用的十六进制密钥
"""
self.base_url = base_url
self.headers = headers.copy()
self.key = key
def encrypt(self, data_dict):
"""
将字典转换为JSON字符串并进行SM4加密
:param data_dict: 明文字典
:return: 加密后的Base64字符串
"""
plain_text = json.dumps(data_dict, ensure_ascii=False)
return SM4ECBUtils.encrypt_ecb(self.key, plain_text)
def decrypt(self, cipher_base64):
"""
解密返回的加密数据
:param cipher_base64: Base64格式的加密字符串
:return: 解密后的字典对象
"""
decrypted_json = SM4ECBUtils.decrypt_ecb(self.key, cipher_base64)
return json.loads(decrypted_json)
def post(self, endpoint, data_dict, verify_ssl=False):
"""
发送POST请求并处理加解密逻辑
:param endpoint: 接口路径(拼接在base_url之后)
:param data_dict: 要发送的明文数据字典
:param verify_ssl: 是否验证SSL证书
:return: 解密后的响应数据字典
"""
full_url = self.base_url + endpoint
encrypted_data = self.encrypt(data_dict)
response = requests.post(
full_url,
headers=self.headers,
data=encrypted_data,
verify=verify_ssl
)
if response.status_code != 200:
return(f"HTTP请求失败,状态码:{response.status_code}")
# 如果有data则解密,没有data直接返回
response_json = json.loads(response.json()["body"])["Response"]
encrypted_result = response_json.get("Data")
if encrypted_result is not None:
decrypted_result = self.decrypt(encrypted_result)
response_json["Data"] = decrypted_result
return response_json