PHP5からSalesforce REST APIを実行する (カスタムオブジェクトへレコードを追加する)

はじめに
===

PHP5からSalesforce REST APIを呼び出して、SalesforceのForce.comカスタムオブジェクトにレコードを追加するサンプルプログラムについて記します。

また、Force.comカスタムオブジェクトに登録したレコード一覧を表示するサンプルプログラムも合わせて記します。

環境
===

SalesforceのDeveloper EditionにForce.comカスタムオブジェクトを作成して試しました。

PHPからSalesforce REST APIの呼び出しについては、AWSのEC2インスタンス(Amazon Linux)にPHP 5.3.29をインストールし、PHPのサンプルプログラムを作成して試しました。
EC2インスタンスは以下のAMIで作成しました。

・Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type - ami-374db956

PHPからSalesforce REST APIの呼び出しについては、Force.com-OAuth-Toolkit-for-PHPを使用させて頂きました。ありがとうございました。

https://github.com/nkjm/Force.com-OAuth-Toolkit-for-PHP

事前準備
===

### (1) https://login.salesforce.com/ へログインします。

### (2) SalesforceにForce.comアプリケーション及びカスタムオブジェクトを作成します。

Salesforce Force.comアプリケーション及びカスタムオブジェクト作成手順は以下をご参照下さい。

http://qiita.com/na0AaooQ/items/e7d9bf35152127a1101f

今回の例として、カスタムオブジェクト作成時には、以下のカスタム項目を追加します。

| カスタム項目名 | API参照名 | データ型 |
|--------------|---------|---------|
| user_name | create_date__c | テキスト型 |
| user_email | user_email__c | テキスト型 |
| create_date | create_date__c | 日付型 |

### (3) 作成したForce.comアプリケーションにOAuth2でアクセス出来るよう設定を開始します。

Salesforceコンソールの画面上の「設定」をクリックします。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/70ee94df-e3c2-4378-7933-fa6e5f558d43.jpeg)

画面左側の「ビルド」->「作成」->「アプリケーション」をクリックします。
「接続アプリケーション」の「新規」をクリックします。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/0c6d766d-b503-b9e5-5b61-b1665ff3bf95.jpeg)

### (4) 作成したForce.comアプリケーションをOAuth2でアクセス出来るよう公開します。

以下を参考にしながら、Force.comアプリケーションのOAuth設定を行います。

https://help.salesforce.com/apex/HTViewHelpDoc?id=connected_app_create.htm&language=ja

今回の例では「接続アプリケーション名」を「testobject」としてアプリケーションを公開します。
「OAuth設定の有効化」にチェックをつけます。
以下の画面のように設定を入力して「保存」をクリックします。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/0b624878-5ee8-112b-c7fc-2b4a90d294ea.jpeg)

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/237988e4-03bb-0914-d6d0-49082856bcf7.jpeg)

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/4f4ae347-0d6e-9c2e-e33a-1d6b63549c36.jpeg)

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/2460d8b1-cbba-cf74-5e9e-14b3c92ecb8b.jpeg)

### (5) Force.comアプリケーションのOAuth2コンシューマキーとコンシューマシークレットを確認します。

前述の設定が完了すると「接続アプリケーション名 testobject」画面が表示されます。

前述の設定が完了すると、Force.comアプリケーションにOAuthでアクセス出来るようになり、Salesforce REST APIによりForce.comアプリケーションへ接続し、カスタムオブジェクトへのレコード追加といった操作が可能になります。

「接続アプリケーション名 testobject」画面では、後述の手順で使用するOAuth2コンシューマキーとコンシューマシークレットを確認します。

「コンシューマ鍵」がOAuthコンシューマキー、
「コンシューマの秘密」がOAuthコンシューマシークレットになります。

「コンシューマ鍵」のキー文字列を確認します。
「コンシューマの秘密」は「クリックして公開」をクリックしてシークレット文字列を確認します。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/44660f80-2c16-754c-5993-56f3ede76f01.jpeg)

### (6) Force.comアプリケーションへのOAuthアクセスを許可するIPアドレスを指定します。

