微信登录oauth2.0
微信oauth2.0登陆流程:
- 客户端(User)访问站点;
- Web站点跳转至授权服务器,并带上appid、redirect_uri、response_type、scope、state等参数;
- 授权服务器请求用户输入账号和密码;
- 用户输入账号和密码,并授权;
- 授权服务器返回code到Web站点;
- Web站点带上appid、appsecret、code、grant_type参数返回给授权服务器,请求获取access_token、openid ;
- 授权服务器返回access_token、openid、refresh_token等参数;
- Web站点带上access_token、openid、lang参数给授权服务器获取用户信息;
- 授权服务器返回用户信息给Web站点;
- Web站点将用户信息返回给客户端(User).
流程图:
PHP源码(APPID 和 APPSECRET 换成自己申请的):
<?php
/*
* 绑定微信 bobwen add
*/
define("APPID", "wwacs354wertf89iykgk");
define("APPSECRET", "9125435wertsfgsdg7f08edsgas0ae8");
class weixin{
var $appid = APPID;
var $appsecret = APPSECRET;
var $access_token = '';
/**
* 获取openid
*/
function get_openid() {
if (!empty($appid))
{
$openid=@$_COOKIE['sopenid'];
if(array_key_exists('HTTP_USER_AGENT', $_SERVER)){
if(!$openid && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false){
//使用jsapi接口
//$jsApi = new JsApi_pub();
if (!isset($_GET['code']))
{
//=========步骤1:网页授权获取用户openid============
//通过code获得openid
//触发微信返回code码
$backurl = $this->get_url();
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=".urlencode($backurl)."&response_type=code&scope=snsapi_base&state=123#wechat_redirect";
//echo $url;
Header("Location: $url");
}else
{
//获取code码,以获取openid
$code = $_GET['code'];
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$appsecret&code=".$code."&grant_type=authorization_code";
$re = $this->http_request_json($url);
$rearr = json_decode($re,true);//获取返回的appid和access_token
if(isset($rearr['openid']))
{
$openid = $rearr['openid'];
setcookie("sopenid",$openid,time()+864000,'/');
}
}
}
}
}
return $rearr;
}
/**
* 获取用戶信息
*/
function get_user_info($res) {
$url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=$res['access_token']&openid=$res['sopenid']";
$re = $this->http_request_json($url);
$rearr = json_decode($re,true);
return $rearr;
}
/**
* 获取当前页面完整URL地址
*/
function get_url() {
$sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
$relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.$_SERVER['QUERY_STRING'] : $path_info);
return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}
function http_request_json($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
}
$weixin = new weixin();
$res=$weixin->get_openid();
$usrinfo=$weixin->get_user_info($res);
return $userinfo;
?>