微信现在开放了第三方授权登录的功能,所以折腾一下ecshop,除了新浪围脖和腾讯围脖外再加一个微信扫码登录功能。在这篇文章开始,tiandi先说明一些概念,否则将会因为开发文档描述的混乱,而将自己弄得很搞很搞,因为腾讯的个别客服实在是有点垃圾,见《尼妹的腾讯客服1007,你是脑残还是文盲》,单个的开发文档还OK,但是从整体来看,就拿酸橘子来说,已经有了认证的订阅号,服务号,这就两个appid了,为了这个扫码登录功能,还得到open.weixin.qq.com再申请一个appID,而且申请appid的账号还不能用申请过别的服务账号,另外到处都是API,到处都是token。
各种概念
1. 微信公众号开发平台,指的是mp.weixin.qq.com,也是公众号管理的平台,里面有一个开发者中心,开启后,才可以制作和自己网站有联系的功能,例如调用网站的用户信息等。
2. 微信公众号开发者appid,这个是在微信公众号里的开发者中心里提申请的,申请通过后会得到appid和appsecret。
PS:以上两个东西初看和微信第三方登录没有半毛关系,仔细看一下还是没有半毛关系,但是尼妹的最后运用的时候却和第三方授权登录有着紧密不可分的基友关系。
3. 微信开放平台,指的是open.weixin.qq.com,第三方授权登录就是在这里申请的,同样会给一个appid和appsecret。
4. 目前只有PC端上的扫码授权登录接口功能,以及APP类的授权登录,并没有WAP手机网站的微信授权登录。
5. 手机上只能做微信浏览器里的授权登录,即需要用到1,2里的appid。但是此时的openid和PC端扫码得到的openid完全不一样,需要用unionid机制进行绑定
6.unionid机制绑定是通过微信开放平台里绑定公众号来实现的,这时用户的openid虽然不一样,但是unionid会变成同一个,也就是同一个开放账号下的应用APPID+绑定的公众号开发者中心APPID虽然不一样,但是unionid是一致的。
核心代码实现
当然要改的代码不只user.php,还有很多,比如模板文件,第三方接口文件,这些都比较简单,tiandi就不说了,这里只说核心的部分。
在user.php下查找if ($action == ‘default’),将其改成elseif ($action == ‘default’),并在之上插入以下代码:
//by tiandi 处理微信登录 if(isset($_REQUEST['code'])&&isset($_REQUEST['state'])){ include_once(ROOT_PATH . 'includes/website/jntoo.php'); $c = &website('wechat'); if($c) { if(!DO_CHECK($_REQUEST['state'])) { //state判断方式,自己写方法 show_message('非法访问或请求超时!' , '首页',$ecs->url() , 'error'); } $access = $c->Code2Token($_REQUEST['code']); if(!$access) show_message('非法访问或请求超时!' , '首页',$ecs->url() , 'error'); $access = $c->GetRefreshToken($access['refresh_token']); if(!$access) show_message('非法访问或请求超时!' , '首页',$ecs->url() , 'error'); $info = $c->Getinfo($access['access_token'],$access['openid']); if(!$info) show_message('非法访问或请求超时!' , '首页',$ecs->url() , 'error'); //获取微信传递过来的微信用户信息 $nickname = $info['nickname']; $sex = $info['sex']; $openid = $info['openid']; $headimgurl = $info['headimgurl']; $unionid = $info['unionid']; $info_user_id = 'wx_'.$info['unionid']; if(!$info['openid']) show_message($c->get_error() , '首页' , $ecs->url() , 'error' , false); $sql = 'SELECT user_name,password,aite_id FROM '.$ecs->table('users').' WHERE aite_id = "'.$info_user_id.'" or wxid = "'.$openid.'"'; $count = $db->getAll($sql); if(!$count) { //如果没有记录,则新建微信用户并提示绑定 $smarty->assign('wechatid', $info_user_id); $smarty->assign('openid', $openid); $smarty->assign('wx_name', $nickname); $smarty->assign('headimg', $headimgurl); $smarty->assign('action', 'wechat_ready'); $smarty->display('user_passport.dwt'); } else { //如果没有信息 for($i=0;$i<count($count);$i++) { if($count[$i]['aite_id'] == $info_user_id) { $user_name = $count[$i]['user_name']; break; } else { $sql = 'UPDATE '.$ecs->table('users')." SET aite_id = '$info_user_id' WHERE user_id = '$count[$i][user_id]'"; $db->query($sql); $user_name = $count[$i]['user_name']; break; } } } $user->set_session($user_name); $user->set_cookie($user_name); update_user_info(); recalculate_price(); show_message($_LANG['login_success'] . $ucdata , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array('index.php','user.php'), 'info'); } else show_message('服务器尚未注册该插件!' , '首页',$ecs->url() , 'error'); } /* by tiandi 微信绑定用户 */ elseif($action == 'wechatbd') { if(isset($_REQUEST['wechatid']) && $_REQUEST['wechatid'] != '') $wechatid = mysql_real_escape_string($_REQUEST['wechatid']); if(isset($_REQUEST['openid']) && $_REQUEST['openid'] != '') $wechatid = mysql_real_escape_string($_REQUEST['openid']); if(isset($_REQUEST['username']) && $_REQUEST['username'] != '') $username = mysql_real_escape_string($_REQUEST['username']); if(isset($_REQUEST['password']) && $_REQUEST['password'] != '') $password = mysql_real_escape_string($_REQUEST['password']); if(isset($_REQUEST['wx_name']) && $_REQUEST['wx_name'] != '') $wx_name = mysql_real_escape_string($_REQUEST['wx_name']); if(isset($_REQUEST['headimg']) && $_REQUEST['headimg'] != '') $headimg = mysql_real_escape_string($_REQUEST['headimg']); //用户不绑定账号 if(!$wechatid || !$username || !$password) { $username = GET_USERNAME; //用户名获取方式,自己写方法 $password = GET_PASSWORD; //密码获取方式,自己写方法 $sql = 'INSERT INTO '.$ecs->table('users').'(user_name , password, nickname,aite_id ,reg_time , user_rank , is_validated, wxid, headimg) VALUES '. "('$username' , '$password' , '$wx_name' ,'$wechatid' , '".gmtime()."' , '99' , '0' , '$openid' , '$headimg')" ; $db->query($sql); $sql = "INSERT INTO `wxch_user` (`subscribe`, `wxid` , `dateline`) VALUES ('1','$openid','$time')"; $db->query($sql); $user->set_session($username); $user->set_cookie($username); update_user_info(); recalculate_price(); show_message($_LANG['login_success'] . $ucdata , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act,'user.php'), 'info'); } //用户绑定账号 if ($user->login($username, $password,isset($_POST['remember']))) { //不考虑用户是否已经绑定过微信 $sql = "UPDATE ".$ecs->table('users')." SET aite_id = '$wechatid' ,headimg = '$headimg' ,wxid = '$openid', wxch_bd = 'ok' WHERE user_name = '$username'"; $db->query($sql); show_message('已经成功的将您的微信号与'.$username.'绑定!' , array($_LANG['back_up_page'], $_LANG['profile_lnk']), array($back_act,'user.php'), 'info'); } show_message('用户名和密码不正确,绑定失败!'); }
敢问博主,有微信工作号认证的服务号,能给PC电脑做扫码登录吗?
不能,得去申请开发者账号,才可以做扫码登录。
学习下
您好,申请网站微信登录失败,驳回原因为:无授权扫描文件。求解?
这个你要问微信那边是啥文件了。
不好意思,问题早解决了。是授权回调域名错了,现在才在垃圾箱看到该回应。谢谢。
点击微信登录 提示这个 Scope 参数错误或没有 Scope 权限
是不是微信开发者需要认证 (300元) ??
这个不确定,你可以询问一下官方客服看看。
还是错误,有解决的朋友吗,,给个参考看看
我这里遇到一个问题无法解决求教一下:
首先我的ecshop通过关注获取的wxid是$fromUsername = $postObj -> FromUserName; 得到的数据是oBbtauH4rEp4OslDKdRxJ2CwoAWc
但是通过微信网页的app_key和app_secret获取回来的不管是openid还是unionid 都不是前面的$fromUsername 那个值导致我的登陆验证不了! 这里该如何解决?
看文章,概念的5,6点。
这个我知道 但是ecshop关注注册插件里面tianxin100 写得代码就是关注的时候就注册FromUserName 拿来作为wxid 而不是我们说的openid 或者unionid ,导致了我现在要扫描登陆只能获取openid 和unionid 而不是他注册的FromUserName .这里我想问问 FromUserName 和(openid、unionid)之间什么关系?怎么转换? 谢谢
fromusername就是用户对你的公众号的openid,然后你扫码登录的openid是开放平台的openid,这两个openid不同,但是都有另外一个unionid字段,需要到扫码的那个开放平台绑定你的公众号,然后这两个unionid就是相同的了。
是这样的 扫描的那个平台绑定了! 扫描二维码我也可以获取开放平台的openid和unionid 但是对于公众号在关注的时候我无法获取unionid 做出他们的关联 我也就是需要知道如何在关注的时候就获取unionid
关注的时候是取不到的,但是关注后,用户操作任何东西,比如点菜单,比如输入关键字,你在处理的地方去拿他的openid去换unionid去。
我在网页扫描登陆的时候可以获取 unionid和openid 只是针对当前应用,但我要在此同事获取fromusername 可以做到么? 如何做? 也就是当前公众号的 openid
不能做到,用户只有在微信里操作才能拿到
现在的问题是关注的时候注册了用户信息 在扫描的时候如何绑定起来? 如果先扫描注册了用户信息 关注的时候如何自动关联? 在关注的时候是获取不到unionid的 我无法关联他们之间的关系
关注的时候不需要关联,只有当用户和微信发生互动时再去拿union_id。
现在我的这个需求是 1 关注的后可以登陆 tianxin100用的FromUserName 来注册 !2 扫描后也可以登陆,但是没有关注的话就需要生成一个注册数据 3 关注和扫描的数据要关联起来! 这里就有个问题 我扫描和关注生成的就是两条数据 关联的时候合并就要删除一条?
差不多这个意思,你也可以不删除,两边都只调用一组记录就行。
不知道我的为何总是爆40029 function Code2Token($code)
{
$params = ‘appid=’.$this->app_key.’&secret=’.$this->app_secret.’&code=’.$code.
‘&grant_type=authorization_code’;
$tokenurl = $this->tokenURL.”?”. $params;
$token = $this->http($tokenurl, ‘GET’);
$token = json_decode($token , true);
return $token;
}
这个方法总是返回失败
失败代码是什么?是HTTP请求没出去还是别的?
if(!DO_CHECK($_REQUEST[‘state’])) { //state判断方式,自己写方法
后面的注释能解释一下吗?方法应该如何写呢? 谢谢一个初学者
就单纯的判断回调的值里的state是否和之前你传递过去的state是否一致。
谢谢您的回答,可是state生成的是什么数据?一个随机数吗?
state的生成应该写在哪里呢。。
麻烦了 有时间回复一下 谢谢啦
随便什么数值,你提交给微信的时候生成。
明白了!衷心感谢。 最后一个问题,在模版文件中怎么调用这个函数接口。。。
模板里不能调用,在PHP里调用,new一个类出来,调用其方法。
state 的生成, 和 $_REQUEST[‘state’] 判断该怎么写呢?
你现在会写了吗?
这个问题您现在知道了吗 可以请教一下吗
我还是不知道啊.你知道了可要通知我
这个问题您现在知道了吗?新手请求指导
把生成的这个 state 放到 session 里面,发出去的时候放入session,接收到的参数再跟session里面的比较
还是不会哇,,大神求教。
$state = md5(uniqid(rand(), true));
………………………………………………………………
$this->qq_static_var(‘state’,$state);
public function qq_static_var($key, $val=null){
static $i =0;
if($i === 0 && !$_SESSION) // 暂时用session.
session_start();
// 只有一个参数时是读, 否则是写.
if($val !== null){
$_SESSION[$key] = $val;
}
//无论如何都会返回!
return $_SESSION[$key];
}
放在哪个文件?可以加个qq吗?
我现在返回的是空白。
没看邮箱。。qq:1033394840
开发者那边如何配置啊
微信开发者后台?
能否加个好友?
热烈关注
能不能把“还有很多,比如模板文件,第三方接口文件…”说详细呢?楼主,我最近也在用ecshop做微信第三方登录…
如果只要实现微信第三方登录,那么不必考虑模板文件,这里的模板是登录后,用户选择绑定旧会员的页面。第三方接口文件,我相信你应该有类似QQ登录的第三方接口文件了,照着改一下即可,都是auth2.0的。
恩 我有类似QQ登录第三方接口 可否留个QQ联系方式呢 好想问你 如果要收费我也可以 可以吗?
而且你贴出来的代码 有些说要“自己写”我好想知道你写代码哦 ~~~~(>_<)~~~~
那个根目录\includes\website的微信登录的文件怎么写?比如我参照了qq.php来写成weixin.php,但是如:“$this->authorizeURL = ‘https://graph.qq.com/oauth2.0/authorize’;”的网址要怎么改呢?
这个的话,你有没有申请微信开放平台?平台上有文档,上面有各种API接口地址。
有申请 但文档的就没见到了..
你可以贴出includes文件夹关于微信这块代码文件不?拜托了…
我这样做不知道对不对?
function website()
{
$this->app_key = APP_KEY;
$this->app_secret = APP_SECRET;
$this->scope = ‘snsapi_login’;
$this->authorizeURL = ‘https://api.weixin.qq.com/sns/oauth2/access_token’;
$this->post_login = array();
$this->meth = ‘GET’;
$this->tokenURL = ‘https://api.weixin.qq.com/sns/oauth2/refresh_token’;
$this->post_token = array();
$this->graphURL = ‘https://api.weixin.qq.com/sns/auth’;
$this->userURL = ‘https://api.weixin.qq.com/sns/userinfo’;
$this->post_msg = array(
‘client_id’ => ”,
‘client_secret’=>”,
‘oauth_consumer_key’ => $this->app_key,
‘format’=>’json’
);
}
我想说 我到了第二步 第一次能获取到数据出来,但第二步中有个刷新access_token有效期的步骤,我怎么写都不对,你可以告诉我下怎么写吗?谢谢了
这两天有点忙,回头我整理一下其他代码,一起帖出来。
您好~ 请问您的问题是否解决了~新手请求指导~这个文件该如何写
亲,易多APP免费提供wordpress博客类app生成工具,诚邀站长拍砖吐槽。
你这里怎么都是ECSHOP了,最近忙啥呢
最近公司项目折腾这个。