外部決済システム連携
PHPを使用して、外部決済代行システムへクレジットカード情報を連携するサンプルプログラムです。
SPIRAL ver.2のアカウント内にクレジットカード情報を保存せず、外部決済代行システムが提供するAPIへ情報を送信し、決済を実行するモデルです。
外部決済代行システムへの連携ページでは、外部決済代行システムAPIの仕様に従ってください。
登録フォームの完了ページのソース
<h1>申し込み完了画面</h1>
<p>申込み番号は<span th:text="${record[1]}">申込管理ID</span>です。</p>
<p>引き続き、支払い入力画面へ進んでください。</p>
<form th:action="${pages['p02759'].path}" method="POST">
<input type="hidden" name="orderid" th:value="${record[1]}">
<button type="submit" name="btnsubmit">支払い入力へ進む</button>
</form>
カード番号入力ページのbody
<h1>支払い入力画面</h1>
<p>クレジットカード番号を入力してください。</p>
<p>※クレジットカード番号はSSL通信で暗号化され、カード決済代行会社へ認証のために送信されます。</p>
<p>※当社ではクレジットカード番号を保管しません。</p>
<form th:action="${pages['p02287'].path}" method="POST">
カード番号:
<input type="number" name="cardnumber" value=""><br>
有効期限:20<input type="number" name="expire" value=""><br>
数字4桁。2023年12月 → 2312
<br>
名義人:
<input type="text" name="holdername" value="">
<br>
セキュリティコード:
<input type="number" name="seccode" value=""><br>
<input type="hidden" name="orderid" th:value="${postParams['orderid']}">
<button type="submit" name="btnsubmit">入力する</button>
</form>
外部決済代行システムへの連携ページのPHP
<?php
//カード番号入力ページから送信されてきた値を変数にセット
$orderid = $SPIRAL->getParam("orderid"); //決済代行システムへ送信する一意の値
$cardnumber = $SPIRAL->getParam("cardnumber"); //カード番号
$expire = $SPIRAL->getParam("expire"); //有効期限
$holdername = $SPIRAL->getParam("holdername"); //名義人
$seccode = $SPIRAL->getParam("seccode"); //セキュリティコード
<code class="php syntaxhl">//オーダーIDを元に、支払い金額をDBから取得
$base_url = "https://api.spiral-platform.com/v1/apps";
$header = array(
"Authorization:Bearer xxxxxxxxxxxxx",
"Content-Type:application/json",
);
//エンドポイント
$url = $base_url . "/9999/dbs/1/records?where=@orderid='" . $orderid . "'&fields=amount";
//メソッド
$method = "GET";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL , $url);
curl_setopt($curl, CURLOPT_HTTPHEADER , $header);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST , $method);
$response = curl_exec($curl);
if (curl_errno($curl)) echo curl_error($curl);
curl_close($curl);
//json形式を配列に変換
$data = json_decode($response , true);
$amount = $data["items"][0]["amount"];//金額
//決済代行システムのAPI仕様に従う
$url = "https://"; //決済代行システムの取引登録APIのエンドポイントURL
$header = array("Content-Type: application/json;charset=UTF-8");
$body = [
'apiKey' => 'xxxxxx',
'apiPass' => 'xxxxxx',
'orderID' => $orderid,
'amount' => $amount
];
//配列をjson形式に変換
$json_body = json_encode($body);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL , $url);
curl_setopt($curl, CURLOPT_HTTPHEADER , $header);
curl_setopt($curl, CURLOPT_POSTFIELDS , $json_body);
curl_setopt($curl, CURLOPT_POST , true);
$response = curl_exec( $curl );
$curlinfo = curl_getinfo( $curl );
curl_close( $curl );
// レスポンスチェック
if( $curlinfo[ 'http_code' ] != 200 ){
// エラー
return false;
}
// レスポンスのエラーチェック
$data = json_decode($response , true);
if( array_key_exists( 'errCode', $data ) ){
// エラー
return false;
}
//決済代行システムのAPIから返却された値を取得
$accessID = $data["accessID"];
$accessPass = $data["accessPass"];
$orderID = $data["orderID"];
$tranurl = "https://"; //決済代行システムの決済実行APIのエンドポイントURL
$param = [
'accessID' => $accessID,
'accessPass' => $accessPass,
'orderID' => $orderID,
'method' => '1',
'cardNo' => $cardnumber,
'expire' => $expire,
'holderName' => $holdername,
'securityCode' => $seccode,
];
//配列をjson形式に変換
$json_param = json_encode($param);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL , $tranurl);
curl_setopt($curl, CURLOPT_HTTPHEADER , $header);
curl_setopt($curl, CURLOPT_POSTFIELDS , $json_param);
curl_setopt($curl, CURLOPT_POST , true);
$response = curl_exec( $curl );
$curlinfo = curl_getinfo( $curl );
curl_close( $curl );
// レスポンスチェック
if( $curlinfo[ 'http_code' ] != 200 ){
// エラー
return false;
}
// レスポンスのエラーチェック
$data = json_decode($response , true);
if( array_key_exists( 'errCode', $data ) ){
// エラー
foreach($data as $d){
$msg = "エラーが発生しました。:" . $da["errCode"];
}
return false;
}else{
$msg = "お支払いが完了しました。";
return true;
}
$SPIRAL->setTHValue("output", $msg);
?>
外部決済代行システムへの連携ページのbody
<div th:if="${cp.result.isSuccess}">
<p th:text="${cp.result.value['output']}"></p>
</div>
<div th:if="${!cp.result.isSuccess}">
<p th:text="${cp.result.errorMessage}">error message</p>
</div>
