各位大神,你们平时都是怎么保存微信的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
步骤注意失效时间(最好比官方提早几分钟,以便更新的时候好过度)
每小时更新一次,用的时候直接取这个

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Salah satu perubahan utama yang diperkenalkan dalam MySQL 8.4 (keluaran LTS terkini pada 2024) ialah pemalam "Kata Laluan Asli MySQL" tidak lagi didayakan secara lalai. Selanjutnya, MySQL 9.0 mengalih keluar pemalam ini sepenuhnya. Perubahan ini mempengaruhi PHP dan apl lain

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

CMS bermaksud Sistem Pengurusan Kandungan. Ia adalah aplikasi perisian atau platform yang membolehkan pengguna mencipta, mengurus dan mengubah suai kandungan digital tanpa memerlukan pengetahuan teknikal lanjutan. CMS membolehkan pengguna membuat dan menyusun kandungan seperti teks, imej, video dan dokumen dengan mudah serta menerbitkannya di tapak web atau platform digital lain.

Array adalah struktur data linear yang digunakan untuk memproses data dalam pengaturcaraan. Kadang -kadang apabila kita sedang memproses tatasusunan kita perlu menambah unsur -unsur baru ke array yang sedia ada. Dalam artikel ini, kami akan membincangkan beberapa cara untuk menambah unsur -unsur ke akhir array dalam PHP, dengan contoh kod, output, dan analisis kerumitan masa dan ruang untuk setiap kaedah. Berikut adalah cara yang berbeza untuk menambah elemen ke array: Gunakan kurungan persegi [] Dalam PHP, cara untuk menambah unsur -unsur ke akhir array adalah menggunakan kurungan persegi []. Sintaks ini hanya berfungsi dalam kes -kes di mana kita mahu menambah hanya satu elemen. Berikut adalah sintaks: $ array [] = nilai; Contoh
