from odoo import api, models, exceptions from odoo.http import request import logging import hashlib import base64 import time import requests _logger = logging.getLogger(__name__) class WechatEnterpriseTools(models.Model): """ 微信企业号工具类 """ _name = 'we.tools' _description = '微信企业号工具类' def get_media(self, media_id): """ 通过media_id 获取媒体文件 :param media_id: media id :return: """ wechat = self.env['we.config'].sudo().get_wechat() try: media = wechat.media.download(media_id=media_id) return { 'errcode': 0, 'errmsg': 'ok', 'media': media.content } except Exception as ex: _logger.info(u'get media fail, message: {str(ex)}.') return { 'errcode': 30001, 'errmsg': str(ex) } def get_jsapi_ticket(self): """ 获取jsapi_ticket :return: """ if request.session.get('ticket') and request.session.get('ticket_time') \ and int(time.time()) - request.session['ticket_time'] <= 7000: return { 'errcode': 0, 'errmsg': 'ok', 'ticket': request.session['ticket'] } wechat = self.env['we.config'].sudo().get_wechat() get_token = wechat.fetch_access_token() if get_token['errcode'] == 0 and get_token['errmsg'] == 'ok': access_token = get_token['access_token'] url = u'https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token={access_token}' response = requests.get(url).json() if response['errcode'] == 0 and response['errmsg'] == 'ok': request.session['ticket'] = response['ticket'] request.session['ticket_time'] = int(time.time()) return response return { "errcode": 10002, "errmsg": "get ticket fail." } def check_message_signature(self, message_list, msg_signature): """ 校验消息的正确性 :param message_list: 消息列表 (list: token, timestamp, nonce, echo_string) :param msg_signature: 签名 :return: true or false """ _logger.info(u'check message signature.') message_list.sort() message_str = "".join(message_list) sha1_message = hashlib.sha1(str(message_str).encode('utf-8')).hexdigest() if sha1_message == msg_signature: return True return False def decode_echo_str(self, echo_str): """ 解密echo string 得到明文内容 :param echo_str: 加密字符串 :return: message """ _logger.info(u'decode echo string.') base64_str = base64.b64decode(echo_str)