手机游戏获取access token怎么获取失败

微信公众平台获取access_token的方式 - 推酷
微信公众平台获取access_token的方式
今天研究一上午看到网上的是用了file_get_contents函数获取失败,结果问了群里的大神采用了curl方式就行了。此刻分享给大家。在地址栏里面直接访问该文件就可以了。
file_get_contets方式:
$APPID=&wxdxxxxxxxxxxxxxxx&;
$APPSECRET=&96xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&;
$TOKEN_URL=&https://api./cgi-bin/token?grant_type=client_credential&appid=&.$APPID.&&secret=&.$APPSECRET;
$json=file_get_contents($TOKEN_URL);
$result=json_decode($json,true);
print_r($result);
$APPID=&wxdxxxxxxxxxxxxxxx&;
$APPSECRET=&96xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&;
$TOKEN_URL=&https://api./cgi-bin/token?grant_type=client_credential&appid=&.$APPID.&&secret=&.$APPSECRET;
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 $
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致查看: 6863|回复: 1
最后登录注册时间阅读权限100精华0帖子
性别男幸福币0 经验198 帖子
本帖最后由 Joejiao 于
09:35 编辑
1.& && &QQ账号和微信账号都是数字吗?如果都是数字,可以作为作为Game DB的账号字符串(编号)吗?答:游戏的客户端和Gamesvr都无法直接获取到用户的QQ号和微信账号,只能获取到通过加密处理的“openid”作为用户的唯一身份标识,openid可作为Game DB的账号字符串。“openid”是一个包含数字,字母,符号等的随机字符串,MSDK建议长度设置成128字节.&&QQ账号对应的openid范例:AECAC2D94EB37&&微信账号对应的openid范例:oGRTijrV0l67hDGN7dstOl8CphN0
2.& && &QQ和微信是完全不同的账号吗?答:1. QQ号和微信号获取到的用户openid是完全不一样的,所以他们是两个完全不同的账号体系;2.在Android和IOS系统下同一个QQ号或微信号获得的openid是一样的;3.IOS上的游戏数据不能和Android系统互通,所以需要根据系统来区分用户账号; 3.& && &Android和IOS的用户账号数据必须分开吗?如果一定要分开,原因是什么?答:按照苹果规定IOS用户数据和Android不能互通,因此必须分开。游戏可分为手Q和微信两个大区,数据不互通实现方式建议单个大区内针对具体的不能互通数值分别保存一份ios和一份android的(同一张表不同字段和不同记录),然后逻辑在使用的时候根据用户当前使用的IOS还是Android取对应的数据。
4.& && &Openeid可以直接作为用户的账号存储到DB吗?答:可以。为了更高可用性建议游戏可以按照一定规则将openid转换为游戏内使用的UID(一一对应),优点在于整型索引和存储成本比字符串小很多,也方便后续分模部署等实现,如果转换建议开发独立的uidsvr负责此项功能。
5.& && &同一个QQ号或微信号拿到的用户openid会变吗?答:QQ号和微信号对应的openid只和APPID相关,只要游戏的APPID不变,同一个账号对应的openid就不会变。
6.& && &Openid建议的字符长度是多少?答:建议128字节。
7.& && &QQ和微信账号对应的openid会重复吗?答:不会重复。两者的转换规则不一样,目前未发现重复的案例。
8.& &&&没有安装手Q时,为什么会提示登录失败,需要下载手Q才能登录?答:未安装手Q时,的确不能使用内置的WEB页面来实现登录(精品游戏因为有特殊权限才可以拉起),需要引导用户去现在最新的手Q,才能登录9.& &&&为什么手机QQ登录的时候会提示“403 Forbidden”?答:请确认调用API的URL是否为正式环境域名,游戏正式上线前只能使用测试环境域名进行功能调试,正式环境权限不会开放,所以如果使用了正式环境的域名因为没有权限,会提示“403 Forbidden”10.& & 为什么微信无法登录?答:请找产品接口人确认微信APPID和APPKEY是否权限已开通,签名,包名等是否已经正确提交并配置。
11.& & 手Q授权后拿到的accesstoken有效期是多久?答:90天,但paytoken过期会导致用户的登录态失效,从而需要用户重新登录。
12.& & Pay_token的有效时间是多久?能自动刷新Pay_token吗? 答:Pay_token有效时间为48小时,需要用户重新登录才能刷新,没有任何接口可以自动刷新。
13.& & 怎么刷新微信accesstoken?答:使用微信客户端拉起授权页面授权以后, 游戏可以获取到微信的accessToken只有两个小时的有效期,授权的同时返回的refreshToken有效期则为30天。 refreshToken的用途就是刷新accessToken, 只要refreshToken不过期就可以通过refreshToken刷新accessToken。 有两种情况需要刷新accessToken, 第一种, 游戏在进行过程中, 调用后台接口或者支付过程中发现accessToken过期; 第二种, 用户授权以后退出游戏, 下一次再进入游戏时候accessToken过期. 要完成此功能需要用到的接口有: WGRefreshWXToken, WGGetLoginRecord, 接口详细说明如下:void WGRefreshWXToken();描述: 微信accessToken续期,调用WGGetLoginRet(LoginRet ret),ret.flag 为eFlag_WX_AccessTokenExpired时调用此接口,刷新微信票据。
刷新accessToken结果通过OnLoginNotify(LoginRet ret)回调给游戏。ret.flag = eFlag_WX_RefreshTokenSucc&&刷新token成功ret.flag = eFlag_WX_RefreshTokenFail& &刷新token失败
调用示例代码如下:WGPlatform::GetInstance()-&WGRefreshWXToken();
回调实现(Demo)代码如下:virtual void OnLoginNotify(LoginRet& loginRet) { if (loginRet.platform ==ePlatform_QQ) {& && &&&... // QQ授权回来的处理逻辑 } else if (loginRet.platform ==ePlatform_Weixin) {& && &&&// 读取微信的授权票据& && &&&switch (loginRet.flag) {& && &&&... // 其他flag的处理& && &&&caseeFlag_WX_RefreshTokenSucc: {& && && && && &// WGRefreshWXToken调用成功// 成功用当前的refreshToken换到新的accessToken& && && && && &std::stringaccessToken = &&;& && && && && &std::stringrefreshToken = &&;& && && && && &for (int i = 0; i &loginRet.token.size(); i++) {& && && && && && && & if(loginRet.token.at(i).type == eToken_WX_Access) {& && && && && && && && && &&&accessToken.assign(loginRet.token.at(i).value);& && && && && && && & } else if(loginRet.token.at(i).type == eToken_WX_Refresh) {& && && && && && && && && &&&refreshToken.assign(loginRet.token.at(i).value);& && && && && && && & }& && && && && &}& && && && && &LOGD(&accessToken: %s&, accessToken.c_str());& && && && && &LOGD(&payToken :%s&, refreshToken.c_str());& && && && && && && &&&}& && &&&caseeFlag_WX_RefreshTokenFail:& && && && && &// WGRefreshWXToken调用过程中网络出错, 刷新失败 //游戏自己决定是否需要重试 WGRefreshWXToken& && && && && && && &&&} }}
14.& & 登出游戏有没有回调?答:没有,也无须回调。
15.& & Mobile QQ, Mobile QZone, QQ账号的 VIP是什么内容?(包括 QQ内容及WeChat的内容)?答:所有QQ账号的vip都是通用的,不区分Mobile QQ,Mobile QZone, QQ账号。不同的增值业务开通的VIP会员身份不一样。QQ账号的VIP目前在MSDK Gamesvr API /profile/load_vip可以获取到三种:QQ会员,QQ蓝钻,QQ红钻;在/relation/qqprofileAPI中可以获取到QQ黄钻的VIP信息。微信账号的vip和QQ账号不一样,只有沃卡(chinaunicom)一种,可以通过Gamesvr API /relation/wxprofile来获取此类VIP信息。 16.& & 为什么手Q登录后无法收到回调?答:AndoridManifest.xml需要进行如下修改:& && & 查找AssitActivity的元素,改成如下:& && &&&&activityandroid:name=&com.mon.AssistActivity&& && && &&&android:theme=&@android:style/Theme.Translucent.NoTitleBar&& && && &&&android:screenOrientation=&portrait& /&
17.& & 为什么部分htc机器(one s, S720t)手Q登录后无法收到回调?答:请将activity修改成如下:& && &&&&activity& && && &&&android:name=&com.mon.AssistActivity&& && && &&&android:screenOrientation=&portrait&& && && &&&android:configChanges=&orientation|screenSize|keyboardHidden&& && && && &android:theme=&@android:style/Theme.Translucent.NoTitleBar&/&
18.& & 为什么部分机器手Q登录后无法收到回调,出现反复授权的死循环?答:横竖屏切换的时候会导致Activity周期重走一遍,导致授权成功后数据没有办法返回到游戏,在activity加上这个属性:
17:59 上传
19.& & 怎么获得APK的应用签名?答:申请微信AppID过程中需要填写的 apk应用签名获取方式: http://open./download/sdk/gen_signature.apk&&将此链接下载的文件安装到手机上, 游戏也同时安装到手机,输入游戏对应的包名即可获取签名.20.& & 手Q和微信登录过程中出现-20000错误,提示invalid credential是什么原因?答:手Q和微信登录调用的服务端API /auth/verify_login&/auth/check_token,就是判断accesstoken是否过期的,返回这个错误的原因是accesstoken已过期,需要用户重新登录,所以适当的收到此提示属正常范畴,不属于错误,收到此提示后客户端让用户重新登录授权即可。
21.& & 手Q和微信服务端API调用出现invalid credential错误是什么原因?答:此错误说明accesstoken过期,需要客户端重新登录授权,刷新accesstoken,然后拿新的accesstoken来调用API。 22.& & 什么是异帐号,需要怎样实现异帐号提示?答:异帐号是指:游戏授权帐号和平台授权帐号不一致。异帐号情景下:1)游戏通过分享拉起平台,平台会弹框提示异帐号。2)平台拉起游戏 msdk会将平台授权帐号对应的openid通过OnWakeupNotify(WakeupRet ret)方法的ret.open_id回调给游戏,游戏用此openid和已授权openid对比即可判断是否为异帐号,如果是异帐号游戏需要弹框提示用户。注意事项: 1)游戏到微信的异账号只在微信5.0及以上版本才支持。 2)手Q4.6以下版本, 手Q到游戏的异账号在游戏已经启动的情况下没有。
23.& & 为什么登录中会出现110407错误,提示QQ登录已停用?答:游戏未在上提交审核上线前,只有开发者账号和协作者账号能登录,需要通过上线审核后才能开放所有用户登录。
24.& & MsdkCallback的OnLoginNotify(LoginRet ret) 接口回调中,ret的user_id属性始终为空字符串答:user_id 是历史版本的保留字段, 已废弃, 新游戏不使用此字段, 登录完成以后用户id是openId,保存在LoginRet.open_id中, 登录的票据保存在LoginRet.token中. 获取accessToken/payToken的实例代码如下: virtual voidOnLoginNotify(LoginRet& loginRet) { if (loginRet.platform == ePlatform_QQ) {& && &&&// 读取QQ的授权票据& && &&&switch (loginRet.flag) {& && &&&case eFlag_Succ: {& && && && && &// 进行正常游戏登陆逻辑& && && && && &std::string accessToken = &&;& && && && && &std::string payToken = &&;& && && && && &for (int i = 0; i & loginRet.token.size(); i++) {& && && && && && && & if (loginRet.token.at(i).type ==eToken_QQ_Access) {& && && && && && && && && &&&accessToken.assign(loginRet.token.at(i).value);& && && && && && && & } else if (loginRet.token.at(i).type ==eToken_QQ_Pay) {& && && && && && && && && &&&payToken.assign(loginRet.token.at(i).value);& && && && && && && & }& && && && && &}& && && && && && && &&&}& && &&&case eFlag_QQ_NotInstall:& && &&&case eFlag_QQ_NotSupportApi:& && && && && &// 没有安装或者版本太低, 引导用户下载新版手Q& && && && && && && &&&case eFlag_QQ_UserCancel:& && && && && &// 用户取消, 提示用户重新授权& && && && && && && &&&case eFlag_QQ_NoAcessToken:& && &&&case eFlag_QQ_LoginFail:& && &&&case eFlag_QQ_NetworkErr:& && && && && &// 授权过程中网络失败, 或者其他错误,引导用户重新授权即可& && && && && && && &&&} } else if (loginRet.platform == ePlatform_Weixin) {& && &&&... }} 25.& & 微信国际版支持用户授权登录吗?答:支持,但不建议使用微信国际版来调试游戏的相关平台功能,因为微信国际版的更新没有中文版快,可能部分新增的能力无法调试。
26.& & 手机QQ国际版支持用户授权登录吗?& &答:不支持,会导致游戏直接crash,如果有需求要支持,可以由运营接口人提需求至MSDK。
最后登录注册时间阅读权限100精华0帖子
性别女幸福币0 经验347 帖子
Powered by微信公众平台开发——如何保证access_token长期有效?
发表于 09:20|
来源CSDN博客|
摘要:由CSDN和《程序员》杂志联合主办的2014年微信开发者大会将于8月23日在北京举行。CSDN优秀博主、畅销书作者柳峰受邀担任讲师,带来《智能客服与LBS开发的“坑”与解决之道》的主题演讲,欢迎来现场与柳峰深度沟通。
【编者按】由CSDN和《程序员》杂志联合主办的&将于8月23日在北京举行。内容涵盖企业服务号开发和高级应用、企业号开发、业务系统对接、高级接口运用、微信支付、智能客服与LBS、HTML5社交应用、微信电商、微信广告自助平台等多方面。作为一线微信开发商云集、专注在开发实践方面的顶级技术活动,到目前为止本次活动已经得到了业界的极大关注度。为此,主办方还总结了技术团队&。&&&&值得一提的是,CSDN优秀博主、畅销书《微信公众平台应用开发:方法、技巧与案例》的作者柳峰受邀做本次活动讲师之一,演讲主题《智能客服与LBS开发的“坑”与解决之道》。他在CSDN博客中()撰写了几十篇+的微信开发技术文章,多篇访问量都在3万+,以下这篇《&》摘自他的博客。全文如下:为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台开放了许多接口,包括自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数access_token,它是公众账号的全局唯一票据,它是接口访问凭证。
access_token的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当access_token过期时,才需要再次调用接口获取access_token。在理想情况下,一个7x24小时运行的系统,每天只需要获取12次access_token,即每2小时获取一次。如果在有效期内,再次获取access_token,那么上一次获取的access_token将失效。
目前,获取access_token接口的调用频率限制为2000次/天,如果每次发送客服消息、获取用户信息、群发消息之前都要先调用获取access_token接口得到接口访问凭证,这显然是不合理的,一方面会更耗时(多了一次接口调用操作),另一方面2000次/天的调用限制恐怕也不够用。因此,在实际应用中,我们需要将获取到的access_token存储起来,然后定期调用access_token接口更新它,以保证随时取出的access_token都是有效的。
下面将为大家介绍如何定时获取并存储access_token。请注意:这不是一篇讲解如何调用接口获取access_token的文章,关于access_token的获取,请参考文章
在动手前先来简单分析一下,我们要解决的无非是如下两个问题:
1.如何定时获取access_token?
在Java中,如果要定时执行某项任务,需要用到java.util.Timer类,对于喜欢使用框架的朋友,可以采用
,Spring框架也支持quartz。除此这外,还有一种方法就是启动一个线程,在线程的run()方法中写一个死循环,然后使用Thread.sleep()来保证线程定时执行某项任务。
2.将access_token保存在哪?
对于access_token的存储,可以考虑存储在文件、数据库或内存中。具体采用哪种存储方式,需要根据项目实际情况而定。如果只有一台服务器,直接将access_token存储在内存中是最简便有效的方式。
在本文中,笔者将演示的定期获取并存储access_token的流程为:Web服务器启动时就加载一个Servlet,在Servlet的init()方法中启动一个线程,在线程的run()方法中通过死循环+Thread.sleep()的方式定期获取access_token,然后将获取到的access_token保存在public
static修饰的变量中。
在工程中创建一个InitServlet类,该类的代码如下:
package org.liufeng.weixin.
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import org.liufeng.weixin.thread.TokenT
import org.liufeng.weixin.util.WeixinU
import org.slf4j.L
import org.slf4j.LoggerF
* 初始化servlet
* @author liuyq
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
public void init() throws ServletException {
// 获取web.xml中配置的参数
TokenThread.appid = getInitParameter("appid");
TokenThread.appsecret = getInitParameter("appsecret");
("weixin api appid:{}", TokenThread.appid);
("weixin api appsecret:{}", TokenThread.appsecret);
// 未配置appid、appsecret时给出提示
if ("".equals(TokenThread.appid) || "".equals(TokenThread.appsecret)) {
log.error("appid and appsecret configuration error, please check carefully.");
// 启动定时获取access_token的线程
new Thread(new TokenThread()).start();
从上面的代码可以看出,InitServlet类只重写了init()方法,并没有重写doGet()和doPost()两个方法,因为我们并不打算让InitServlet来处理访问请求。init()方法的实现也比较简单,先获取在web.xml中配置的参数appid和appsecret,再启动线程TokenThread定时获取access_token。
InitServlet在web.xml中的配置如下:
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.5" xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
&a href="/xml/ns/javaee/web-app_2_5.xsd" "=""&/xml/ns/javaee/web-app_2_5.xsd"&/a&&
&servlet-name&initServlet&/servlet-name&
&servlet-class&
org.liufeng.weixin.servlet.InitServlet
&/servlet-class&
&!-- 配置获取access_token所需参数appid和appsecret --&
&init-param&
&param-name&appid&/param-name&
&param-value&wx617a123bb8bc99cd&/param-value&
&/init-param&
&init-param&
&param-name&appsecret&/param-name&
&param-value&4d82cbbbbb62d7hn3dcb8&/param-value&
&/init-param&
&load-on-startup&0&/load-on-startup&
&/servlet&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
InitServlet在web.xml中的配置与普通Servlet的配置有几点区别:1)通过配置&init-param&向Servlet中传入参数;2)通过配置&load-on-startup&使得Web服务器启动时就加载该Servlet;3)没有配置&servlet-mapping&,因为InitServlet并不对外提供访问。
TokenThread的源代码如下:
package org.liufeng.weixin.
import org.liufeng.weixin.pojo.AccessT
import org.liufeng.weixin.util.WeixinU
import org.slf4j.L
import org.slf4j.LoggerF
* 定时获取微信access_token的线程
* @author liuyq
public class TokenThread implements Runnable {
private static Logger log = LoggerFactory.getLogger(TokenThread.class);
// 第三方用户唯一凭证
public static String appid = "";
// 第三方用户唯一凭证密钥
public static String appsecret = "";
public static AccessToken accessToken =
public void run() {
while (true) {
accessToken = WeixinUtil.getAccessToken(appid, appsecret);
if (null != accessToken) {
("获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
// 休眠7000秒
Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);
// 如果access_token为null,60秒后再获取
Thread.sleep(60 * 1000);
} catch (InterruptedException e) {
Thread.sleep(60 * 1000);
} catch (InterruptedException e1) {
log.error("{}", e1);
log.error("{}", e);
代码中的第23行通过while(true){}构造了一个死循环(永久执行);第25行调用公众平台接口获取access_token;第29行让线程休眠7000秒再运行,即每隔7000秒获取一次access_token,保证access_token永不失效。在项目中的其他类,可以通过调用&TokenThread.accessToken.getToken()&来得到接口访问凭证access_token。在本地部署运行该程序,Tomcat启动完成后就会在控制台显示如下日志:[INFO ] weixin api appid:wx617a123bb8bc99cd
[INFO ] weixin api appsecret:4d82cbbbbb62d7hn3dcb8
[INFO ] 获取access_token成功,有效时长7200秒 token:sFopJ9lMmLl4u-ad61ojKpS0TolhN2s3SnHoI2Mh5GgdiYb35i-7DG2T2CDyQKMe 为了能够直观看到定期获取access_token的效果,可以试着将TokenThread里的线程休眠时间修改为30秒或60秒。最后,附上本文所涉及的项目源代码,下载地址:PS:日微信团队发布了修改access_token长度的通知,很多开发者问这次修改会对我们的程序产生什么影响,这里顺便回答一下:如果开发者将获取到的access_token存入数据库,就必须保证对应的字段长度足够大,至少能存储512个字符;如果开发者是将access_token存储在内存中,那什么都不需要修改。持续关注欢迎大家来现场与柳峰深度沟通,与他零距离互动,现场提问,柳峰将为你解答各种疑惑。&,更多详情参见官网。关注&,了解更多研发资讯,参与互动讨论;当然您可以向我们推荐更多有趣、有质量的文章。&
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章

我要回帖

更多关于 php获取accesstoken 的文章

 

随机推荐