php - Wink API v2 Hello World 在 PHP
问题描述
Wink API 目前是第 2 版。
我的问题: 如何通过 PHP 使用 Wink API V2 做一个简单的“Hello World”?
备注:
- Wink 使用 PubNub 进行订阅(设备有事件)
- 使用 OAuth2 标准
- 网站/登录通常是“骗人的”:(登录时会出错:“身份验证失败!”)
- 在此处登录:https ://developer.wink.com并使用 Google 帐户(或其他)
- 然后将 URL 更改为此:https ://developer.wink.com/clients
- 有时你必须这样做几次!
- 您需要申请应用程序 API 密钥才能使用 API。我跟进了一封电子邮件,以便迅速获得批准。
- 获得批准后,您将获得:客户端 ID、客户端密码和可提供帮助的 URL
- API 网址:https ://api.wink.com/ ...
- 电子邮件支持:support@wink.zendesk.com(获取应用程序 API 密钥等)
- 认证 2:
- Wink 表示使用“授权码授予类型”
- Dox 和示例:https ://developer.byu.edu/docs/consume-api/use-api/choose-grant-type
相关链接:
- 眨眼 API:https ://winkapiv2.docs.apiary.io/#
- Stackoverflow 相关问题:
- https://community.home-assistant.io/t/wink-access-token-issue/52197/15
- Github 示例:https ://github.com/cbulock/php-wink (这是 3 年前最后一次更新;可能在以前的 API 版本上)
解决方案
关于这方面的信息非常有限,所以我会回答我自己的问题,希望能帮助别人。(花了很长时间,因为那里没有任何好的信息。)这个例子有一个用户界面(Wink 需要登录)。我希望有人可以发布非用户界面版本(用于后台脚本等)。
这将为您提供原始 json 输出,供您随意使用。这个单一的 php 页面最初会加载,带你到 Wink 的登录名(如果这不明显,你需要一个设备帐户),登录后,它会带你回到同一个页面,带有代码,调用令牌,然后使用该令牌获取设备资源。
在您的 http/php 服务器上创建://[YourServer]/wink_helloworld.php。
wink_helloworld.php:
//Make sure to add this exact URL to your Wink Developer Portal! (https://developer.wink.com/clients)
$redirect_uri = "http://[YourServer]/wink_helloworld.php";
// This is from Wink Developer Portal
$client_id = "abcdefg";
$wink_oauth_url = "https://api.wink.com/oauth2/token";
$client_secret = "hijklmnop";
$devices_url = "https://api.wink.com/users/me/wink_devices";
//need to create a state variable, like a session id. should actually be random tho!!
$randomstring="xyzABC123";
$state = base64_encode($randomstring);
/*_____________________________________________________________________________________________________________________________________ */
echo "<h2>Wink Hello World - Show Devices</h2>";
//If we don't have a code, then send user to login page
if($_GET['code'] == null | $_GET['code'] == ""){
echo "<a href='https://api.wink.com/oauth2/authorize?response_type=code&client_id=".$client_id."&redirect_uri=$redirect_uri&state=".$state."'>Login</a>";
return;
}
$code = $_GET['code'];
//if we dont have a token, lets get one
if($access_token == null | $access_token == ""){
$access_token = getAccessToken();
}
// lets get some data from our devices!
getResource($access_token);
/*_____________________________________________________________________________________________________________________________________ */
// Get token
function getAccessToken() {
global $wink_oauth_url, $code, $client_secret;
echo "<b>getAccessToken()</b> Using Code: $code<br>";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $wink_oauth_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, "{
\"client_secret\": \"$client_secret\",
\"grant_type\": \"authorization_code\",
\"code\": \"$code\"
}");
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
$response = curl_exec($curl);
//var_dump($response);
formatResults($response); //debug output
curl_close($curl);
return json_decode($response)->access_token;
}
/*_____________________________________________________________________________________________________________________________________ */
// Get Resource(s) with our code & token
function getResource($access_token) {
global $devices_url;
echo "<b>getResource()</b> Using Token: $access_token<p>";
$header = array("Authorization: Bearer {$access_token}");
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $devices_url,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true
));
$response = curl_exec($curl);
curl_close($curl);
formatResults($response); //debug output
}
/*_____________________________________________________________________________________________________________________________________ */
//debug formatted output functions
function formatResults($json){
echo "<pre>";
echo json_encode(json_decode($json), JSON_PRETTY_PRINT);
echo "</pre>";
}
?>
推荐阅读
- apache-spark - Spark Structed Streaming 从 kafka 读取嵌套的 json 并将其展平
- git - Git rebase 和 squash 在与 master 合并的分支上?
- excel - 无法修改标头信息 - /wp-includes/formatting.php:5716 已发送标头
- computer-vision - 计算从中间层获取的输出的梯度并使用优化器更新权重
- javascript - Vue 登录表单 - 多用户
- c# - ASP.Net Core 中的 SortDirection
- azure - 未找到 Microsoft.Data.Schema.SqlTasks.targets"
- regex - 正则表达式获取字母或字母,包括最后一位带空格的数字
- linux-kernel - Yocto - 在 ARM 处理器中更改内核时设备树不兼容
- laravel - Laravel-7 迁移中的外键约束形成错误