Интерфейс GCash или платежный интерфейс Maya с PHP/Python

Руководство по взаимодействию с платежными интерфейсами GCash и Maya

Докинг платежного интерфейса GCash

Реализация PHP

<?php
// Конфигурация API GCash
$gcash_api_key = 'YOUR_GCASH_API_KEY';
$gcash_secret = 'YOUR_GCASH_SECRET';
$gcash_base_url = 'https://api.gcash.com';

// Создайте запрос на оплату
function createGcashPayment($amount, $reference_id, $callback_url) {
глобальные $gcash_api_key, $gcash_secret, $gcash_base_url;

$endpoint = '/payments/v1/payments';
$timestamp = time();

// Конструируем данные запроса
$data = [
'amount' => number_format($amount, 2),
'currency' => 'PHP',
'payment_method' => ['type' => 'GCASH'],
'reference_id' => $reference_id,
'redirect_urls' => [
'success' => "$callback_url?status=success",
'failure' => "$callback_url?status=failure",
'cancel' => "$callback_url?status=cancel"
]
];

// Создайте подпись
$signature_data = "POST\n{$endpoint}\n{$timestamp}\n" . json_encode($data);
$signature = hash_hmac('sha256', base64_encode($signature_data), base64_encode($gcash_secret));

// Заголовок HTTP-запроса
$headers = [
"Content-Type: application/json".
"Authorization: Bearer {$gcash_api_key}", "Авторизация: Bearer {$gcash_api_key}".
"X-GCash-Timestamp: {$timestamp}",
"X-GCash-Signature: {$signature}"
];

// cURL-запрос
попробуйте {
return makeApiRequest("{$gcash_base_url}{$endpoint}", json_encode($data), true);
} catch (Exception) {
throw new Exception("Не удалось создать GCASH-платеж");
}
}

function makeApiRequest(string url string data bool isPost): array|false {
/* Реализация здесь */
}

Реализация на языке Python

запросы на импорт
импортировать hashlib
импорт hmac
импортировать base64
время импорта
импортировать json

класс GcashPayment.

def __init__(self api_key secret).
self.api_key api key self.secret secret self.base url https://api.gcash.com

def create_payment(self amount reference id callback url)::
конечная точка /payments/v1/payments timestamp int(time.time())

