RMS APIは楽天市場の店舗管理、商品管理の自動化を実現するAPIです。あまりサンプルがまとまっていないので、APIの全パターンを下記記事でまとめています。
楽天 RMS APIのPHPサンプル集・使い方 ほぼ全パターン(随時更新中)
今回は決済API(Payment API)、authoriを解説します。
APIを使用できる環境がない場合は、下記から出店申請をしてください。毎度言ってますが料金が高いので、APIを試すだけなら既に店舗アカウントを持っている人に頼んでテスト店舗を使わせてもらうのも手です。
サンプルソースコードは下記です。
こちらの記事は当初運営者メンバーの執筆でしたが現在は離れており、寄稿記事となっています。そのため当記事の情報アップデートにつきましては2020年1月をもって終了・サポート・内容についての問合せなどは受けておりません。また、記事内容を利用された際に生じた内容にも責任を負えませんのでご了承ください。
authoriの概要
authoriを使えば、クレジットカードでの受注に対して、支払い処理を行うことができます。
デフォルトのRMSであれば、受注が入った後、受注管理画面から手動でオーソリ処理を行う必要があります。
これが割と手間なため、自動決済サービスなんてものもありますがこれはあまり自由度がありません。どんな注文でも自動でオーソリ処理をして支払いまでいってしまうので、柔軟な対応が損なわれるケースがあります。そんな時にauthori APIを用いてある一定のルールを満たした注文だけオーソリする、などの対応が可能となります。
authoriはSOAP APIです。エンドポイントにPOSTすると、受注された注文に対して、クレジットカードのオーソリ処理を行ってくれます。
指定するパラメータ、設定値は下記です。
- 受注番号
- 請求額
- 一括払いや分割払い、リボ払いなどの指定
POST リクエスト例
SOAPのリクエストなのでRESTしかやったことない人はギョッとします。(俺もギョッとしました)
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="java:jp.co.rakuten.rms.mall.rccsapi.model.entity" xmlns:ns2="http://orderapi.rms.rakuten.co.jp/rccsapi-services/RCCSAPI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns2:authori>
<ns2:userAuthModel>
<ns1:authKey>hogekey</ns1:authKey>
<ns1:shopUrl>hogeshop</ns1:shopUrl>
<ns1:userName>hogeuser</ns1:userName>
</ns2:userAuthModel>
<ns2:intVal>174858024</ns2:intVal>
<ns2:uiAuthoriRequestModels>
<ns1:UiAuthoriRequestModel>
<ns1:helpItem xsi:nil="true"/>
<ns1:orderNumber>338459-20180629-00000824</ns1:orderNumber>
<ns1:payType>0</ns1:payType>
<ns1:price>208</ns1:price>
</ns1:UiAuthoriRequestModel>
</ns2:uiAuthoriRequestModels>
</ns2:authori>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope
ソースコード解説
authori APIが非同期のため、やることが2つあります。
- 非同期APIのためのリクエストIDの取得
- getRCCSRequestIdに向けてSOAPクライアントでPOSTする
- authori API POST
- POSTリクエストする決済情報パラメータのクラスを作成
- SOAPクライアントを用いてリクエストIDと決済情報を添えてPOSTする
リクエストIDを取得後、authori APIにPOSTします。リクエストIDを保存しておけば、getRCCSResult APIを使って処理結果を取得できます。
クレジットカードの情報が間違っていたり、カード限度額に引っかかった場合はオーソリ処理に失敗します。処理失敗に備えて、リクエストIDをつけたgetRCCSResult APIを叩いて結果を取得する必要がありますが、本エントリーでは割愛します。getRCCSResultで処理結果を取得する方法は下記です。
getRCCSResultのAPIで非同期決済APIの結果を取得する方法はこちら(準備中)
非同期APIのためのリクエストIDの取得
getRCCSRequestIdのAPIのエンドポイントにSOAPでPOSTを行うと、決済API全般で使用するリクエストIDを取得できます。
SOAPのPOST方法としてはauthoriのAPIと同じなので、ここでは処理部分を載せるに留めます。
/***
* リクエストIDを取得 getRCCSRequestId [同期]
* */
// 楽天へRMS APIを使って送信
list($request, $httpStatusCode, $response) = getRCCSRequestId();
if (strcmp($httpStatusCode, "200") != 0) {
// statuscode 200じゃない場合、リクエストIDの取得に失敗。処理中止
return;
}
if(strcmp($response->result->errorCode, "RCCS_N00-000") != 0 ) {
// 決済APIの結果が正常でない場合、リクエストIDの取得に失敗。処理中止
return;
}
// リクエストIDの取得完了
$requestId = $response->result->requestId;
function getRCCSRequestId() {
//パラメータセット
$userAuthModel = new UserAuthModel();
$userAuthModel->authKey = RMS_SETTLEMENT_AUTH;
$userAuthModel->shopUrl = RMS_SETTLEMENT_SHOP_URL;
$userAuthModel->userName = RMS_SETTLEMENT_USER_NAME;
$params = array('userAuthModel' => _convertClassObjectToArray($userAuthModel));
//エラーを無視するエラーハンドラに切り替える(実行後は元に戻す)
set_error_handler("myErrorHandler");
try{
$client = new SoapClient(RMS_API_PAYMENT_SOAP_WSDL, array('trace' => 1 ));
//エラーハンドラ回復
restore_error_handler();
} catch (Exception $e) {
//エラーハンドラ回復
restore_error_handler();
return array(null, "400", $e->getMessage()); // 適切に対処した方が良い
//WSDLファイルの読み込みに失敗した場合の処理
}
try{
//SOAP通信実行
$result = $client->getRCCSRequestId($params);
// customVarDump($result);
} catch (SoapFault $e) {
// customVarDump($e);
//SOAP通信の実行に失敗した場合の処理
}
// customVarDump($client->__getLastRequest());
// customVarDump($client->__getLastResponse());
return array($client->__getLastRequest(), extract_response_http_code($client->__getLastResponseHeaders()), $result);
}
POSTリクエストする決済情報パラメータのクラスを作成
POSTする際に一番頭を悩ませるのが、POSTパラメータの文字列の作成方法です。今回はPOSTの形式がSOAPなので、SOAPクライアントを使うと、クラスオブジェクトをパラメータにぶち込むだけでいい感じにリクエストのXMLを作成してくれます。
ということで、まずはリクエストとして設定するパラメータをクラス定義します。
class/uiAuthoriRequestModel.php
<?php
class UiAuthoriRequestModel {
public $orderNumber;
public $price;
public $payType;
public $helpItem;
function __construct() {
}
}
クラスを作ったら、決済情報の値を入れて、POSTの関数authori にぶち込みます。リクエストIDを入れるのも忘れずに。
// リクエストIDの取得完了 $requestId = $response->result->requestId; /*** * オーソリ処理 authori [非同期] * $requestIdはシステム内に保存しておくこと。 * 非同期のため、処理が正しく行われたかどうかはgetRCCSResult APIに$requestIdを入れて確認する必要がある * */ $uiAuthoriRequestModel = new UiAuthoriRequestModel(); $uiAuthoriRequestModel->orderNumber = $orderNumber; $uiAuthoriRequestModel->price = 208; $uiAuthoriRequestModel->payType = 0; // 一括払い $uiAuthoriRequestModels[] = $uiAuthoriRequestModel; // 楽天へRMS APIを使って送信 list($request, $httpStatusCode, $response) = authori($requestId, $uiAuthoriRequestModels);
SOAPクライアントを用いてリクエストIDと決済情報を添えてPOSTする
決済情報のクラスをSOAPクライアントに入れて実行することで、SOAPクライアントが自動でいい感じのリクエストのXMLを作ってPOSTしてくれます。
API申請時に発行した店舗URLやユーザーネーム、APIのキーを付与する必要があります(★部分)。RMSのRESTのAPIのサービスシークレットとライセンスキーとは別物なのでご注意ください。
authori.php
function authori($requestId, $uiAuthoriRequestModels) {
//パラメータセット
$userAuthModel = new UserAuthModel();
$userAuthModel->authKey = RMS_SETTLEMENT_AUTH; // ★
$userAuthModel->shopUrl = RMS_SETTLEMENT_SHOP_URL; // ★
$userAuthModel->userName = RMS_SETTLEMENT_USER_NAME; // ★
$params = array('userAuthModel' => _convertClassObjectToArray($userAuthModel),
'intVal' => $requestId,
'uiAuthoriRequestModels' => $uiAuthoriRequestModels);
//エラーを無視するエラーハンドラに切り替える(実行後は元に戻す)
set_error_handler("myErrorHandler");
try{
$client = new SoapClient(RMS_API_PAYMENT_SOAP_WSDL, array('trace' => 1 ));
//エラーハンドラ回復
restore_error_handler();
} catch (Exception $e) {
//エラーハンドラ回復
restore_error_handler();
return array(null, "400", $e->getMessage()); // 適切に対処した方が良い
//WSDLファイルの読み込みに失敗した場合の処理
}
try{
//SOAP通信実行
$result = $client->authori($params);
// customVarDump($result);
} catch (SoapFault $e) {
// customVarDump($e);
//SOAP通信の実行に失敗した場合の処理
}
// customVarDump($client->__getLastRequest());
// customVarDump($client->__getLastResponse());
return array($client->__getLastRequest(), extract_response_http_code($client->__getLastResponseHeaders()), $result);
}
/**
* Convert an classObject to array
*/
function _convertClassObjectToArray($object) {
$json = json_encode($object);
return (array)json_decode($json, true);
}
ポイントは、SoapClientをnewする時の第一引数に、WSDLファイルというSOAPのAPIの情報が詰まったURLを指定してやるところです。
$client = new SoapClient(RMS_API_PAYMENT_SOAP_WSDL, array('trace' => 1 ));
WSDLファイルの中身を見ると分かりますが、どんなAPIがあるか、パラメータは何かみたいな情報が書いてあります。これを元に、Soapクライアントは
$params = array('userAuthModel' => _convertClassObjectToArray($userAuthModel), 'intVal' => $requestId, 'uiAuthoriRequestModels' => $uiAuthoriRequestModels);
のパラメータ情報をいい感じにXMLに変換してPOSTします。
レスポンスとして下記のようなのが返ってきたら成功です。
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:authoriResponse xmlns:ns2="http://orderapi.rms.rakuten.co.jp/rccsapi-services/RCCSAPI" xmlns:ns3="java:jp.co.rakuten.rms.mall.rccsapi.model.entity" xmlns:ns4="java:language_builtins">
<ns2:result>
<count>1</count>
<errorCode>RCCS_N00-000</errorCode>
<kind>1</kind>
<message>正常終了</message>
<requestId>174858024</requestId>
<startDate>2018-07-01T17:48:37+09:00</startDate>
<status>1</status>
<timeStamp>2018-07-01T17:48:37+09:00</timeStamp>
<unitErrors xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</ns2:result>
</ns2:authoriResponse>
</S:Body>
</S:Envelope>
繰り返しになりますが、authori APIは非同期APIのため、この時点ではオーソリ処理が成功したかは判別つきません。
オーソリ処理の結果を取得するには、注文API(Order API)のgetOrderで定期取得して状態を監視するか、リクエストIDから処理結果を取得するgetRCCSResultを叩く必要があります。
注文API(Order API)のgetOrder解説はこちら
getRCCSResultのAPIで非同期決済APIの結果を取得する方法はこちら(準備中)
まとめ
authori APIは非同期のAPIのため同期のAPIと比べて多少煩雑な処理が必要でした。
処理の流れは下記です。
- リクエストIDをSOAP APIで取得
- authori を SOAP APIで実施
- 処理結果をリクエストIDで取得
なお、テスト店舗ではテスト用のクレジットカードも割り当てられますので、自由にクレジット決済のテストを試すことができます。試してみたい方は是非下記から資料請求などをして準備をはじめてみてくださいね。