【php 对接通通锁,发放电子钥匙,远程开锁(网关控制)】

 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值