данные сумма f{float(amount):.2f} валюта PHP способ оплаты тип GCASH ссылка id ссылка id перенаправление урлов успех f{call backurl статус успех failure f{call backurl status failure cancel f call backurl status cancel

данные подписи POST\n конечная точка \n str(timestamp)\n +json.dumps(data)
подпись hmac.new(base64.b64encode(self.secret.encode()) base64.b6encode(signatur_data.encode()) hashlib.sha256).hexdigest()

headers Content-Type application/json Authorization Bearer {self.api key X-GCash-Timestamp str(timestamp) X-GCash-Signatur signature

response requests.post(f"{self.base url}{end point}" jso=data headers=headers)
response.raise_for_status()
return response.json()

Стыковка платежного интерфейса Maya

Реализация PHP


public function createCheckout(float amount string requestReferenceNumber array redirectUrls try payload [ totalAmount [ value amount currency PHP items [[ name Item name quantity | price value (amoun/100)*100 code item001 description Sample item]] requestReferenceNumber requestReferenceNumber redirectUrl redirectUrls ] ]

response this->makeRequest('/checkout/v1/checkouts payload); if (!isset(response['checkoutId'])) throw new Exception('Failed to create checkout').

return [ checkoutUrl response['redirectUrl'] checkoutId response['checkoutId'] ]; catch (Exception e) error log(e->getMessage()); return false. }

private function makeRequest(string path array data string method POST') curl curl_init(this->api Url path); curl_setopt_array(curl CURLOPT_ RETURNTRANSFER true CURLOPT_CUSTOMREQUEST метод CURLOPT_POSTFIELDS json encode(data)); headers ['Content-Type application/json Authorization Basic .base6 encode(this->checOutKey )]; curl setopt(curl CURLOPT HTTPHEADER headers);

result cur_exec(curl); errno cur_errno(curl); error cur_error(curl); if errno throw new Exception(Curl error error error).

httpCode cur_getinfo(cu CURLINFO HTTP CODE if httpCode >=400 parse result ?json decode(result true :[]; message parsed['message??parsed[0][' message]? 'Unknown Maya API erro'; throw new Exception(Maya API Error message httpCod finally cu_close(cu );

return son decode(result tru ); } ```

Реализация Python ``python import reques import bas664 import jsor from typing impo Dict Any Optional class May Payment def __init__(sel checout_k y your_may _check utkey se ret ey your maya s cret k y a i_u l https:/ pg sand ox pay ay . om).

elf ch ck ut ke check t k y elf sec et ke secre _ke elf a i u l ap _ur def cre te_ch ckou sel am unt floa req est ref r nc numbe tr redi ectU ls Di t[str st ] D ct[str An ].

payload otal mount alue amou nt curr ncy PH it ms na e Ite name qua ti price valu round(amo t *10 )/100 co de ite O01 descr pt on Sam le tem re uestRefere ce um er requ stR ferenc Numbe redi ectU l redir ctUr s ]

respon e self._ma e_req est /ch ck ut v1/ch c outs paylo d)

если ответа нет или нет respo se.get( chec ou d ): rais Except on(Fai ed o cre te Ma ya ch c out )

ret r dict chec ou Ur res o se[ ed rectUr ] che kou Id espo se[c ec outI ] )

ef _mak eque t(se pa th str da a Di t ny met od st POS ) > Op iona Dic any].

rl f {s If.a i_r }{ ath heade s ont nt Typ appli ation/jso Auth riz tion asic b4encod ((f sel .checou key ).en ode() hex ist()]

sponse re uests.req est method lower() ur he ers head rs jso da a)

spons raise fo sta us()

re urn sponse.jso () excep Exce tion as xceptio print(f May API er or ex ep ion ret urn No ne ```

Ключевые соображения

1 Среда "песочницы": оба платежных сервиса предоставляют среду "песочницы", при разработке следует сначала использовать тестовый API-ключ для интеграционного тестирования.

2 Обработка Webhook: необходимо настроить конечную точку сервера для обработки асинхронных уведомлений и проверки статуса транзакции.

3 Меры безопасности:
- Все вызовы API должны осуществляться по протоколу HTTPS
- Чувствительные данные, такие как ключи API, не должны быть жестко закодированы в коде
- Белые списки IP-адресов (если они поддерживаются) должны быть настроены таким образом, чтобы разрешить доступ только к IP-адресам ваших серверов.

4 Требования к соответствию:
- Обработка данных кредитных карт в соответствии с требованиями стандарта PCI DSS (если применимо)
- Соответствие требованиям GDPR или другим местным нормативным актам в области конфиденциальности

5 Обработка ошибок: реализуйте механизмы повторных попыток в ответ на проблемы в сети или временные сбои.

Углубленное внедрение и лучшие практики стыковки платежных интерфейсов

Реализация обработки Webhook (пример на PHP)

<?php
// Процессор вебхуков GCash/Maya
класс PaymentWebhookHandler {
частный $apiSecret.

public function __construct(string $apiSecret) {
$this->apiSecret = $apiSecret;
}

public function handleGcashWebhook(): void {
// Проверьте подпись
$signature = $_SERVER['HTTP_X_GCASH_SIGNATURE'] ?? '';
$payload = file_get_contents('php://input');

если (!$this->verifyGcashSignature($signature, $payload)) {
http_response_code(401).
выход;
}

// Обработка событий вебхука
попробуйте {
return match ($eventType) {
'payment.success' => new SuccessPaymentEvent($data),
'payment.failed' => new FailedPaymentEvent($data),
default => throw new UnexpectedValueException("Неподдерживаемый тип события: {$eventType}"),
};

// TODO: обновление статуса заказа и другая бизнес-логика

http_response_code(200).

Асинхронная обработка веб-хуков на Python

from fastapi import FastAPI, Request, HTTPException 
импорт hmac
импортировать hashlib

app = FastAPI()

MAYA_WEBHOOK_SECRET = "your_webhook_secret"

@app.post("/maya/webhooks")
async def handle_maya_webhook(request: Request).
# Проверка подписи
signature_header = request.headers.get("X-Maya-Signature")

Решение распространенных проблем

  1. Сбой проверки сертификата::

    # PHP cURL SSL (среда разработки может временно отключить аутентификацию)
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    # Python запрашивает настройку SSL
    requests.post(url, verify='/path/to/cert.pem')

  2. Советы по отладке::

    • Номер тестовой карты песочницы GCash:4111111111111111
  3. оптимизация производительности::

  4. Рекомендации по усилению безопасности

  5. Синхронизация состояния транзакций

10

Углубленное внедрение и лучшие практики стыковки платежных интерфейсов (продолжение)

5. механизм синхронизации состояния транзакций

PHP-реализация активного запроса

function getGcashPaymentStatus(string $paymentId): array {
$endpoint = "/payments/v1/payments/{$paymentId}";
$timestamp = time();

// Создайте подпись (используя ранее определенный метод подписи)
$signature = generateGcashSignature('GET', $endpoint, $imestamp);

попробуйте {
return makeApiRequest(
"{$gcash_base_url}{$endpoint}",
ноль,
false, // GET-запрос
[
"Authorization: Bearer {$gcash_api_key}", "Авторизация: Bearer {$gcash_api_key}".
"X-GCash-Timestamp: {$timestamp}",
"X-GCash-Signature: {$signature}"
]
);
} catch (Exception) {
throw new Exception("Failed to fetch payment status");
}
}

Асинхронная проверка состояния в Python

async def check_maya_payment_status(session, checkout_id).
url = f"{self.base_url}/checkout/v1/checkouts/{checkout_id}"

6. механизмы обработки ошибок и повторных попыток

PHP Пример экспоненциального обратного хода

function makePaymentWithRetry(callable $paymentFn, int maxRetries) { retryCount while (true) { try return paymentFn(); catch PaymentException e if retryCount >= maxRetries throw e; } }

sleep(min(pow(2 retryCount rand(1000)/1000)); retryCount++; } }

// Использование.
makePaymentWithRetry(fn createGcashPayment(...)) ;

Реализация декоратора в Python

из functools import wraps 

def retriable(max_retries=3 backoff_factor=1)::
def decorator(func @wraps(func))
async def wrapper(*args kwargs last_error None for attempt in range(max_retrieve sleep_time backoff_factor * (2 attempt await asyncio.sleep(sleep_ время)

try return await func(*args kwargs except PaymentError as e last_error e raise Retr yExhaustedError from last_error return wrapper return decorator

@retriable(max_retrie )
async def process_paymen().
пройти ``



7.

8.

9.

10