用户权限认证
Fitbit使用OAuth2来进行权限认证,而PHP下的OAuth2可以使用下面的插件
它有一个第三方插件
针对Fitbit的认证流程做了兼容,安装时只需要composer require这个第三方兼容插件即可
1 |
composer require djchen/oauth2-fitbit |
OAuth2认证流程
1.将用户引导至Fitbit官方授权页面,
2.待用户授权后在请求末尾附加一个code到之前设定的callback地址
3.callback地址收到带有code的请求后,用附加code的请求申请accessToken和RefreshToken
4.callback收到官方回复的accessToken和RefreshToken后保存在本地,之后使用accessToken加持后的URL发起Get请求,如果accessToken过期,用RefreshToken申请新的accessToken和refreshToken。
保存和传递accessToken
oauth2-client插件中使用的accessToken是一个对象,所以不能简单的在数据库中分别存储accessToken和RefreshToken值,否则无法在之后的操作中使用accessToken的方法
这里可以使用序列化将对象转换为字符串后保存到数据库中
1 |
serialize($accessToken); |
从数据库获取序列值后,通过解开序列化操作来将其展开为完整的对象
1 |
$accessToken = unserialize(GetStringFromSql); |
刷新accessToken
Fitbit的accessToken有效期为一小时,过期后,需要通过refreshToken来重新获取accessToken和refreshToken。
值得注意的是,在成功刷新一次之后,之前的refreshToken就过期了,需要将新获取的refreshToken保存进数据库中,以备下次刷新。因为保存和读取accessToken的操作在多个场景会用到,所以可以单独写一个方法,用于在不同的场景读取和调用accessToken。
可以通过 if ($existingAccessToken->hasExpired()) 来判断当前accessToken是否过期,过期后执行刷新操作
1 2 3 |
$newAccessToken = $provider->getAccessToken('refresh_token', [ 'refresh_token' => $existingAccessToken->getRefreshToken() ]); |
可以设定cron任务,每隔半小时自动检测当前accessToken是否过期。
获取数据
在获得用户的accessToken后,就可以通过Get发起数据请求了。
这个在之前用于OAuth的插件中已提供了相应的方法
1 2 3 4 5 6 7 |
$request = $provider->getAuthenticatedRequest( 'GET', Fitbit::BASE_FITBIT_API_URL . '/1/user/-/profile.json', $accessToken, ['headers' => ['Accept-Language' => 'en_US'], ['Accept-Locale' => 'en_US']] ); $response = $provider->getResponse($request); |
在获取了数据之后,就可以对数据进行处理了
数据处理
接口调用频率限制
Fitbit的调用频率限制为150次/小时,按单个API请求为基准计一次,即如果一个请求同时调用了步数和卡路里两个API接口,那么就按两次调用来算。
定时任务
在用crontab定时执行获取Fitbit数据的时候,发现无法虽然可以获取数据,但是却无法更新json文件,查了很久才发现原来是读写文件的操作用的是相对地址,而在crontab中需要改为使用绝对地址。
(待续。。。)
There are no comments yet