Files
wticreatorstudio/Modules/WTIALaCarte/Http/Controllers/StripeWebhookController.php
T
2024-02-12 22:54:20 -05:00

135 lines
6.0 KiB
PHP

<?php
namespace Modules\WTIALaCarte\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\WTIALaCarte\Entities\Alacarte;
use Modules\WTIALaCarte\Entities\AlacarteOrder;
use Modules\WTIALaCarte\Entities\AlacarteOrderItem;
use Modules\Subscription\Entities\SubscriptionCoupon;
use Modules\Subscription\Entities\SubscriptionCouponRedemption;
use Modules\Subscription\Entities\UserCredit;
use Modules\Subscription\Entities\UserCreditHistory;
use Modules\Customer\Services\CustomerService;
use Carbon\Carbon;
use Stripe;
use Exception;
use Log;
class StripeWebhookController extends Controller
{
protected $customerService;
public function __construct(CustomerService $customerService){
$credential = getPaymentInfoViaSellerId(1, 4);
\Stripe\Stripe::setApiKey(@$credential->perameter_3);
$this->customerService = $customerService;
}
public function webhook() {
// This is your Stripe CLI webhook secret for testing your endpoint locally.
$endpoint_secret = 'whsec_xa29CzpHtGdhe6HHQdvJT8oH30zLsClW';
//$endpoint_secret = 'whsec_8713fc6dfb985a0a56eaa2dce9fa5e836b2480189f49865431a0fd529a6a7087';
$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;
try {
$event = \Stripe\Webhook::constructEvent(
$payload, $sig_header, $endpoint_secret
);
} catch(\UnexpectedValueException $e) {
// Invalid payload
http_response_code(400);
exit();
} catch(\Stripe\Exception\SignatureVerificationException $e) {
// Invalid signature
http_response_code(400);
exit();
}
// Handle the checkout.session.completed event
if ($event->type == 'checkout.session.completed') {
$session = $event->data->object;
if($session->mode == 'payment'){
$line_items = \Stripe\Checkout\Session::allLineItems($session->id, ['limit' => 100]);
try {
$user_credits = UserCredit::firstOrCreate(['user_id' => $session->client_reference_id]);
$alacarte_order = AlacarteOrder::create([
'order_number' => rand(11, 99).date('ymdhis'),
'user_id' => $session->client_reference_id,
'stripe_checkout_session_id' => $session->id,
'total' => $session->amount_total,
'status' => $session->payment_status
]);
foreach ($line_items->data as $key => $item) {
$alacarte = Alacarte::with('category')->where('stripe_product_id',$item->price->product)->first();
if($alacarte){
$alacarte_order->items()->create([
'alacarte_id' => $alacarte->id,
'price' => $item->price->unit_amount / 100,
'quantity' => $item->quantity,
'discount' => $item->amount_discount,
'total' => $item->amount_total,
]);
if($session->payment_status == 'paid'){
$before_credits = $this->customerService->credits($user_credits->user_id);
$user_credits->alacarte_credits = $user_credits->alacarte_credits + ($alacarte->credits * $item->quantity);
$user_credits->update();
$after_credits = $this->customerService->credits($user_credits->user_id);
$user_credits_history = new UserCreditHistory;
$user_credits_history->user_id = $user_credits->user_id;
$user_credits_history->subscription_credits_from = $before_credits['total_available_credits']['subscription'];
$user_credits_history->subscription_credits_to = $after_credits['total_available_credits']['subscription'];
$user_credits_history->alacarte_credits_from = $before_credits['total_available_credits']['alacarte'];;
$user_credits_history->alacarte_credits_to = $after_credits['total_available_credits']['alacarte'];
$user_credits_history->details = 'Added '.$item->quantity.'X '.$alacarte->name;
$user_credits_history->save();
}
}
}
if($session->total_details->amount_discount > 0){
$checkout_session = \Stripe\Checkout\Session::retrieve([
'id' => $session->id,
'expand' => ['total_details.breakdown'],
]);
if($coupon_id = $checkout_session['total_details']['breakdown']['discounts'][0]['discount']['coupon']['id']){
$coupon = SubscriptionCoupon::where('stripe_coupon_id',$coupon_id)->first();
if($coupon){
$coupon_redemption = new SubscriptionCouponRedemption;
$coupon_redemption->subscription_coupon_id = $coupon->id;
$coupon_redemption->customer_id = $alacarte_order->user_id;
$coupon_redemption->alacarte_order_id = $alacarte_order->id;
$coupon_redemption->save();
}
}
}
} catch(\Exception $e) {
Log::error($e->getMessage());
http_response_code(400);
exit();
}
}
}
http_response_code(200);
}
}