前言
有時(shí)候我們做了一些網(wǎng)頁嚣潜,希望只有某些人才能看的話椅贱,可以搞一個(gè)釘釘掃碼登錄,接入也比較簡(jiǎn)單计技,下面記錄下接入的過程山橄。
流程
我們先看看官方的文檔:釘釘接入文檔
梳理一下官方的流程:
1、先跳去一個(gè)掃碼網(wǎng)頁睡雇,配置好參數(shù)就能跳,然后用用戶去掃碼它抱;
2、掃碼成功后混移,會(huì)自動(dòng)跳轉(zhuǎn)回你之前設(shè)置的頁面蜘腌,并在鏈接上帶一個(gè)code的參數(shù);
3撮珠、利用appkey和秘鑰去獲取token金矛,這個(gè)token有效期為2小時(shí);
4娶耍、利用第2步獲取的code和第3步獲取的token饼酿,去請(qǐng)求接口,得到一個(gè)持久碼想鹰;
5药版、利用第4步獲取的持久碼再去請(qǐng)求接口,得到一個(gè)SNS_TOKEN槽片;
6、利用第5步獲取的SNS_TOKEN再去請(qǐng)求接口碌廓,得到userInfo的信息剩盒,然后解析就能拿到用戶昵稱。
流程很簡(jiǎn)單,就是按著文檔說的股淡,一步一步往下調(diào)接口就行廷区。
坑點(diǎn)
如果是在網(wǎng)頁直接調(diào)接口的話,會(huì)存在跨域的問題埠帕。所以得搞一個(gè)接口做轉(zhuǎn)發(fā)玖绿。
我寫了個(gè)PHP
<?php
// 指定允許其他域名訪問
header('Access-Control-Allow-Origin:*');
// 響應(yīng)類型
header('Access-Control-Allow-Methods:POST');
// 響應(yīng)頭設(shè)置
header('Access-Control-Allow-Headers:x-requested-with,content-type');
$type=$_GET['type'];
if($type==""){
echo "請(qǐng)輸入type";
}else if($type==1){
echo curl_get_https("https://oapi.dingtalk.com/sns/gettoken?appid={{APP_ID}}&appsecret={{KEY}}");
}else if($type==2){
if($_GET['code']==""||$_GET['token']==""){
echo "請(qǐng)輸入code和token";
}else{
$data = array ('tmp_auth_code' => $_GET['code']);
$data_string = json_encode($data);
echo curl_post_https("https://oapi.dingtalk.com/sns/get_persistent_code?access_token=".$_GET['token'],$data_string);
}
}else if($type==3){
if($_GET['code']==""||$_GET['token']==""||$_GET['openid']==""){
echo "請(qǐng)輸入code斑匪、token、openid";
}else{
$data = array ('openid' => $_GET['openid'],'persistent_code' => $_GET['code']);
$data_string = json_encode($data);
echo curl_post_https("https://oapi.dingtalk.com/sns/get_sns_token?access_token=".$_GET['token'],$data_string);
}
}else if($type==4){
if($_GET['token']==""){
echo "請(qǐng)輸token";
}else{
echo curl_get_https("https://oapi.dingtalk.com/sns/getuserinfo?sns_token=".$_GET['token']);
}
}else{
echo "沒有獲取內(nèi)容";
}
function curl_post_https($url,$data_string){ // 模擬提交數(shù)據(jù)函數(shù)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 線下環(huán)境不用開啟curl證書驗(yàn)證, 未調(diào)通情況可嘗試添加該代碼
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
$res = curl_exec($ch);
curl_close($ch);
return $res; // 返回?cái)?shù)據(jù),json格式
}
function curl_get_https($url){
$curl = curl_init(); // 啟動(dòng)一個(gè)CURL會(huì)話
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書檢查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 從證書中檢查SSL加密算法是否存在
$tmpInfo = curl_exec($curl); //返回api的json對(duì)象
//關(guān)閉URL請(qǐng)求
curl_close($curl);
return $tmpInfo; //返回json對(duì)象
}
?>
OK贪惹,通過上面的接口轉(zhuǎn)發(fā)后奏瞬,前端就可以按照上面的接口去調(diào)了泉孩,很簡(jiǎn)單棵譬。
其他
如果按照正常的邏輯呢,是要求2小時(shí)token過期曼尊,然后要重新掃碼登錄的脏嚷。但我們的需求不用那么嚴(yán)格父叙,只要他掃碼過肴裙,登錄成功蜻懦,驗(yàn)證了用戶身份宛乃,就保存下狀態(tài)征炼,下次再進(jìn)入該網(wǎng)頁的時(shí)候躬贡,就不用再掃碼了。流程圖如下:
OK,大概就這樣檐蚜。