getContent(), config('nntmux.btcpay_webhook_secret')); if ($hashCheck !== $request->header('btcpay-sig')) { Log::error('BTCPay webhook hash check failed: '.$request->header('btcpay-sig')); return response('Not Found', 404); } $payload = json_decode($request->getContent(), true); // We have received a payment for an invoice and user should be upgraded to a paid plan based on order if ($payload['type'] === 'InvoicePaymentSettled') { $user = User::query()->where('email', '=', $payload['metadata']['buyerEmail'])->first(); if ($user) { $checkOrder = Payment::query()->where('invoice_id', '=', $payload['invoiceId'])->where('payment_status', '=', 'Settled')->first(); if ($checkOrder !== null) { Log::error('Duplicate BTCPay webhook: '.$payload['webhookId']); return response('Not Found', 404); } Payment::create([ 'email' => $payload['metadata']['buyerEmail'], 'username' => $user->username, 'item_description' => $payload['metadata']['itemDesc'], 'order_id' => $payload['metadata']['orderId'], 'payment_id' => $payload['payment']['id'], 'payment_status' => $payload['payment']['status'], 'invoice_amount' => $payload['metadata']['invoice_amount'], 'payment_method' => $payload['paymentMethodId'], 'payment_value' => $payload['payment']['value'], 'webhook_id' => $payload['webhookId'], 'invoice_id' => $payload['invoiceId'], ]); return response('OK', 200); } Log::error('User not found for BTCPay webhook: '.$payload['metadata']['buyerEmail']); return response('Not Found', 404); } if ($payload['type'] === 'InvoiceSettled') { // Check if we have the invoice_id in payments table and if we do, update the user account $checkOrder = Payment::query()->where('invoice_id', '=', $payload['invoiceId'])->where('payment_status', '=', 'Settled')->first(); if ($checkOrder !== null) { $user = User::query()->where('email', '=', $checkOrder->email)->first(); if ($user) { preg_match('/(?P\w+(\s\+\+)?)[\s](?P\d+)/i', $checkOrder->item_description, $matches); User::updateUserRole($user->id, $matches['role']); User::updateUserRoleChangeDate($user->id, null, $matches['addYears']); Log::info('User: '.$user->username.' upgraded to '.$matches['role'].' for BTCPay webhook: '.$checkOrder->webhook_id); return response('OK', 200); } Log::error('User not found for BTCPay webhook: '.$checkOrder->webhook_id); return response('Not Found', 404); } } return response('OK', 200); } }