Force.comアプリケーションへOAuthアクセス可能なIPアドレスを制限する事が出来ます。
今回の例では「198.51.100.10」からのアクセスのみ許可するよう設定します。

「接続アプリケーション名 testobject」画面の下にある「OAuth Webサーバフローの信頼済み IP 範囲」の「新規」をクリックします。

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/efd65846-3e1e-bc24-1dfd-79ba19a39dda.jpeg)

「アプリケーションバージョン 信頼済み IP 範囲の編集」画面が表示されます。
「開始IPアドレス」及び「終了IPアドレス」に「198.51.100.10」と入力して「保存」をクリックします。

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/bdf4bc2d-7552-3af1-cb86-5af9662f2099.jpeg)

「接続アプリケーション名 testobject」画面が表示されるので「OAuth Webサーバフローの信頼済み IP 範囲」にアクセス許可を追加したIPアドレスが表示されている事を確認します。

![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/49fda2e1-89b6-9998-31ec-5123a80206dd.jpeg)

### (7) Salesforce REST API接続用のSalesforceユーザアカウント・プロファイル・権限セットを作成します。

Salesforceコンソールの画面上の「設定」をクリックします。

画面左側の「管理」->「ユーザの管理」->「プロファイル」をクリックします。

![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/dc725ff1-c9f1-0562-cba8-1b98f59f47a1.jpeg)

「プロファイルのコピー」画面が表示されます。
「既存のプロファイル」は「標準ユーザ」を選択します。
「プロファイル名」には「テストオブジェクトプロファイル」と入力して「保存」をクリックします。

![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/699bb3f6-b27c-77b9-4bf4-f9d35806d0f2.jpeg)


プロファイル「テストオブジェクトプロファイル」が作成されて、「プロファイル - テストオブジェクトプロファイル」画面が表示されます。「編集」をクリックします。

![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/84152988-50b4-e899-dc9a-ad47b8e17911.jpeg)

「プロファイル編集 - テストオブジェクトプロファイル」画面が表示されます。
「カスタムアプリケーション設定」の「テストオブジェクト」の「参照可能」にチェックをつけます。

![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/8a588a8b-7cca-c539-6b8c-4fdb9042e3d0.jpeg)

「接続アプリケーション」->「testobject」にチェックをつけます。

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/43e8f46a-136a-beca-f9c6-7b749828159e.jpeg)

「タブの設定」->「カスタムタブの設定」->「テストオブジェクト」->「デフォルトで表示」を選択します。

![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/bcfbaa93-d12b-d6a3-115b-ef42f66b6bd7.jpeg)

「システム管理者権限」->「API の有効化」にチェックをつけます。

![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/016ab072-fcbb-dd60-655a-2565f26cb886.jpeg)

「カスタムオブジェクト権限」->「テストオブジェクト」について、「基本アクセス」の「参照」「作成」「編集」「削除」チェックボックスにチェックをつける。

![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/90682f9b-1888-ada4-307d-5d71d2f3fda2.jpeg)

「保存」をクリックしてプロファイルを作成します。
プロファイル「テストオブジェクトプロファイル」が作成されます。

![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/71f43dc6-179a-486d-448e-fd99c573a320.jpeg)

「設定」->「管理」->「ユーザの管理」->「権限セット」をクリックします。
カスタムオブジェクトを作成すると、自動的に権限セットが作成されます。
ここでは「テストオブジェクト 開発者」という権限セットが作成されている事を確認します。
「テストオブジェクト 開発者」をクリックします。

![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/dedca958-2530-67a0-95f0-3fc12135dfef.jpeg)

「権限セット - テストオブジェクト 開発者」画面が表示されます。
「システム権限」をクリックします。

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/abdf08db-30f7-5d86-c7ab-083572e92e2e.jpeg)

![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/4243ab4a-b848-eb9e-b1bd-6a4ee876718b.jpeg)

「権限セット - テストオブジェクト 開発者」画面が表示されます。
「編集」をクリックします。

「API の有効化」にチェックをつけます。
「保存」をクリックします。

![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/af1069f3-2d46-6a76-8053-541daef681bb.jpeg)

![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/7ebbe134-446e-17b4-2ef3-44c7fab44cce.jpeg)

