事前にmixi Platformへの登録が完了している必要があります。
※1 mixi Graph APIを利用するには、「mixi有料サービス」のクレジットカード登録が必要です。これは身分証明のためであり、APIの利用では課金が発生することはないとのことです。 個人パートナーのクレジットカード登録 << mixi Developer Center
次の3項目が必須となっています。
リダイレクトURLは、OAuthによる認可時にリダイレクトされてくるページのURLです。どこへリダイレクトされるかはこの設定により決定されるため、正確に記述します。
サービス管理ページで登録したサービスを選択すると、「Consumer Key」と「Consumer Secret」を取得できます。
[サービス設定変更]ページ最下部の[削除する]をクリックします。
認可の手順の概略は、
となります。ここで取得したアクセストークンを使用して、各種APIへアクセスできるようになります。
発行されたAuthorization Codeの有効期限は3分です。
発行されたアクセストークンの有効期限は15分です。
class MixiOAuth { private $consumerKey; private $consumerSecret; private $apiUrl = 'https://api.mixi-platform.com/2/'; private $tokenUri = 'https://secure.mixi-platform.com/2/token'; // public function __construct( $consumerKey, $consumerSecret ) { $this->consumerKey = $consumerKey; $this->consumerSecret = $consumerSecret; } // GET public function Get( $url, $params = null ) { return $this->Request( 'GET', $url, $params ); } // POST public function Post( $url, $params = null ) { return $this->Request( 'POST', $url, $params ); } // リクエスト private function Request( $method, $url, $params = null ) { $status = $this->GetResponse( $_SESSION[ 'access_token' ], $method, $url, $params ); if( @$status[ 'error' ] == 'expired_token' ) { $token = $this->UpdateToken( $_SESSION[ 'refresh_token' ] ); if( isset( $token[ 'error' ] ) ) { $status[ 'error' ] = $token[ 'error' ]; } else { $_SESSION[ 'access_token' ] = $token[ 'access_token' ]; $_SESSION[ 'refresh_token' ] = $token[ 'refresh_token' ]; $status = $this->GetResponse( $_SESSION[ 'access_token' ], $method, $url, $params ); } } return $status; } // レスポンスの取得 private function GetResponse( $access_token, $method, $url, $params = null ) { $header = 'Authorization: OAuth '.$access_token; $ch = curl_init(); switch( $method ) { case 'GET': if( isset( $params ) ) { $url .= '?'.http_build_query( $params ); } break; case 'POST': if( !isset( $params ) ) { $params = ''; } curl_setopt( $ch, CURLOPT_POST, TRUE ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $params ); break; } curl_setopt( $ch, CURLOPT_URL, $this->apiUrl.$url ); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( $header ) ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt( $ch, CURLOPT_HEADER, TRUE ); // $result = array(); $response = curl_exec( $ch ); if( $response === FALSE ) { $result[ 'error' ] = curl_error( $ch ); } else { $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); if( $httpCode == 200 ) { $lines = explode( "\n", $response ); $body = $lines[ count( $lines ) - 1 ]; $result = json_decode( $body, TRUE ); } else if( preg_match( '/WWW-Authenticate:.*error=\'([^\']*)/', $response, $error ) ) { $result[ 'error' ] = $error[ 1 ]; } else { $result[ 'error' ] = 'unknown error. code:'.$httpCode; } } curl_close( $ch ); return $result; } // アクセストークンの取得 public function GetToken( $authorizationCode, $redirectUri ) { $params = array( 'code'=>$authorizationCode, 'grant_type'=>'authorization_code', 'client_id'=>$this->consumerKey, 'client_secret'=>$this->consumerSecret, 'redirect_uri'=>$redirectUri ); $ch = curl_init( $this->tokenUri ); curl_setopt( $ch, CURLOPT_POST, TRUE ); curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $ch, CURLOPT_FAILONERROR, TRUE ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); $response = curl_exec( $ch ); if( $response === FALSE ) { $token = array( 'error'=>curl_error( $ch ) ); } else { $token = json_decode( $response, TRUE ); } curl_close( $ch ); return $token; } // アクセストークンの更新 private function UpdateToken( $refresh_token ) { $params = array( 'refresh_token'=>$refresh_token, 'grant_type'=>'refresh_token', 'client_id'=>CONSUMER_KEY, 'client_secret'=>CONSUMER_SECRET ); $ch = curl_init( $this->tokenUri ); curl_setopt( $ch, CURLOPT_POST, TRUE ); curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $ch, CURLOPT_FAILONERROR, TRUE ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); $response = curl_exec( $ch ); if( $response === FALSE ) { $token = array( 'error'=>curl_error( $ch ) ); } else { $token = json_decode( $response, TRUE ); } curl_close( $ch ); return $token; } }