PHPでインドネシア決済サービスを統合するには?
PHPでインドネシアの決済サービスを統合するガイド
インドネシア市場では、いくつかの一般的なローカル決済方法が利用可能です。以下は、PHPを使用してこれらのサービスを統合するための手順と考慮事項です:
主なインドネシア支払方法
- OVO
- DANA
- リンクアジャ
- ゴーペイ (現GoTo Financial)
- 銀行振込 (マンディリ、BCA、BRIなど)。
- コンビニ決済 (アルファマート、インドマーレ)
一般的な統合ステップ
1.決済ゲートウェイプロバイダーの選定
以下のサービス・プロバイダーについて考えてみよう:
- ミッドトランス(一番人気)
- ゼンディット
- ドク
- iPay88
2.PHPの統合例(例としてMidtrans)
// Midtrans PHP ライブラリをインストールする: composer require midtrans/midtrans-php
require_once(dirname(__FILE__) . '/vendor/autoload.php');
// マーチャント・サーバー・キーの設定
\$serverKey = 'YOUR_SERVER_KEY';
// 開発/サンドボックス環境に設定(デフォルト)。 本番環境ではtrueに設定します。
\$isProduction = false;
// サニタイズを有効にする
\$isSanitised = true;
// 重複トランザクションを防ぐため、idempotency-keyを有効にする。
\$isIdempotencyKeyEnabled = true;
$params = [
'transaction_details' => [
'order_id' => rand()、
'gross_amount' => 100000、
],
'payment_type' => 'gopay', // または銀行送金、電子財布などの他の支払い方法。
'customer_details' => [
'first_name' => "John"、
'last_name' => "Doe"、
'email' => "[email protected]"、
// インドネシアの電話番号形式が必要 (+62)
// 例:+6281234567890 - 携帯番号から最初のゼロを取り除き、接頭辞に+62を加える。
// GoPay/DANAなど、一部の支払い方法におけるOTP認証のために重要です。
//
APIコールの例 (Xendit)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.xendit.co/v2/invoices");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch,CURLOPT_POSTFIELDS,'{。
"external_id": "demo_147580196270",
"金額":10000。
"説明": "請求書デモ #123"。
/* インドネシアでの支払いの場合 */
/* OVOの場合 */
/*"payer_email": "[email protected]",*/
});
/* ヘッダーの追加 */
/* リクエストの実行 */
/* レスポンスの処理 */
Webhook処理(Xenditを例として)
if($_SERVER['REQUEST_METHOD']===POST){。
$callbackToken= $_SERVER['HTTP_X_CALLBACK_TOKEN'];
if ($callbackToken !== your_callback_token){。
http_response_code(403); exit(); }.
$json= file_get_contents('php://input');
$data= json_decode($json);
switch ($data->status) {.
case PAID: processPaidInvoice(); break;
case EXPIRED: handleExpiredPayment(); break;
}
} else { http_response_code(405); }.
Laravelパッケージの推奨
Laravel開発者向け:
composer require veritrans/veritrans-laravel # MidTrans 公式パッケージ
composer require xendit/xendit-laravel # XendIT 公式パッケージ
または一般的なGuzzle HTTPクライアントの実装です。
このガイドがお役に立てば幸いです!お客様のビジネスニーズに合った決済方法とAPIプロバイダーをお選びください。
PHPインドネシア決済サービスガイド
3.さまざまな支払い方法を扱うための特別な要件
OVO決済の統合
// ミッドトランスにおけるOVOの設定例
$params = [
'payment_type' => 'ewallet'、
'ewallet' => [
'channel_code' => 'ovo', // OVOのチャンネルコード
'channel_properties' => [
// インドネシアの携帯電話番号形式(+628...)を使用すること。
// 例:08123456789 → +628123456789。
'mobile_number' => '+6281234567890'
]
],
// ...その他のトランザクションパラメータ ...
];
を試す。
$response = \MidtransCoreApi::charge($params);
をキャッチします。
echo $e->getMessage();
}
DANAペイメント・インテグレーションに関する考察
- 加盟店登録が必要DANAマーチャントプラットフォームにAPIキーを登録する必要があります。
- コールバック検証支払い状況を確認するために、DANAのコールバックURLを実装する必要があります。
// DANAコールバック処理の例(簡易版)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {.
$rawData = file_get_contents('php://input');
if (!empty($rawData)){。
を試す。
require_once('dana_sdk.php'); // DANA公式SDK
$danaClient = 新しいDanaClient([)
'clientId' => YOUR_CLIENT_ID、
'secretKey' => YOUR_SECRET_KEY、
// ...
]);
if ($danaClient->validateCallback($rawData)) {.
http_response_code(200)。
/*
* :: ビジネスロジック。
* 注文ステータスを支払済みに更新する
* 出荷やサービス提供などのフォローアップ業務
*/
} else { throw new Exception("Invalid callback signature"); }.
} catch (Exception $e) { error_log($e); http_response_code(400); }.
}
}
GoPay/GoToファイナンシャルの特別設定
GoPayはGoToエコシステムの一部となりました。
-
サンドボックステスト:
\$isProduction = false;
\"SB-Mid-server-... "である。;
-
生産環境:
\$isProduction = true;
/* GoPay は追加の資格を要求する場合がある。
-
ユーザー携帯電話番号フォーマット(重要):PHPプリプロセッサの例。
function formatIndonesianPhone(string $phone): string
{
/*
* ローカルフォーマットの変換
* - "08123456789" → "+628123456789"
*/
return preg_replace('/^0/', '+62', ltrim($phone));
}
$customerPhone= formatIndonesianPhone($_POST['phone']);
/* その後、支払いパラメーターで使用する。
$params['customer_details']['phone'] = validatedNumber;
アルファマート/インドマーレ コンビニ決済
銀行口座を持たないユーザーグループにも適用可能。中心的なプロセスは、支払いコードを生成する→ユーザーがオフラインでコードをスキャンして取引を完了する。
// ミッドトランス・コンビニエンスストアの支払請求サンプル・スニペット
$convenienceStoreParams= [ ]です。
"store" => "alfamart", // またはindomaret
];
$response= \MidtransCoreApi::charge([])
...通常の注文パラメータ ...,
"payment_type"=>"cstore"。
"cstore"=> convenienceStoreParams、
]);
/* レスポンスには、印刷用の支払いコードと有効期限が含まれる。
echo json_encode([
payment_code=> response->payment_code、
]);
次に知っておきたいことがある:
- Webhookセキュリティ検証のベストプラクティス(署名検証など)
- Laravelのフレームワークに特化したアプローチのエレガントな実装(サービスプロバイダー設計)
- ルピアの通貨フォーマットと小数点以下の桁数処理 PHP Tips