「設定」->「管理」->「ユーザの管理」->「ユーザ」をクリックします。
「すべてのユーザ」画面が表示されます。「新規ユーザ」をクリックします。

![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/9e6cc18c-08b8-c171-8a71-3e0abebe8339.jpeg)

「新規ユーザ」画面が表示されます。
Salesforce REST API接続時に使用するSalesforce REST API接続用ユーザアカウントを作成します。
今回の例では、以下のユーザ名でSalesforceユーザを作成します。

| ユーザ名 |
|---------|
| example_salesforce_api_user@hoge.example.com |

「ライセンス」は「Salesforce」を選択します。
「プロファイル」は前述の手順で作成した「テストオブジェクトプロファイル」を選択します。

![WS000028.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/cd12eff6-7dff-fafb-1a5e-23c1f9f81b67.jpeg)

「保存 & 新規」をクリックします。
Salesforceユーザ「example_salesforce_api_user」が作成されます。

「設定」->「管理」->「ユーザの管理」->「ユーザ」->「example_salesforce_api_user」をクリックします。

「ユーザ - example_salesforce_api_user」画面が表示されます。

![WS000031.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/a746c3c1-8171-9b04-5163-e0067efd927b.jpeg)


「権限セットの割り当て」をクリックします。
「権限セットの割り当て」で「割り当ての編集」をクリックします。

「利用可能な権限セット」の「テストオブジェクト 開発者」を追加して「保存」をクリックします。



「権限セットの割り当て」に「テストオブジェクト 開発者」が追加された事を確認します。

![WS000030.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/c289950d-27e5-7691-17a2-6a96cfc25955.jpeg)

### (8) プロファイルでForce.comアプリケーションへの通信を許可するIPアドレスを指定します。

前述の手順で作成したプロファイル「テストオブジェクトプロファイル」でもForce.comアプリケーションへの接続を許可するIPアドレスを指定します。

「設定」->「管理」->「ユーザの管理」->「プロファイル」の「テストオブジェクトプロファイル」をクリックします。

<img width="1266" alt="スクリーンショット 2017-03-11 11.22.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/455100b1-caee-a646-141b-a104dab5e551.png">


「テストオブジェクトプロファイル」画面が表示されるので「ログイン IP アドレスの制限」をクリックします。

<img width="1271" alt="スクリーンショット 2017-03-11 11.23.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/3b8bb0ea-4e78-c33f-423e-946f72105a8f.png">

「ログイン IP アドレスの制限」の「新規」をクリックします。

<img width="1264" alt="スクリーンショット 2017-03-11 11.25.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/35aae072-456d-af2e-a9f9-4accfc286d1b.png">

「ログイン IP アドレスの制限」画面が表示されます。
「開始IPアドレス」及び「終了IPアドレス」に「198.51.100.10」と入力して「保存」をクリックします。

<img width="1263" alt="スクリーンショット 2017-03-11 11.27.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/030ea2b9-7257-66cf-a73a-a8f2ec30eaf2.png">

「テストオブジェクトプロファイル」画面が表示されるので「ログイン IP アドレスの制限」にアクセス許可を追加したIPアドレスが表示されている事を確認します。

<img width="1238" alt="スクリーンショット 2017-03-11 11.31.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/c2e62337-6feb-14a6-c3b7-376c04dc642b.png">

<img width="1250" alt="スクリーンショット 2017-03-11 11.32.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/5b46b2d0-aa1e-b27d-f78b-1c990d08558f.png">


### (9) AWSにEC2インスタンス(Amazon Linux)を作成し、PHP5.3をインストールします。

AWSにEC2インスタンス(Amazon Linux)を作成し、ec2-userでsshログインします。
PHP5.3やgit等をインストールします。

```
# sed -i -e "s/HOSTNAME=localhost.localdomain/HOSTNAME=salesforce-api-test/g" /etc/sysconfig/network
# yum -y update
# yum -y install git
# yum -y install php
```

タイムゾーンを設定します。

```
# cp /usr/share/zoneinfo/Japan /etc/localtime

# vi /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
#
```

インストールしたPHPバージョンを確認します。

