OAuth2.0网页授权 不弹出“微信登录”页面 获得用户基本信息

php相关 / 2016年10月27日 15时02分 / 10813人浏览
通过OAuth2.0方式不弹出授权页面获得用户基本信息 1. 配置回调域名 2.构造请求url 获取code https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_base&state=1#wechat_redirect (scope=snsapi_base 表示应用授权作用域为 不弹出授权页面,直接跳转,只获取用户openid) 返回回调页面如下 http://israel.duapp.com?code=02a9bed29b2185a9f0ed3a48fe56e700&state=1 这里获得到了code 3.构造请求url 使用code获取OpenID https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 返回如下 { "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-oJ9VmO-0Z-_izfnSAX_s0aqDsYkW4s8W5dLZ4iyNj5Y6vey3dgDtFki5C8r6D0E6mSVxxtb8BjLMhb-mCyT_Yg", "expires_in": 7200, "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-oJ9VmO-0Z-_izfnSAX_s0aqDsYkW4s8W5dLZ4iyNj5YBkF0ZUH1Ew8Iqea6x_itq13sYDqP1D7ieaDy9u2AHHw", "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc", "scope": "snsapi_base" } 4.构造请求url 获取全局Access Token https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 返回如下 { "access_token": "NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ", "expires_in": 7200 } 5.构造请求url 使用全局ACCESS_TOKEN获取OpenID的用户详细信息 https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID 返回如下 { "subscribe": 1, "openid": "oLVPpjqs2BhvzwPj5A-vTYAX4GLc", "nickname": "lostphp", "sex": 1, "language": "zh_CN", "city": "北京", "province": "北京", "country": "中国", "headimgurl": "http://wx.qlogo.cn/mmopen/JcDicrZBlREhnNXZRudod9PmibRkIs5K2f1tUQ7lFjC63pYHaXGxNDgMzjGDEuvzYZbFOqtUXaxSdoZG6iane5ko9H30krIbzGv/0", "subscribe_time": 1386160805 } 成功获得用户基本信息 实例 [codee] getRow("SELECT * FROM `wxch_config` WHERE `id` = 1"); $appid = $wxch_config['appid']; $appsecret = $wxch_config['appsecret']; // 获取code if (!isset($_GET['code'])) { // $redirect = urlencode($GLOBALS['ecs']->url()); $redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; $url = createOauthUrlForCode($redirect, $appid); Header("Location: $url"); } else { // 根据code 获取open_id $code = $_GET['code']; $openid = getOpenId($appid, $appsecret, $code); if ($openid != '' && strlen($openid) == 28) { $_SESSION['store_open_id'] = $openid; //获取全局token $access_token = getToken($appid, $appsecret); //获取 用户信息 $user = getUser($access_token, $openid); $_SESSION['store_user'] = $user; } } } } /** * 作用:生成可以获得code的url */ function createOauthUrlForCode($redirectUrl, $appid) { $urlObj["appid"] = $appid; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["response_type"] = "code"; $urlObj["scope"] = "snsapi_base"; $urlObj["state"] = "STATE" . "#wechat_redirect"; $bizString = formatBizQueryParaMap($urlObj, false); return "https://open.weixin.qq.com/connect/oauth2/authorize?" . $bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid($appid, $secret, $code) { $urlObj["appid"] = $appid; $urlObj["secret"] = $secret; $urlObj["code"] = $code; $urlObj["grant_type"] = "authorization_code"; $bizString = formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?" . $bizString; } /** * 作用:生成可以获得全局Access Token的url */ function createOauthUrlForToken($appid, $secret) { $urlObj["appid"] = $appid; $urlObj["secret"] = $secret; // $urlObj["code"] = $code; $urlObj["grant_type"] = "client_credential"; $bizString = formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/cgi-bin/token?" . $bizString; } /** * 作用:生成可以获得用户信息的url */ function createOauthUrlForUser($token, $openid) { $urlObj["access_token"] = $token; $urlObj["openid"] = $openid; $bizString = formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/cgi-bin/user/info?" . $bizString; } /** * 作用:通过curl向微信提交code,以获取openid */ function getOpenid($appid, $secret, $code) { $url = createOauthUrlForOpenid($appid, $secret,$code); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出 openid $data = json_decode($res, true); $openid = $data['openid']; return $openid; } /** * 作用:通过curl向微信提交openid,以获取获取全局Access Token */ function getToken($appid, $secret) { $url = createOauthUrlForToken($appid, $secret); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出token $data = json_decode($res, true); $access_token = $data['access_token']; return $access_token; } /** * 作用:通过curl向微信提交openid tolen,以获取用户信息 */ function getUser($token,$openid) { $url = createOauthUrlForUser($token,$openid); //初始化curl $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl,结果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出用户信息 $data = json_decode($res, true); return $data; } /** * 作用:格式化参数,签名过程需要使用 */ function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if ($urlencode) { $v = urlencode($v); } //$buff .= strtolower($k) . "=" . $v . "&"; $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } /* 检查是否是微信浏览器访问 */ function is_wechat_browser(){ $user_agent = $_SERVER['HTTP_USER_AGENT']; if (strpos($user_agent, 'MicroMessenger') === false){ return false; } else { return true; } } ?> [/codee]