qq手游check 微信token check failerror怎么办

您当前位置: >
> QQ第三方登陆及同步内容到腾讯微博,腾讯空间,朋友网
QQ第三方登陆及同步内容到腾讯微博,腾讯空间,朋友网
来源:程序员人生&& 发布时间: 08:55:59 阅读次数:2682次
1、开发前准备工作
1 进入进行登陆,然后点击网站接入(根据需求,如果需要移动利用接入点击移动利用接入)。以下例子为网站接入。
2 创建利用页面中,将鼠标放在”验证”按钮上,会弹出1个小窗口,将要复制的内容复制下来放在你网站的首页对应位置,然后点击”开始验证”按钮
1 将该代码放入你网站登陆页面
&a href='/oauth2.0/authorize?client_id=YOUR_APPID&response_type=code&scope=all&status=LEO&redirect_uri=YOUR_REDIRECT_URI'&
&img border=&0&alt=&QQ登录& src=&/qzone/vas/opensns/res/img/Connect_logo_1.png&&&/img&
按钮图片下载官方地址:
http://wiki./%E7%BD%91%E7%AB%99%E5%89%8D%E7%AB%AF%E9%A1%B5%E9%9D%A2%E8%A7%84%E8%8C%83#1..E4.BD.BF.E7.94.A8.E8.85.BE.E8.AE.AF.E6.8F.90.E4.BE.9B.E7.9A.84.E6.A0.87.E5.87.86.E2.80.9CQQ.E7.99.BB.E5.BD.95.E2.80.9D.E6.A0.87.E8.AF.86
注意修改a标签中href里面client_id后面的值改成你利用的appid,status的值可以改成你想设置的值,可以用于验证是不是来你利用的要求。redirect_uri是你的回调地址,该回调地址用于成功登陆后的操作。Scope的值还可以是其他值,scope不填时默许为get_user_info。具体请参考官方:http://wiki./api%E5%88%97%E8%A1%A8
2 进入到你网址的QQ登陆页面,点击QQ登陆图标,如果出现回调地址不合法的提示,请参考官方进行回调地址修改,官方地址以下:
http://wiki./%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E4%BF%AE%E6%94%B9%E6%96%B9%E6%B3%95
1切顺畅出现以下页面:
3 获得_token和openid方法我写在回调action中,具体代码以下:
package com.wingo.action.
import java.io.IOE
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.struts2.ServletActionC
import org.slf4j.L
import org.slf4j.LoggerF
import com.monU
import com.wingo.util.ConfigU
public class TencentLoginAction {
&& &private static Logger log = LoggerFactory.getLogger(TencentLoginAction.class);
&& &HttpServletRequest request = ServletActionContext.getRequest();
&& &HttpServletResponse response = ServletActionContext.getResponse();
&& &public String execute(){
&& &&& &String code = request.getParameter(&code&);
&& &&& &request.setAttribute(&code&, code);
&& &&& &/* 获得_token
&& &&& & * 成功后返回信息格式_token=BA03E5Bxxxxxx950&expires_in=7776000&refresh_token=8972279xxxxxxF8752F
&& &&& & * 1般_token有效期是3个月
&& &&& & */
&& &&& &String parames = &grant_type=authorization_code&client_id=&+ConfigUtil.CLIENT_ID+&&client_secret=&+ConfigUtil.CLIENT_SECRET+&&code=&+code+&&redirect_uri=&+ConfigUtil.REDIRECT_URI;
&& &&& &String _result = CommonUtil.httpsRequest(ConfigUtil.TOKEN_URL, &GET&, parames);
&& &&& &if(_result.contains(&callback&)){
&& &&& &/*当返回的_token是callback( {&error&:100019,&error_description&:&code to
token error&} )类似的数据;
&& &&& &* 表示获得_token失败,需要返回点击QQ登陆页面让用户重新登陆授权
&& &&& &*/
&& &&& &&& &try {
&& &&& &&& &&& &response.sendRedirect(&登陆页面&);
&& &&& &&& &} catch (IOException e) {
&& &&& &&& &&& &e.printStackTrace();
&& &&& &&& &}
&& &&& &}else {
&& &&& &&& &String _token = _result.split(&&&)[0];
&& &&& &&& &request.setAttribute(&_token&, _token);
&& &&& &&& &/* 获得openid
&& &&& &&& & * 成功后返回信息格式:callback( {&client_id&:&10xxxxx18&,&openid&:&DDxxxxxxxxxxx587&} );
&& &&& &&& & */
&& &&& &&& &String open_id = CommonUtil.httpsRequest(ConfigUtil.OPENID_URL, &GET&, _token);
&& &&& &&& &request.setAttribute(&openid&, open_id);
&& &&& &&& &
&& &&& &&& &if(open_id.contains(&error&)){
&& &&& &&& &&& &/*当返回的open_id是callback( {&error&:100007,&error_description&:&param
token is wrong or lost &} );类似的数据;
&& &&& &&& &&& & * 表示获得open_id失败,需要返回点击QQ登陆页面让用户重新登陆授权
&& &&& &&& &&& & */
&& &&& &&& &&& &try {
&& &&& &&& &&& &&& &response.sendRedirect(&登陆页面&);
&& &&& &&& &&& &} catch (IOException e) {
&& &&& &&& &&& &&& &e.printStackTrace();
&& &&& &&& &&& &}&& &
&& &&& &&& &}else {
&& &&& &&& &&& &String openId = open_id.substring(open_id.indexOf(&openid&)+9, open_id.lastIndexOf(&&&));
&& &&& &&& &&& &request.setAttribute(&myOpenId&, openId);
&& &&& &&& &&& &//TODO 我们可以将_token与openid1起存入
&& &&& &&& &&& &
&& &&& &&& &&& &/*发布1条不带图片的腾讯微博
&& &&& &&& &&& & *(注意:微博内容140个汉子,即420字节。若在此处@好友,需要填写好友的微博账号而非昵称)
&& &&& &&& &&& & * 默许返回json格式
&& &&& &&& &&& & * 如:{&data&:{&id&:&386&,&time&:},&errcode&:0,&msg&:&ok&,&ret&:0,&seqid&:5818942}
&& &&& &&& &&& & * 其中ret为0表示成功
&& &&& &&& &&& & */
&& &&& &&& &&& &parames = _token+&&oauth_consumer_key=&+ConfigUtil.CLIENT_ID+&&openid=&+openId+&&content=LEO测试发布1条不带图片的腾讯微博&;
&& &&& &&& &&& &String reslut = CommonUtil.httpsRequest(ConfigUtil.ADD_T_URL, &POST&, parames);
&& &&& &&& &&& &request.setAttribute(&reslut&, reslut);
&& &&& &&& &}
&& &&& &return &test&;
上面相干的工具类代码以下:
package com.wingo.
import java.io.BufferedR
import java.io.InputS
import java.io.InputStreamR
import java.io.OutputS
import java.io.UnsupportedEncodingE
import java.net.ConnectE
import java.net.URL;
import javax.net.ssl.HttpsURLC
import javax.net.ssl.SSLC
import javax.net.ssl.SSLSocketF
import javax.net.ssl.TrustM
import org.slf4j.L
import org.slf4j.LoggerF
CommonUtil工具类
&* 通用工具类
&* @author 李欣桦
&* @date 下午9:10:30
public class CommonUtil {
&& &private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
&& & * 发送https要求
&& & * @param requestUrl 要求地址
&& & * @param requestMethod 要求方式(GET、POST)
&& & * @param outputStr 提交的数据
&& & * @return 返回微佩响应的信息
&& &public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
&& &&& &try {
&& &&& &&& &// 创建SSLContext对象,并使用我们指定的信任管理器初始化
&& &&& &&& &TrustManager[] tm = { new MyX509TrustManager() };
&& &&& &&& &SSLContext sslContext = SSLContext.getInstance(&SSL&, &SunJSSE&);
&& &&& &&& &sslContext.init(null, tm, new java.security.SecureRandom());
&& &&& &&& &// 从上述SSLContext对象中得到SSLSocketFactory对象
&& &&& &&& &SSLSocketFactory ssf = sslContext.getSocketFactory();
&& &&& &&& &URL url = new URL(requestUrl);
&& &&& &&& &HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
&& &&& &&& &conn.setSSLSocketFactory(ssf);
&& &&& &&& &conn.setDoOutput(true);
&& &&& &&& &conn.setDoInput(true);
&& &&& &&& &conn.setUseCaches(false);
&& &&& &&& &// 设置要求方式(GET/POST)
&& &&& &&& &conn.setRequestMethod(requestMethod);
&& &&& &&& &conn.setRequestProperty(&content-type&, &application/x-www-form-urlencoded&);
&& &&& &&& &// 当outputStr不为null时向输出流写数据
&& &&& &&& &if (null != outputStr) {
&& &&& &&& &&& &OutputStream outputStream = conn.getOutputStream();
&& &&& &&& &&& &// 注意编码格式
&& &&& &&& &&& &outputStream.write(outputStr.getBytes(&UTF⑻&));
&& &&& &&& &&& &outputStream.close();
&& &&& &&& &}
&& &&& &&& &// 从输入流读取返回内容
&& &&& &&& &InputStream inputStream = conn.getInputStream();
&& &&& &&& &InputStreamReader inputStreamReader = new InputStreamReader(inputStream, &utf⑻&);
&& &&& &&& &BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
&& &&& &&& &String str =
&& &&& &&& &StringBuffer buffer = new StringBuffer();
&& &&& &&& &while ((str = bufferedReader.readLine()) != null) {
&& &&& &&& &&& &buffer.append(str);
&& &&& &&& &}
&& &&& &&& &// 释放资源
&& &&& &&& &bufferedReader.close();
&& &&& &&& &inputStreamReader.close();
&& &&& &&& &inputStream.close();
&& &&& &&& &inputStream =
&& &&& &&& &conn.disconnect();
&& &&& &&& &return buffer.toString();
&& &&& &} catch (ConnectException ce) {
&& &&& &&& &log.error(&连接超时:{}&, ce);
&& &&& &} catch (Exception e) {
&& &&& &&& &log.error(&https要求异常:{}&, e);
&& &public static String urlEncodeUTF8(String source){
&& &&& &String result =
&& &&& &try {
&& &&& &&& &result = java.net.URLEncoder.encode(source,&utf⑻&);
&& &&& &} catch (UnsupportedEncodingException e) {
&& &&& &&& &e.printStackTrace();
ConfigUtil工具类:
package com.wingo.
public class ConfigUtil {
&& &//利用appid
&& &public static final String CLIENT_ID= &101XXXXXX18&;
&& &//利用appsecret
&& &public static final String CLIENT_SECRET = &21aXXXXXXXXXXXX86&;
&& &//授权成功后的回调地址
&& &public static final String REDIRECT_URI = &http://loginXXXXXXXXte.action&;
&& &//获得token的url(GET)获得到_token后有效期3个月
&& &public static final String TOKEN_URL = &/oauth2.0/token&;
&& &//获得openid的url(GET)
&& &public static final String OPENID_URL = &/oauth2.0/me&;
&& &//发布1条不带图片的腾讯微博(POST)
&& &public static final String ADD_T_URL = &/t/add_t&;
package com.wingo.
import java.security.cert.CertificateE
import java.security.cert.X509C
import javax.net.ssl.X509TrustM
MyX509TrustManager工具类:
&* 信任管理器
&* @author 李欣桦
&* @date 下午9:15:08
public class MyX509TrustManager implements X509TrustManager {
&& &// 检查客户端证书
&& &public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
&& &// 检查端证书
&& &public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
&& &// 返回受信任的X509证书数组
&& &public X509Certificate[] getAcceptedIssuers() {
上面回调方法中获得_token,openid 时也能够根据自己的需要传其他参数。
官方地址:http://wiki./%E4%BD%BF%E7%94%A8authorization_code%E8%8E%B7%E5%8F%96_token
除发布腾讯微博,还可以利用其他api获得你想要的功能。api列表官方地址:http://wiki./api%E5%88%97%E8%A1%A8。具体使用方法可以参考上面回调地址中发布腾讯微博的代码。
4& 利用腾讯开发平台组件可以分享内容到QQ空间和朋友网(在弹出页面,用户也能够选择是不是分享到腾讯微博)。该组件不需要用户授权也可以使用,当没有腾讯用户是登录状态时(相对腾讯网),弹出的分享界面会让分享用户先登录。官方网址:/intro/share
例子以下:
&script type=&text/javascript&&
(function(){
url:location.href,
showcount:'1',/*是不是显示分享总数,显示:'1',不显示:'0' ,分享总数是以上面的url值统计的总数*/
desc:'我的分享理由',/*默许分享理由(可选),140汉字之内*/
summary:'这是我的摘要',/*分享摘要(可选)*/
title:'这是我的标题',/*分享标题(可选)*/
site:'分享来源:LEO测试',/*分享来源 如:腾讯网(可选)*/
pics:'http://img4./it/u=,&fm=23&gp=0.jpg', /*分享图片的路径(可选)*/
style:'202',/*分享按钮的样式,下面的宽高亦为分享按钮的宽高*/
width:105,
var s = [];
for(var i in p){
s.push(i + '=' + encodeURIComponent(p[i]||''));
document.write(['&a version=&1.0& class=&qzOpenerDiv& href=&http://sns./cgi-bin/qzshare/cgi_qzshare_onekey?',s.join('&'),'& target=&_blank&&分享&/a&'].join(''));
&script type=&text/javascript& src=&&%=basePath%&/common/js/⑴.7.js&&&/script&
&script src=&/qzone/app/qzlike/qzopensl.js#jsdate=& charset=&utf⑻&&&/script&
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
------分隔线----------------------------
------分隔线----------------------------
积分:4212QQ登录接口(第三方登录接口) - 宇智波-鼬 - 博客园
posts - 6, comments - 0, trackbacks - 0, articles - 2
&&&&&&&&&&&&&&&&&&&&&&&&&& CI框架 QQ接口(第三方登录接口PHP版)
本帖内容较多,大部分都是源码,要修改的地方只有一个,其他只要复制过去,就可以完美运行。本帖主要针对CI框架,不用下载SDK,按我下面的步骤,建文件,复制代码就可以了。10分钟不要,接口就可完成。第一步:申请APP&ID,APP&KEY,申请地址:http://connect./验证通过后:会得到APP ID,APP KEY。这是你用个文件把这些信息保持下来,免得用的时候有要上网去查,记录在本地记事本里,方便,用的时候打开就可以。如下:APP&ID:APP&KEY:7cbc900feaa979 回调地址:第二步:如果你的系统没有安装curl,请先安装curl。怎么知道本地系统是否安装了curl呢,方法如下:1.在web服务器目录( Ubuntu下的通常为 /var/www )新建crul.php文件2.编辑文件,键入下面一行代码:& &?php phpinfo(); ?&3.保存文件4.打开浏览器,浏览该网页。(例如:http://localhost/curl.php)5.搜索"curl",如果没搜到就证明没安装curl。下面是安装方法:打开终端,输入下面的命令:sudo apt-get install curl libcurl3 libcurl3-dev php5-curl再重启apache:sudo /etc/init.d/apache2 restart这样curl就安装好了,打开你刚才的那个页面,搜一下curl,就可以看到了curl了,这表示已经安装成功,很简单吧。如果还是没有,编辑你的php.ini文件,我的phpini.php文件在/etc/php5/apache2/php.ini,估计你的也差不多是在这个位置,去找找看,找到后,打开这个文件,在最后加上一行:extension=curl.so保存文件后重启Apache服务器,再打开页面,就会出现curl了。第三步:代码注:腾讯提供了SDK,可以在官网下载:下载地址:http://wiki./sdk%E4%B8%8B%E8%BD%BD,如果不是CI框架,估计下载下来就可以用了,CI框架调用规则不同,所以要做修改,如果是CI框架下开发QQ登录接口,就不用下载SDK了,用我下面的代码,下面正式上代码,完整的代码。代码步骤:1.打开application/config/constants.php文件写入如下代码:/*qq登陆*/define('GET_AUTH_CODE_URL', "/oauth2.0/authorize");define('GET_ACCESS_TOKEN_URL' , "/oauth2.0/token");define('GET_OPENID_URL' , "/oauth2.0/me");保存2.打开application文件夹,在application下新建一个文件夹isetting,在isetting下建一个qq_setting.php文件,打开qq_setting.php文件,输入如下代码:
&?php& if ( ! defined('BASEPATH')) exit('No direct script access allowed');&&& /**&&&& * @qq互联配置信息&&&& * 默认开启get_user_info模块&&&& * **/&&& $config['inc_info'] = array(&&&&&&& array (&&&&&&&&&&&&&&& 'appid' =& '',&&&&&&&&&&&&&&& 'appkey' =& '7cbc900feaa979',&&&&&&&&&&&&&&& 'callback' =& ''&&&&&&&&&&&&& ),&&&&&&& array (&&&&&&&&&&&&&&& 'get_user_info' =& '1',&&&&&&&&&&&&&&& 'add_topic' =& '0',&&&&&&&&&&&&&&& 'add_one_blog' =& '0',&&&&&&&&&&&&&&& 'add_album' =& '0',&&&&&&&&&&&&&&& 'upload_pic' =& '0',&&&&&&&&&&&&&&& 'list_album' =& '0',&&&&&&&&&&&&&&& 'add_share' =& '0',&&&&&&&&&&&&&&& 'check_page_fans' =& '0',&&&&&&&&&&&&&&& 'add_t' =& '0',&&&&&&&&&&&&&&& 'add_pic_t' =& '0',&&&&&&&&&&&&&&& 'del_t' =& '0',&&&&&&&&&&&&&&& 'get_repost_list' =& '0',&&&&&&&&&&&&&&& 'get_info' =& '0',&&&&&&&&&&&&&&& 'get_other_info' =& '0',&&&&&&&&&&&&&&& 'get_fanslist' =& '0',&&&&&&&&&&&&&&& 'get_idollist' =& '0',&&&&&&&&&&&&&&& 'add_idol' =& '0',&&&&&&&&&&&&&&& 'del_idol' =& '0',&&&&&&&&&&&&&&& 'get_tenpay_addr' =& '0',&&&&&&&&&&&&& )&&& );保存说明:你需要把appid,appkey对应的键值修改成你刚刚申请的appid,appkey值,callback为回调地址(所谓回调地址就是登录成功后,返回到哪个页面),callback的值写你申请的时候做验证的那个地址。3.打开application下的libraries文件,新建一个文件夹tencent,在tencent里面新建一个文件oauth.php,打开这个文件,复制下面的代码进去:&?php&& &&&& class Oauth&&& {&&&&&&&& /**&&&&&&& * combineURL&&&&&&& * 拼接url&&&&&&& * @param string $baseURL&& 基于的url&&&&&&& * @param array& $keysArr&& 参数列表数组&&&&&&& * @return string&&&&&&&&&& 返回拼接的url&&&&&&& */&&&&&& &&&&&&&& private $APIM&&&&&& &&&&&&&& public function __construct() {&&&&&&&&&&& /*以下部分为获取第三方qq登陆资料*/&&&&&&& //初始化APIMap&&&&&&& /*&&&&&&&& * 加#表示非必须,无则不传入url(url中不会出现该参数), "key" =& "val" 表示key如果没有定义则使用默认值val&&&&&&&& * 规则 array( baseUrl, argListArr, method)&&&&&&&& */&&&&&&& $this-&APIMap = array(&&&&&& &&&&&&&&&&& &&&&&&&&&&&& /*&&&&&&&&&&&&&&&&&&&&&& qzone&&&&&&&&&&&&&&&&&&& */&&&&&&&&&&& "add_blog" =& array(&&&&&&&&&&&&&&& "/blog/add_one_blog",&&&&&&&&&&&&&&& array("title", "format" =& "json", "content" =& null),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "add_topic" =& array(&&&&&&&&&&&&&&& "/shuoshuo/add_topic",&&&&&&&&&&&&&&& array("richtype","richval","con","#lbs_nm","#lbs_x","#lbs_y","format" =& "json", "#third_source"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "get_user_info" =& array(&&&&&&&&&&&&&&& "/user/get_user_info",&&&&&&&&&&&&&&& array("format" =& "json"),&&&&&&&&&&&&&&& "GET"&&&&&&&&&&& ),&&&&&&&&&&& "add_one_blog" =& array(&&&&&&&&&&&&&&& "/blog/add_one_blog",&&&&&&&&&&&&&&& array("title", "content", "format" =& "json"),&&&&&&&&&&&&&&& "GET"&&&&&&&&&&& ),&&&&&&&&&&& "add_album" =& array(&&&&&&&&&&&&&&& "/photo/add_album",&&&&&&&&&&&&&&& array("albumname", "#albumdesc", "#priv", "format" =& "json"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "upload_pic" =& array(&&&&&&&&&&&&&&& "/photo/upload_pic",&&&&&&&&&&&&&&& array("picture", "#photodesc", "#title", "#albumid", "#mobile", "#x", "#y", "#needfeed", "#successnum", "#picnum", "format" =& "json"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "list_album" =& array(&&&&&&&&&&&&&&& "/photo/list_album",&&&&&&&&&&&&&&& array("format" =& "json")&&&&&&&&&&& ),&&&&&&&&&&& "add_share" =& array(&&&&&&&&&&&&&&& "/share/add_share",&&&&&&&&&&&&&&& array("title", "url", "#comment","#summary","#images","format" =& "json","#type","#playurl","#nswb","site","fromurl"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "check_page_fans" =& array(&&&&&&&&&&&&&&& "/user/check_page_fans",&&&&&&&&&&&&&&& array("page_id" =& "","format" =& "json")&&&&&&&&&&& ),&&&&&&&&&&& /*&&&&&&&&&&&&&&&&&&& wblog&&&&&&&&&&&&&&&&&&&&&&&&&&&& */&&&&&&&&&&& "add_t" =& array(&&&&&&&&&&&&&&& "/t/add_t",&&&&&&&&&&&&&&& array("format" =& "json", "content","#clientip","#longitude","#compatibleflag"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "add_pic_t" =& array(&&&&&&&&&&&&&&& "/t/add_pic_t",&&&&&&&&&&&&&&& array("content", "pic", "format" =& "json", "#clientip", "#longitude", "#latitude", "#syncflag", "#compatiblefalg"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "del_t" =& array(&&&&&&&&&&&&&&& "/t/del_t",&&&&&&&&&&&&&&& array("id", "format" =& "json"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "get_repost_list" =& array(&&&&&&&&&&&&&&& "/t/get_repost_list",&&&&&&&&&&&&&&& array("flag", "rootid", "pageflag", "pagetime", "reqnum", "twitterid", "format" =& "json")&&&&&&&&&&& ),&&&&&&&&&&& "get_info" =& array(&&&&&&&&&&&&&&& "/user/get_info",&&&&&&&&&&&&&&& array("format" =& "json")&&&&&&&&&&& ),&&&&&&&&&&& "get_other_info" =& array(&&&&&&&&&&&&&&& "/user/get_other_info",&&&&&&&&&&&&&&& array("format" =& "json", "#name", "fopenid")&&&&&&&&&&& ),&&&&&&&&&&& "get_fanslist" =& array(&&&&&&&&&&&&&&& "/relation/get_fanslist",&&&&&&&&&&&&&&& array("format" =& "json", "reqnum", "startindex", "#mode", "#install", "#sex")&&&&&&&&&&& ),&&&&&&&&&&& "get_idollist" =& array(&&&&&&&&&&&&&&& "/relation/get_idollist",&&&&&&&&&&&&&&& array("format" =& "json", "reqnum", "startindex", "#mode", "#install")&&&&&&&&&&& ),&&&&&&&&&&& "add_idol" =& array(&&&&&&&&&&&&&&& "/relation/add_idol",&&&&&&&&&&&&&&& array("format" =& "json", "#name-1", "#fopenids-1"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& "del_idol" =& array(&&&&&&&&&&&&&&& "/relation/del_idol",&&&&&&&&&&&&&&& array("format" =& "json", "#name-1", "#fopenid-1"),&&&&&&&&&&&&&&& "POST"&&&&&&&&&&& ),&&&&&&&&&&& /*&&&&&&&&&&&&&&&&&&&&&&&&&& pay&&&&&&&&&&&&&&&&&&&&&&&&& */&&&&&&&&&&& "get_tenpay_addr" =& array(&&&&&&&&&&&&&&& "/cft_info/get_tenpay_addr",&&&&&&&&&&&&&&& array("ver" =& 1,"limit" =& 5,"offset" =& 0,"format" =& "json")&&&&&&&&&&& )&&&&&&& );&&&&&& &&&&&&&& }&&&&&&& //登陆&&&&&&&& public function check_login()&&&&&&&& {&&&&&&&&&&&& if(isset($_SESSION['qq']['state']) && $_GET['state'] && ($_SESSION['qq']['state'] == $_GET['state']))&&&&&&&&&&&& {&&&&&&&&&&&&&&&& return 'true';&&&&&&&&&&&& }&&&&&&&&&&&& else&&&&&&&&&&&& {&&&&&&&&&&&&&&&& return 'false';&&&&&&&&&&&& }&&&&&&&& }&&&&&&& &&&&&&&&& public function qq_login()&&&&&&& {&&&&&&&&&&& $CI = &get_instance();&&&&&&&&&&& $CI-&config-&load('isetting/qq_setting');&&&&&&&&&&& $setting = $CI-&config-&item('inc_info');&&&&&&&&&&& $appid = $setting[0]['appid'];&&&&&&&&&&& $callback = $setting[0]['callback'];&&&&&&&&&&& $scope = '';&&&&&&&&&&& foreach ($setting[1] as $key=&$val)&&&&&&&&&&& {&&&&&&&&&&&&&&& if($val === '1')&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& $scope .= $key . ',';&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& $scope = trim(rtrim($scope,',')); &&&&&&&&&&& //-------生成唯一随机串防CSRF攻击&&&&&&&&&&& $state = md5(uniqid(rand(), TRUE));&&&&&&&&&&& $_SESSION['qq']['state'] = $&&&&&&&&&&& //-------构造请求参数列表&&&&&&&&&&& $keysArr = array(&&&&&&&&&&&&&&& "response_type" =& "code",&&&&&&&&&&&&&&& "client_id" =& $appid,&&&&&&&&&&&&&&& "redirect_uri" =& $callback,&&&&&&&&&&&&&&& "state" =& $state,&&&&&&&&&&&&&&& "scope" =& $scope&&&&&&&&&&& );&&&&&&&&&&& $login_url =& $this-&combineURL(GET_AUTH_CODE_URL, $keysArr);&&&&&&&&&&& header("Location:$login_url");&&&&&&& }&&&&&& &&&&&&&& //callback回调方法&&&&&&& public function qq_callback()&&&&&&& {&&&&&&&&&&& $CI = &get_instance();&&&&&&&&&&& $CI-&config-&load('isetting/qq_setting');&&&&&&&&&&& $setting = $CI-&config-&item('inc_info');&&&&&&&&&&& $state = $_SESSION['qq']['state'];&&&&&&&&&&& //--------验证state防止CSRF攻击&&&&&&&&&&& if($_GET['state'] != $state){&&&&&&&&&&&&&&& echo "&script&alert('QQ第三方登陆失败');&/script&";&&&&&&&&&&&&&&& redirect('/login','location',301);&&&&&&&&&&& }&&&&&&&&&&& //-------请求参数列表&&&&&&&&&&& $keysArr = array(&&&&&&&&&&&&&&& "grant_type" =& "authorization_code",&&&&&&&&&&&&&&& "client_id" =& $setting[0]['appid'],&&&&&&&&&&&&&&& "redirect_uri" =& $setting[0]['callback'],&&&&&&&&&&&&&&& "client_secret" =& $setting[0]['appkey'],&&&&&&&&&&&&&&& "code" =& $_GET['code']&&&&&&&&&&& );&&&&&&&&&&& //------构造请求access_token的url&&&&&&&&&&& $token_url = $this-&combineURL(GET_ACCESS_TOKEN_URL, $keysArr);&&&&&&&&&&& $response = $this-&get_contents($token_url);&&&&&&&&&& &&&&&&&&&&&& $params = array();&&&&&&&&&&& parse_str($response, $params);&&&&&&&&&&& $_SESSION['qq']['access_token'] = $params["access_token"];&&&&&&&&&& &&&&&&&&&&&& $access_token = $params["access_token"];&&&&&&&&&&& $openid= $this-&get_openid();&&&&&&&&&& &&&&&&&&&&&& //进入主页&&&&&&&&&&& //获取用户信息&&&&&&&&&&& $_data = $this-&qq_get_user($access_token,$openid);&&&&&&&&&& &&&&&&&&&&&& redirect('/','location',301);&&&&&&& }&& &&&&&&&& //注销&&&&&&& public function qq_logout()&&&&&&& {&&&&&&&&&& &&&&&&&& }&&&&&& &&&&&&& &&&&&&&& public function combineURL($baseURL,$keysArr){&&&&&&&&&&& $combined = $baseURL."?";&&&&&&&&&&& $valueArr = array();&&&&&&&&&&& foreach($keysArr as $key =& $val){&&&&&&&&&&&&&&& $valueArr[] = "$key=$val";&&&&&&&&&&& }&&&&&&&&&&& $keyStr = implode("&",$valueArr);&&&&&&&&&&& $combined .= ($keyStr);&&&&&&&&&&& return $&&&&&&& }&&&&&& &&&&&&&& /**&&&&&&&& * get_contents&&&&&&&& * 服务器通过get请求获得内容&&&&&&&& * @param string $url&&&&&& 请求的url,拼接后的&&&&&&&& * @return string&&&&&&&&&& 请求返回的内容&&&&&&&& */&&&&&&&&& public function get_contents($url)&&&&&&&&& {&&&&&&&&&&& if (ini_get("allow_url_fopen") == "1") {&&&&&&&&&&&&&&& $response = file_get_contents($url);&&&&&&&&&&& }else{&&&&&&&&&&&&&&& $ch = curl_init();&&&&&&&&&&&&&&& curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);&&&&&&&&&&&&&&& curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);&&&&&&&&&&&&&&& curl_setopt($ch, CURLOPT_URL, $url);&&&&&&&&&&&&&&& $response =& curl_exec($ch);&&&&&&&&&&&&&&& curl_close($ch);&&&&&&&&&&& }&&&&&&&&&&& //-------请求为空&&&&&&&&&&& if(empty($response)){&&&&&&&&&&&&&&& echo "&script&alert('QQ第三方登陆失败');&/script&";&&&&&&&&&&&&&&& redirect('/login','location',301);&&&&&&&&&&& }&&&&&&&&&&& return $&&&&&&& }&&&&&& &&&&&&&& public function get_openid()&&&&&&& {&&&&&&&&&&& //-------请求参数列表&&&&&&&&&&& $keysArr = array(&&&&&&&&&&&&&&& "access_token" =& $_SESSION['qq']['access_token']&&&&&&&&&&& );&&&&&&&&&&& $graph_url = $this-&combineURL(GET_OPENID_URL, $keysArr);&&&&&&&&&&& $response = $this-&get_contents($graph_url);&&&&&&&&&&& //----检测错误是否发生&&&&&&&&&&& if(strpos($response, "callback") !== false)&&&&&&&&&&& {&&&&&&&&&&&&&&& $lpos = strpos($response, "(");&&&&&&&&&&&&&&& $rpos = strrpos($response, ")");&&&&&&&&&&&&&&& $response = substr($response, $lpos + 1, $rpos - $lpos -1);&&&&&&&&&&& }&&&&&&&&&&& $user = json_decode($response);&&&&&&&&&&& //------记录openid&&&&&&&&&&& $_SESSION['qq']['openid'] = $user-&&&&&&&&&&&& return $user-&&&&&&&& }&&&&&& &&&&&&& &&&&&&& &&&&&&& &&&&&&& &&&&&&&& /**&&&&&&& * _call&&&&&&& * 魔术方法,做api调用转发&&&&&&& * @param string $name&&& 调用的方法名称&&&&&&& * @param array $arg&&&&& 参数列表数组&&&&&&& * @since 5.0&&&&&&& * @return array&&&&&&&&& 返加调用结果数组&&&&&&& */&&&&&&& public function __call($name,$arg){&&&&&&& //如果APIMap不存在相应的api&&&&&&& if(empty($this-&APIMap[$name])){&&&&&&&&&&& echo "&script&alert('获取资料出错');&/script&";&&&&&&&&&&& redirect('/login','location',301);&&&&&&& }&&&&&&& //从APIMap获取api相应参数&&&&&&& $baseUrl = $this-&APIMap[$name][0];&&&&&&& $argsList = $this-&APIMap[$name][1];&&&&&&& $method = isset($this-&APIMap[$name][2]) ? $this-&APIMap[$name][2] : "GET";&&&&&&& if(empty($arg)){&&&&&&&&&&& $arg[0] =&&&&&&& }&&&&&&& //对于get_tenpay_addr,特殊处理,php json_decode对\xA312此类字符支持不好&&&&&&& if($name != "get_tenpay_addr"){&&&&&&&&&&& $response = json_decode($this-&_applyAPI($arg[0], $argsList, $baseUrl, $method));&&&&&&&&&&& $responseArr = $this-&objToArr($response);&&&&&&& }else{&&&&&&&&&&& $responseArr = $this-&simple_json_parser($this-&_applyAPI($arg[0], $argsList, $baseUrl, $method));&&&&&&& }&&&&&&& //检查返回ret判断api是否成功调用&&&&&&& if($responseArr['ret'] == 0){&&&&&&&&&&& return $responseA&&&&&&& }else{&&&&&&&&&&& echo "&script&alert('第三方登陆失败')&/script&";&&&&&&&&&&& redirect('/','location',301);&&&&&&& }&&& }&& &&&& //调用相应api&&& private function _applyAPI($arr, $argsList, $baseUrl, $method){&&&&&&& $pre = "#";&&&&&&& $keysArr = $this-&keysA&&&&&&& $optionArgList = array();//一些多项选填参数必选一的情形&&&&&&& foreach($argsList as $key =& $val){&&&&&&&&&&& $tmpKey = $&&&&&&&&&&& $tmpVal = $&&&&&&&&&&& if(!is_string($key)){&&&&&&&&&&&&&&& $tmpKey = $&&&&&&&&&&&&&&& if(strpos($val,$pre) === 0){&&&&&&&&&&&&&&&&&&& $tmpVal = $&&&&&&&&&&&&&&&&&&& $tmpKey = substr($tmpKey,1);&&&&&&&&&&&&&&&&&&& if(preg_match("/-(\d$)/", $tmpKey, $res)){&&&&&&&&&&&&&&&&&&&&&&& $tmpKey = str_replace($res[0], "", $tmpKey);&&&&&&&&&&&&&&&&&&&&&&& $optionArgList[$res[1]][] = $tmpK&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& }else{&&&&&&&&&&&&&&&&&&& $tmpVal =&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& //-----如果没有设置相应的参数&&&&&&&&&&& if(!isset($arr[$tmpKey]) || $arr[$tmpKey] === ""){&&&&&&&&&&&&&&& if($tmpVal == $pre){//则使用默认的值&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }else if($tmpVal){&&&&&&&&&&&&&&&&&&& $arr[$tmpKey] = $tmpV&&&&&&&&&&&&&&& }else{&&&&&&&&&&&&&&&&&&& if($v = $_FILES[$tmpKey]){&&&&&&&&&&&&&&&&&&&&&&& $filename = dirname($v['tmp_name'])."/".$v['name'];&&&&&&&&&&&&&&&&&&&&&&& move_uploaded_file($v['tmp_name'], $filename);&&&&&&&&&&&&&&&&&&&&&&& $arr[$tmpKey] = "@$filename";&&&&&&&&&&&&&&&&&&& }else{&&&&&&&&&&&&&&&&&&&&&&& $this-&error-&showError("api调用参数错误","未传入参数$tmpKey");&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& $keysArr[$tmpKey] = $arr[$tmpKey];&&&&&&& }&&&&&&& //检查选填参数必填一的情形&&&&&&& foreach($optionArgList as $val){&&&&&&&&&&& $n = 0;&&&&&&&&&&& foreach($val as $v){&&&&&&&&&&&&&&& if(in_array($v, array_keys($keysArr))){&&&&&&&&&&&&&&&&&&& $n ++;&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& if(! $n){&&&&&&&&&&&&&&& $str = implode(",",$val);&&&&&&&&&&&&&&& $this-&error-&showError("api调用参数错误",$str."必填一个");&&&&&&&&&&& }&&&&&&& }&&&&&&& if($method == "POST"){&&&&&&&&&&& if($baseUrl == "/blog/add_one_blog") $response = $this-&urlUtils-&post($baseUrl, $keysArr, 1);&&&&&&&&&&& else $response = $this-&urlUtils-&post($baseUrl, $keysArr, 0);&&&&&&& }else if($method == "GET"){&&&&&&&&&&& $response = $this-&urlUtils-&get($baseUrl, $keysArr);&&&&&&& }&&&&&&& return $&&& }&& &&&& //php 对象到数组转换&&& private function objToArr($obj){&&&&&&& if(!is_object($obj) && !is_array($obj)) {&&&&&&&&&&& return $&&&&&&& }&&&&&&& $arr = array();&&&&&&& foreach($obj as $k =& $v){&&&&&&&&&&& $arr[$k] = $this-&objToArr($v);&&&&&&& }&&&&&&& return $&&& }&& &&&& //简单实现json到php数组转换功能&&& private function simple_json_parser($json){&&&&&&& $json = str_replace("{","",str_replace("}","", $json));&&&&&&& $jsonValue = explode(",", $json);&&&&&&& $arr = array();&&&&&&& foreach($jsonValue as $v){&&&&&&&&&&& $jValue = explode(":", $v);&&&&&&&&&&& $arr[str_replace('"',"", $jValue[0])] = (str_replace('"', "", $jValue[1]));&&&&&&& }&&&&&&& return $&&& }&&& }保存说明:这段代码复制不过就行,不用做任何改动。这个是最核心的代码,代码比较多,但是功能代码就这些了,想想,在自己的网站上,别人用qq帐号就可以登录了,都不用注册,多方便啊,是吧,这样一想这些代码也不算多了。&&&&&&&&&& &&&&&&&&&&& &4.建控制器。打开application下的controllers文件夹,在controllers下新建一个文件qq.php,打开qq.php,复制下面代码:
&?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');&& &&&& /*&&&& * @ qq登陆 注销 消息获取等&&&& * @author&&&& */&&& class QQ extends CI_Controller&&& {&&&&& &&&&&&&& public function __construct() {&&&&&&&&&&& parent::__construct();&&&&&&&&&&& session_start();&&&&&&&&&&& $this-&load-&helper('url'); &&&&&&&&&&& //error_reporting(0);&&&&&&&&&&& /*qq登陆*/&&&&&&&&&& $this-&load-&library('tencent/oauth','oauth'); &&&&&&& }&&&&&& &&&&&&&& public function index()&&&&&&& {& &&&&&&&&&&&& //验证是登陆还是回调&&&&&&&&&&& if($this-&oauth-&check_login() === 'false')&&&&&&&&&&& {&&&&&&&&&&&&&&& $this-&oauth-&qq_login();&&&&&&&&&&& }&&&&&&&&&&& else&&&&&&&&&&& {&&&&&&&&&&&&&&& $this-&oauth-&qq_callback();&&&&&&&&&&& }&&&&&&&&&&&&&& &&&&&&&& }&&& &&&& }保存说明:这段代码不用做修改。5.放置登录按钮,点击用QQ帐号登录按钮,跳转到QQ登录页面登录。在你的登录页面放按钮的位置,写入:&div&&a href="/qq"&&img src="/qq_login.png" width="110" /&&/a&&/div&保存说明:样式你可自己调整,图片按钮可以从官网下载,地址:http://wiki./%E8%A7%86%E8%A7%89%E7%B4%A0%E6%9D%90%E4%B8%8B%E8%BD%BD#2.QQ.E7.99.BB.E5.BD.95.E6.A1.86.E6.A0.87.E5.87.86.E6.A0.B7.E5.BC.8F到这里,QQ第三方登录接口就OK了,你打开你的登录页面,点击QQ登录的图片按钮,它会转到QQ登录页面登录,如果要上线,要用到别的功能,可在这几个文件上填代码就行了。申明:本帖仅供学习参考,不涉及任何商业范围,如有冒犯,敬请原谅!如有不对的地方,或者可以改良的地方,请回复指点,受教受教!

我要回帖

更多关于 权限不足 token error 的文章

 

随机推荐