```
# uname -a
Linux ip-172-31-3-217 4.4.11-23.53.amzn1.x86_64 #1 SMP Wed Jun 1 22:22:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
#

# php -v
PHP 5.3.29 (cli) (built: May 12 2015 22:42:19)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
#
```

一度EC2インスタンスを再起動します。起動してきたら、再度EC2インスタンスにsshログインします。

```
# reboot
```

.bashrcにSalesforce REST API接続用の設定を追加します。

```
[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/.bashrc
　(末尾に以下を追加する)

### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"

export DATABASEDOTCOM_CLIENT_ID="前述の「コンシューマ鍵」(OAuthコンシューマキー)を記載します。"
export DATABASEDOTCOM_CLIENT_SECRET="前述の「コンシューマの秘密」(OAuthコンシューマシークレット)を記載します。"
export DATABASEDOTCOM_CLIENT_USERNAME="APIを有効化しているSalesforceユーザアカウント名を記載します。"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"
```

以下は.bashrcに設定を追加した後の例です。

```
[ec2-user@salesforce-api-test ~]$ cat /home/ec2-user/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
### Sandbox環境へ接続する場合のAPIエンドポイント
##export DATABASEDOTCOM_HOST="test.salesforce.com"
### 本番環境へ接続する場合のAPIエンドポイント
export DATABASEDOTCOM_HOST="login.salesforce.com"
export DATABASEDOTCOM_CLIENT_ID="3**************************************************************F"
export DATABASEDOTCOM_CLIENT_SECRET="1********************4"
export DATABASEDOTCOM_CLIENT_USERNAME="example_salesforce_api_user@hoge.example.com"
export DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD="*************"
[ec2-user@salesforce-api-test ~]$
```

.bashrcに設定した環境変数を読み込みます。

```
[ec2-user@salesforce-api-test ~]$ source /home/ec2-user/.bashrc
[ec2-user@salesforce-api-test ~]$
```

Force.com-OAuth-Toolkit-for-PHP.gitをcloneします。

```
[ec2-user@salesforce-api-test ~]$ git clone https://github.com/nkjm/Force.com-OAuth-Toolkit-for-PHP.git

[ec2-user@salesforce-api-test ~]$ ls -lrta /home/ec2-user/Force.com-OAuth-Toolkit-for-PHP/oauth.php
-rw-rw-r-- 1 ec2-user ec2-user 8472 Sep  6 02:28 /home/ec2-user/Force.com-OAuth-Toolkit-for-PHP/oauth.php
[ec2-user@salesforce-api-test ~]$
```

Force.com-OAuth-Toolkit-for-PHPのセッション格納ディレクトリを作成します。

```
[ec2-user@salesforce-api-test ~]$ mkdir -p /home/ec2-user/tmp/session
[ec2-user@salesforce-api-test ~]$
```

PHPのタイムゾーンを設定します。

```
[root@salesforce-api-test ~]# echo "date.timezone = \"Asia/Tokyo\"" >> /etc/php.ini

[root@salesforce-api-test ~]# grep date.timezone /etc/php.ini | grep -v "^;"
date.timezone = "Asia/Tokyo"
[root@salesforce-api-test ~]#
```

### (10) EC2インスタンスにOpenSSL 1.0.1以上がインストールされている事を確認します。

Salesforce REST APIはTLS 1.0の段階的な無効化を開始しています。
https://help.salesforce.com/apex/HTViewSolution?id=000221207&language=ja

Salesforce REST APIを呼び出すインスタンスには、TLS 1.1をサポートしているOpenSSL 1.0.1以上がインストールされている必要があります。

Amazon LinuxのEC2インスタンスの場合、前述の手順でyum updateを実行すると、OpenSSL 1.0.1がインストールされます。念の為、OpenSSL 1.0.1がインストールされている事を確認します。

```
[ec2-user@salesforce-api-test ~]$ rpm -qa | grep openssl
openssl-1.0.1k-15.93.amzn1.x86_64
[ec2-user@salesforce-api-test ~]$
```

PHPからSalesforce REST APIでカスタムオブジェクトにレコードを追加する
===

