zoukankan      html  css  js  c++  java
  • 黄聪:如何高效率存储微信中的 access_token

    众所周知,在微信开发中,获取access_token 的接口每天的调用次数是有限制的,2000次应该是。 
    不过其实这些完全够用了,除非你不小心写了个循环,在1秒中内用完了。 
    每个access_token 的生效时间是2小时内,2小时过后就需要重新申请一下。其实每天只需要申请12次就可以了。 
    不管你怎么申请,当前申请了access_token,以前的就都不能用了。

    所以解决办法就是: 
    在数据库中新建一个表token盛放申请来的access_token,字段有三个

    access_token #存放access_token
    expires #存放毫秒数
    update_time #更新时间戳
    • 1
    • 2
    • 3

    逻辑是这样的:(表中只有一条数据)

    查询表中数据
        如果有数据,用 时间戳+更新时间 跟 现在时间比较,计算是否已过期:
            如果已过期,重新申请,并更新数据库中数据,并返回access_token
            如果没有过期,直接返回查询出的access_token
        如果没数据:
            申请数据并,插入数据库,返回access_tooken
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    查询表中数据是否有数据?查询数据是否过期向微信申请新token并插入数据库设置变量 access_token 的值返回 access_token输出数据库表中的access_token向微信申请新token并插入数据库yesnoyesno
    /*
    ---------------------
    获取access_token:
        查询数据库中是否有数据,
            如果有 取出数据
                    如果已经过期,查询,更新记录
                    如果没过期,直接返回数据
            如果没有 查询并添加数据,返回数据
    ---------------------
    */
    
    function get_token(){
        $access_url= 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.AppID.'&secret='.AppScret;
    //AppID  AppScret 已经定义为常量
    
        //数据库参数
        $host= "1.1.1.1";
        $port = '3306';
        $database = "wx";
        $user = "mysql";
        $passwd = "mysql";
    
        $db = new mysqli($host,$user,$passwd,$database,$port);
        $sql = "select * from token"; //查询wx表数据
        $exist = $db->query($sql);
    
        global $access_token;
    
        if($exist->num_rows) 
        //如果存在数据
        {
            $row = $exist->fetch_array();
            //如果数据已过期
            if($row['expires']+$row['update_time']<time()){
                $token = json_decode(file_get_contents($access_url));
                $sql = "update token set access_token = '{$token->access_token}' where access_token = '{$row['access_token']}'";
                $db->query($sql);
                $access_token = $token->access_token; //返回更新的token
            } else {
                $access_token = $row['access_token']; //返回查询的token
            }
        }
        //如果没有数据 
        else { 
            $token = json_decode(file_get_contents($access_url));
            $sql = "insert into token values('{$token->access_token}',{$token->expires_in},".time().")";
            $db->query($sql);
            $access_token = $token->access_token; //返回新建的token
        }
        $db->close();
    
        return $access_token; //返回access_token
    }
  • 相关阅读:
    C# XML 文档注释
    大数据知识学习
    现在的人,买个钢铁做的车,每天擦,每周打蜡。可对自已的身体最应该保养的“车”,却从不养护
    Asp.net项目因Session阻塞导致页面打开速度变慢
    AvoidRepeatSubmit通过Javascript避免客户端重复提交请求
    Linux下Attansic L2 网卡驱动安装
    如果知道dll文件是面向32位系统还是面向64位系统的?
    整理C# 二进制,十进制,十六进制 互转
    连接Oracle时出现“System.AccessViolationException: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”错误的问题
    [转]删除hbase表region块脚本
  • 原文地址:https://www.cnblogs.com/huangcong/p/8422040.html
Copyright © 2011-2022 走看看