事前に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;
}
}