微信页面扫码登录和授权登录附源码

  • Post author:
  • Post category:其他



授权登录开发文档



扫码授权登录开发文档


一、微信授权登录


微信开发文档有四部:

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, "/");
?>


如何成为开发者1



如何成为开发者详细版



版权声明:本文为weixin_44936767原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。