### (11) Force.comカスタムオブジェクトにレコードを追加するプログラムを作成します。

Force.comカスタムオブジェク「テストオブジェクト」(例としてオブジェクト名が QuickStart__c であるとします)にレコードを追加するPHPプログラムを作成します。
これを実行すると、カスタムオブジェクトにレコードを追加出来ます。

```
[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/insert_salesforce_api_test.php
```

```php:insert_salesforce_api_test.php
<?php

date_default_timezone_set('Asia/Tokyo');

require_once("/home/ec2-user/Force.com-OAuth-Toolkit-for-PHP/oauth.php");

///// Salesforce REST API接続用の環境変数を.bashrcから取得する
// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」
$DATABASEDOTCOM_CLIENT_ID = getenv('DATABASEDOTCOM_CLIENT_ID');

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を.bashrcから取得する
$DATABASEDOTCOM_CLIENT_SECRET = getenv('DATABASEDOTCOM_CLIENT_SECRET');

// Salesforce REST API接続用のSalesforceユーザ(Salesforceログインに使用しているEメールアドレスを設定)を.bashrcから取得する
$DATABASEDOTCOM_CLIENT_USERNAME = getenv('DATABASEDOTCOM_CLIENT_USERNAME');

// Salesforce REST API接続用のSalesforceユーザのパスワードを.bashrcから取得する
$DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD = getenv('DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD');

// Salesforce REST APIエンドポイントを.bashrcから取得する
$DATABASEDOTCOM_HOST = getenv('DATABASEDOTCOM_HOST');
$LOGIN_URL = "https://" . $DATABASEDOTCOM_HOST . "/";

///// Salesforce REST API接続用の設定
$CACHE_DIR = '/home/ec2-user/tmp/session';
$CALLBACK_URL = 'https://198.51.100.10/';

/////
// Salesforce REST API接続用のOauthインスタンスを生成
$oauth = new oauth( $DATABASEDOTCOM_CLIENT_ID, $DATABASEDOTCOM_CLIENT_SECRET, $CALLBACK_URL, $LOGIN_URL, $CACHE_DIR);

// Salesforce REST API接続にあたりSalesforceへの認証を実行
$oauth->auth_with_password( $DATABASEDOTCOM_CLIENT_USERNAME, $DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD );

var_dump( $oauth->instance_url );

// Salesforce REST APIでカスタムオブジェクトへ追加するレコード
$today = date("Y-m-d");
$insert_time = date("Ymd_His");

$insert_name = "testname_" . $insert_time;
$insert_email = $insert_name . "@hoge.example.com";
$insert_record = array(
    'user_name__c' => $insert_name,
    'user_email__c' => $insert_email,
    'create_date__c' => $today
);

$insert_record_json = json_encode($insert_record);
$insert_record_json = preg_replace('/\\\\\//', '/', $insert_record_json);
echo $insert_record_json . "\n";

$url = $oauth->instance_url . "/services/data/v20.0/sobjects/QuickStart__c";
$curl = curl_init($url);

curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $insert_record_json);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=UTF-8', "Authorization: OAuth " . $oauth->access_token));

$response = json_decode(curl_exec($curl), true);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
var_dump($url);

// insert成功時は201が返ってくるので、201以外はエラーと判定
if ( $status != 201 ) {
    print("Salesforce REST API Access Failed  StatusCode =[" . $status . "]\n");
} else {
    print("Salesforce REST API Access Success StatusCode =[" . $status . "]\n");
}

var_dump( $response );

curl_close($curl);

$oauth->auth_with_refresh_token();

?>
```

PHPプログラムを実行すると、Force.comカスタムオブジェクトにレコードを追加出来ます。

```
[ec2-user@salesforce-api-test ~]$ pwd
/home/ec2-user
[ec2-user@salesforce-api-test ~]$ php /home/ec2-user/insert_salesforce_api_test.php
string(26) "https://ap2.salesforce.com"
{"user_name__c":"testname_20160907_014059","user_email__c":"testname_20160907_014059@hoge.example.com","create_date__c":"2016-09-07"}
string(69) "https://ap2.salesforce.com/services/data/v20.0/sobjects/QuickStart__c"
SalesForce REST API Access Success StatusCode =[201]
array(3) {
  ["id"]=>
  string(18) "a032800000G8dC0AAJ"
  ["success"]=>
  bool(true)
  ["errors"]=>
  array(0) {
  }
}
[ec2-user@salesforce-api-test ~]$
```

