phpapitoken
⑴ php怎麼獲取釘釘員工授權信息
做過一個E應用,使用lumen框架,和你的思路是一樣的,新用戶點進去就自動授權注冊應用,數據存到我們自己的資料庫中,不依賴釘釘,我們還同步了部門信息,如果粘貼復制和下面的那個同學一樣,看上去你也會覺得懵,方法都是封裝好了的。
建議你這樣試試看:
獲取AccessToken:
後端通過corpid,corpsecret請求介面gettoken?corpid=id&corpsecret=secrect獲取AccessToken
獲取釘釘用戶userid:
前端需要相應的處理,攜帶authCode請求,加上AccessToken這兩個參數請求介面/user/getuserinfo?access_token=access_token&code=authCode這個
獲取釘釘用戶詳情:
使用access_token和上一步的釘釘userid 請求介面 /user/get?access_token=ACCESS_TOKEN&userid=
插入釘釘用戶的數據到你的 資料庫中
我們這樣做的:
/**
* 釘釘免登陸獲獲取用信息
* @param $authCode
* @param $url
* @return array
*/
static function outhLogin($authCode, $url)
{
if (empty($authCode) || empty($url)) {
return self::returnError('1101', self::$errorArray['1101']);
}
$accessToken = ComponentDingtalk::getPcAccessToken();
if ($accessToken['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '獲取access_token失敗');
return self::returnError('1102', self::$errorArray['1102']);
}
$dingUserId = ComponentDingtalk::getDingUserid($accessToken['data'], $authCode);
if ($dingUserId['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用戶userid獲取失敗(調用釘釘API)');
return self::returnError('1103', self::$errorArray['1103']);
}
$dinguserInfo = ComponentDingtalk::getDingUserInfo($accessToken['data'], $dingUserId['data']);
if ($dinguserInfo['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用戶信息獲取失敗(調用釘釘API)');
return self::returnError('1104', self::$errorArray['1004']);
}
$userInfo = $dinguserInfo['data'];
return self::transaction(function () use ($accessToken, $userInfo, $url) {
if (count($userInfo['department']) > 1) {
$departIdArr = [];
$departNameArr = [];
for ($i = 0, $iMax = count($userInfo['department']); $i < $iMax; $i++) {
$departInfo[$i] = ServerDepartment::getByDdDepartid($userInfo['department'][$i]);
$departIdArr[] = $departInfo[$i]['id'];
$departNameArr[] = $departInfo[$i]['name'];
}
$depart['id'] = implode(',', $departIdArr);
$depart['name'] = implode(',', $departNameArr);
} else {
$ddDepartmentId = implode(',', $userInfo['department']);
$depart = ServerDepartment::getByDdDepartid($ddDepartmentId);
}
//插入用戶
$user = ServerEmployee::getByDdUserid($userInfo['userid']);
if ($user && $user['status'] == 2) {
return self::returnError('1105', self::$errorArray['1105']);
}
if (empty($user)) {
$roleId = 0;
$departId = $depart['id'];
$name = $userInfo['name'];
$mobile = $userInfo['mobile'];
$departName = $depart['name'];
$position = $userInfo['position'];
$ddUserid = $userInfo['userid'];
$ddStatus = $userInfo['active'] ? 1 : 2;
$ddInfo = json_encode($userInfo, JSON_UNESCAPED_UNICODE);
$tokenOverAt = (int)(time() + $_ENV['PROJECT_apiAppTokenOverTime']);
$token = self::_createToken($userInfo['userid'], $tokenOverAt);
$status = 1;
$userId = ServerEmployee::insert($roleId, $departId, $name, $mobile, $departName, $position, $ddUserid, $ddStatus, $ddInfo, $token, $tokenOverAt, $status);
if (!$userId) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用戶初始化創建失敗');
return self::returnError('1106', self::$errorArray['1106']);
}
}
$userId = $userId ?? $user['id'];
// 更新Token
$id = $userId;
$roleId = $user['roleId'];
$departId = $depart['id'];
$name = $userInfo['name'];
$mobile = $userInfo['mobile'];
$departName = $depart['name'];
$position = $userInfo['position'];
$ddUserid = $userInfo['userid'];
$ddStatus = $userInfo['active'] ? 1 : 2;
$ddInfo = json_encode($userInfo, JSON_UNESCAPED_UNICODE);
$tokenOverAt = (int)(time() + $_ENV['PROJECT_apiAppTokenOverTime']);
$token = self::_createToken($userInfo['userid'], $tokenOverAt);
$status = 1;
$updateParams = ServerEmployee::update($id, $roleId, $departId, $name, $mobile, $departName, $position, $ddUserid, $ddStatus, $ddInfo, $token, $tokenOverAt, $status);
if (!$updateParams) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '用戶信息更新失敗' . json_encode($updateParams, JSON_UNESCAPED_UNICODE) . '/' . json_encode([$id, $roleId, $departId, $name, $mobile, $depart, $position, $ddUserid, $ddStatus, $ddInfo, $token, $tokenOverAt, $status]));
return self::returnError('1107', self::$errorArray['1107']);
}
// 前端的配置信息
// 獲取jsTicket
$jsTicket = ComponentDingtalk::getPcJsTicket($accessToken['data']);
if ($jsTicket['code']) {
self::logError(__CLASS__ . '->' . __FUNCTION__, '獲取jsTicket失敗(調用釘釘API)');
return self::returnError('1111', self::$errorArray['1111']);
}
// 組裝簽名數據
$curUrl = $url;;
$nonceStr = uniqid('', true);
$agentId = $_ENV['PROJECT_ddInterfaceAgentID'];
$timeStamp = time();
$corpId = $_ENV['PROJECT_ddInterfaceCorpId'];
$signature = ComponentDingtalk::getSign($jsTicket['data'], $nonceStr, $timeStamp, $curUrl);
$config = array(
'url' => urldecode($curUrl),
'nonceStr' => $nonceStr,
'agentId' => $agentId,
'timeStamp' => $timeStamp,
'corpId' => $corpId,
'signature' => $signature
);
// 獲取當前角色的許可權
$roleInfo = ServerRole::getById($roleId);
// 當前用戶的頂級部門(不含根部門)
$departInfo = ServerDepartment::getById($departId);
if ($departInfo['parentid'] == 1) { // 二級部門(總經辦)
$departRootId = $departId;
$departRootName = $departName;
} else {
$sonDepart = ServerDepartment::getById($departInfo['parentid']);//分組
if ($sonDepart['parentid'] == 1) {
$departRootId = $sonDepart['id'];
$departRootName = $sonDepart['name'];
} else {
$grandsonDepart = ServerDepartment::getById($sonDepart['parentid']);//部門
if ($grandsonDepart['parentid'] == 1) {
$departRootId = $grandsonDepart['id'];
$departRootName = $grandsonDepart['name'];
} else {
$grandchildDepart = ServerDepartment::getById($grandsonDepart['parentid']);//分公司
$departRootId = $grandchildDepart['id'];
$departRootName = $grandchildDepart['name'];
}
}
}
$company = ServerDepartment::get(['parentid' => 0, 'dd_departid' => 1]);
return self::returnSuccess(array(
'id' => $userId,
'name' => $name,
'token' => $token,
'tokenOverAt' => $tokenOverAt,
'config' => $config,
'power' => $roleInfo['power'] ?? '',
'departId' => $departId,
'departName' => $departName,
'departRootId' => $departRootId,
'departRootName' => $departRootName,
'company' => $company['name'],
));
}, function (Exception $e) {
echo $e->getMessage();
self::logError(__CLASS__ . '->' . __FUNCTION__, $e->getMessage());
return self::returnError('1108', self::$errorArray['1108']);
});
}
⑵ php介面根據不同用戶返回不同數據
token只能用來驗證登陸,無法區別不同用戶。每次登陸後token是變化的。不然就不安全了。
要區分用戶要麼用用戶分組,要麼直接id區分開(這個不好控制,量大的時候,特殊的可以用這個),根據你的業務邏輯來設計。
你還是先理清楚邏輯吧。
⑶ php獲取微信token的是什麼格式的
access_token是公眾號的全局唯一票據,公眾號調用各介面時都需使用access_token。開發者需要進行妥善保存。
access_token的存儲至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的
access_token失效。
access_token的獲取:
<?php
define("APPID", "您的appid");
define("APPSECRET", "您的appsecret ");
$token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . APPID . "&secret=" . APPSECRET;
$res = file_get_contents($token_access_url); //獲取文件內容或獲取網路請求的內容
//echo $res;
$result = json_decode($res, true); //接受一個 JSON 格式的字元串並且把它轉換為 PHP 變數
$access_token = $result['access_token'];
echo $access_token;
php>
⑷ 新浪微博 api 網站中判斷登錄是依據uid還是token呢 php的
判斷用uid,每次登陸成功都將access_token寫入資料庫。
那個access_token是和用戶對應用授權有關的。
⑸ php jsapi ticket怎麼獲取
1、開啟使用了jsapi的頁面的wx.config的debug,提示signature簽名錯誤
2、既然簽名錯誤就一步步列印獲取這個數據的步驟上的中間數據,看是哪個錯了
3、結果是用php curl模擬get https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi 這個去獲取jsapi_ticket時報錯400,請求參數錯誤
請求參數錯誤!!!困擾了很久!之前能成功!
原因:問題出在ACCESS_TOKEN上,這個token的格式會不會出現特殊字元騰訊沒有說明,而「JSSDK說明文檔」中說用http GET方式請求jsapi_ticket時也沒說明 這個 token中會出現特殊字元!!!
在PHP中沒有對該token進行urlencode,於是當token中有特殊字元時就出現400
解決
get和post開放API時,對格式不明的請求參數使用urlencode
⑹ php怎麼將openid變成token
相關解釋如下:
?1、因為是非開放性的,所以所有的介面都是封閉的,只對公司內部的產品有效;
?2、因為是非開放性的,所以OAuth那套協議是行不通的,因為沒有中間用戶的授權過程;
?3、有點介面需要用戶登錄才能訪問;
?4、有點介面不需要用戶登錄就可訪問;
_攵砸隕咸氐悖貧擻敕穸說耐ㄐ啪托枰?2把鑰匙,即2個token。
_諞桓_oken是針對介面的(api_token);
_詼_oken是針對用戶的(user_token)。
⑺ 程序員應該如何設計更優雅的Token認證方式
把認證信息保存在客戶端,關鍵點就是安全的驗證,如果能解決認證信息的安全性問題,完全可以把認證信息保存在客戶端,服務端完全無認證狀態,這樣的話服務端擴展起來要方便很多。關於信息的安全解決方案,現在普遍的做法就是簽名機制,像微信公眾介面的驗證方式就基於簽名機制。簽名,就是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。當用戶成功登系統並成功驗證有效之後,伺服器會利用某種機制產生一個token字元串,這個token中可以包含很多信息,例如來源IP,過期時間,用戶信息等, 把這個字元串下發給客戶端,客戶端在之後的每次請求
4.適用性更廣:只要是支持http協議的客戶端,就可以使用token認證。
5.服務端只需要驗證token的安全,不必再去獲取登錄用戶信息,因為用戶的登錄信息已經在token信息中。
6.基於標准化:你的API可以採用標准化的 JSON Web Token (JWT). 這個標准已經存在多個後端庫(.NET, Ruby, Java,Python,PHP)和多家公司的支持(如:Firebase,Google, Microsoft).
⑻ 微信 在php中 如何獲取access_token
access_token是公眾號的全局唯一票據,公眾號調用各介面時都需使用access_token。開發者需要進行妥善保存。
access_token的存儲至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的
access_token失效。
access_token的獲取:
<?php
define("APPID","您的appid");
define("APPSECRET","您的appsecret");
$token_access_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;
$res=file_get_contents($token_access_url);//獲取文件內容或獲取網路請求的內容
//echo$res;
$result=json_decode($res,true);//接受一個JSON格式的字元串並且把它轉換為PHP變數
$access_token=$result['access_token'];
echo$access_token;
php>
⑼ php介面怎樣安全接收並驗證token
<?php
/*
*PHP簡單利用token防止表單重復提交
*此處理方法純粹是為了給初學者參考
*/
session_start();
functionset_token(){
$_SESSION[『token』]=md5(microtime(true));
}
functionvalid_token(){
$return=$_REQUEST[『token』]===$_SESSION[『token』]?true:false;
set_token();
return$return;
}
//如果token為空則生成一個token
if(!isset($_SESSION[『token』])||$_SESSION[『token』]==」){
set_token();
}
if(isset($_POST[『test』])){
if(!valid_token()){
echo"tokenerror";
}else{
echo『成功提交,Value:』.$_POST[『test』];
}
}
?>
<formmethod="post"action="">
<inputtype="hidden"name="token"value="<?phpecho$_SESSION[『token』]?>">
<inputtype="text"name="test"value="Default">
<inputtype="submit"value="提交"/>
</form>
⑽ PHP寫一個api介面,為什麼需要生成一個token值
token的作用在於過濾請求來源,提高安全性.其他人拿不到token的產生規則,就無法訪問介面.
校驗參數