Salesforce：カスタムRestAPIをPHPから呼び出すサンプル

PHPからカスタムRestAPIを呼び出すサンプルです。作成したカスタムRestAPIの動作チェックなどに利用しています。

### 前提条件

呼び出すカスタムRestAPIのパスは/example/とし、このカスタムRestAPIは取引先のSalesforce IDをGETパラメータaidで受け取って、当該取引先の情報をjson形式で返すものとします。

### サンプルコード

```php:sample.php
<?php
// Salesforce 接続共通設定
$username = ''; // Salesforceの接続に用いるアカウント名（メールアドレス）
$password = ''; // Salesforceの接続に用いるアカウントのパスワード
$token = ''; // セキュリティートークン。接続元IP制限している場合は不要
$client_id = ''; // コンシューマ鍵
$client_secret = ''; // コンシューマの秘密
$oauth2 = 'https://login.salesforce.com/services/oauth2/token'; // OAuth API's URL
$api_version = 'v28.0';

// カスタムRestAPIのパス
$apipath = '/example/';
// カスタムRestAPIに渡すパラメータ設定
$aid = ''; // 情報を取得する対象の取引先のSalesforce ID

// アクセストークン取得
$post = array(
    "grant_type" => "password",
    "client_id" => $client_id,
    "client_secret" => $client_secret,
    "username" => $username,
    "password" => $password . $token,
);

$curl = curl_init();
curl_setopt( $curl, CURLOPT_URL, $oauth2 );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $post );
$buf = curl_exec( $curl );
if ( curl_errno( $curl ) ) {
    exit;
}
curl_close( $curl );
$json = json_decode( $buf );
$instance_url = '';
$access_token = '';
try {
    $json = json_decode( $buf );
    $instance_url = $json->instance_url;
    $access_token = $json->access_token;
} catch ( SalesforceApiException $e ) {
    exit;
}

// カスタムRestAPI情報取得
$endpoint = $instance_url . '/services/apexrest' . $apipath . '?aid=' . $aid;
$result = salesforce_curl_get( $endpoint, $access_token );
if (! $result ) { exit; }
$json = json_decode( $result );

// 取得した情報を出力して終了
echo var_dump( $json );
exit;

function salesforce_curl_get( $api, $access_token ) {
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_HTTPHEADER, array( "Authorization: OAuth ${access_token}" ) );
    curl_setopt( $curl, CURLOPT_URL, $api );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
    $buf = curl_exec( $curl );
    if ( curl_errno( $curl ) ) {
        return '';
    }
    curl_close( $curl );
    return $buf;
}
?>
```

### 実行方法

コマンドラインから実行します。

`php sample.php`

### RestAPIをPOSTでコールするには？

サンプルではGETでカスタムRestAPIをコールしています（salesforce_curl_get）が、次のようにPOSTでコールする事もできます。POSTで送りたいパラメータを連想配列 *$send* に指定して使います。

```php:
function salesforce_curl_post( $api, $access_token, $send=array() ) {
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_HTTPHEADER, array( "Authorization: OAuth ${access_token}", "Content-Type: application/json" ) );
    curl_setopt( $curl, CURLOPT_URL, $api );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
    curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, 'PATCH' );
    curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode( $send ) );
    $buf = curl_exec( $curl );
    if ( curl_errno( $curl ) ) {
        return '';
    }
    curl_close( $curl );
    return $buf;

    // 返却値ではなくHTTPステータスを返したい場合は以下のようにする。
    // $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    // curl_close( $curl );
    // return $http_code;
}
```