Ответ
В PHP-проектах для интеграции с платежными шлюзами я обычно использую следующие подходы:
-
HTTP-клиенты (Guzzle, Symfony HttpClient) — для отправки запросов на API шлюза. Они предоставляют удобный интерфейс, поддержку повторных попыток и обработку ошибок.
// Пример с Guzzle для инициации платежа $client = new GuzzleHttpClient(); $response = $client->post('https://api.payment.com/v1/charge', [ 'headers' => [ 'Authorization' => 'Bearer ' . $apiKey, 'Content-Type' => 'application/json', ], 'json' => [ 'amount' => 1000, 'currency' => 'USD', 'source' => $token ], 'timeout' => 15 ]); $result = json_decode($response->getBody(), true); -
Официальные SDK платежных систем (Stripe, Braintree, CloudPayments). Они инкапсулируют логику взаимодействия, обеспечивают типизацию и следуют актуальным версиям API.
-
Webhooks (обратные вызовы) — для асинхронного получения уведомлений о статусе платежа. Критически важно проверять подпись запроса от шлюза.
// endpoint /payment/callback $payload = file_get_contents('php://input'); $receivedSignature = $_SERVER['HTTP_X_SIGNATURE']; $expectedSignature = hash_hmac('sha256', $payload, $webhookSecret); if (hash_equals($expectedSignature, $receivedSignature)) { $event = json_decode($payload, true); // Обновить статус заказа в БД $order->markAsPaid($event['id']); }
Ключевые практики: всегда использовать HTTPS, хранить ключи в переменных окружения (не в коде), реализовывать idempotency keys для повторяющихся запросов и детально логировать все этапы взаимодействия для отладки.
Ответ 18+ 🔞
А, ну это ж классика, ёпта! Слушай, про интеграцию с платежками в PHP — тут у меня, блядь, волнение ебать, потому что каждый второй проект через это проходит. Расскажу, как я обычно делаю, чтобы потом не орать «ёперный театр!», когда всё накроется медным тазом.
Первое, что приходит в голову — это, конечно, HTTP-клиенты. Ну, типа Guzzle или там Symfony HttpClient. Берёшь эту мартышлюшку и начинаешь слать запросы на API шлюза. Главное — не забыть таймауты поставить, а то будешь ждать ответа, как хуй с горы, пока пользователь уйдёт. Вот, смотри, примерно так это выглядит:
// Пример с Guzzle для инициации платежа
$client = new GuzzleHttpClient();
$response = $client->post('https://api.payment.com/v1/charge', [
'headers' => [
'Authorization' => 'Bearer ' . $apiKey,
'Content-Type' => 'application/json',
],
'json' => [
'amount' => 1000,
'currency' => 'USD',
'source' => $token
],
'timeout' => 15
]);
$result = json_decode($response->getBody(), true);
Второй путь — официальные SDK от самих платежек. Stripe, Braintree, CloudPayments — у них у всех свои коробочки. Это, в общем-то, мудрый выбор, потому что они сами за собой следят, API не сломают неожиданно, и тебе не придётся каждый раз, когда у них что-то поменяется, впендюривать правки в свой костыльный код. Доверия ебать ноль к собственным костылям, если честно.
А вот третья штука — это вебхуки, обратные вызовы. Вот тут надо быть хитрой жопой, чувак. Платежка стучится к тебе на урл и говорит: «Э, сабака сука, платёж прошёл!». И ты должен не просто взять и поверить. Любой пидарас шерстяной может притвориться платежкой и сказать, что ему заплатили. Поэтому подпись проверяй, ядрёна вошь! Обязательно!
// endpoint /payment/callback
$payload = file_get_contents('php://input');
$receivedSignature = $_SERVER['HTTP_X_SIGNATURE'];
$expectedSignature = hash_hmac('sha256', $payload, $webhookSecret);
if (hash_equals($expectedSignature, $receivedSignature)) {
$event = json_decode($payload, true);
// Обновить статус заказа в БД
$order->markAsPaid($event['id']);
}
Видишь? hash_equals. Без этого — пизда рулю. Прилетит фальшивый запрос, отметишь заказ оплаченным, а денег нихуя не придёт. Будет тебе хиросима и нигерсраки с бухгалтерией.
И главные правила, которые я выучил, ебать мои старые костыли:
- HTTPS — всегда. Без вариантов. Как будто на дворе 2002-й год и можно по HTTP гонять.
- Ключи — в переменные окружения. Не в код, не в репозиторий, нигде. Иначе какой-нибудь распиздяй закоммитит и все твои ключи будут светиться на GitHub. Удивление пиздец потом.
- Ключи идемпотентности для повторных запросов. Чтобы если сеть глюкнула и ты отправил запрос дважды, платеж не списали дважды. Это must have.
- Логируй всё. Абсолютно всё. Что отправил, что получил, какие заголовки, какие ошибки. Потом, когда что-то сломается, не будешь как полупидор в танке гадать, а просто посмотришь логи.
Вот так, вкратце. Главное — не выдумывать велосипеды, где можно взять готовое, и всегда, блядь, э бошка думай, кто и что тебе шлёт. А то потом сам от себя охуеешь, когда деньги испарятся.