Как интегрировать платежный сервис Индонезии в PHP?
Руководство по интеграции индонезийских платежных сервисов с PHP
На индонезийском рынке существует несколько популярных местных способов оплаты. Ниже описаны шаги и соображения по интеграции этих сервисов с помощью PHP:
Главная Индонезия Варианты оплаты
- OVO
- ДАНА
- LinkAja
- GoPay (теперь GoTo Financial)
- банковский перевод (Mandiri, BCA, BRI и др.)
- Платежи в магазинах бытовой техники (Альфамарт, Индомарет)
Общие этапы интеграции
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
- Требуется регистрация торговца: Для получения ключа API вам необходимо сначала зарегистрироваться на платформе DANA Merchant Platform.
- проверка обратного вызова: Должен быть реализован 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.
-
тестирование в песочнице:
\Midtrans\Config::$isProduction = false;
\Midtrans\Config::$serverKey = "SB-Mid-server-..." ;
-
производственная среда:
\Midtrans\Config::$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;
Альфамарт/Индомарет оплата в магазинах у дома
Применимо к небанковским группам пользователей. Основной процесс заключается в генерации кода платежа → пользователи сканируют код в автономном режиме для завершения транзакции.
// Образец фрагмента запроса на оплату в магазине 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 Советы