Как интегрировать платежный сервис Индонезии в PHP?

Руководство по интеграции индонезийских платежных сервисов с PHP

На индонезийском рынке существует несколько популярных местных способов оплаты. Ниже описаны шаги и соображения по интеграции этих сервисов с помощью PHP:

Главная Индонезия Варианты оплаты

  1. OVO
  2. ДАНА
  3. LinkAja
  4. GoPay (теперь GoTo Financial)
  5. банковский перевод (Mandiri, BCA, BRI и др.)
  6. Платежи в магазинах бытовой техники (Альфамарт, Индомарет)

Общие этапы интеграции

1. выбор провайдеров платежных шлюзов

Рассмотрите следующих поставщиков услуг:

  • Мидтранс (самый популярный)
  • Xendit
  • Doku
  • iPay88

2. Пример интеграции PHP (на примере Midtrans)

// Установите PHP-библиотеку Midtrans: composer require midtrans/midtrans-php

require_once(dirname(__FILE__) . '/vendor/autoload.php');

// Установите ключ вашего торгового сервера
\Midtrans\Config::$serverKey = 'YOUR_SERVER_KEY';
// Установите значение для среды разработки/Sandbox (по умолчанию). Установите значение true для производственной среды.
\Midtrans\Config::$isProduction = false;
// Включите дезинфекцию
\Midtrans\Config::$isSanitised = true;
// Включите idempotency-key для предотвращения дублирования транзакций
\Midtrans\Config::$isIdempotencyKeyEnabled = true;

$params = [
'transaction_details' => [
'order_id' => rand(),
'gross_amount' => 100000,
],
'payment_type' => 'gopay', // или другие способы оплаты, такие как банковский_перевод, электронный кошелек и т.д.
'customer_details' => [
'first_name' => "Джон",
'last_name' => "Doe",
'email' => "[email protected]",
// Требуется формат индонезийского телефонного номера (+62)
// Пример: +6281234567890 - удалите первый ноль из номера мобильного телефона и добавьте префикс +62.
// Важно для проверки OTP при некоторых способах оплаты, таких как GoPay/DANA/etc.
//

Пример вызова 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]",*/

});

/* Добавьте заголовки */

/* Выполнение запроса */

/* Обработка ответа */

Обработка веб-хуков (на примере 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

или общую реализацию HTTP-клиента Guzzle.

Мы надеемся, что это руководство было полезным! Выберите подходящий способ оплаты и поставщика API для ваших конкретных бизнес-потребностей.

Продолжить PHP Интеграция Индонезия платежный сервис руководство

3. специальные требования для работы с различными способами оплаты

Интеграция платежей OVO

// Пример настройки OVO в Midtrans
$params = [
'payment_type' => 'ewallet',
'ewallet' => [
'channel_code' => 'ovo', // Код канала OVO
'channel_properties' => [
// Должен использоваться индонезийский формат номера мобильного телефона (+628...)
// Примечание: +62 заменяет 0, например, 08123456789 → +628123456789.
'mobile_number' => '+6281234567890'
]
],
// ... Другие параметры транзакции ...
];

попробуйте {
$response = \Midtrans\CoreApi::charge($params);
} catch (\Exception $e) {
echo $e->getMessage();
}

Интеграция платежей DANA

  1. Требуется регистрация торговца: Для получения ключа API вам необходимо сначала зарегистрироваться на платформе DANA Merchant Platform.
  2. проверка обратного вызова: Должен быть реализован URL обратного вызова DANA для проверки статуса платежа
// Пример обработки обратных вызовов DANA (упрощенный)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$rawData = file_get_contents('php://input');

если (!empty($rawData)) {
попробуйте {
require_once('dana_sdk.php'); // Официальный SDK DANA

$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 Financial

Поскольку GoPay теперь является частью экосистемы GoTo.

  1. тестирование в песочнице:

    \Midtrans\Config::$isProduction = false;   
    \Midtrans\Config::$serverKey = "SB-Mid-server-..." ;
  2. производственная среда:

    \Midtrans\Config::$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;

Альфамарт/Индомарет оплата в магазинах у дома

Применимо к небанковским группам пользователей. Основной процесс заключается в генерации кода платежа → пользователи сканируют код в автономном режиме для завершения транзакции.

// Образец фрагмента запроса на оплату в магазине Midtrans Convenience Store    

$convenienceStoreParams= [
"store" => "alfamart", // или indomaret
];

$response= \Midtrans\CoreApi::charge([
... Параметры регулярного заказа ... ,
"payment_type"=>"cstore".
"cstore"=> convenienceStoreParams,
]);

/* Ответ будет содержать код платежа и время истечения срока действия для печати */
echo json_encode([
payment_code=> response->payment_code,
]);

Следующее, что вы, возможно, захотите узнать:

  • Лучшие практики проверки безопасности Webhook (проверка подписи и т. д.)
  • Элегантная реализация фреймворкового подхода Laravel (проектирование поставщиков услуг)
  • Форматирование валюты рупии и работа с десятичными знаками PHP Советы