PHPからSalesforce REST APIでカスタムオブジェクトに追加したレコード一覧を表示する
===

### (12) Force.comカスタムオブジェクトに追加したレコードを表示するプログラムを作成します。

Force.comカスタムオブジェク「テストオブジェクト」(例としてオブジェクト名が　 QuickStart__c であるとします)のレコードを表示するPHPプログラムを作成します。
これを実行すると、カスタムオブジェクトに追加されたレコードを表示出来ます。

```
[ec2-user@salesforce-api-test ~]$ vi /home/ec2-user/select_salesforce_api_test.php
```

```php:select_salesforce_api_test.php
<?php

require_once("/home/ec2-user/Force.com-OAuth-Toolkit-for-PHP/oauth.php");

///// Salesforce REST API接続用の環境変数を.bashrcから取得する
// Salesforce REST APIで接続するアプリケーションの「コンシューマ鍵」
$DATABASEDOTCOM_CLIENT_ID = getenv('DATABASEDOTCOM_CLIENT_ID');

// Salesforce REST APIで接続するアプリケーションの「コンシューマの秘密」を.bashrcから取得する
$DATABASEDOTCOM_CLIENT_SECRET = getenv('DATABASEDOTCOM_CLIENT_SECRET');

// Salesforce REST API接続用のSalesforceユーザ(Salesforceログインに使用しているEメールアドレスを設定)を.bashrcから取得する
$DATABASEDOTCOM_CLIENT_USERNAME = getenv('DATABASEDOTCOM_CLIENT_USERNAME');

// Salesforce REST API接続用のSalesforceユーザのパスワードを.bashrcから取得する
$DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD = getenv('DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD');

// Salesforce REST APIエンドポイントを.bashrcから取得する
$DATABASEDOTCOM_HOST = getenv('DATABASEDOTCOM_HOST');
$LOGIN_URL = "https://" . $DATABASEDOTCOM_HOST . "/";

///// Salesforce REST API接続用の設定
$CACHE_DIR = '/home/ec2-user/tmp/session';
$CALLBACK_URL = 'https://198.51.100.10/';

/////
// Salesforce REST API接続用のOauthインスタンスを生成
$oauth = new oauth( $DATABASEDOTCOM_CLIENT_ID, $DATABASEDOTCOM_CLIENT_SECRET, $CALLBACK_URL, $LOGIN_URL, $CACHE_DIR);

// Salesforce REST API接続にあたりSalesforceへの認証を実行
$oauth->auth_with_password( $DATABASEDOTCOM_CLIENT_USERNAME, $DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD );

//var_dump( $oauth->instance_url );
//var_dump( $oauth->access_token );
//var_dump( $oauth->refresh_token );

// Salesforce REST APIパラメータに指定するSOQLを定義
$query = "SELECT user_name__c, user_email__c, create_date__c FROM QuickStart__c";

// Salesforce REST APIを実行する
$url = $oauth->instance_url . "/services/data/v24.0/query?q=" . urlencode($query);
$curl = curl_init($url);
var_dump($url);

curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $oauth->access_token));

// Salesforce REST API実行結果を保存
$response = json_decode(curl_exec($curl), true);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $status != 200 ) {
    print("Salesforce REST API Access Failed  StatusCode =[" . $status . "]\n");
} else {
    print("Salesforce REST API Access Success StatusCode =[" . $status . "]\n");
}

var_dump( $response );

curl_close($curl);

$oauth->auth_with_refresh_token();

?>
```

このプログラムを実行すると、Force.comカスタムオブジェクトのレコード一覧を表示出来ます。

