各位大神,你们平时都是怎么保存微信的access_token的?
微信的access_token的获取次数是是限制的,不知道我写的代码是不是正确的
<code>//获取微信access_token function get_access_token(){ $appid = C("APPID"); $appSecret = C("APPSECRET"); $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appSecret"; $where = array( "appid" =>$appid, "appsecret" =>$appSecret, ); $res = M("as")->field('expire,accesssecret,timestamp')->where($where)->select(); if(!$res){//当as表里没有数据的时候 dump("!res"); $return = json_decode(curl($url)); $data['appid'] = $appid; $data['appsecret'] = $appSecret; $data['expire'] = $return->expires_in; $data['accesssecret'] = $return->access_token; $data['timestamp'] = time(); M("as")->add($data); $token = $data['accesssecret']; }else if($res[0]['expire']+$res[0]['timestamp']-30 expires_in; $data['accesssecret'] = $return->access_token; $data['timestamp'] = time(); M("as")->where("appid='".$appid."'")->save($data); $token = $data['accesssecret']; }else{ $token = $res[0]['accesssecret']; } return $token; } </code>
回复内容:
微信的access_token的获取次数是是限制的,不知道我写的代码是不是正确的
<code>//获取微信access_token function get_access_token(){ $appid = C("APPID"); $appSecret = C("APPSECRET"); $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appSecret"; $where = array( "appid" =>$appid, "appsecret" =>$appSecret, ); $res = M("as")->field('expire,accesssecret,timestamp')->where($where)->select(); if(!$res){//当as表里没有数据的时候 dump("!res"); $return = json_decode(curl($url)); $data['appid'] = $appid; $data['appsecret'] = $appSecret; $data['expire'] = $return->expires_in; $data['accesssecret'] = $return->access_token; $data['timestamp'] = time(); M("as")->add($data); $token = $data['accesssecret']; }else if($res[0]['expire']+$res[0]['timestamp']-30 expires_in; $data['accesssecret'] = $return->access_token; $data['timestamp'] = time(); M("as")->where("appid='".$appid."'")->save($data); $token = $data['accesssecret']; }else{ $token = $res[0]['accesssecret']; } return $token; } </code>
关于AccessToken
1.每天请求次数为2000次;
2.每个Access_Token有效期为2小时;
存储方案:
1.数据库:通过微信接口获取到 Access_Token 之后,将 Access_Token + 当前时间戳序列化存储,每次需要 Access_Token 时,从数据库取出,然后反序列化对比时间戳,如果过期,重新调用微信接口并更新数据库记录;
2.NoSQl:这里以 Redis 为例子。通过微信接口获取到 Access_Token 之后,存入 Redis 并设置过期时间,每次需要 Access_Token 时,去 Redis 查询,如果没有查询到记录说明上次获取到的 Access_Token 已过期,重新获取并更新记录;
3.文件存储:这个比较适合单一公众号的情况。通过微信接口获取到 Access_Token 之后,存入文件,可以选择性将时间戳一并存入。每次需要 Access_Token 时,如果之前未记录时间戳,则比较文件修改时间与当前时间,然后选择读取记录或者重新调用微信接口更新记录,否则先读取文件内容,然后对比之后选择下一步行为。
NoSQL方案 > 数据库 > 文件管理
使用session加过期时间
那个,特么才2000次调用,我怕我一抽筋就用完了,然后就被各种老大吊打,所以,我不会在请求里面获取这个家伙。
因为没涉及到业务我就一整个拷下来。。。应该可以吧
<code>namespace Kinhom\Cli\Tasks; use Kinhom\Cli\Tasks\Impl\TaskInterface; use Phalcon\Cli\Task; use Phalcon\Di; /** * 用于更新微信access_token * * Class WeiXinAccessTokenTask * @package Kinhom\Cli\Tasks */ class WeiXinAccessTokenTask extends Task implements TaskInterface { # 最后申请时间 protected $lastApplyTime = 0; # 间隔时间 : 50秒内的申请算连击,根据每天只能调用2000次估算出来 protected $intervalTime = 50; /** * 更新微信的accessToken */ public function runAction() { # token有效时间 $expTime = 0; # 提前20分钟获取token $pre = 20 * 60; $config = $this->getDI()->get('config')['weixin']->toArray(); $cache = $this->getCache(); $cacheKey = $config['cacheKey']; # 最后检查cache时间,每隔一定时间会检查cache是否存在 $cacheLastCheckTime = time(); while (true) { # 如果时间到了就更新token if ( $expTime applyToken($config); continue; } # 3秒一次的cache检查 if ( time() - $cacheLastCheckTime get($cacheKey); if (!$token) { $expTime = $this->applyToken($config); $cacheLastCheckTime = time(); } } } /** * 申请token * @param $config * @return int */ protected function applyToken( $config ) { # 50 秒内不能查询两次,避免抽风一下子将整天的查询都用光了 if ( time() - $this->lastApplyTime intervalTime ) { return time(); } $appId = $config['appId']; $secret = $config['appSecret']; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$secret}"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl,CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); $data = curl_exec($curl); curl_close($curl); if ( ! $data ) { $this->getLogger()->error( '获取微信公众号token失败,返回为空' ); return time(); } $result = json_decode($data, true); if ( ! $result ) { $this->getLogger()->error( '获取微信公众号token失败,返回异常:'.$data ); return time(); } $cache = $this->getCache(); $cacheKey = $config['cacheKey']; $cache->save($cacheKey,$result['access_token'],$result['expires_in']); return time() + $result['expires_in']; } /** * 获取缓存 * @return \Phalcon\Cache\BackendInterface */ protected function getCache() { return $this->getDI()->get('cache'); } /** * 获取日志 * @return \Phalcon\Logger\AdapterInterface */ protected function getLogger() { return $this->getDI()->get( 'logger' ); } }</code>
文档上好像说了吧,这个东西你要保存到你本地的数据库的
你做query的时候,先到本地数据库查找,
没有合适的就query weixin api,使用获得的结果,并且把结果保存到数据库中
下次使用的时候也先query数据库
官方sdk有标准示例。把值存到文件,包括过期时间。每次用的时候比对时间,过期就去取,然后存。反之直接用。
我的方案是写一个JSON文件存储到服务器上,
<code>{ "access_token" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "prev_time" : "20140000000" }</code>
用数据库存过,原理一样,但是觉得这样操作简单一些。
http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html
微信官方文档说了,推荐使用中转服务器专门负责access_token的事情,在中转服务器里面做缓存和过期重新获取,所有需要获取access_token都程序都到中转服务器去请求,这样你就不用担心超过2000次的问题,也更不用担心多个程序请求access_token,后者刷新了access_token,前者会不会失效的问题。
我的习惯是三层去获取token
首先读取缓存(如memcache、redis或文件缓存都行)
如果缓存读取失败,就读取数据库(并写入缓存。下次就直接读取缓存了)
最后通过微信API接口获取,获取后写入到数据库,并写入到缓存
其中
1,2
步骤注意失效时间(最好比官方提早几分钟,以便更新的时候好过度)
每小时更新一次,用的时候直接取这个

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

MySQL 8.4(截至 2024 年的最新 LTS 版本)中引入的主要变化之一是默认情况下不再启用“MySQL 本机密码”插件。此外,MySQL 9.0完全删除了这个插件。 此更改会影响 PHP 和其他应用程序

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

PHP连接MySQL后页面空白,die()函数失效的原因分析在学习PHP和MySQL数据库连接的过程中,常常会遇到一些让人困惑...

CMS 代表内容管理系统。它是一种软件应用程序或平台,使用户能够创建、管理和修改数字内容,而无需先进的技术知识。 CMS 允许用户轻松创建和组织内容
