| | @@ -0,0 +1,302 @@ |
| 1 | +<?php
|
| 2 | +namespace Std\Lib;
|
| 3 | +
|
| 4 | +use Std\Lib\Curl;
|
| 5 | +
|
| 6 | +class Openprovider {
|
| 7 | + private string $user;
|
| 8 | + private string $pass;
|
| 9 | + private string $token;
|
| 10 | + private string $ip;
|
| 11 | + private int $reseller_id;
|
| 12 | + private string $BASEURL = 'https://api.openprovider.eu/v1beta';
|
| 13 | + // private Curl $curl;
|
| 14 | +
|
| 15 | + public function __construct() {
|
| 16 | + if (!OPENPROVIDER_ENABLED) return;
|
| 17 | + $this->user = OPENPROVIDER['username'];
|
| 18 | + $this->pass = OPENPROVIDER['password'];
|
| 19 | + $this->ip = OPENPROVIDER['ip'];
|
| 20 | + }
|
| 21 | +
|
| 22 | + /***
|
| 23 | + * トークンの受け取り。
|
| 24 | + * このライブリリーを使ったら、一回「login()」を実行する事が必須となります。
|
| 25 | + *
|
| 26 | + * @return Result 結果
|
| 27 | + */
|
| 28 | + public function login(): \Result {
|
| 29 | + $curl = new Curl("{$this->BASEURL}/auth/login");
|
| 30 | +
|
| 31 | + $payload = [
|
| 32 | + 'username' => $this->user,
|
| 33 | + 'password' => $this->pass,
|
| 34 | + 'ip' => $this->ip ?: '0.0.0.0',
|
| 35 | + ];
|
| 36 | +
|
| 37 | + $curl->setMethod("POST");
|
| 38 | + $curl->setPostRaw(json_encode($payload));
|
| 39 | + $curl->addHeader("Content-Type", "application/json");
|
| 40 | + $curl->addHeader("Accept", "application/json");
|
| 41 | +
|
| 42 | + $res = $curl->execute();
|
| 43 | + if (!$res->isSuccess) {
|
| 44 | + $err = "CURLの実行に失敗: ".$curl->message;
|
| 45 | + assert_unless_success($res, $err);
|
| 46 | + return \Result::Error($err);
|
| 47 | + }
|
| 48 | +
|
| 49 | + $body = $curl->getResponseBody();
|
| 50 | + if ($curl->getResponseCode() != 200) {
|
| 51 | + $err = json_decode($body, true);
|
| 52 | + assert_not_null($err, "エラーの受け取りに失敗。");
|
| 53 | + assert($curl->getResponseCode() == 200, $err['desc']);
|
| 54 | + return \Result::Error();
|
| 55 | + }
|
| 56 | + assert_not_null($body, "返事ボディーは空です。");
|
| 57 | +
|
| 58 | + $data = json_decode($body, true);
|
| 59 | + if (isset($data['data']['token'])) {
|
| 60 | + $this->token = $data['data']['token'];
|
| 61 | + $this->reseller_id = $data['data']['reseller_id'];
|
| 62 | + return \Result::Success();
|
| 63 | + }
|
| 64 | +
|
| 65 | + return \Result::Error("ログインに失敗。");
|
| 66 | + }
|
| 67 | +
|
| 68 | + // カスタマー
|
| 69 | +
|
| 70 | + // ドメイン
|
| 71 | +
|
| 72 | + //// ドメイン
|
| 73 | +
|
| 74 | + /***
|
| 75 | + * ドメインを登録可能かどうかの確認。
|
| 76 | + *
|
| 77 | + * @param array $domains ドメイン名リスト。例:['076.moe', '076.co.jp', '076.com']
|
| 78 | + * @param bool $with_price 値段を表示するかどうか。デフォルトは「false」
|
| 79 | + * @return Result|array 結果。配列の場合:'domain'と'status'はいつでもあり、'reason', 'premium', 'is_premium'が多分あり、そして'price'が「with_price」が「true」の場合のみ。
|
| 80 | + */
|
| 81 | + public function checkDomainAvailable(array $domains, bool $with_price = false): \Result|array {
|
| 82 | + $domainList = [];
|
| 83 | + foreach ($domains as $d) {
|
| 84 | + $domain = explode('.', $d);
|
| 85 | + assert_exists($domain[0]);
|
| 86 | + assert_exists($domain[1]);
|
| 87 | + if (count($domain) !== 2) {
|
| 88 | + return \Result::Error("不正なドメイン形: {$d}");
|
| 89 | + }
|
| 90 | +
|
| 91 | + $domainList[] = [
|
| 92 | + 'name' => $domain[0],
|
| 93 | + 'extension' => $domain[1],
|
| 94 | + ];
|
| 95 | + }
|
| 96 | +
|
| 97 | + $payload = [
|
| 98 | + 'domains' => $domainList,
|
| 99 | + 'with_price' => $with_price,
|
| 100 | + ];
|
| 101 | +
|
| 102 | + $curl = $this->setupCurl('/domains/check', 'POST', $payload);
|
| 103 | + $data = $this->curlResult($curl);
|
| 104 | + if (isset($data['data']['results'])) return $data['data']['results'];
|
| 105 | +
|
| 106 | + return \Result::Error("ドメインの確認に失敗。");
|
| 107 | + }
|
| 108 | +
|
| 109 | + /**
|
| 110 | + * ドメイン名の登録。
|
| 111 | + *
|
| 112 | + * @param string $name 登録したいドメイン名(例:"076studio.jp")
|
| 113 | + * @param int $period 年間(デフォルト=1年)
|
| 114 | + * @param string $owner_handle
|
| 115 | + * @param string $admin_handle
|
| 116 | + * @param string $tech_handle
|
| 117 | + * @param string $billing_handle
|
| 118 | + * @param string $reseller_handle
|
| 119 | + * @param array $name_servers ネームサーバー(4つまで、デフォルトはOpenProviderさんのネームサーバー)
|
| 120 | + * @param string $autorenew 自動的に更新するかどうか(可能な値:on|off|default、デフォルト=default)
|
| 121 | + * @return Result|array 結果。配列の場合:'activation_date'(リアルタイムで成功したのみ), 'auth_code'(TLDが対応している場合のみ), 'expiration_date', 'id', 'renewal_date', 'status'(ACT又はREQ)
|
| 122 | + */
|
| 123 | + public function registerDomain(string $name, int $period = 1, string $owner_handle = '',
|
| 124 | + string $admin_handle = '', string $tech_handle = '',
|
| 125 | + string $billing_handle = '', string $reseller_handle = '',
|
| 126 | + array $name_servers = [], string $autorenew = 'default'): \Result|array {
|
| 127 | + if ($owner_handle === '') $owner_handle = OPENPROVIDER['owner_handle'];
|
| 128 | + if ($admin_handle === '') $admin_handle = $owner_handle;
|
| 129 | + if ($tech_handle === '') $tech_handle = $owner_handle;
|
| 130 | + if ($billing_handle === '') $billing_handle = $owner_handle;
|
| 131 | + if ($reseller_handle === '') $reseller_handle = $owner_handle;
|
| 132 | +
|
| 133 | + $parts = explode('.', $name, 2);
|
| 134 | + assert_exists($parts[0]);
|
| 135 | + assert_exists($parts[1]);
|
| 136 | + $domain = [
|
| 137 | + 'name' => $parts[0],
|
| 138 | + 'extension' => $parts[1],
|
| 139 | + ];
|
| 140 | +
|
| 141 | + $ns = [];
|
| 142 | + if (empty($name_servers)) $name_servers = ['ns1.openprovider.nl', 'ns2.openprovider.be', 'ns3.openprovider.eu'];
|
| 143 | + foreach ($name_servers as $n) {
|
| 144 | + $ns[] = ['name' => $n];
|
| 145 | + }
|
| 146 | +
|
| 147 | + $payload = [
|
| 148 | + 'name' => $domain,
|
| 149 | + 'period' => $period,
|
| 150 | + 'owner_handle' => $owner_handle,
|
| 151 | + 'admin_handle' => $admin_handle,
|
| 152 | + 'tech_handle' => $tech_handle,
|
| 153 | + 'billing_handle' => $billing_handle,
|
| 154 | + 'reseller_handle' => $reseller_handle,
|
| 155 | + 'name_servers' => $ns,
|
| 156 | + 'autorenew' => $autorenew,
|
| 157 | + ];
|
| 158 | +
|
| 159 | + $curl = $this->setupCurl('/domains/', 'POST', $payload);
|
| 160 | + kys('TODO');
|
| 161 | + $data = $this->curlResult($curl);
|
| 162 | + if (isset($data['data'])) return $data['data'];
|
| 163 | +
|
| 164 | + return \Result::Error("ドメインの確認に失敗。");
|
| 165 | + }
|
| 166 | +
|
| 167 | + //// 追加データ
|
| 168 | +
|
| 169 | + //// 顧客様の追加データ
|
| 170 | +
|
| 171 | + /**
|
| 172 | + * 顧客様の検索
|
| 173 | + * @param array $query 検索クエリー(可能:handle_pattern (string), email_pattern (string), first_name_pattern (string), last_name_pattern (string), company_name_pattern (string), comment_pattern (string), with_additional_data (bool), limit (int = 100、最大=1000), offset (int = 0)
|
| 174 | + */
|
| 175 | + public function searchCustomers(array $query = []): \Result|array {
|
| 176 | + foreach ($query as $k => $v) { if (is_bool($v)) $query[$k] = $v ? '1' : '0'; }
|
| 177 | +
|
| 178 | + $uri = '/customers?'.http_build_query($query, '', '&', PHP_QUERY_RFC3986);
|
| 179 | + $curl = $this->setupCurl($uri);
|
| 180 | + kys("TODO: 問題");
|
| 181 | + $data = $this->curlResult($curl);
|
| 182 | + kys($data);
|
| 183 | + if (isset($data['data'])) return $data['data'];
|
| 184 | +
|
| 185 | + return \Result::Error("TLD一覧の受け取りに失敗。");
|
| 186 | + }
|
| 187 | +
|
| 188 | + //// ドメイン値段
|
| 189 | +
|
| 190 | + //// 認証コード
|
| 191 | +
|
| 192 | + //// TLD
|
| 193 | +
|
| 194 | + /**
|
| 195 | + * TLD一覧
|
| 196 | + *
|
| 197 | + * @param array $query 検索クエリー(可能:limit (int),offset (int),order (string),order_by (string),extensions(array), name_pattern (string), only_names (bool), with_description (bool),with_restrictions (bool)with_usage_count (bool)with_application_mode (bool),with_price (bool),with_level_prices (bool)is_active (bool)is_new_gtld (bool),status (string),application_mode (string))
|
| 198 | + */
|
| 199 | + public function listTlds(array $query = []): \Result|array {
|
| 200 | + if (empty($query)) $query = [ 'limit' => 10, 'offset' => 0, 'order' => 'ASC' ];
|
| 201 | +
|
| 202 | + foreach ($query as $k => $v) {
|
| 203 | + if (is_bool($v)) $query[$k] = $v ? '1' : '0';
|
| 204 | + }
|
| 205 | +
|
| 206 | + $uri = '/tlds?'.http_build_query($query, '', '&', PHP_QUERY_RFC3986);
|
| 207 | + // kys($uri);
|
| 208 | + $curl = $this->setupCurl($uri);
|
| 209 | + kys("TODO: JSONの問題");
|
| 210 | + $data = $this->curlResult($curl);
|
| 211 | + kys($data);
|
| 212 | + if (isset($data['data'])) return $data['data'];
|
| 213 | +
|
| 214 | + return \Result::Error("TLD一覧の受け取りに失敗。");
|
| 215 | + }
|
| 216 | +
|
| 217 | + /**
|
| 218 | + * TLDの受け取り
|
| 219 | + */
|
| 220 | +
|
| 221 | + // 請求
|
| 222 | + //// 請求書
|
| 223 | + //// 支払
|
| 224 | + //// トランザクション
|
| 225 | +
|
| 226 | + // DNS
|
| 227 | + //// DomainToken
|
| 228 | + //// ネームサーバー
|
| 229 | + //// NSグループ
|
| 230 | + //// テンプレート
|
| 231 | + //// ゾーン
|
| 232 | + //// ゾーンレコード
|
| 233 | +
|
| 234 | + // Easydmarc
|
| 235 | +
|
| 236 | + // ライセンス
|
| 237 | +
|
| 238 | + // リセラー・顧客様
|
| 239 | +
|
| 240 | + // SpamExpert
|
| 241 | +
|
| 242 | + // SSL証明書
|
| 243 | +
|
| 244 | + ////////
|
| 245 | +
|
| 246 | + /**
|
| 247 | + * トークンの受け取り。
|
| 248 | + *
|
| 249 | + * @return string トークン
|
| 250 | + */
|
| 251 | + public function getToken(): string {
|
| 252 | + return $this->token;
|
| 253 | + }
|
| 254 | +
|
| 255 | + /**
|
| 256 | + * リセラーIDの受け取り。
|
| 257 | + *
|
| 258 | + * @return int リセラーID
|
| 259 | + */
|
| 260 | + public function getResellerId(): int {
|
| 261 | + return $this->reseller_id;
|
| 262 | + }
|
| 263 | +
|
| 264 | + //////////
|
| 265 | +
|
| 266 | + private function setupCurl(string $uri, string $resType = 'GET', array $payload = []): Curl {
|
| 267 | + $curl = new Curl("{$this->BASEURL}{$uri}");
|
| 268 | +
|
| 269 | + $curl->setMethod($resType);
|
| 270 | + if (!empty($payload)) $curl->setPostRaw(json_encode($payload));
|
| 271 | + $curl->setBearerAuth($this->token);
|
| 272 | + $curl->addHeader('Content-Type', 'application/json');
|
| 273 | + $curl->addHeader('Accept', 'application/json');
|
| 274 | +
|
| 275 | + return $curl;
|
| 276 | + }
|
| 277 | +
|
| 278 | + private function curlResult(Curl &$curl): \Result|array {
|
| 279 | + $res = $curl->execute();
|
| 280 | + // kys($curl->getRequestHeader());
|
| 281 | + if (!$res->isSuccess) {
|
| 282 | + $err = "CURL実行に失敗: {$curl->message}";
|
| 283 | + assert_unless_success($res, $err);
|
| 284 | + return \Result::Error($err);
|
| 285 | + }
|
| 286 | +
|
| 287 | + $body = $curl->getResponseBody();
|
| 288 | + // kys($body);
|
| 289 | + // kys($curl->getResponseHeaders());
|
| 290 | + if ($curl->getResponseCode() != 200) {
|
| 291 | + $err = json_decode($body, true);
|
| 292 | + assert_not_null($err, "エラーの受け取りに失敗。");
|
| 293 | + assert($curl->getResponseCode() == 200, $err['desc']);
|
| 294 | + return \Result::Error();
|
| 295 | + }
|
| 296 | + assert_not_null($body, "返事ボディーは空です。");
|
| 297 | +
|
| 298 | + // $body = str_
|
| 299 | + kys($body);
|
| 300 | + return json_decode($body, true);
|
| 301 | + }
|
| 302 | +} |