PHPでインドネシア決済サービスを統合するには?

PHPでインドネシアの決済サービスを統合するガイド

インドネシア市場では、いくつかの一般的なローカル決済方法が利用可能です。以下は、PHPを使用してこれらのサービスを統合するための手順と考慮事項です:

主なインドネシア支払方法

  1. OVO
  2. DANA
  3. リンクアジャ
  4. ゴーペイ (現GoTo Financial)
  5. 銀行振込 (マンディリ、BCA、BRIなど)。
  6. コンビニ決済 (アルファマート、インドマーレ)

一般的な統合ステップ

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ペイメント・インテグレーションに関する考察

  1. 加盟店登録が必要DANAマーチャントプラットフォームにAPIキーを登録する必要があります。
  2. コールバック検証支払い状況を確認するために、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エコシステムの一部となりました。

  1. サンドボックステスト:

    \$isProduction = false;   
    \"SB-Mid-server-... "である。;
  2. 生産環境:

    \$isProduction = true;    
    /* GoPay は追加の資格を要求する場合がある。
  3. ユーザー携帯電話番号フォーマット(重要):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