90 lines
2.9 KiB
Python
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)
|