public function _initialize()
{
parent::_initialize();
$this->tts_clientId = Config::get('site.tts_clientId');
$this->tts_clientSecret = Config::get('site.tts_clientSecret');
$this->auto_tts_accessToken = Db::name('tts_user')->where(['id' => 1])->value('accessToken');
$this->auto_tts_accessTokentime = Db::name('tts_user')->where(['id' => 1])->value('catetime');
$this->auto_tts_refresh_token = Db::name('tts_user')->where(['id' => 1])->value('refresh_token');
}
//注册通通锁账号
public function tts_register()
{
//先看管理员auto_tts_accessToken 是否过期
if ($this->auto_tts_accessTokentime < time() - 60 * 60 * 60 * 24) {
//重新获取管理员账号accessToken
$url = 'https://cnapi.ttlock.com/oauth2/token';
$post_data = [
'clientId' => $this->tts_clientId,
'clientSecret' => $this->tts_clientSecret,
'grant_type' => 'refresh_token',
'refresh_token' => $this->auto_tts_refresh_token,
];
$token = curl_post($url, $post_data);
$token = json_decode($token, true);
$save_token = [
'accessToken' => $token['access_token'],
'refresh_token' => $token['refresh_token'],
'catetime' => time()
];
Db::name('tts_user')->where(['id' => 1])->update($save_token);
$this->auto_tts_accessToken = $save_token['accessToken'];
$this->auto_tts_accessTokentime = $save_token['catetime'];
$this->auto_tts_refresh_token =$save_token['refresh_token'];
}
$user_info = \app\common\model\User::where(['id' => $this->auth->id])->find();
if ($user_info['tts_status'] == 0) {
//注册账号
$url = 'https://cnapi.ttlock.com/v3/user/register';
$post_data = [
'clientId' => $this->tts_clientId,
'clientSecret' => $this->tts_clientSecret,
'username' => $user_info['mobile'],
'password' => md5($user_info['mobile']),
'date' => time(),
];
$register_info = curl_post($url, $post_data);
$register_info = json_decode($register_info, true);
if (isset($register_info['username'])) {
$user_info->tts_username = $register_info['username'];
$user_info->tts_password = $post_data['password'];
$user_info->tts_status = 1;
$user_info->save();
} else {
$this->error('通通锁账号注册失败');
}
$user_info = \app\common\model\User::where(['id' => $this->auth->id])->find();
}
if ($user_info['tts_endtime'] <= time()) {
//电子钥匙已过期,发放电子钥匙
$receiverUsername = $user_info['tts_username'];
$tts_keyId = $this->send_key($receiverUsername);
$user_info->tts_endtime = time() + 60 * 60 * 60 * 24;
$user_info->tts_keyId = $tts_keyId;
}
$tts_accessToken = $user_info['tts_accessToken'];
//获取访问令牌
if ($user_info['tts_accesstime'] < time() - 60 * 60 * 60 * 24) {
// 令牌过期重新获取
$tts_username = $user_info['tts_username'];
$tts_password = $user_info['tts_password'];
$tts_accessToken = $this->gettoken($tts_username, $tts_password);
$user_info->tts_accesstime = time();
$user_info->tts_accessToken = $tts_accessToken;
$user_info->save();
}
//开始开锁
$this->unlock($tts_accessToken);
}
//获取访问令牌
public function gettoken($username, $password)
{
$url = 'https://cnapi.ttlock.com/oauth2/token';
$post_data = [
'clientId' => $this->tts_clientId,
'clientSecret' => $this->tts_clientSecret,
'username' => $username,
'password' => $password,
];
$token = curl_post($url, $post_data);
$token = json_decode($token, true);
return $token['access_token'];
}
//开锁
public function unlock($tts_accessToken)
{
$url = 'https://cnapi.ttlock.com/v3/lock/unlock';
$post_data = [
'clientId' => $this->tts_clientId,
'accessToken' => $tts_accessToken,
'lockId' => '16947005',
'date' => time() . '000',
];
$unlock_info = curl_post($url, $post_data);
$unlock_info = json_decode($unlock_info, true);
if ($unlock_info['errcode'] == 0) {
$this->success('开锁成功');
} else {
$this->error('网络错误,请重试');
}
}
//发送电子钥匙
public function send_key($receiverUsername)
{
$url = 'https://cnapi.ttlock.com/v3/key/send';
$post_data = [
'clientId' => $this->tts_clientId,
'accessToken' => $this->auto_tts_accessToken,//管理员账号 accessToken
'lockId' => '16947005',
'receiverUsername' => $receiverUsername,
'keyName' => $receiverUsername,
'startDate' => time() . '000',
'endDate' => time() + 60 * 60 * 60 * 24 . '000',
'date' => time() . '000',
'remoteEnable' => 1,
];
$unlock_info = curl_post($url, $post_data);
$unlock_info = json_decode($unlock_info, true);
if ($unlock_info['errcode'] == 0) {
return $unlock_info['keyId'];
} else {
$this->error('网络错误,请重试(code`电子钥匙`)');
}
}
//获取锁电子钥匙
public function get_key()
{
$url = 'https://cnapi.ttlock.com/v3/key/get';
$post_data = [
'clientId' => $this->tts_clientId,
'accessToken' => '601d635c0e41f9643e108e4c7a031dea',
'lockId' => '16947005',
'date' => time() . '000',
];
$unlock_info = curl_post($url, $post_data);
$unlock_info = json_decode($unlock_info, true);
dump($unlock_info);
exit;
// if ($unlock_info['errcode'] == 0) {
// $this->success('开锁成功');
// } else {
// $this->error('网络错误,请重试');
// }
}
//修改电子钥匙有效期
public function changePeriod_key()
{
$url = 'https://cnapi.ttlock.com/v3/key/changePeriod';
$post_data = [
'clientId' => $this->tts_clientId,
'accessToken' => '601d635c0e41f9643e108e4c7a031dea',
'keyId' => '176457697',
'startDate' => time() . '000',
'endDate' => time() + 30 * 60 * 60 * 24 . '000',
'date' => time() . '000',
];
$unlock_info = curl_post($url, $post_data);
$unlock_info = json_decode($unlock_info, true);
dump($unlock_info);
exit;
// curl --location -g --request POST 'https://cnapi.ttlock.com/v3/key/changePeriod' \
//--data-urlencode 'clientId=4773aa036f7f49c68d876bb4be85c80c' \
//--data-urlencode 'accessToken=dfd5489d0cee31f0bdfaf59d0d42d71f' \
//--data-urlencode 'keyId=27619' \
//--data-urlencode 'startDate=1625025703000' \
//--data-urlencode 'endDate=1635025703000' \
//--data-urlencode 'date=1625025703000'
// if ($unlock_info['errcode'] == 0) {
// $this->success('开锁成功');
// } else {
// $this->error('网络错误,请重试');
// }
}
if (!function_exists('curl_post')) {
/**
* curl post 请求
* @param string $url 请求地址
*/
function curl_post($url, $post_data)
{
$headers = array(
"content-type: application/x-www-form-urlencoded;",//设置请求头 请求的内容格式,编码
// "Accept: application/json", //Accept字段头确定客户端可以接收的媒体类型
);
$post_data = http_build_query($post_data);
//dump($post_data);exit;
$ch = curl_init();//初始化cURL
curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串并输出到屏幕上
curl_setopt($ch, CURLOPT_POST, 1);//Post请求方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);//Post变量
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);// 从证书中检查SSL加密算法是否存在
$output = curl_exec($ch);//执行并获得HTML内容
curl_close($ch);//释放cURL句柄
return $output;
}
}
【php 对接通通锁,发放电子钥匙,远程开锁(网关控制)】
于 2024-10-21 17:04:08 首次发布