精华内容
下载资源
问答
  • 微信公众号 Token验证失效 问题

    千次阅读 2020-10-17 16:58:43
    最近在学习微信公众号的时候遇到了一个问题:Token验证失效 话不说,看代码:handle.py import hashlib import web class Handle(object): def GET(self): try: data = web.input() if len(data) == 0: ...

    最近在学习微信公众号的时候遇到了一个问题:Token验证失效

    话不多说,看代码:handle.py

    import hashlib
    import web
    
    
    class Handle(object):
        def GET(self):
            try:
                data = web.input()
                if len(data) == 0:
                    return "hello, this is handle view"
                # 微信服务器获取到的数据
                # 生成方式是将nonce、timestamp和token(也就是我们在网页中配置的TOKNE)
                # 三个字符串按照字典序排序后,对排序后得到的字符串数组使用哈希加密算法得到。
                signature = data.signature
                # 时间戳
                timestamp = data.timestamp
                # 随机数
                nonce = data.nonce
                # 随机数,我们将所得到的参数,按前面的方式生成生成hashcode,将其与signature进行比对,
                # 若相等返回echostr,否则返回空
                echostr = data.echostr
                token = "xxxx"  # 请按照公众平台官网\基本配置中信息填写
    
                list = [token, timestamp, nonce]
                # 按字典顺序排序
                list.sort()
                # 哈希算法加密list得到hashcode
                sha1 = hashlib.sha1()
      
              	# 注释掉
              	# map(sha1.update, list)
              
                # 新增代码
                sha1.update(list[0].encode('utf-8'))
                sha1.update(list[1].encode('utf-8'))
                sha1.update(list[2].encode('utf-8'))
                
                hashcode = sha1.hexdigest()
                print("handle/GET func: hashcode, signature: ", hashcode, signature)
                # 验证是否相等
                if hashcode == signature:
                    return echostr
                else:
                    return ""
            except Exception as Argument:
                return Argument
    
    

    官网用的是python2.7,我本地装的是python3。自己也忽视了map()函数的不同,搞了半天也没找到错误在哪里,后来晚上看到这篇文章,终于解决了。
    在此记录一下,希望对你们有所帮助。

    展开全文
  • 使用ngrok做微信公众号token验证

    千次阅读 2018-06-28 20:10:34
    公司要做微信开发,需要在本地配置开发环境,使用的是ngrok,以前用的花生壳...2. 配置微信公众号服务器(如下图,token随便写) 3.参照微信开发文档,进行验证   完整代码: <?php /**  * wechat ...

            公司要做微信开发,需要在本地配置开发环境,使用的是ngrok,以前用的花生壳,ngrok是我以前那个同事教我的,当时没学会,以前觉得很难。

         1.  ngrok安装就不多说了,安装好之后如下:

    2. 配置微信公众号服务器(如下图,token随便写)

    3.参照微信开发文档,进行验证

     

    完整代码:

    <?php

    /**
      * wechat php test
      */
    //define your token

    define("TOKEN", "wechat");

    $wechatObj = new wechatCallbackapiTest();

    $wechatObj->valid();


    class wechatCallbackapiTest
    {

        public function valid()
        {

            $echoStr = $_GET["echostr"];

            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }

        }


        public function responseMsg() {

            //get post data, May be due to the different environments

            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            //extract post data

            if (!empty($postStr)){
                    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

                    $fromUsername = $postObj->FromUserName;

                    $toUsername = $postObj->ToUserName;

                    $keyword = trim($postObj->Content);

                    $time = time();

                    $textTpl = "<xml>

                                <ToUserName><![CDATA[%s]]></ToUserName>

                                <FromUserName><![CDATA[%s]]></FromUserName>

                                <CreateTime>%s</CreateTime>

                                <MsgType><![CDATA[%s]]></MsgType>

                                <Content><![CDATA[%s]]></Content>

                                <FuncFlag>0</FuncFlag>

                                </xml>";

                    if(!empty( $keyword ))

                    {
                        $msgType = "text";

                        $contentStr = "Welcome to wechat world!";

                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

                        echo $resultStr;

                    }else{

                        echo "Input something...";

                    }


            }else {

                echo "";

                exit;

            }

        }


        private function checkSignature()

        {

            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    }

     

     

    展开全文
  • 微信公众号开发过程中,如果我们想要主动向微信服务器推送消息那么我们必须要有access_token。access_token 是公众号的唯一票据,当我们开发调用微信的各种接口时都需要使用access_token。access_token是类似于...

    在微信公众号开发过程中,如果我们想要主动向微信服务器推送消息那么我们必须要有access_token。access_token 是公众号的唯一票据,当我们开发调用微信的各种接口时都需要使用access_token。access_token是类似于下面所展示的一个字符串。

    wGOSbMw6iKvhIOcjCJTi_r6wXpOF_Vnih-TEvumx_1OXgnaZiRfy0g0hJ08ykRkc0bMAYTzKdZoAmZ32ROdmgo5_JQbgTcPth2bajjoRqfEeC_VRz53cl2_CLavkNkBTSKWcAEAMEQ

    这个字符串比较长。所以说access_token的存储至少要保留512个字符空间。并且得到的这一个access_token并不是永久有效的,它的有效时间是2个小时。这个有效时间会附加在我们获取access_token的返回结果中,字段名称是expires_in。关于如何获取access_token我们在下面会讲到。下面我们先来看一下微信官方是如何说明access_token的使用及生成方式的。

    1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;

    2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;

    3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

    所以说,对于access_token我们应该定时去刷新获取。否则的话,重复获取将导致上次获取的access_token失效。

    好,说了这么多,也了解到access_token的重要性,那么我们到底应该怎么来获取它呢?其实,获取access_token也挺简单的。微信为我们提供了http接口:

    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    注意:调用所有微信接口时均需使用https协议。

    上面的接口需要我们发送三个参数:

    grant_type 该参数在获取access_token时要填写client_credential

    appid 这个参数在基本配置中可以获取,对于每一个开发者都有一个唯一的appid,作为第三方用户的唯一凭证

    secret 这个参数的值是appsecret 同样对于每一个开发者都有一个appsecret,它是第三方用户唯一凭证密钥。和appid一样,appsecret也可以在基本配置中得到。

    a68589bafed1d8975cd3904a06cfa5b4.png

    清楚了这三个参数,下面我们就开始来调用这个接口。因为是http接口,我们使用php语言来调用,所以需要用到curl。

    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . self::appId . "&secret=" . self::appSecret;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $res = curl_exec($ch);

    curl_close($ch);

    返回的结果是一个json串,该json串包含两个内容:一个是access_token,另一个是有效时间(expires_in)。

    {"access_token":"gq84-toUzqn2mNX_ibmvMOIVm1TIKPD6mGLUfMNdCytpsLv6H-aCZgXMPkEt_D4Iqjjoe8w_qgo_9oli3dECpimhb-FUONTEJLarG6PGYSpPZSAb8rcwv4WR0BMwwc8ESCXiAGABLG","expires_in":7200}

    同样,调用错误出现错误的话也会返回一个json串,该json串的内容根据错误原因的不同而有所不同。示例如下:

    {"errcode":40013,"errmsg":"invalid appid"}

    access_token使用案例——获取微信服务器ip地址

    上面我们介绍了access_token的用途以及该如何获取access_token。这里我们介绍一个access_token的使用案例——如果公众号基于安全等考虑,我们需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过相应接口获取微信服务器ip地址列表。

    其接口如下

    https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN

    我们看,这个接口只有一个参数——access_token 。下面我们来看如何使用

    $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$this->get_accesstoken();

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $res = curl_exec($ch);

    返回的结果同样也是一个json字符串。

    { "ip_list":["ip1"," ip2"] }

    同样,该接口也可能返回调用错误。其错误原因多数是access_token无效或过期

    {"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [w2KXsa0239vr29!]"}

    好,上面就是对于access_token的用途及获取方式做的一个详细的介绍。

    展开全文
  • 重复 强烈建议看 官网文档 微信有很开放接口,那么必然需要权限验证,access_token 和jsapi_ticket是我们使用微信高级接口必不可少的数据,而且它们都是有有效期的。 一、access_token (我厚颜无耻的复制了官方...

            重复 强烈建议看 官网文档 微信有很多开放接口,那么必然需要权限验证,access_token 和 jsapi_ticket是我们使用微信高级接口必不可少的数据,而且它们都是有有效期的。

    一、access_token (我厚颜无耻的复制了官方文档)

    access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

    公众平台的API调用所需的access_token的使用及生成方式说明:

    1、建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务;

    2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器可对外继续输出的老access_token,此时公众平台后台会保证在5分钟内,新老access_token都可用,这保证了第三方业务的平滑过渡;

    3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。

    公众号和小程序均可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。**调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。**小程序无需配置IP白名单。

    二、jsapi_ticket

    生成js-sdk签名之前必须使用jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。

    由此可见重新生成token之后,前一个token就无法使用,如果我们不统一管理,很多模块之间会冲突,因此我们需要一个控制模块,定时对这两个数据进行刷新,以及保存,统一分发

    三、上代码(完整代码 见 这篇文章

    参考网上的机制 是使用Redis数据库进行存取

    # 缓存 access_token 和 jsapi_ticket,并且即使更新,防止过期
    # access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。
    # 开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时
    # jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取
    # 我们用redis去存数据,并设置过期时间
    import redis
    from wxlogger import logger
    
    class BaseCache(object):
        """缓存类父类"""
        _host = '127.0.0.1'
        _port = 6379
        _database = 0
        _password = ''
    
        @property
        def redis_ctl(self):
            """redis控制句柄,就是连接对象"""
            redis_ctl = redis.Redis(host=self._host, port=self._port, db=self._database, password=self._password)
            return redis_ctl
    
    class TokenCache(BaseCache):
        """微信token缓存"""
        _expire_access_token = 7200  # 微信access_token过期时间, 2小时
        _expire_js_token = 7200   # 微信jsapi_ticket, 过期时间, 7200秒
    
        def set_access_cache(self, key, value):
            """添加微信access_token验证相关redis"""
            self.redis_ctl.set(key, value)
            # 设置过期时间
            self.redis_ctl.expire(key, self._expire_access_token)
            logger.info('更新了 access_token')
    
        def set_js_cache(self, key, value):
            """添加网页授权相关redis"""
            self.redis_ctl.set(key, value)
            # 设置过期时间
            self.redis_ctl.expire(key, self._expire_js_token)
            logger.info('更新了 js_token')
    
        def get_cache(self, key):
            """获取redis"""
            try:
                v = (self.redis_ctl.get(key)).decode('utf-8')
                return v
            except Exception as e:
                logger.error('wxcache'+str(e))
                return None
    
    

    然后我们启动 tornado自带的定时函数 tornado.ioloop.PeriodicCallback(callback, callback_time, io_loop=None),将他放在tornado程序中运行

    import tornado.ioloop
    import requests
    import json
    from wxconfig import WxConfig
    from wxcache import TokenCache
    from wxlogger import logger
    
    class WxShedule(object):
        """负责access_token和jsapi_ticket的更新"""
        _token_cache = TokenCache()  # 微信token缓存实例
        _expire_time_access_token = 7000 * 1000  # token过期时间
    
        def excute(self):
            """执行定时器任务"""
            # IOLoop.instance().call_later(delay, callback, *args, **kwargs)
            # 延时delay秒之后,将callback加入到tornado的加入到的处理队列里面,异步调用只调用一次
            tornado.ioloop.IOLoop.instance().call_later(0, self.get_access_token)
            # tornado.ioloop.PeriodicCallback(callback, callback_time, io_loop=None)
            # callback设定定时调用的方法 callback_time设定每次调用之间的间隔,单位毫秒
            tornado.ioloop.PeriodicCallback(self.get_access_token, self._expire_time_access_token).start()
    
        def get_access_token(self):
            """获取微信全局唯一票据access_token"""
            try:
                url = WxConfig.get_access_token_url
                r = requests.get(url)
                if r.status_code == 200:
                    d = json.loads(r.text)
                    if 'access_token' in d.keys():
                        access_token = d['access_token']
                        # 添加至redis中
                        self._token_cache.set_access_cache('access_token', access_token)
                        # 获取JS_SDK权限签名的jsapi_ticket
                        self.get_jsapi_ticket()
                    else:
                        errcode = d['errcode']
                        # 出现错误10s之后调用一次,获取access_token
                        tornado.ioloop.IOLoop.instance().call_later(10, self.get_access_token)
                else:
                    # 网络错误10s之后调用一次,获取access_token
                    tornado.ioloop.IOLoop.instance().call_later(10, self.get_access_token)
            except Exception as e:
                logger.error('wxtoken get_access_token'+str(e))
                    
        def get_jsapi_ticket(self):
            """获取JS_SDK权限签名的jsapi_ticket"""
            try:
                # 从redis中获取access_token
                access_token = self._token_cache.get_cache('access_token')
                if access_token:
                    url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi' % access_token
                    r = requests.get(url)
                    if r.status_code == 200:
                        d = json.loads(r.text)
                        errcode = d['errcode']
                        if errcode == 0:
                            jsapi_ticket = d['ticket']
                            # 添加至redis中
                            self._token_cache.set_js_cache('jsapi_ticket', jsapi_ticket)
                        else:
                            tornado.ioloop.IOLoop.instance().call_later(10, self.get_jsapi_ticket)
                    else:
                        # 网络错误 重新获取
                        tornado.ioloop.IOLoop.instance().call_later(10, self.get_jsapi_ticket)
                else:
                    # access_token已经过期 重新获取
                    tornado.ioloop.IOLoop.instance().call_later(10, self.get_access_token)
            except Exception as e:
                logger.error('wxtoken get_jsapi_ticket'+str(e))
    

    OK,解决了access_token 那么我们就可以用它来创建自定义菜单啦,如果为了测试,你可以写个简单的函数 单独执行一下,临时生成 token数据

    展开全文
  • 1、微信公众平台开发是指为微信公众号进行业务开发,为移动应用、PC端网站、公众号第三方平台(为各行各业公众号运营者提供服务)的开发,请开发者前往微信开放平台接入。 2、在申请到认证公众号之前,开发者可以先...
  • 微信公众号查询数据库,微信公众号数据库怎么查询?以下是小编整理的微信公众号怎么查询数据库的内容。有兴趣的朋友可以往下看看。希望以下的的内容能对您有帮助。1、 启用消息接口登陆微信公众平台,选择:高级功能...
  • 登录微信公众平台,由于很开发人员并没有认证的的微信公众号,所以比较折中的方式是使用公众平台测试帐号来测试功能,其优势是能够测试微信公众号的绝大部分功能,不受认证门槛的限制。 进入测试账号管理界面: ...
  • 1、先整公众号,创建了一个订阅号,来熟悉对微信的一些操作,构建一个自定义可以工作的订阅号 2、小程序 微信开发使用盛派的SDK,服务端用asp.net mvc,照着别人的例子,先把token测试通过。详细代码见...
  • 微信公众号主要有以下几个步骤 微信公众号的通讯机制 微信公众号简介 1.注册微信公众号 2.注册测试公众号 3.搭建微信本地调试环境 1)下载客户端natapp: 2)安装natapp: 4.微信公众号接入(校验签名) 第1步中...
  • 在使用微信公众号时,需要先将已有的网站与微信服务器做关联;如何做关联? 在调试过程中,我尝试过很种可能; 1.在微信公众号开发文档中寻找相关解读资料; 2.在CSDN中找类似的问题解决办法; 3.在已有的网站...
  • 随着公众平台日益渐火,微信公众号的建设单纯只靠健全他的自定义菜单,完善消息回复体系,稳定高质量更文频率,就能给自己的平台带来源源不断的粉丝了吗为什么需要创新?随着社会的发展,社会服务形式的多样化,人们...
  • 说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! ... 一丶叙述 开发说明 Python代码实现(以Flask框架为例) ... 客户端---->微信服务器---->nginx服务器---->开发者服务器 ...
  • 关于注册这点我就简单说一下,需要注意的就是,微信公众号一般用的就是订阅号和企业号,订阅号不能认证,权限少,且不能就行二次开发。而企业号可以认证,但是认证只有一年期限,认证费用300元。当然了,为了让我们...
  • 微信公众号开发过程及对微信公众号功能的认识
  • 一、填写服务器配置信息的介绍   登录微信公众平台官网后,进入到公众平台后台管理...微信公众号配置界面:    以上配置需要认证后才会得到相应的权限。如果开发阶段,我们可以申请开发者测试账号。   为什
  • 接入微信公众号是开发的第一步,万事开头难,走好第...登录微信公众平台,由于很开发人员并没有认证的的微信公众号,所以比较折中的方式是使用公众平台测试帐号来测试功能,其优势是能够测试微信公众号的绝大部分...
  • 开启微信公众号服务 注:1.以测试号(权限开发比较)完成大部分微信功能,正式环境上类似配置开发即可。测试号不能开发支付交易,必须公众号验证和支付验证的公众号。 2.主要开发 公众号设置服务、获取用户信息...
  • 如何注册微信公众号--个人、企业 注册地址https://mp.weixin.qq.com/个人注册选择 '订阅号', 只能使用简单接口 企业注册择 '服务号' 可以使用更的接口 如何注册微信公众号--测试号 我们个人开发只能使用...
  • 微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能。开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建、查询、修改、删除等操作,...
  • 一站式解决新手开发微信公众号遇到的所有问题。为了防止我的文章被到处转载,贴一下我的公众号【智能制造社区】,欢迎大家关注。本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的...
  • 在要做微信项目开发前,大家都会去了解微信公众号的类型和注册流程,以及不同公众号的功能使用权限,这个我前面文章也有过介绍,做微信开发公众号最起码得是一个已认证的服务号,这里我是指企业项目哈,当然如果是...
  • JAVA微信公众号开发入门(详细) 有很在学习公众号开发的小伙伴向我反映了,说在学习的过程中很矛盾,很的公众号开发教程不够详细,亦或者是完全看不懂,况且官网给的文档也只是PHP的实例教程,而这时候学其他...
  • 1.1 没有严格按照微信官方的要求进行token验证。 解决方案建议:详细阅读几次官方文档,并达到理解的程度。这里我将文档中的重点位置摘录,以提醒注意: 验证消息的确来自微信服务器 开发者提交信息(如何配置不再...
  • Node.js授权微信公众号服务器访问本地
  • 1:获取token值,微信获取公众号token值需要公众号的appid和secret 这两个值是微信提供的,是不会变的 获取token值地址 String strUrl = “https://api.weixin.qq.com/cgi-bin/token?grant_type=client_cred...
  • 一站式解决新手开发微信公众号遇到的所有问题。为了防止我的文章被到处转载,贴一下我的公众号【智能制造社区】,欢迎大家关注。本篇文章首先实现与公众号的对接,实现简单的回复文字、图片内容。下一篇会对接腾讯的...
  • 在阅读这篇文章之前你要做以下的准备:1.注册一个订阅号(通过微信公众平台...第一步:填写服务器配置我们登录微信公众号之后,右下角基本开发配置点进去---->URL是开发者用来接收微信消息和事件的接口URL...
  • 最近公司让我开发微信公众号平台扫码登录,同步用户信息于PC端,所做的过程当中遇到了一些坑,做完了就总结一下需要注意的点,如若大家开发过程中遇到同样的问题,可以借鉴! 第一:配置域名  作用:配置域名为了...
  • 微信公众号上传多媒体文件

    千次阅读 2015-12-18 10:23:15
    微信公众号上传多媒体文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,447
精华内容 3,778
关键字:

微信公众号token多平台