一、微信授权登录
微信开发文档有四部:
1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token、openid
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
snsapi_base: 到第二步就结束了,获取到openid,其他操作在这个基础上(比如记录该用户访问时间次数信息)
snsapi_userinfo: 获取openid和用户资料(昵称、头像、国、省、城市、性别、权限)
注意:
这手机里微信端采用的是授权登录,PC端采用的是微信开发者扫码登录
如何分辨是微信端还是PC端请参考
PHP如何分辨当前是移动端,还是PC端
1、首先是拉起页面
//发起微信授权登录
//state作为授权登录成功后,调转的页面
<a href="wxmp/login.php?act=getCode&state=<?=$HTTP_SELF."A_formweixin.php"?>" class="ziti_ddngu">微信登录</a>
2、参数处理
wxmp/login.php
//当前文件路径
$HTTP_SELF_URL = $HTTP_TYPE . $_SERVER["HTTP_HOST"] . $_SERVER['PHP_SELF'];
//curl采集get接口信息
//当我们在做php开发的时候,非常多时候须要对接口进行測试,或者更方便的调用一些已有模块的接口,取到结果并进行兴许操作,我们能够通过curl进行模拟提交post和get请求,来去实现这些功能
function curl_get($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);//HTTPS这个是重点。
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);//HTTPS这个是重点。
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
//curl发送post数据,这个在本文章中没有用到,可忽略。作为延伸知识点
function curl_post($url , $data=array()){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1);// POST数据
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);// 把post的变量加上
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
<?php
/*
* 微信开发者 PC端授权登录
*
*/
$act = $_GET["act"];
$state = $_GET["state"];//携带的参数
// 第一步:用户同意授权,获取code
if($act=="getCode" || $act=="getCodeUserInfo"){
//微信端
if(_isMobile("wxmp")){
$scope = "snsapi_base";
if($act == "getCodeUserInfo"){
$scope = "snsapi_userinfo";
}
$code_url = "https://open.weixin.qq.com/connect/oauth2/authorize";
$code_url .= "?appid=" . AppID_mp . ""; //获取当前公众号的appid
$code_url .= "&redirect_uri=" . $HTTP_SELF_URL . ""; //授权后重定向回调会当前文件
$code_url .= "&response_type=code"; //返回类型,请填写code
$code_url .= "&scope=".$scope.""; //snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid)
//snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别等。即使在未关注公众号,用户授权后,也能获取其信息)
$code_url .= "&state=".$state.""; //重定向后会带上state参数,可以填写a-zA-Z0-9的参数值,最多128字节
$code_url .= "#wechat_redirect"; //必须带此参数
header("Location:$code_url");
exit;
//其他端(包括PC)
}else{
$code_url = "https://open.weixin.qq.com/connect/qrconnect";
$code_url .= "?appid=" . AppID_pc . ""; //获取当前开发者的appid
$code_url .= "&redirect_uri=" . $HTTP_SELF_URL . "";
$code_url .= "&response_type=code";
$code_url .= "&scope=snsapi_login";
$code_url .= "&state=".$state."";
$code_url .= "#wechat_redirect";
header("Location:$code_url");
exit;
}
}
//如果code不为空执行第二部
if($_GET["code"]){
//微信端
if(_isMobile("wxmp")){
// 第二步:通过code换取网页授权access_token
$token_url = "https://api.weixin.qq.com/sns/oauth2/access_token";
$token_url .= "?appid=" . AppID_mp . "";
$token_url .= "&secret=" . AppSecret_mp . "";//公众号密钥
$token_url .= "&code=".$_GET["code"]."";
$token_url .= "&grant_type=authorization_code";
//其他端(包括PC,浏览器手机端)
}else{
// 第二步:通过code换取网页授权access_token
$token_url = "https://api.weixin.qq.com/sns/oauth2/access_token";
$token_url .= "?appid=" . AppID_pc . "";
$token_url .= "&secret=" . AppSecret_pc . "";//开发者账号密钥
$token_url .= "&code=".$_GET["code"]."";
$token_url .= "&grant_type=authorization_code";
}
$json_token = curl_get($token_url);//获取返回参数
$token = json_decode($json_token, true);//转化为json
if (isset($token['errcode'])){//不是空报错
echo "<h3>2_errcode:</h3>" . $token['errcode'];
echo "<h3>2_errmsg:</h3>" . $token['errmsg'];
exit;
//返回说明 正确的JSON返回结果:
//{ "errcode":0,"errmsg":"ok"}
}
$access_token = $token['access_token'];//获取access_token
$openid = $token['openid'];//获取openid
// 第三步:刷新access_token(如果需要)
// 第四步:拉取用户信息(需scope为 snsapi_userinfo)
$userInfo_url = "https://api.weixin.qq.com/sns/userinfo";
$userInfo_url .= "?access_token=".$access_token."";
$userInfo_url .= "&openid=".$openid."";
$userInfo_url .= "&lang=zh_CN";
$json_info = curl_get($userInfo_url);//获取返回参数
$info = json_decode($json_info, true);//转化为json
if (isset($info['errcode'])){//不是空报错
if($info['errcode']=="48001"){ //未授权
header("Location:".$_SERVER["PHP_SELF"]."?act=getCodeUserInfo&state=".$state."");
exit;
}
echo "<h3>3_errcode:</h3>" . $info['errcode'];
echo "<h3>3_errmsg:</h3>" . $info['errmsg'];
exit;
}
//存入cookie
setcookie('wxmpUserInfo',$json_info,NULL,"/");
//调整返回路径
header("Location:$state");
exit;
}
echo '授权错误[空]';
exit;
?>
A_formweixin.php文件
<?php
//开启session
session_start();
//释放session。之后可读不可写(防堵塞)
session_write_close();
include 'adminIsAdmin/php_conn.php';
?>
<?php
$wxmpUserInfo = $_COOKIE["wxmpUserInfo"] ? json_decode($_COOKIE["wxmpUserInfo"], true) : array();
if(!$wxmpUserInfo["openid"]){
header("Location:./");
exit;
}
//echo json_encode($wxmpUserInfo, true);
//exit;
$WXopenid = $wxmpUserInfo["openid"];
$WXunionid = $wxmpUserInfo["unionid"] ? $wxmpUserInfo["unionid"] : '';
//然后后面进行会员信息存储
//清除获取的微信用户信息缓存
setcookie("wxmpUserInfo", "", time() - 3600, "/");
?>
版权声明:本文为weixin_44936767原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。