前段時(shí)間剛做完微信登陸柬采,就想先寫(xiě)個(gè)文檔方便以后繼續(xù)處理關(guān)于微信登陸方面的代碼魂务,寫(xiě)代碼前微信公眾平臺(tái)還需要修改一些配置:
1.在執(zhí)行之前需要在微信公眾平臺(tái)配置網(wǎng)頁(yè)授權(quán)作用域
2.登陸微信公眾平臺(tái)點(diǎn)擊管理中心==>網(wǎng)站應(yīng)用==>(如果有綁定的網(wǎng)站應(yīng)用)查看==>開(kāi)發(fā)信息--修改
詳細(xì)的步驟可以參考:https://www.cnblogs.com/0201zcr/p/5131602.html
注意:支付授權(quán)目錄多個(gè)凌受, js安全域名3個(gè)裂明、授權(quán)回調(diào)頁(yè)面1個(gè) 偶芍;
微信登錄基本有三個(gè)步驟拌禾。
第一步:請(qǐng)求CODE
第三方使用網(wǎng)站應(yīng)用授權(quán)登錄前請(qǐng)注意已獲取相應(yīng)網(wǎng)頁(yè)授權(quán)作用域(scope=snsapi_login)取胎,則可以通過(guò)在PC端打開(kāi)以下鏈接:
// 兩種授權(quán)地址不一樣需要注意!E惹稀N胖!您市!
// 微信瀏覽器授權(quán):https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信公眾號(hào)appid&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
// 第三方瀏覽器掃碼登錄https://open.weixin.qq.com/connect/qrconnect?appid=微信開(kāi)放平臺(tái)appid&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
// 授權(quán)登錄使用的APPID是微信公眾號(hào)的appid觉痛,掃碼登錄使用的是微信開(kāi)放平臺(tái)的appid
REDIRECT_URI回調(diào)地址填寫(xiě)你的你準(zhǔn)備處理微信登錄操作的外網(wǎng)地址,回掉地址需要使用urlencode函數(shù)進(jìn)行處理
RESPONSE_TYPE 填code
SCOPE根據(jù)需求填茵休,可以填兩種snsapi_login和snsapi_userinfo
snsapi_login 獲取登陸授權(quán)
snsapi_userinfo 獲取用戶(hù)信息
snsapi_base 微信支付也需要獲取openid薪棒,選擇該參數(shù)(靜默授權(quán))
第二步:通過(guò)code獲取access_token
從第一步會(huì)跳回到這個(gè)方法,get方式傳回來(lái)code參數(shù)
$code = $_GET['code'];
$wxData = $this->getWxUserData($code);
第三步: 刷新access_token(一般不需要)
第四步:通過(guò)access_token調(diào)用接口
下面的方法是我在ci框架中寫(xiě)的根據(jù)code獲取用戶(hù)信息榕莺,使用時(shí)根據(jù)需求修改
/**
* 根據(jù)code拉取用戶(hù)微信信息
* @param $code
* @return array|mixed
*/
function getWxUserData($code)
{
// 1.根據(jù)code獲取access_token
$appId = $this->m_common->getWxParameter(WX_OPEN_APPID);
$secret = $this->m_common->getWxParameter(WX_OPEN_SECRET);
$url = "https://api.weixin.qq.com/sns/oauth2/access_token";
$data = array(
'code' => $code,
'appId' => $appId,
'secret' => $secret,
'grant_type' => 'authorization_code',
);
$res = $this->m_common->request_post($url, $data);
$result = json_decode($res, true);
// 4.根據(jù)token獲取用戶(hù)信息
$accessToken = $result['access_token'];
$openId = $result['openid'];
$url2 = "https://api.weixin.qq.com/sns/userinfo";
$data2 = array(
'access_token' => $accessToken,
'openid' => $openId
);
$res = $this->m_common->request_post($url2, $data2);
$data = json_decode($res, true);
return $data;
}
下面是我封裝的curl的post請(qǐng)求方法
/**
* 模擬post進(jìn)行url請(qǐng)求
* @param string $url
* @param array $post_data
* @return bool|mixed
*/
function request_post($url = '', $post_data = array())
{
if (empty($url) || empty($post_data))
{
return false;
}
$o = "";
foreach ( $post_data as $k => $v )
{
$o.= "$k=" . urlencode( $v ). "&" ;
}
$post_data = substr($o,0,-1);
$postUrl = $url;
$curlPost = $post_data;
$ch = curl_init();// 初始化curl
curl_setopt($ch, CURLOPT_URL,$postUrl); // 抓取指定網(wǎng)頁(yè)
curl_setopt($ch, CURLOPT_HEADER, 0); // 設(shè)置header
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 跳過(guò)證書(shū)檢查 其中跳過(guò)證書(shū)是為了訪問(wèn)https俐芯。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 要求結(jié)果為字符串且輸出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1);// post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // 請(qǐng)求參數(shù)
$data = curl_exec($ch);//運(yùn)行curl
curl_close($ch);
return $data;
}