Python3 對接微信

# -*- coding: utf-8 -*-
from wechatpy import WeChatClient
import time
import requests
import hashlib
import random
import string


class wxJdkParmasView(object):
    ''' 1, 此處官方文檔明確提到用戶需要緩存jsapi_ticket
           因爲其api調用次數非常有限,根據文檔說明我把獲取基礎支持的acess_token和ticket寫到了一起

        2, 此類是給前端js_JDK構造參數,並得到 nonceStr,signature,timestamp 的類,調用signutareEncryption()即可

        3, signature生成需要一下幾個參數noncestr(隨機字符串),
           有效的jsapi_ticket, timestamp(時間戳),
           url(當前網頁的URL,不包含#及其後面部分)
    '''

    def __init__(self, url):

        # app_id
        self.app_id = "***********"
        # nonceStr
        self.app_secret = "********************"
        self.client = WeChatClient(self.app_id, self.app_secret)
        # 獲取access_token鏈接
        # https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
        self.base_get_access_token = self.client.fetch_access_token()
        # 獲取ticket鏈接
        # https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
        self.get_ticket_url = self.client.jsapi.get_jsapi_card_ticket()
        print(self.get_ticket_url)
        # 生成signature的參數
        self.ret = {
            'nonceStr': self.__create_nonce_str(),
            'timestamp': self.__create_timestamp(),
            # 'jsapi_ticket': self.__get_ticket(),
            'jsapi_ticket': self.get_ticket_url,
            'url': url
        }
        self.signutareEncryption()

    def get_access_token(self):
        '''從微信端獲取access_token'''
        try:
            access_token = requests.get(self.base_get_access_token).json()['access_token']
            # access_token = "23_oZS_nQaKMC5UjbfzDJ48Jsaz6hPhLjWg3pVDCd2tva1hM19nQTdimLH-Dn-Hy0da2NDFdgM0AvKkkR48WKBUwTQkjRJLl2PAD0ZcKgpvIw9Qn3vWBI6B6YDYnm4T-UnOfn7Hj-x_B_ZCHNnVKLUeACAYZI"
            # 緩存並設置過期時間
            # cache.set(key, access_token, 110 * 60)
            return access_token
        except:
            return "獲取access_token異常"

    def __get_ticket(self):
        '''獲取tickey'''
        try:
            access_token = self.get_access_token()
            # 獲取ticket
            ticket = requests.get(self.get_ticket_url.format(access_token)).json()['ticket']
            return ticket
        except:
            return "獲取tickey異常"

    def __create_nonce_str(self):
        '''從a-zA-Z0-9生成指定數量的隨機字符'''

        return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))

    def __create_timestamp(self):
        '''生成時間戳'''

        return int(time.time())

    def signutareEncryption(self):
        '''生成簽名signature'''

        string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)]).encode('utf-8')
        signature = hashlib.sha1(string).hexdigest()
        # 返回js_jdk參數
        response = dict()
        response['signature'] = signature
        response['timestamp'] = self.ret.get('timestamp')
        response['nonce']=self.ret.get('nonceStr')
        response['appid'] = self.app_id
        return response

if __name__ == '__main__':
    print(wxJdkParmasView('https://blog.csdn.net/GodLordGee/article/details/89382886').signutareEncryption())


import time
import requests
import hashlib
import random
import string


class wxJdkParmasView(object):
    ''' 1, 此處官方文檔明確提到用戶需要緩存jsapi_ticket
           因爲其api調用次數非常有限,根據文檔說明我把獲取基礎支持的acess_token和ticket寫到了一起

        2, 此類是給前端js_JDK構造參數,並得到 nonceStr,signature,timestamp 的類,調用signutareEncryption()即可

        3, signature生成需要一下幾個參數noncestr(隨機字符串),
           有效的jsapi_ticket, timestamp(時間戳),
           url(當前網頁的URL,不包含#及其後面部分)
    '''

    def __init__(self, url):

        # app_id
        self.app_id = "************"
        # nonceStr
        self.app_secret = "*****************"
        # 獲取access_token鏈接
        # https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
        self.base_get_access_token = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.format(self.app_id, self.app_secret)
        # 獲取ticket鏈接
        # https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
        self.get_ticket_url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={}&type=jsapi'
        # 生成signature的參數
        self.ret = {
            'nonceStr': self.__create_nonce_str(),
            'timestamp': self.__create_timestamp(),
            'jsapi_ticket': self.__get_ticket(),
            'url': url
        }
        self.signutareEncryption()

    def get_access_token(self):
        '''從微信端獲取access_token'''
        try:
            access_token = requests.get(self.base_get_access_token).json()['access_token']
            # access_token = "23_oZS_nQaKMC5UjbfzDJ48Jsaz6hPhLjWg3pVDCd2tva1hM19nQTdimLH-Dn-Hy0da2NDFdgM0AvKkkR48WKBUwTQkjRJLl2PAD0ZcKgpvIw9Qn3vWBI6B6YDYnm4T-UnOfn7Hj-x_B_ZCHNnVKLUeACAYZI"
            # 緩存並設置過期時間
            # cache.set(key, access_token, 110 * 60)
            return access_token
        except:
            return "獲取access_token異常"

    def __get_ticket(self):
        '''獲取tickey'''
        try:
            access_token = self.get_access_token()
            # 獲取ticket
            ticket = requests.get(self.get_ticket_url.format(access_token)).json()['ticket']
            print(ticket)
                # print("Redis中保存ticketA正常%s"%cache.get('ticket'))

            return ticket
        except:
            return "獲取tickey異常"

    def __create_nonce_str(self):
        '''從a-zA-Z0-9生成指定數量的隨機字符'''

        return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))

    def __create_timestamp(self):
        '''生成時間戳'''

        return int(time.time())

    def signutareEncryption(self):
        '''生成簽名signature'''

        string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)]).encode('utf-8')
        signature = hashlib.sha1(string).hexdigest()
        # 返回js_jdk參數
        response = dict()
        response['signature'] = signature
        response['timestamp'] = self.ret.get('timestamp')
        response['nonce']=self.ret.get('nonceStr')
        response['appid'] = self.app_id
        return response

if __name__ == '__main__':
    print(wxJdkParmasView('https://blog.csdn.net/GodLordGee/article/details/89382886').signutareEncryption())

http://docs.wechatpy.org/zh_CN/master/client/jsapi.html WechatPy

https://www.cnblogs.com/ifme/p/11796705.html 微信JSSdk實現分享功能

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 微信官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章