微信现在开放了第三方授权登录的功能,所以折腾一下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是一致的。
您可以登录www.suanjuzi.com查看实际效果。
当然要改的代码不只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('用户名和密码不正确,绑定失败!'); }