# -*- coding: utf-8 -*- import logging import json import requests from odoo import api, fields, models, _ URL_ROOT = 'https://qyapi.weixin.qq.com' _logger = logging.getLogger(__name__) class WeComApi(models.Model): _name = "wecom.api" _description = "企业微信的请求api" name = fields.Char("api名称", required=True) category = fields.Selection( [ ("1", "基础"), ("2", "通讯录"), ("3", "客户联系"), ("4", "微信客服"), ("5", "身份验证"), ("6", "应用管理"), ("7", "消息推送"), ("8", "媒体素材"), ("9", "OA"), ("10", "效率工具"), ("11", "企业支付"), ("12", "企业互联"), ("13", "企业链,上下游"), ("14", "会话内容存档"), ("15", "电子发票"), ("16", "家校沟通"), ("17", "家校应用"), ("18", "政民沟通"), ], string="请求分类", default="1", ) function = fields.Char("请求方法", required=True, readonly=True) request_url = fields.Char("请求地址", required=True) request_type = fields.Selection( [("GET", "GET"), ("POST", "POST")], string="请求类型", required=True, default="GET", ) sequence = fields.Integer(default=0) _sql_constraints = [ ("function_uniq", "unique (function)", "请求方法唯一 !"), ] def http_request_url(self, data, access_token=None): """ api请求方法 :param data: 请求数据 :param access_token: 密钥 :param app_name: 密钥的app名称 :return: 请求结果 """ self.ensure_one() request_url = self.request_url # 替换ACCESS_TOKEN if "ACCESS_TOKEN" in request_url: request_url = request_url.replace("ACCESS_TOKEN", access_token) # 拼接root组装url url = URL_ROOT + request_url # url = URL_ROOT + request_url + "&debug=1" # 根据请求类型请求信息 if self.request_type == 'POST': result = requests.post(url=url, data=json.dumps(data)) else: result = requests.get(url=url, params=data) return result def function_get_access_token(self, data): """ 获取密钥 :param data: :return: access_token """ wecom_api = self.search([('function', '=', 'GET_ACCESS_TOKEN')], limit=1) response_result = wecom_api.http_request_url(data) if response_result.status_code != 200: _logger.error('获取token异常,异常:{0}'.format(str(response_result.json()))) # 获取返回的信息 response = json.loads(response_result.content) access_token = response.get("access_token", None) return access_token def function_http_request(self, function, data, access_token): """ 根据方法获取到请求的参数和返回结果 :param function: :param data: :param access_token: :return: """ wecom_api = self.search([('function', '=', function)], limit=1) response = wecom_api.http_request_url(data, access_token) response = json.loads(response.content) return response