python调用国税乐企直连接口开数电票之API调用工具类
背景
ERP直连国税平台开数电票,涉及到预赋码下载,额度查询,风险信息查询等等步骤, 实现一个接口调用的工具类,统一管理加密,调用,异常返回工具类,方便其他脚本使用.
直接上代码
# 文件: lq_request_util.py
# encoding: utf-8
# @author: Evan#chengwenit.com
# 乐企接口调用工具类import requests
import json
from cjc_sm4_encrypt import SM4ECBUtilsclass LQRequestUtil:def __init__(self, base_url, headers, key):"""初始化请求工具类:param base_url: 基础URL地址:param headers: 请求头信息:param key: SM4加密使用的十六进制密钥"""self.base_url = base_urlself.headers = headers.copy()self.key = keydef 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 + endpointencrypted_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_resultreturn response_json