f试ssefahah可能卡卡卡马卡卡计算机视觉事实上事实上飒飒飒gj◐◐◐◐hfkttkgdgkmcuocucocucoc顶顶顶顶顶顶顶顶顶顶顶顶uco朵朵可可放2巍峨2555555666369🌹 �����ѩ�����һ����dddf2qevf2fv69666 ? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!StripeWebhookListener.php000064400000017360152665566040011576 0ustar00payload, false, 512, JSON_THROW_ON_ERROR); // Incoming data is verified at StripeController handleWebhook function, which fires this event. $event_type = $incomingJson->type; // $resource_id = $incomingJson->data->object->lines->data[0]->price->id; //Price id if ($event_type === 'invoice.paid') { $resource_id = $incomingJson->data->object->subscription; // Subscription id $resource_type = $incomingJson->data->object->lines->data[0]->type; // Subscription / prepaid $summary = $incomingJson->data->object->lines->data[0]->description; $resource_state = $incomingJson->data->object->status; } elseif ($event_type === 'customer.subscription.deleted') { $resource_id = $incomingJson->data->object->items->data[0]->subscription; // Subscription id $resource_type = $incomingJson->data->object->object; // Subscription / prepaid $summary = $incomingJson->data->object->cancellation_details->reason; $resource_state = 'cancelled'; // $incomingJson->data->object->items->status; } // save incoming data $newData = new WebhookHistory; $newData->gatewaycode = 'stripe'; $newData->webhook_id = $incomingJson->id; $newData->create_time = $incomingJson->created; $newData->resource_type = $resource_type; // Subscription / prepaid $newData->event_type = $event_type; $newData->summary = $summary; $newData->resource_id = $resource_id; $newData->resource_state = $resource_state; if ($event_type === 'invoice.paid') { $newData->parent_payment = $incomingJson->data->object->payment_intent; $newData->amount_total = $incomingJson->data->object->lines->data[0]->amount; $newData->amount_currency = $incomingJson->data->object->lines->data[0]->currency; } $newData->incoming_json = json_encode($incomingJson, JSON_THROW_ON_ERROR); $newData->status = 'check'; $newData->save(); // switch/check event type if ($event_type === 'customer.subscription.deleted') { // $resource_id is subscription id in this event. $currentSubscription = Subscriptions::where('stripe_id', $resource_id)->first(); if ($currentSubscription->stripe_status !== 'cancelled') { $currentSubscription->stripe_status = 'cancelled'; $currentSubscription->ends_at = Carbon::now(); $currentSubscription->save(); $newData->status = 'checked'; $newData->save(); } } elseif ($event_type === 'invoice.paid') { // $resource_id is subscription id in this event. $activeSub = Subscriptions::where('stripe_id', $resource_id)->first(); if (isset($activeSub->plan_id) === true) { // Plan may be deleted and null at database. // Get plan $plan = Plan::where('id', $activeSub->plan_id)->first(); if ($plan !== null) { $currentStripeStatus = GatewaySelector::selectGateway('stripe')::getSubscriptionStatus($activeSub->user_id); if ($currentStripeStatus) { // active or trial at stripe side // check for duplication $duplicate = false; // check for first payment in subscription if (Carbon::parse($activeSub->created_at)->diffInMinutes(Carbon::parse($incomingJson->created)) < 5) { $duplicate = true; } if (! $duplicate) { // if it is trial then convert it to active // if it is active and/or converted to active add plan word/image amount to the user // if($activeSub->stripe_status == 'trialing'){} // it may be cancelled so in any case its going to be active $activeSub->stripe_status = 'active'; $activeSub->save(); $payment = new UserOrder; $payment->order_id = $incomingJson->id; $payment->plan_id = $plan->id; $payment->user_id = $activeSub->user_id; $payment->payment_type = 'Stripe Recurring Payment'; $payment->price = $plan->price; $payment->affiliate_earnings = ($plan->price * $settings->affiliate_commission_percentage) / 100; $payment->status = 'Success'; $payment->country = $user->country ?? 'Unknown'; $payment->save(); $user = User::where('id', $activeSub->user_id)->first(); self::creditIncreaseSubscribePlan($user, $plan); $newData->status = 'checked'; $newData->save(); } } } } else { // plan id is null at subscription database table. if ($activeSub->stripe_status !== 'cancelled') { $activeSub->stripe_status = 'cancelled'; $activeSub->ends_at = Carbon::now(); $activeSub->save(); $newData->status = 'checked'; $newData->save(); } Log::error('Payment on a deleted plan. Please check: ' . $resource_id . ' with incoming webhook : ' . json_encode($incomingJson, JSON_THROW_ON_ERROR)); } } // save new order if required // on cancel we do not delete anything. just check if subs cancelled } catch (Exception $ex) { Log::error("StripeWebhookListener::handle()\n" . $ex->getMessage()); } } /** * Handle a job failure. * * @throws JsonException */ public function failed(StripeWebhookEvent $event, Throwable $exception): void { $space = '*****'; $msg = '\n' . $space . '\n' . $space; $msg .= json_encode($event->payload, JSON_THROW_ON_ERROR); $msg .= '\n' . $space . '\n'; $msg .= '\n' . $exception . '\n'; $msg .= '\n' . $space . '\n' . $space; Log::error($msg); } } StripeLifetimeListener.php000064400000004426152665566040011735 0ustar00status; $order_ids = $event->orderIds; // 1. stripe_approved if ($status === 'stripe_approved') { $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { switch ($order->plan->frequency) { case FrequencyEnum::LIFETIME_YEARLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addYears(1)]); $msg = __('Subscription renewed for 1 year.'); break; default: // FrequencyEnum::LIFETIME_MONTHLY->value Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; } self::creditIncreaseSubscribePlan($order->user, $order->plan); CreateActivity::for($order->user, $msg, $order->plan->name . ' ' . __('Plan')); } } } catch (Exception $ex) { Log::error("StripeLifetimeListener::handle()\n" . $ex->getMessage()); } } } PaystackLifetimeListener.php000064400000004404152665566040012242 0ustar00status; $order_ids = $event->orderIds; // 1. paystack_approved if ($status === 'paystack_approved') { $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { switch ($order->plan->frequency) { case FrequencyEnum::LIFETIME_YEARLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => Carbon::now()->addYears(1)]); $msg = __('Subscription renewed for 1 year.'); break; default: // FrequencyEnum::LIFETIME_MONTHLY->value Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; } self::creditIncreaseSubscribePlan($order->user, $order->plan); CreateActivity::for($order->user, $msg, $order->plan->name . ' ' . __('Plan')); } } } catch (Exception $ex) { Log::error("PaystackLifetimeListener::handle()\n" . $ex->getMessage()); } } } YokassaWebhookListener.php000064400000017414152665566040011742 0ustar00payload, false, 512, JSON_THROW_ON_ERROR); // Incoming data is verified at StripeController handleWebhook function, which fires this event. $event_type = $incomingJson->type; // $resource_id = $incomingJson->data->object->lines->data[0]->price->id; //Price id if ($event_type === 'invoice.paid') { $resource_id = $incomingJson->data->object->subscription; // Subscription id $resource_type = $incomingJson->data->object->lines->data[0]->type; // Subscription / prepaid $summary = $incomingJson->data->object->lines->data[0]->description; $resource_state = $incomingJson->data->object->status; } elseif ($event_type === 'customer.subscription.deleted') { $resource_id = $incomingJson->data->object->items->data[0]->subscription; // Subscription id $resource_type = $incomingJson->data->object->object; // Subscription / prepaid $summary = $incomingJson->data->object->cancellation_details->reason; $resource_state = 'cancelled'; // $incomingJson->data->object->items->status; } // save incoming data $newData = new WebhookHistory; $newData->gatewaycode = 'stripe'; $newData->webhook_id = $incomingJson->id; $newData->create_time = $incomingJson->created; $newData->resource_type = $resource_type; // Subscription / prepaid $newData->event_type = $event_type; $newData->summary = $summary; $newData->resource_id = $resource_id; $newData->resource_state = $resource_state; if ($event_type === 'invoice.paid') { $newData->parent_payment = $incomingJson->data->object->payment_intent; $newData->amount_total = $incomingJson->data->object->lines->data[0]->amount; $newData->amount_currency = $incomingJson->data->object->lines->data[0]->currency; } $newData->incoming_json = json_encode($incomingJson, JSON_THROW_ON_ERROR); $newData->status = 'check'; $newData->save(); // switch/check event type if ($event_type === 'customer.subscription.deleted') { // $resource_id is subscription id in this event. $currentSubscription = Subscriptions::where('stripe_id', $resource_id)->first(); if ($currentSubscription->stripe_status !== 'cancelled') { $currentSubscription->stripe_status = 'cancelled'; $currentSubscription->ends_at = Carbon::now(); $currentSubscription->save(); $newData->status = 'checked'; $newData->save(); } } elseif ($event_type === 'invoice.paid') { // $resource_id is subscription id in this event. $activeSub = Subscriptions::where('stripe_id', $resource_id)->first(); if (isset($activeSub->plan_id)) { // Plan may be deleted and null at database. // Get plan $plan = Plan::find($activeSub->plan_id); if ($plan) { // Check status from gateway first $currentStripeStatus = YokassaService::getSubscriptionStatus($activeSub->user_id); if ($currentStripeStatus) { // active or trial at stripe side // check for duplication $duplicate = false; // check for first payment in subscription if (Carbon::parse($activeSub->created_at)->diffInMinutes(Carbon::parse($incomingJson->created)) < 5) { $duplicate = true; } if (! $duplicate) { // if it is trial then convert it to active // if it is active and/or converted to active add plan word/image amount to the user // if($activeSub->stripe_status == 'trialing'){} // it may be cancelled so in any case its going to be active $activeSub->stripe_status = 'active'; $activeSub->save(); UserOrder::create([ 'order_id' => $incomingJson->id, 'plan_id' => $plan->id, 'user_id' => $activeSub->user_id, 'payment_type' => 'Stripe Recurring Payment', 'price' => $plan->price, 'affiliate_earnings' => ($plan->price * $settings->affiliate_commission_percentage) / 100, 'status' => 'Success', 'country' => $user->country ?? 'Unknown', ]); $user = User::where('id', $activeSub->user_id)->first(); self::creditIncreaseSubscribePlan($user, $plan); $newData->status = 'checked'; $newData->save(); } } } } else { // plan id is null at subscription database table. if ($activeSub->stripe_status !== 'cancelled') { $activeSub->stripe_status = 'cancelled'; $activeSub->ends_at = Carbon::now(); $activeSub->save(); $newData->status = 'checked'; $newData->save(); } Log::error('Payment on a deleted plan. Please check: ' . $resource_id . ' with incoming webhook : ' . json_encode($incomingJson)); } } // save new order if required // on cancel we do not delete anything. just check if subs cancelled } catch (Exception $ex) { Log::error("YokassaWebhookListener::handle()\n" . $ex->getMessage()); } } /** * Handle a job failure. * * @throws JsonException */ public function failed(StripeWebhookEvent $event, Throwable $exception): void { $space = '*****'; $msg = '\n' . $space . '\n' . $space; $msg .= json_encode($event->payload, JSON_THROW_ON_ERROR); $msg .= '\n' . $space . '\n'; $msg .= '\n' . $exception . '\n'; $msg .= '\n' . $space . '\n' . $space; Log::error($msg); } } PaypalLifetimeListener.php000064400000004371152665566040011714 0ustar00status; $order_ids = $event->orderIds; // 1. paypal_approved if ($status === 'paypal_approved') { $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { switch ($order->plan->frequency) { case FrequencyEnum::LIFETIME_YEARLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => Carbon::now()->addYears(1)]); $msg = __('Subscription renewed for 1 year.'); break; default: // FrequencyEnum::LIFETIME_MONTHLY->value Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; } self::creditIncreaseSubscribePlan($order->user, $order->plan); CreateActivity::for($order->user, $msg, $order->plan->name . ' ' . __('Plan')); } } } catch (Exception $ex) { Log::error("PaypalLifetimeListener::handle()\n" . $ex->getMessage()); } } } IyzicoWebhookListener.php000064400000012600152665566040011566 0ustar00payload, false, 512, JSON_THROW_ON_ERROR); // Incoming data is verified at IyzicoService handleWebhook function, which fires this event. $event_type = $incomingJson->iyziEventType; // save incoming data $newData->gatewaycode = 'iyzico'; $newData->webhook_id = $incomingJson->iyziReferenceCode; $newData->create_time = $incomingJson->iyziEventTime; $newData->resource_type = 'subscription'; $newData->event_type = $incomingJson->iyziEventType; $newData->summary = $incomingJson->orderReferenceCode; $newData->resource_id = $incomingJson->subscriptionReferenceCode; $newData->resource_state = $incomingJson->iyziEventType === 'subscription.order.success' ? 'paid' : 'cancelled'; $newData->incoming_json = json_encode($incomingJson, JSON_THROW_ON_ERROR); $newData->status = 'check'; $newData->save(); if ($event_type === 'subscription.order.failure') { $currentSubscription = Subscriptions::where('stripe_id', $newData->resource_id)->first(); if ($currentSubscription->stripe_status !== 'cancelled') { $currentSubscription->stripe_status = 'cancelled'; $currentSubscription->ends_at = Carbon::now(); $currentSubscription->save(); $newData->status = 'checked'; $newData->save(); } } elseif ($event_type === 'subscription.order.success') { // $resource_id is subscription id in this event. $currentSubscription = Subscriptions::where('stripe_id', $newData->resource_id)->first(); $plan = Plan::find('id', $currentSubscription->plan_id); // check for duplication against time $duplicate = false; // check for first payment in subscription if (Carbon::parse($currentSubscription->created_at)->diffInMinutes(Carbon::parse($newData->create_time)) < 5) { $duplicate = true; } // check current subscription status from iyzico if (GatewaySelector::selectGateway('iyzico')::getSubscriptionStatus() && ! $duplicate) { // if it is trial then convert it to active // if it is active and/or converted to active add plan word/image amount to the user // if($currentSubscription->stripe_status == 'trialing'){} // it may be cancelled so in any case its going to be active $currentSubscription->stripe_status = 'active'; $currentSubscription->save(); UserOrder::create([ 'order_id' => $incomingJson->orderReferenceCode, 'plan_id' => $plan->id, 'user_id' => $currentSubscription->user_id, 'payment_type' => 'iyzico Recurring Payment', 'price' => $plan->price, 'affiliate_earnings' => ($plan->price * $settings->affiliate_commission_percentage) / 100, 'status' => 'Success', 'country' => $user->country ?? 'Unknown', ]); $user = User::where('id', $currentSubscription->user_id)->first(); self::creditIncreaseSubscribePlan($user, $plan); $newData->status = 'checked'; $newData->save(); } } } catch (Exception $ex) { Log::error("IyzicoWebhookListener::handle()\n" . $ex->getMessage() . "\n" . $event->payload); $newData->status = 'error'; $newData->save(); } } /** * Handle a job failure. * * @throws JsonException */ public function failed(IyzicoWebhookEvent $event, Throwable $exception): void { $space = '*****'; $msg = '\n' . $space . '\n' . $space; $msg .= json_encode($event->payload, JSON_THROW_ON_ERROR); $msg .= '\n' . $space . '\n'; $msg .= '\n' . $exception . '\n'; $msg .= '\n' . $space . '\n' . $space; Log::error($msg); } } PaypalWebhookListener.php000064400000036707152665566040011564 0ustar00payload, false, 512, JSON_THROW_ON_ERROR); // Incoming data is verified at PayPalService handleWebhook function, which fires this event. $event_type = $incomingJson->event_type; $resource_id = $incomingJson->resource->id; // save incoming data $newData = new WebhookHistory; $newData->gatewaycode = 'paypal'; $newData->webhook_id = $incomingJson->id; $newData->create_time = $incomingJson->create_time; $newData->resource_type = $incomingJson->resource_type; $newData->event_type = $event_type; $newData->summary = $incomingJson->summary; $newData->resource_id = $resource_id; $newData->resource_state = $incomingJson->resource->state ?? ($incomingJson->resource->status ?? null); if ($event_type === 'PAYMENT.SALE.COMPLETED') { $newData->parent_payment = null; if (isset($incomingJson->resource) && is_object($incomingJson->resource)) { $newData->parent_payment = $incomingJson->resource->parent_payment ?? null; } $newData->amount_total = $incomingJson->resource->amount->total; $newData->amount_currency = $incomingJson->resource->amount->currency; } $newData->incoming_json = json_encode($incomingJson, JSON_THROW_ON_ERROR); $newData->status = 'check'; $newData->save(); // switch/check event type if ($event_type === 'BILLING.SUBSCRIPTION.CANCELLED') { // $resource_id is subscription id in this event. $currentSubscription = Subscriptions::where('stripe_id', $resource_id)->first(); if ($currentSubscription->stripe_status !== 'cancelled') { $currentSubscription->stripe_status = 'cancelled'; $currentSubscription->ends_at = Carbon::now(); $currentSubscription->save(); $newData->status = 'checked'; $newData->save(); } } elseif ($event_type === 'PAYMENT.SALE.COMPLETED') { // $resource_id is transaction id in this event. // Hence we must make new request to get subscription id. $provider = GatewaySelector::selectGateway('paypal')::getPaypalProvider(); $filters = [ 'transaction_id' => $resource_id, 'start_date' => Carbon::now()->subDays(7)->toIso8601String(), 'end_date' => Carbon::now()->addDays(2)->toIso8601String(), ]; // https://developer.paypal.com/docs/api/transaction-search/v1/#transactions_get $transactionList = $provider->listTransactions($filters); if (is_string($transactionList)) { $transactions = json_decode($transactionList, false, 512, JSON_THROW_ON_ERROR); } else { $transactions = $transactionList; } if (array_key_exists('error', $transactions) === false) { foreach ($transactions->transaction_details ?? [] as $transaction) { // https://developer.paypal.com/docs/transaction-search/transaction-event-codes/ // T0002: Subscription payment. Either payment sent or payment received. // S: The transaction successfully completed without a denial and after any pending statuses. if ($transaction->transaction_info->transaction_event_code === 'T0002' and $transaction->transaction_status === 'S') { $amountPaidValue = $transaction->transaction_info->transaction_amount->value; $amountPaidCurrency = $transaction->transaction_info->transaction_amount->currency_code; $email = $transaction->payer_info->email_address; $name = $transaction->payer_info->given_name; $surname = $transaction->payer_info->surname; $transaction_id = $transaction->transaction_info->transaction_id; // We can NOT get subscription id directly, thats why we are going to make a workaround. // Get user $user = User::where('email', $email)->first(); if ($user) { $userId = $user->id; $activeSub = getCurrentActiveSubscription($userId); if ($activeSub) { $plan = Plan::where('id', $activeSub->plan_id)->first(); if ($plan) { // Check if its price is equal to amountPaidValue. // amountPaidValue returns decimal with . (i.e. "value": "465.00" , "value": "-13.79") // we save price in plan as double (i.e. 10 , 19.9 (not 19.90)) if (number_format((float) $amountPaidValue, 2, '.', '') === number_format((float) $plan->price, 2, '.', '')) { // check for duplication $duplicate = false; // check for first payment in subscription if (Carbon::parse($activeSub->created_at)->diffInMinutes(Carbon::parse($incomingJson->create_time)) < 5) { $duplicate = true; } if (! $duplicate) { // if it is trial then convert it to active ( Check status from gateway first ) // if it is active and/or converted to active add plan word/image amount to the user if ($activeSub->stripe_status === 'trialing') { $subscription = $provider->showSubscriptionDetails($activeSub->stripe_id); if (isset($subscription['error'])) { Log::error("PaypalWebhookListener::handle() -> getSubscriptionStatus() :\n" . json_encode($subscription, JSON_THROW_ON_ERROR)); } else { if ($subscription['status'] === 'ACTIVE') { $trial = false; if (isset($subscription['billing_info']['cycle_executions'][0]['tenure_type']) && $subscription['billing_info']['cycle_executions'][0]['tenure_type'] === 'TRIAL') { $trial = true; } if (! $trial) { $activeSub->stripe_status = 'active'; $activeSub->save(); } UserOrder::create([ 'order_id' => $transaction_id, 'user_id' => $user->id, 'plan_id' => $plan->id, 'payment_type' => 'PayPal Recurring Payment', 'price' => $plan->price, 'affiliate_earnings' => ($plan->price * $settings->affiliate_commission_percentage) / 100, 'status' => 'Success', 'country' => $user->country ?? 'Unknown', ]); self::creditIncreaseSubscribePlan($user, $plan); } else { $activeSub->stripe_status = 'cancelled'; $activeSub->ends_at = \Carbon\Carbon::now(); $activeSub->save(); } $newData->status = 'checked'; $newData->save(); } } } else { // active or cancelled $subscription = $provider->showSubscriptionDetails($activeSub->stripe_id); if (isset($subscription['error'])) { Log::error("PaypalWebhookListener::handle() -> getSubscriptionStatus() :\n" . json_encode($subscription, JSON_THROW_ON_ERROR)); } else { // check for duplication $duplicate = false; // check for first payment in subscription if (Carbon::parse($activeSub->created_at)->diffInMinutes(Carbon::parse($incomingJson->create_time)) < 5) { $duplicate = true; } if (! $duplicate) { if ($subscription['status'] === 'ACTIVE') { if ($activeSub->stripe_status === 'cancelled') { $activeSub->stripe_status = 'active'; $activeSub->save(); } UserOrder::create([ 'order_id' => $transaction_id, 'user_id' => $user->id, 'plan_id' => $plan->id, 'payment_type' => 'PayPal Recurring Payment', 'price' => $plan->price, 'affiliate_earnings' => ($plan->price * $settings->affiliate_commission_percentage) / 100, 'status' => 'Success', 'country' => $user->country ?? 'Unknown', ]); self::creditIncreaseSubscribePlan($user, $plan); } else { $activeSub->stripe_status = 'cancelled'; $activeSub->ends_at = \Carbon\Carbon::now(); $activeSub->save(); } $newData->status = 'checked'; $newData->save(); } } } } else { Log::error('PaypalWebhookListener::handle() Error : Subscription prices do not match. || ' . json_encode($transactions)); } } else { Log::error('PaypalWebhookListener::handle() Error : Membership Plan Not Found || ' . json_encode($transactions)); } } else { Log::error('PaypalWebhookListener::handle() Error : Subscription Not Found || ' . json_encode($transactions)); } } else { Log::error('PaypalWebhookListener::handle() Error : User Not Found || ' . json_encode($transactions)); } } } } else { Log::error('PayPal Transaction Response: ' . json_encode($transactions)); } } // save new order if required // on cancel we do not delete anything. just check if subs cancelled } catch (Exception $ex) { Log::error("PaypalWebhookListener::handle()\n" . $ex->getMessage()); } } /** * Handle a job failure. * * @throws JsonException */ public function failed(PaypalWebhookEvent $event, Throwable $exception): void { $space = '*****'; $msg = '\n' . $space . '\n' . $space; $msg .= json_encode($event->payload, JSON_THROW_ON_ERROR); $msg .= '\n' . $space . '\n'; $msg .= '\n' . $exception . '\n'; $msg .= '\n' . $space . '\n' . $space; Log::error($msg); } } PaystackWebhookListener.php000064400000007724152665566040012112 0ustar00payload; $method = 'handle' . Str::studly(str_replace('.', '_', $payload['event'])); if (method_exists($this, $method)) { $response = $this->{$method}($payload); } } catch (Exception $ex) { Log::error("PaystackWebhookListener::handle()\n" . $ex->getMessage()); } } /** * Handle a job failure. * * @throws JsonException */ public function failed(PaystackWebhookEvent $event, Throwable $exception): void { $space = '*****'; $msg = '\n' . $space . '\n' . $space; $msg .= json_encode($event->payload, JSON_THROW_ON_ERROR); $msg .= '\n' . $space . '\n'; $msg .= '\n' . $exception . '\n'; $msg .= '\n' . $space . '\n' . $space; Log::error($msg); } protected function successMethod(array $parameters = []): void {} protected function missingMethod(array $parameters = []): void {} public function handleChargeSuccess($payload): void {} /** * @throws Exception */ public function handlesubScriptionDisable($payload): void // A subscription disabled { $subscriptionData = $payload['data']; // Extract relevant subscription data $subscriptionCode = $subscriptionData['subscription_code']; $status = $subscriptionData['status']; // Extract plan details $plan = $subscriptionData['plan']; $planId = $plan['id']; // Extract customer details $customer = $subscriptionData['customer']; $customerFirstName = $customer['first_name']; $customerLastName = $customer['last_name']; $customerEmail = $customer['email']; // Extract authorization details $authorization = $subscriptionData['authorization']; $authorizationCode = $authorization['authorization_code']; // Save to Webhook History $newData = new WebhookHistory; $newData->gatewaycode = 'paystack'; $newData->webhook_id = $authorizationCode; $newData->event_type = 'subscription.disable'; $newData->resource_id = $subscriptionCode; // Subscription id $newData->resource_type = 'subscription'; // Subscription $newData->status = 'check'; $newData->summary = "Subscription Disabled: $customerFirstName $customerLastName - $customerEmail - $status - $planId"; $newData->incoming_json = json_encode($payload); $newData->create_time = $subscriptionData['created_at']; $newData->resource_state = 'cancelled'; $newData->save(); $currentSubscription = Subscriptions::where('stripe_id', $subscriptionCode)->first(); if ($currentSubscription !== null && $currentSubscription->stripe_status !== 'cancelled') { $currentSubscription->stripe_status = 'cancelled'; $currentSubscription->ends_at = Carbon::now(); $currentSubscription->save(); $newData->status = 'checked'; $newData->save(); self::creditDecreaseCancelPlan($currentSubscription->user, $currentSubscription->plan); } } } IyzicoLifetimeListener.php000064400000005125152665566040011732 0ustar00status; $order_ids = $event->orderIds; // 1. iyzico_approved if ($status === 'iyzico_approved') { $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { switch ($order->plan->frequency) { case FrequencyEnum::LIFETIME_MONTHLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; case FrequencyEnum::LIFETIME_YEARLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addYears(1)]); $msg = __('Subscription renewed for 1 year.'); break; default: // FrequencyEnum::LIFETIME_MONTHLY->value Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; } self::creditIncreaseSubscribePlan($order->user, $order->plan); CreateActivity::for($order->user, $msg, $order->plan->name . ' ' . __('Plan')); } } } catch (Exception $ex) { Log::error("IyzicoLifetimeListener::handle()\n" . $ex->getMessage()); } } } UsersActivityListener.php000064400000001554152665566040011625 0ustar00insert([ 'email' => $event->email, 'type' => $event->type ?? 'user', 'ip' => $event->ip, 'connection' => $event->connection, 'created_at' => now(), ]); } } FreePaymentListener.php000064400000005545152665566040011232 0ustar00status; $order_ids = $event->orderIds; // 1. free_renewed, 2. free_expired if ($status === 'free_expired') { Subscriptions::whereIn('stripe_id', $order_ids)->update(['stripe_status' => $status]); $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { self::creditDecreaseCancelPlan($order->user, $order->plan); CreateActivity::for($order->user, __('Subscription Expired'), $order->plan->name . ' ' . __('Plan')); } } elseif ($status === 'free_renewed') { $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { switch ($order->plan->frequency) { case FrequencyEnum::LIFETIME_YEARLY->value: case FrequencyEnum::YEARLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => Carbon::now()->addYears(1)]); $msg = __('Subscription renewed for 1 year.'); break; default: // FrequencyEnum::LIFETIME_MONTHLY->value // FrequencyEnum::MONTHLY->value Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; } self::creditIncreaseSubscribePlan($order->user, $order->plan); CreateActivity::for($order->user, $msg, $order->plan->name . ' ' . __('Plan')); } } } catch (Exception $ex) { Log::error("FreeTransferListener::handle()\n" . $ex->getMessage()); } } } TwoCheckoutWebhookListener.php000064400000004646152665566040012572 0ustar00payload; $product_id = $incomingJson['IPN_PCODE'][0]; if (str_contains($product_id, 'Prepaid')) { return; } $product = GatewayProducts::where('product_id', $product_id)->first(); $plan = Plan::find($product->plan_id); $order_status = $incomingJson['ORDERSTATUS']; $customer_email = $incomingJson['CUSTOMEREMAIL']; $subscription_ref = $incomingJson['IPN_LICENSE_REF'][0]; $user = User::where('email', $customer_email)->first(); $user_id = $user->id; if ($order_status === 'COMPLETE') { $subscription = Subscriptions::where([['user_id', '=', $user_id], ['stripe_price', '=', $product_id], ['stripe_status', '=', 'active']])->first(); if (! $subscription) { return; } $subscription->stripe_id = $subscription_ref; $subscription->save(); self::creditIncreaseSubscribePlan($user, $plan); } elseif ($order_status === 'CANCELED') { $subscription = Subscriptions::where([['user_id', '=', $user_id], ['stripe_price', '=', $product_id], ['stripe_status', '=', 'active']])->first(); $subscription->stripe_status = 'cancelled'; $subscription->ends_at = Carbon::now(); $subscription->save(); } } catch (Exception $ex) { Log::error("TwoCheckoutWebhookListener::handle()\n" . $ex->getMessage()); } } } BankTransferListener.php000064400000005356152665566040011373 0ustar00status; $order_ids = $event->orderIds; // 1. bank_renewed, 2. bank_expired if ($status === 'bank_expired') { Subscriptions::whereIn('stripe_id', $order_ids)->update(['stripe_status' => $status]); $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { self::creditDecreaseCancelPlan($order->user, $order->plan); CreateActivity::for($order->user, __('Subscription Expired'), $order->plan->name . ' ' . __('Plan')); } } elseif ($status === 'bank_renewed') { $orders = UserOrder::whereIn('order_id', $order_ids)->get(); foreach ($orders as $order) { switch ($order->plan->frequency) { case FrequencyEnum::LIFETIME_YEARLY->value : Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addYears(1)]); $msg = __('Subscription renewed for 1 year.'); break; default: // FrequencyEnum::LIFETIME_MONTHLY->value Subscriptions::where('stripe_id', $order->order_id)->update(['stripe_status' => $status, 'ends_at' => \Carbon\Carbon::now()->addMonths(1)]); $msg = __('Subscription renewed for 1 month.'); break; } self::creditIncreaseSubscribePlan($order->user, $order->plan); CreateActivity::for($order->user, $msg, $order->plan->name . ' ' . __('Plan')); } } } catch (Exception $ex) { Log::error("BankTransferListener::handle()\n" . $ex->getMessage()); } } }