/** * 获取发送短信的令牌 * @param Boolean $flag 是否请求新令牌:true-请求(不管本地Redis是否保存令牌) false-不请求(首先从本地Redis中取,没有的话再向服务器请求) * @return String 令牌 */ private static function getAccessToken($flag) { if (!$flag) { // 首先从本地Redis中取 $accesstoken = MyRedis::get('sms.accesstoken'); if ($accesstoken) { return $accesstoken; } } $url = "https://oauth.api.189.cn/emp/oauth2/v3/access_token"; $postData['grant_type'] = 'client_credentials'; $postData['app_id'] = YsSmSService::APPID; $postData['app_secret'] = YsSmSService::APPSECRET; foreach ($postData as $key => $value) { $post[] = $key . '=' . $value; } $curl = new t\Curl(); $resultJson = $curl->post($url, implode('&', $post)); $resObj = json_decode($resultJson); $expiers = intval($resObj->expires_in); $accesstoken = $resObj->access_token; if ($expiers > 0) { MyRedis::set('sms.accesstoken', $accesstoken, $expiers); } return $accesstoken; }
/** * 获取用户凭证(包括获取超级用户的用户凭证) * 超级用户ID:-1(程序内部推送消息需要用到) * @param $userId 用户ID -1:获取超级用户的用户凭证 * @param $expire 期限(秒) -1:没有生存期限,一直保存在Redis中 * @return false:生成失败 其它值:$userToken 用户凭证 */ protected function getUserToken($userId, $expire = 3600) { $maxNums = 7; // 最多循环生成次数 $userToken = false; $isSuccess = false; // 记录是否生成userToken成功 for ($i = 0; $i < $maxNums; $i++) { $userToken = generateUserToken($userId); $saveUserId = p\MyRedis::get("token.to.userid:{$userToken}"); if ($saveUserId) { // 用户凭证已经存在 $isSuccess = false; continue; } else { $isSuccess = true; if ($expire == -1) { // 没有生存期限,一直保存在Redis中 p\MyRedis::set("token.to.userid:{$userToken}", $userId); } else { p\MyRedis::set("token.to.userid:{$userToken}", $userId, $expire); } break; } } if (!$isSuccess) { $userToken = false; } // 生成失败 return $userToken; }