图像

微信公众号第三方平台开发python教程 Part 5

github地址:cppfun@wechat-open-third-party-dev
在开始本节之前,你需要先阅读前四节的内容:
微信公众号第三方平台开发python教程 Part 1
微信公众号第三方平台开发python教程 Part 2
微信公众号第三方平台开发python教程 Part 3
微信公众号第三方平台开发python教程 Part 4
本节第五讲,我们讲讲如何刷新token(刷新授权公众号的接口调用令牌)。

这个其实就更简单了,代码如下:

    def get_refresh_authorizer_access_token(self, authorizer_appid, authorizer_refresh_token):
        url = 'https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=%s' \
              % self.get_com_access_token()
        payload = {
            "component_appid": self.component_appid,
            "authorizer_appid": authorizer_appid,
            "authorizer_refresh_token": authorizer_refresh_token
        }
        headers = {'content-type': 'application/json'}
        response = requests.post(url, data=json.dumps(payload), headers=headers)
        return response.json()

这里需要两个参数:

# authorizer_appid 
# 授权方appid
# authorizer_refresh_token 
# 授权方的刷新令牌,刷新令牌主要用于公众号第三方平台获取和刷新已授权用户的access_token,只会在授权时刻提供,请妥善保存。
# 我们一般将其保存在数据库中,因为你授权的公众号不止一个

现在我们看看我们的class WxOpenSDK,其代码如下:

class WxOpenCallback:
    def __init__(self):
        self.token = token

    def check_signature(self, pams):
        if not self.token:
            return HttpResponse('TOKEN is not defined!')

        msg_signature = pams.get('msg_signature', '')
        timestamp = pams.get('timestamp', '')
        nonce = pams.get('nonce', '')
        tmparr = [self.token, timestamp, nonce]
        tmparr.sort()
        string = ''.join(tmparr)
        string = hashlib.sha1(string).hexdigest()
        # print signature
        # print string
        return msg_signature == string


class WxOpenSDK:
    def __init__(self, ticket):
        self.component_appid = component_appid
        self.component_appsecret = component_appsecret
        self.ticket = ticket
  # something below...
    def get_com_access_token(self):
        # load file
        json_file = open('com_access_token.json')
        data = json.load(json_file)
        json_file.close()

        component_access_token = data['component_access_token']

        now = time.time()
        if data['expire_time'] < now:
            url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token"
            payload = {'component_appid': self.component_appid,
                   'component_appsecret': self.component_appsecret,
                   'component_verify_ticket': self.ticket}
            headers = {'content-type': 'application/json'}
            response = requests.post(url, data=json.dumps(payload), headers=headers)
            component_access_token = json.loads(response.text)['component_access_token']
            data['component_access_token'] = component_access_token
            data['expire_time'] = int(now) + 7000
            # save file
            json_file = open('com_access_token.json', 'w')
            json_file.write(json.dumps(data))
            json_file.close()

        return component_access_token

    def get_pre_auth_code(self):
        # load file
        json_file = open('pre_auth_code.json')
        data = json.load(json_file)
        json_file.close()

        pre_auth_code = data['pre_auth_code']
        now = time.time()
        if data['expire_time'] < now:
            url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=%s"\
                  % self.get_com_access_token()
            payload = {'component_appid': self.component_appid}
            headers = {'content-type': 'application/json'}
            response = requests.post(url, data=json.dumps(payload), headers=headers)
            pre_auth_code = json.loads(response.text)['pre_auth_code']
            data['pre_auth_code'] = pre_auth_code
            data['expire_time'] = int(now) + 1100
            # save file
            json_file = open('pre_auth_code.json', 'w')
            json_file.write(json.dumps(data))
            json_file.close()

        return pre_auth_code

    def get_authorization_info(self, authorization_code):
        url = 'https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=%s' \
              % self.get_com_access_token()
        payload = {
            "component_appid": self.component_appid,
            "authorization_code": authorization_code
        }
        headers = {'content-type': 'application/json'}
        response = requests.post(url, data=json.dumps(payload), headers=headers)
        data = response.json()
        return data['authorization_info']

    def get_refresh_authorizer_access_token(self, authorizer_appid, authorizer_refresh_token):
        url = 'https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token?component_access_token=%s' \
              % self.get_com_access_token()
        payload = {
            "component_appid": self.component_appid,
            "authorizer_appid": authorizer_appid,
            "authorizer_refresh_token": authorizer_refresh_token
        }
        headers = {'content-type': 'application/json'}
        response = requests.post(url, data=json.dumps(payload), headers=headers)
        return response.json()

接下来,我们会进行第六节

发表评论