verifyWebhookSignature($payload, $sigHeader, STRIPE_WEBHOOK_SECRET); $event = json_decode($payload, true); } catch (Exception $e) { error_log('Stripe webhook signature verification failed: ' . $e->getMessage()); http_response_code(400); exit(); } } else { $event = json_decode($payload, true); if (!$event) { http_response_code(400); exit(); } } $eventType = $event['type'] ?? ''; $data = $event['data']['object'] ?? []; switch ($eventType) { case 'payment_intent.succeeded': $paymentIntentId = $data['id'] ?? ''; $orderId = $data['metadata']['order_id'] ?? ''; if ($orderId) { db()->update('orders', [ 'payment_status' => 'paid', 'order_status' => 'confirmed' ], 'order_id = :id', ['id' => $orderId] ); // Send confirmation email $order = db()->fetch("SELECT * FROM orders WHERE order_id = :id", ['id' => $orderId]); if ($order) { sendOrderConfirmationEmail($order); } } break; case 'payment_intent.payment_failed': $orderId = $data['metadata']['order_id'] ?? ''; if ($orderId) { db()->update('orders', ['payment_status' => 'failed'], 'order_id = :id', ['id' => $orderId] ); } break; case 'charge.refunded': $paymentIntentId = $data['payment_intent'] ?? ''; if ($paymentIntentId) { db()->update('orders', [ 'payment_status' => 'refunded', 'order_status' => 'refunded' ], 'stripe_payment_intent = :pi', ['pi' => $paymentIntentId] ); } break; } http_response_code(200); echo json_encode(['received' => true]); /** * Send order confirmation email */ function sendOrderConfirmationEmail($order) { $items = json_decode($order['items'], true) ?? []; $shippingAddress = json_decode($order['shipping_address'], true) ?? []; $itemsHtml = ''; foreach ($items as $item) { $itemsHtml .= sprintf( '
Thank you for your order, {$order['customer_name']}!
Order #: {$order['order_number']}
Total: \${$order['total']}
| Total | \${$order['total']} |
{$shippingAddress['address']}
{$shippingAddress['city']}, {$shippingAddress['state']} {$shippingAddress['zip']}
We'll send you tracking information once your order ships.
Tom's Java Jive | Premium Coffee