```
[ec2-user@salesforce-api-test ~]$ php /home/ec2-user/select_salesforce_api_test.php
string(128) "https://ap2.salesforce.com/services/data/v24.0/query?q=SELECT+user_name__c%2C+user_email__c%2C+create_date__c+FROM+QuickStart__c"
SalesForce REST API Access Success StatusCode =[200]
array(3) {
  ["totalSize"]=>
  int(15)
  ["done"]=>
  bool(true)
  ["records"]=>
  array(15) {
    [0]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000FlloBAAR"
      }
      ["user_name__c"]=>
      string(15) "テスト太郎"
      ["user_email__c"]=>
      string(22) "test.tarou@example.com"
      ["create_date__c"]=>
      NULL
    }
    [1]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000FlloVAAR"
      }
      ["user_name__c"]=>
      string(15) "テスト次郎"
      ["user_email__c"]=>
      string(22) "test.jirou@example.com"
      ["create_date__c"]=>
      NULL
    }
    [2]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8d8SAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_013814"
      ["user_email__c"]=>
      string(41) "testname_20160907_013814@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [3]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8d7yAAB"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_013750"
      ["user_email__c"]=>
      string(41) "testname_20160907_013750@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [4]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8d9pAAB"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_013850"
      ["user_email__c"]=>
      string(41) "testname_20160907_013850@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [5]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8d0EAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_013037"
      ["user_email__c"]=>
      string(41) "testname_20160907_013037@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [6]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8dAiAAJ"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_013909"
      ["user_email__c"]=>
      string(41) "testname_20160907_013909@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [7]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8dC0AAJ"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_014059"
      ["user_email__c"]=>
      string(41) "testname_20160907_014059@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [8]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G8dCFAAZ"
      }
      ["user_name__c"]=>
      string(24) "testname_20160907_014210"
      ["user_email__c"]=>
      string(41) "testname_20160907_014210@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-07"
    }
    [9]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G7wcGAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160906_042408"
      ["user_email__c"]=>
      string(41) "testname_20160906_042408@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-06"
    }
    [10]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G7wcQAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160906_042527"
      ["user_email__c"]=>
      string(41) "testname_20160906_042527@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-06"
    }
    [11]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G7wcuAAB"
      }
      ["user_name__c"]=>
      string(24) "testname_20160906_043918"
      ["user_email__c"]=>
      string(41) "testname_20160906_043918@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-06"
    }
    [12]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G7wcBAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160906_042126"
      ["user_email__c"]=>
      string(41) "testname_20160906_042126@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-06"
    }
    [13]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G7wdEAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160906_044112"
      ["user_email__c"]=>
      string(41) "testname_20160906_044112@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-06"
    }
    [14]=>
    array(4) {
      ["attributes"]=>
      array(2) {
        ["type"]=>
        string(13) "QuickStart__c"
        ["url"]=>
        string(62) "/services/data/v24.0/sobjects/QuickStart__c/a032800000G7wcLAAR"
      }
      ["user_name__c"]=>
      string(24) "testname_20160906_042515"
      ["user_email__c"]=>
      string(41) "testname_20160906_042515@hoge.example.com"
      ["create_date__c"]=>
      string(10) "2016-09-06"
    }
  }
}
[ec2-user@salesforce-api-test ~]$
```

備考
===

以下のコマンドを実行すると、PHPクライアントからSalesforce REST APIへのネットワーク層での通信が正常な場合、SalesforceからAPIアクセストークンを取得出来ます。
Salesforceへの手軽な疎通確認に利用出来ます。


```
[ec2-user@salesforce-api-test ~]$ curl https://$DATABASEDOTCOM_HOST/services/oauth2/token -d "grant_type=password" -d "client_id=$DATABASEDOTCOM_CLIENT_ID" -d "client_secret=$DATABASEDOTCOM_CLIENT_SECRET" -d "username=$DATABASEDOTCOM_CLIENT_USERNAME" -d "password=$DATABASEDOTCOM_CLIENT_AUTHENTICATE_PASSWORD"
{"access_token":"00D******************************************wzij","instance_url":"https://ap2.salesforce.com","id":"https://login.salesforce.com/id/********************:/*******************","token_type":"Bearer","issued_at":"1473101261652","signature":"J28rR************************:"}[ec2-user@salesforce-api-test ~]$
[ec2-user@salesforce-api-test ~]$
```

***

以上になります。