Files
test/sg_wechat_enterprise/models/we_tools.py
2024-07-10 15:58:47 +08:00

90 lines
2.9 KiB
Python

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)