如今大部分微站都经过用户的微信openid来实现自动登陆。在我以前的开发中,用户经过点击一个菜单,公众号返回一个图文,用户点击这个图文才能够自动登陆微站。可是若是你拥有高级接口,就能够实现点击菜单,打开网页就能获取这个openid,实现自动登陆。php
这里已经提到,必需要拥有高级接口的权限(服务号、企业号),开启了开发者模式。html
在微信公众平台后台“开发者中心”中找到“高级接口”下的“OAuth2.0网页受权”,后面有一个“修改”,点击以后就会弹出填写回调地址的对话框。具体如何受权,请点击这里学习。只有得到高级接口权限后,才能出现这个地方的“修改”。json
注意,这里填写的是域名,不是带http://的网址,并且解释中很清楚,“受权回调域名配置规范为全域名”,也就是说带www和不带是不一样的两个域名。所以我这里要填写以下图中的域名。api
建立菜单能够经过你的微站后台建立,若是没有开启开发者模式,也能够经过微信公众平台后台建立。微信
菜单使用点击打开连接的模式,也就是view模式。若是你是使用开发者模式,经过向微信提交以下代码,便可建立公众号菜单(开发者文档):app
{ "button":[ { "type":"view", "name":"登陆微站", "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid={在微信公众平台后台获取这个APPID}&redirect_uri={你填写的回调域名下的地址}&response_type=code&scope=snsapi_base&state=1#wechat_redirect" }] }
代码1 要提交的菜单代码,下面要用到微信公众平台
APPID的获取位置就是上面你填写回调地址的那个“开发者中心”。下面咱们用PHP来实现一下菜单提交:curl
<?php function curl_info($appid,$secret) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { echo 'Errno'.curl_error($ch); } curl_close($ch); $arr= json_decode($tmpInfo,true); return $arr; } function curl_menu($ACCESS_TOKEN,$data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$ACCESS_TOKEN); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { echo 'Errno'.curl_error($ch); } curl_close($ch); $arr= json_decode($tmpInfo,true); return $arr; } function creat_menu() { $ACCESS_LIST= curl_info(APP_ID,APP_SCR);//获取到的凭证,你须要本身define APP_ID和APP_SCR(应用密钥),这个也是在微信公众平台后台开发者中心找 if($ACCESS_LIST['access_token']!='') { $access_token = $ACCESS_LIST['access_token'];//获取到ACCESS_TOKEN $data = '把上面代码1拷贝黏贴在这里'; $msg = curl_menu($access_token,preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $data)); if($msg['errmsg']=='ok') { die('建立自定义菜单成功!'); } else { die('建立自定义菜单失败!'); } } else { die('建立失败,微信AppId或微信AppSecret填写错误'); } } create_menu(); ?>
代码2 用PHP来建立微信公众号菜单post
代码2其实有点冗余了,核心部分用红色标出来了。就这样,你的微信公众号中应该很快就能够看到建立了一个“登陆微站”的菜单。点击这个菜单就能够实现登陆微站了。学习
若是你不须要PHP,能够直接在微信公众平台后台的菜单自定义中写连接就能够了。
在上图中的这个地方,选择打开连接的方式建立菜单。OK,接下来把上面那个连接放进去:
https://open.weixin.qq.com/connect/oauth2/authorize?appid={在微信公众平台后台获取这个APPID}&redirect_uri={你填写的回调域名下的地址}&response_type=code&scope=snsapi_base&state=1#wechat_redirect
建立菜单就能够了。
固然,你也有可能只须要在你本身的微信管理后台加入这个连接就能够了。
细心的你可能已经发现了,上面的连接地址中含有参数scope=snsapi_base,而非scope=snsapi_userinfo, 由于使用前者不须要用户点击一个受权按钮,直接跳转到回调页面,然后者须要点击受权按钮,不过点击受权按钮有好处,一是能够在没有关注公众号的状况下也可 以受权,二是受权后能够得到用户的一些信息,如昵称、性别、所在地。可是咱们是为了利用openid进行登陆,因此直接选择前者就能够了。
点击菜单以后,通过微信authorize的处理,会跳转到你提交的回调地址(这里须要提醒,回调地址最好不要带参数,例如xxx/?callback=from_weixin,由于微信跳转到你的回调地址也要带参数,而这个参数就你须要的)。微信跳转到以下URL:
回调地址/?code=CODE&state=1
上面代码能够经过$_GET['code']得到一个CODE值,利用这个CODE值和appid,能够得到openid和access_token。
下面再用PHP来实现如下:
if($_GET['code']) { $code = $_GET['code']; $data = get_by_curl('https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSRC&code='.$code.'&grant_type=authorization_code'); $data = json_decode($data); $openid = $data->openid; $access_token = $data->access_token; } function get_by_curl($url,$post = false){ $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if($post){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$post); } $result = curl_exec($ch); curl_close($ch); return $result; }
这样能够就能够得到openid和access_token,利用这些值,咱们还能够利用微信公众平台的获取用户基本信息api接口获取用户基本信息。
原文来自 乌徒帮 http://www.utubon.com/post/3065.html