Python3 对接微信

本文详细介绍了如何使用Python实现微信JS-SDK签名的生成过程,包括获取access_token、jsapi_ticket,以及生成nonceStr、timestamp等参数,最后通过SHA1算法生成signature。
部署运行你感兴趣的模型镜像
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 = "xxxxxxx"
        # nonceStr
        self.app_secret = "xxxxxxxxxx"
        # 获取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.youkuaiyun.com/GodLordGee/article/details/89382886').signutareEncryption())

# -*- 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 = "xxxxxxxxxx"
        # nonceStr
        self.app_secret = "xxxxxxxxxxxxxxxxx"
        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.youkuaiyun.com/GodLordGee/article/details/89382886').signutareEncryption())


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

https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Online_API_calls.html

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 使用 Python 的 itchat 库对接微信 #### 安装 itchat 库 为了能够使用 `itchat` 进行操作,首先需要安装该库。可以通过 pip 工具轻松完成这一过程。 ```bash pip install itchat ``` #### 登录并保持会话 登录到微信账户是使用 `itchat` 的第一步。下面展示了如何自动登录以及保存登录状态以便后续调用[^1]: ```python import itchat # 自动回复文本消息给好友 @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): return 'This is an automatic reply.' if __name__ == '__main__': # 扫描二维码登录 itchat.auto_login(hotReload=True) # 开始监听消息 itchat.run() ``` 这段代码实现了扫描二维码登录的功能,并设置了当收到文字类消息时返回预定义的文字作为回应。 #### 获取联系人列表 一旦成功登录之后,就可以利用 `get_friends()` 方法获取当前用户的全部好友信息。 ```python friends = itchat.get_friends(update=False)[0:] for friend in friends: print(friend['NickName']) ``` 此段脚本遍历了所有的好友昵称并打印出来。 #### 发送消息至特定聊天对象 除了接收和响应来自朋友的消息外,还可以主动向某个具体的聊天伙伴发送消息。这里提供了一个简单的例子说明怎样做到这一点[^2]。 ```python userName = itchat.search_friends(name='目标用户名')[0]['UserName'] itchat.send_msg('你好', toUserName=userName) ``` 上述命令中,先通过名字查找对应用户的身份标识符 (`UserName`) ,再以此为基础构建一条新消息传递过去。 #### 实现定时任务功能 对于一些场景下可能存在的周期性通知需求,则可以借助第三方调度器如 `schedule` 或者直接运用多线程机制来安排固定时间间隔的任务执行计划。 ```python import schedule import time def job(): userName = itchat.search_friends(name='目标用户名')[0]['UserName'] itchat.send_msg('这是每天一次的提醒', toUserName=userName) schedule.every().day.at("10:30").do(job) while True: schedule.run_pending() time.sleep(1) ``` 在这个案例里,程序被设定成每日上午十点半准时触发函数 `job()` 向指定的人发送问候语句。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值