©TsvetanAngelov.com | All Rights Reserved
Пълно ръководство за интеграция на Stripe Checkout със стар PHP проект (PHP 5.4), използващ mysql_* функции и класически MySQL flow.
Stripe е online payment processor. Позволява:
1. Клиент добавя продукти
2. Клиент натиска "Плати"
3. Твоят сайт създава Stripe Checkout Session
4. Stripe връща checkout URL
5. Клиентът се прехвърля към Stripe
6. Клиентът плаща
7. Stripe обработва плащането
8. Stripe праща webhook
9. Твоят сайт update-ва поръчката
10. Клиентът вижда success page
Checkout Session е payment session. Примерен Stripe response:
Array
(
[id] => cs_test_xxxxx
[object] => checkout.session
[payment_status] => paid
[status] => complete
)
| Поле | Значение |
|---|---|
| id | ID на checkout session |
| payment_status | paid / unpaid |
| status | complete / open |
| metadata | custom данни (order_id) |
| customer_details | данни за клиента |
Metadata позволява да свържем Stripe payment с нашата локална поръчка.
'payload' => array(
'metadata' => array(
'order_id' => 33
)
)
После Stripe връща:
"metadata": { "order_id": "33" }
Success page е само визуална страница. Клиентът може да затвори браузъра, redirect може да fail-не, user може да refresh-не. Success page НЕ е reliable source.
Webhook е server-to-server комуникация. Stripe изпраща POST request към твоя URL. Това е истинското потвърждение.
Stripe изпраща HTTP POST към твоя URL (напр. https://example.com/webhook.php) с JSON payload.
Stripe не чете файлове. Stripe просто прави POST заявка към URL-а. Сървърът намира webhook.php и PHP стартира файла.
$payload = file_get_contents("php://input");
php://input НЕ е файл. Това е HTTP request body. Stripe изпраща JSON, PHP го чете чрез php://input.
{
"id": "evt_123",
"type": "checkout.session.completed",
"data": {
"object": {
"metadata": {
"order_id": "33"
}
}
}
}
$event = json_decode($payload, true);
true означава: върни array, не object.
Например $value = $x ?? 'default'; – Това дава Parse error в PHP 5.4.
// Вместо: $x = $value ?? 'default'; // Пиши: $x = isset($value) ? $value : 'default';
if (!isset($event['type']) || $event['type'] !== 'checkout.session.completed') {
http_response_code(200);
exit;
}
Stripe очаква HTTP 200 OK. Ако няма 200, Stripe счита webhook-а за failed и ще retry-ва автоматично.
Stripe автоматично retry-ва неуспешни webhook-и. Това е много важно за надеждност.
$order_id = 'NO ORDER';
if (isset($session['metadata']['order_id'])) {
$order_id = $session['metadata']['order_id'];
}
Много legacy проекти използват mysql_connect() и mysql_query(). Това е deprecated, но работи на стари hosting-и.
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("database_name");
$order_id директно в заявката без sanitize!$order_id = mysql_real_escape_string($order_id);
mysql_query("
UPDATE cnt_members_order
SET act_active = '2'
WHERE orders_id = $order_id
");
| Стойност | Значение |
|---|---|
| 0 | unpaid |
| 1 | pending |
| 2 | paid |
<?php
// Read Stripe payload
$payload = file_get_contents("php://input");
$event = json_decode($payload, true);
// Safety check
if (!isset($event) || !is_array($event)) {
http_response_code(200);
exit;
}
// Check event type
if (!isset($event['type']) || $event['type'] !== 'checkout.session.completed') {
http_response_code(200);
exit;
}
// Get session object
$session = array();
if (isset($event['data']['object'])) {
$session = $event['data']['object'];
}
// Get order_id
$order_id = 'NO ORDER';
if (isset($session['metadata']['order_id'])) {
$order_id = $session['metadata']['order_id'];
}
// Stop if no order
if ($order_id == 'NO ORDER') {
http_response_code(200);
exit;
}
// Connect DB
mysql_connect("localhost", "db_user", "db_pass");
mysql_select_db("database_name");
// Sanitize
$order_id = mysql_real_escape_string($order_id);
// Update order
mysql_query("
UPDATE cnt_members_order
SET act_active = '2'
WHERE orders_id = $order_id
");
http_response_code(200);
exit;
?>
file_put_contents(__DIR__.'/debug.txt', "WEBHOOK HIT\n", FILE_APPEND);
file_put_contents(__DIR__.'/debug.txt', "RAW:\n".$payload, FILE_APPEND);
| Проблем | Решение |
|---|---|
| Грешен URL в Stripe Dashboard | Проверете endpoint URL-a |
| PHP Parse Error | Използвайте PHP 5.4 съвместим синтаксис |
| json_decode fail | Проверете дали payload е валиден JSON |
| mysql_query fail | Проверете DB връзката |
| Няма metadata order_id | Добавете metadata при създаване на session |
В Stripe Dashboard можеш да видиш: плащания, webhook-и, retries, failed events, event payload, customer details.
Stripe има test mode и live mode. Винаги тествай в test mode. Тестова карта: 4242 4242 4242 4242
Success page: зависи от браузъра, зависи от redirect.
Webhook: server-to-server, reliable, автоматичен.
Stripe ✔ получава парите. Сайтът ❌ не знае че е платено.
Stripe сървърите трябва да могат да достъпят URL-a. localhost НЕ работи. Използвайте https://, не http://.
checkout.session.completed събития.
©TsvetanAngelov.com | All Rights Reserved