微信公共帐号的access token_token和body是怎样填写的呢?求大神们解救!

使用了php,php部分如下:
1234567891011121314151617181920212223242526272829303132333435363738394041$code = $_GET[&code&];
& & $userinfo = getUserInfo($code);
& & function getUserInfo($code)
& & & & $appid = &&;
& & & & $appsecret = &1&;//appid和appsecret在这里隐去,在源代码中是正确的
& & & & $access_token = &&;
& & & & //Get access_token
& & & & $access_token_url = &https://api./sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=$code&grant_type=authorization_code&;
& & & & $access_token_json = https_request($access_token_url);
& & & & $access_token_array = json_decode($access_token_json,true);
& & & & $access_token = $access_token_array['access_token'];
& & & & $openid = $access_token_array['openid'];
& & & & //Get user info
& & & & $userinfo_url = &https://api./sns/userinfo?access_token=$access_token&openid=$openid&;
& & & & $userinfo_json = https_request($access_token_url);
& & & & $userinfo_array = json_decode($userinfo_json,ture);
& & & & echo $userinfo_
& & & & return userinfo_
& & function https_request($url)
& & & & $curl = curl_init();
& & & & curl_setopt($curl, CURLOPT_URL, $url);
& & & & curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
& & & & curl_setopt($curl, &CURLOPT_SSL_VERIFYHOST, FALSE);
& & & & curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
& & & & $data = curl_exec($curl);
& & & & if (curl_errno($curl)){
& & & & & & return 'ERROR'.curl_error($curl);
& & & & curl_close($curl);
& & & & return $
然后现在出现的问题就是,调userinfo_json时出现了问题,导致了最后结果无法显示。
中间过程把userinfo_json输出时,提示{“errcode&#,”errmsg”:”invalid code”}
而如果我把userinfo_url的链接复制下来在手机打开的话,还是能调用到用户的详细资料
所以问题到底出现在了哪里?有什么解决办法?求大神解答
http://mp./wiki/17/c0f37d13d5d2c37b468d75.html
先好好看看文档吧,这个问题有点大。。
你的这里是写错了吧!
$userinfo_json = https_request($access_token_url);
$userinfo_json = https_request($userinfo_url);
这样导致code用了两次,code只允许用一次,5分钟内有效
再说一次:code 只能使用一次,不能刷新
/thenbsp/wechat
本文出自 操他妈,转载时请注明出处及相应链接。本文永久链接: /11343.html
Ɣ回顶部
Powered by .
TangStyle .|
本页共执行36次数据库查询操作
共耗时0.486秒微信平台开发access token什么意思_百度知道nodejs中微信公众号开发-access_token获取与保存
nodejs中微信公众号开发-access_token获取与保存
注意:这是一个系列的文章,只看一篇会有点懵逼的感觉
微信的access_token是从获取开始<span style="color:#ff秒后失效,也就是2个小时,需要重新获取.
access_token必须能在路由中全局访问到,本系列博文在express框架中测试,
所以可以挂载到请求的对象(req)上;
获取一次可以使用2小时,2小时后需要重新获取,这里采用redis数据库存储access_token,
为什么使用redis数据库呢,因为redis数据库也带过期特性,感觉天生就和access_token
的过期匹配,结合起来使用非常方便.开始改造.
-- 需要的模块
request &-- 调用微信接口模块
redis -- redis数据库模块
xml2js -- xml转为js对象
安装 npm install request xml2js redis -save
-- 封装几个方法
1.Promise化
Promise已经是nodejs的内置对象了,可以直接使用,从这里能看出nodejs以后异步代码发展路线估计也是Promise了
2.redis添加数据
3.redis获取数据
common文件夹的utils.js文件代码:
var utils = {};
var sha1 = require(&#39;sha1&#39;);
var request = require(&#39;request&#39;);
var redis = require(&redis&);
var client = redis.createClient();
client.on(&error&, function (err) {
console.log(&Error :& , err);
client.on(&#39;connect&#39;, function(){
console.log(&#39;Redis连接成功.&#39;);
//检查微信签名认证中间件
utils.sign = function (config){
return function(req, res, next){
config = config || {};
console.log(config);
var q = req.
console.log(q);
var token = config.wechat.
var signature = q. //微信加密签名
var nonce = q. //随机数
var timestamp = q. //时间戳
var echostr = q. //随机字符串
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
var str = [token, timestamp, nonce].sort().join(&#39;&#39;);
var sha = sha1(str);
if (req.method == &#39;GET&#39;) {
if (sha == signature) {
res.send(echostr+&#39;&#39;)
res.send(&#39;err&#39;);
else if(req.method == &#39;POST&#39;){
if (sha != signature) {
* 添加string类型的数据
* @param key 键
* @params value 值
* @params expire (过期时间,单位秒;可为空,为空表示不过期)
utils.set = function(key, value, expire){
return new Promise(function(resolve, reject){
client.set(key, value, function(err, result){
if (err) {
console.log(err);
reject(err);
if (!isNaN(expire) && expire & 0) {
client.expire(key, parseInt(expire));
resolve(result);
* 查询string类型的数据
* @param key 键
utils.get = function(key){
return new Promise(function(resolve, reject){
client.get(key, function(err,result){
if (err) {
console.log(err);
reject(err);
resolve(result);
//Promise化request
utils.request = function(opts){
opts = opts || {};
return new Promise(function(resolve, reject){
request(opts,function(error, response, body){
if (error) {
return reject(error);
resolve(body);
module.exports =
-- 封装微信操作API
在common文件夹下,添加wechatapi.js文件,目前只有获取access_token的方法
*微信相关操作api
var wechatApi = {};
var config = require(&#39;../config/config&#39;);
var appID = config.wechat.appID;
var appSecret = config.wechat.appS
var utils = require(&#39;./utils&#39;);
var api = {
accessToken : `${config.wechat.prefix}token?grant_type=client_credential`,
upload : `${config.wechat.prefix}media/upload?`
//获取access_token
wechatApi.updateAccessToken = function(){
var url = `${api.accessToken}&appid=${appID}&secret=${appSecret}`;
//console.log(url);
var option = {
url : url,
json : true
return utils.request(option).then(function(data){
return Promise.resolve(data);
module.exports = wechatA
--改造index路由
在index.js路由文件中添加router.use方法,router.use方法意思就是这个路由中所有的
请求都必须先经过这个方法才能往下执行,
-- 首先是从redis中获取access_token,如果获取到了,传递下去,如果没获取到就从微信端获取,然后传递下去;
-- 在第二个then方法中判断这个data是redis中的还是微信端的.方法有多种,我这里是判断data.expires_in
是否存在,如果存在就是微信端的,如果不存在就是redis数据库获取的;
-- 如果是redis中的access_token,就把他挂载到req对象上,下面的方法就可以通过req.accessToken得到&#20540;,
如果是微信端获取的access_token,就需要先保存到redis数据库中,再挂载到req对象上.
//获取,验证access_token,存入redis中
router.use(function(req, res, next) {
//根据token从redis中获取access_token
utils.get(config.wechat.token).then(function(data){
//获取到值--往下传递
if (data) {
return Promise.resolve(data);
//没获取到值--从微信服务器端获取,并往下传递
return wechatApi.updateAccessToken();
}).then(function(data){
console.log(data);
//没有expire_in值--此data是redis中获取到的
if (!data.expires_in) {
console.log(&#39;redis获取到值&#39;);
req.accessToken =
//有expire_in值--此data是微信端获取到的
console.log(&#39;redis中无值&#39;);
* 保存到redis中,由于微信的access_token是7200秒过期,
* 存到redis中的数据减少20秒,设置为7180秒过期
utils.set(config.wechat.token,`${data.access_token}`,7180).then(function(result){
if (result == &#39;OK&#39;) {
req.accessToken = data.access_
,会经过router.use方法.在'/'方法中打印console.log(req.accessToken);
需要暂时注释掉微信认证的中间件,否则进不了方法;
这就是传说中的access_token了
再次访问http://localhost:3000/
我的热门文章
即使是一小步也想与你分享微信公众平台token验证失败 如何解决 求大神啊_百度知道

我要回帖

更多关于 获取access token 的文章

 

随机推荐