Ngiler SH3LL 360
Home
Information
Create File
Create Folder
:
/
home
/
tbf
/
membrubackend
/
app
/
Http
/
Controllers
/
Api
/
Information Server
MySQL :
OFF
Perl :
OFF
CURL :
ON
WGET :
OFF
PKEXEC :
OFF
Directive
Local Value
IP Address
89.40.16.97
System
Linux server.atelieruldeit.ro 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64
User
tbf
PHP Version
7.3.33
Software
Apache
Doc root
Writable
close
Edit File :
StripeController.php
| Size :
22.91
KB
Copy
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\User; use App\Models\Instance; use App\Models\Package; use App\Models\Voucher; use App\Mail\NewInvoiceCreated; use App\Mail\FailedPaymentMail; use Illuminate\Support\Arr; use Carbon\Carbon; use App\Models\CronjobMail; use App\Repositories\InvoiceRepository; use Session; use Auth; use Stripe; use Lang; use Mail; use Log; use Str; class StripeController extends Controller { public function packages(Request $request) { if($request->package_token){ return response()->json(Package::where('token', $request->package_token)->first()); }else{ return response()->json(Package::where('display_for_subscription',1)->get()); } } public function getProforma() { $instance = Auth::user()->instance; $user = $instance->users->first(); $invoice = $instance->invoices->first(); if(!$invoice){ $proforma = InvoiceRepository::generateProforma( $instance->id, $instance->package->price_in_ron, 'paid', 'stripe_payment_id', 'RON', $user->email ); // change the language according to user language $subject = "Proforma pentru curs"; $package = $instance->package; $data = [ 'proforma' => $proforma['public_path'], 'landing_page_url' => $package->landing_page_url, 'course_name' => $package->name, 'limited_offer' => $package->compare_at_price_euro ? true : false ]; createCronjobMail($user->email, $subject, $data, CronjobMail::PAY_WITH_PROFORMA, $user->language); }else{ $proforma = ['url' => config('app.url').'/proforma/'.$instance->id.Carbon::parse($invoice->created_at)->timestamp.'.pdf']; } return response()->json([ 'status' => 'success', 'url' => $proforma['url'] ], 200); } public function setAsActive(Request $request) { $instance = Auth::user()->instance; $instance->update([ 'status' => Instance::STATUS_ACTIVE, 'first_payment' => 0, 'send_invoice_to_emails' => Auth::user()->email ]); // add user with tag in active campaign createCronjobActiveCampaign(Auth::user(), 'membru_tbf_trimestriala'); // se genereaza factura $invoice = InvoiceRepository::generateInvoice( $instance->id, $instance->package->price_in_ron, 'paid', $request->paymentIntent['id'], 'RON', Auth::user()->email ); return response()->json([ 'status' => 'success' ], 200); } // This request is used for step 3 from register when you want to create the subscription public function createPayment(Request $request) { $instance = Auth::user()->instance; $package = $instance->package; // From here you can get testing cards: https://stripe.com/docs/testing#international-cards $request->validate([ 'number' => 'required', 'exp_month' => 'required', 'cvc' => 'required', 'exp_year' => 'required' ]); // check if there is a card already added $stripeCustomerCurrentCards = Stripe::cards()->all($instance->stripe_customer_id); foreach($stripeCustomerCurrentCards['data'] as $stripeCustomerCurrentCard){ $delCard = Stripe::cards()->delete($instance->stripe_customer_id, $stripeCustomerCurrentCard['id']); } // check if there is a subscription already added $stripeCustomerCurrentSubscriptions = Stripe::subscriptions()->all($instance->stripe_customer_id); foreach($stripeCustomerCurrentSubscriptions['data'] as $stripeCustomerCurrentSubscription){ $delSub = Stripe::subscriptions()->cancel($instance->stripe_customer_id, $stripeCustomerCurrentSubscription['id']); } // add card in STRIPE try { $token = Stripe::tokens()->create([ 'card' => $request->only(['number','exp_month','cvc','exp_year']) ]); } catch (\Cartalyst\Stripe\Exception\CardErrorException $e) { $instance->update(['status' => Instance::STATUS_NEW]); newUserCantPay(Auth::user()); return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } // add card to Customer try { $card = Stripe::cards()->create($instance->stripe_customer_id, $token['id']); } catch (\Cartalyst\Stripe\Exception\CardErrorException $e) { $instance->update(['status' => Instance::STATUS_NEW]); newUserCantPay(Auth::user()); return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } // create subscription based with customer card and selected plan try { $subscription = Stripe::subscriptions()->create($instance->stripe_customer_id, [ 'plan' => $instance->country->iso == "RO" ? $instance->package->ron_plan_id : $instance->package->euro_plan_id, // 'tax_percent' => $instance->vat_percentage, 'coupon' => null, 'payment_behavior' => 'allow_incomplete', 'expand' => ['latest_invoice.payment_intent'], ]); } catch (\Cartalyst\Stripe\Exception\CardErrorException $e) { $instance->update(['status' => Instance::STATUS_NEW]); return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } if($subscription['status'] != 'active'){ return response()->json([ 'status' => 'error', 'subscription' => $subscription, 'message' => "A aparut o eroare. Te rugam sa incerci mai tarziu.", ], 500); } $instance->update([ 'status' => Instance::STATUS_ACTIVE, 'first_payment' => 0, ]); // se genereaza factura $invoice = InvoiceRepository::generateInvoice( $instance->id, $instance->package->price_in_ron, 'paid', "payment_intent_direct", 'RON', Auth::user()->email ); // add user with tag in active campaign createCronjobActiveCampaign(Auth::user(), 'membru_tbf_trimestriala'); return response()->json([ 'status' => 'success' ], 200); } // generate invoice public function generateNewInvoiceWebhook(Request $request) { $invoice = $request->data['object']; $instance = Instance::where('stripe_customer_id', $invoice['customer'])->first(); // Verificam sa nu fie la prima plata, pentru ca pt prima plata folosim alt webhook if($instance->invoices->count() > 0){ // se genereaza factura $invoice = InvoiceRepository::generateInvoice( $instance->id, $invoice['currency'] == 'ron' ? $instance->package->price_in_ron : $instance->package->price_in_euro, 'paid', $invoice['id'], $invoice['currency'] == 'ron' ? 'RON' : 'EUR', $instance->users->first()->email ); return response()->json([ 'status' => 'success' ], 200); } } public function PaymentFailedWebhook(Request $request) { $invoice = $request->data['object']; Log::critical("Requestul care vine de la Stripe cand un payment e failed"); Log::critical($request->data); Log::critical("----------------------------------------------------------"); Log::critical("----------------------------------------------------------"); $instance = Instance::where('stripe_customer_id', $invoice['customer'])->first(); if($instance->invoices->count() > 0 && $invoice['attempt_count'] == 1){ $subject = "[Membru TBF] ⚠️ Plată nereușită"; $data = [ ]; try{ Mail::to(explode(',', $instance->send_invoice_to_emails))->send(New FailedPaymentMail($subject, $data)); }catch(\Exception $e){ return response()->json([ 'status' => 'error', 'msg' => $e->getMessage() ], 200); } return response()->json([ 'status' => 'success', 'msg' => "Mail-ul a fost trimis" ], 200); } return response()->json([ 'status' => 'success', 'msg' => "Mail-ul nu a fost trimis, suntem la a ".$invoice['attempt_count']." incercare" ], 200); } // This call is used when you want to view your card details used for this soft public function cardDetails() { $instance = Auth::user()->instance; $stripe_customer_current_card = Stripe::cards()->all($instance->stripe_customer_id)['data'][0]; return response()->json(Arr::only($stripe_customer_current_card, ['brand', 'last4', 'exp_month', 'exp_year'])); } // This call is used when you want to change your card details public function changeCard(Request $request) { $request->validate([ 'customer' => 'required', 'email' => 'required', 'number' => 'required', 'exp_month' => 'required', 'cvc' => 'required', 'exp_year' => 'required' ]); $instance = Instance::where('stripe_customer_id',$request->customer)->first(); if($instance){ $user = $instance->users->where('email',$request->email)->first(); if(!$user){ return response()->json([ 'status' => 'error', 'message' => "Acest cont nu exista in baza noastra de date. Daca consideri ca este o greseala te rugam sa ne scri la <a href='mailto:contact@tbf.ro'>contact@tbf.ro</a> si te vom ajuta in cel mai scurt timp!", ], 500); } }else{ return response()->json([ 'status' => 'error', 'customer_id'=> $request->customer, 'instance' => $instance, 'message' => "Acest cont nu exista in baza noastra de date. Daca consideri ca este o greseala te rugam sa ne scri la <a href='mailto:contact@tbf.ro'>contact@tbf.ro</a> si te vom ajuta in cel mai scurt timp!", ], 500); } $stripeCustomerCurrentCards = Stripe::cards()->all($instance->stripe_customer_id); // add card in STRIPE try { $token = Stripe::tokens()->create([ 'card' => $request->only(['number','exp_month','cvc','exp_year']) ]); } catch (\Cartalyst\Stripe\Exception\CardErrorException $e) { return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } // add card to Customer try { $card = Stripe::cards()->create($instance->stripe_customer_id, $token['id']); } catch (\Cartalyst\Stripe\Exception\CardErrorException $e) { return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } // Delete old card foreach($stripeCustomerCurrentCards['data'] as $stripeCustomerCurrentCard){ $delCard = Stripe::cards()->delete($instance->stripe_customer_id, $stripeCustomerCurrentCard['id']); } return response()->json([ 'status' => 'success' ], 200); } // This call is used when you want to change your card details public function listInvoices() { $instance = Auth::user()->instance; $stripe_customer_invoices = Stripe::invoices()->all([ 'customer' => $instance->stripe_customer_id, 'status' => 'paid' ]); $invoices = []; foreach($stripe_customer_invoices['data'] as $invoice){ $invoices[] = [ 'invoice_number' => $invoice['number'], 'amount_paid' => $invoice['amount_paid'] / 100, 'currency' => strtoupper($invoice['currency']), 'created' => Carbon::parse($invoice['created']), 'download_link' => $invoice['invoice_pdf'] ]; } return response()->json($invoices); } // Upgrade/downgrade la subscription public function changePlanAccount(Request $request) { $package = Package::where('token', $request->package_token)->first(); $instance = Auth::user()->instance; $discount_code_id = null; if($instance->voucher_id){ $voucher = $instance->voucher; if($voucher->discount_full == false && $voucher->name != "digital50" && Carbon::parse($instance->created_at)->year < 2021){ $voucher = Voucher::where('name','digital50')->first(); $instance->update([ 'voucher_id' => $voucher->id ]); } if($voucher){ switch ($package->name) { case "Profesional": $discount_code_id = $instance->country->iso == "RO" ? $voucher->stripe_dc_id_pr : $voucher->stripe_dc_id_pe; break; case "Startup": $discount_code_id = $instance->country->iso == "RO" ? $voucher->stripe_dc_id_sr : $voucher->stripe_dc_id_se; break; } } } try { $subscriptions = Stripe::subscriptions()->all($instance->stripe_customer_id); } catch (\Cartalyst\Stripe\Exception\InvalidRequestException $e) { return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } $subscription = Stripe::subscriptions()->update($instance->stripe_customer_id, $subscriptions['data'][0]['id'], [ 'plan' => $instance->country->iso == "RO" ? $package->ron_plan_id : $package->euro_plan_id, 'prorate' => true, 'coupon' => $discount_code_id ]); $instance->package_id = $package->id; $instance->save(); return response()->json($package); } public function webhookRecurrence(Request $request) { $invoice = $request->data['object']; $instance = Instance::where('stripe_customer_id', $invoice['customer'])->first(); if($instance && $invoice['amount_remaining'] == 0){ $instance->update(['status' => Instance::STATUS_ACTIVE]); // add user with tag in active campaign // createCronjobActiveCampaign($instance->users->first(), 'tbf_digital_antreprenor'); }else{ $customerInvoices = Stripe::invoices()->all(['customer' => $instance->stripe_customer_id]); if($invoice['attempt_count'] == 1 && !empty($customerInvoices['data'])){ $instance->update([ 'status' => Instance::STATUS_GRACE_PERIOD, 'grace_period_date' => Carbon::today()->toDateString(), ]); } } return response()->json([ 'status' => 'success', ], 200); } public function webhookPayOuts(Request $request) { Log::critical('payouts.created'); $payout_id = $request->data['object']['id']; $transactions = Stripe::balanceTransactions()->all(['payout' => $payout_id]); Log::critical($transactions); Log::critical('END --------------payouts.created'); } public function sendInvoice(Request $request) { $instance = Instance::where('stripe_customer_id', $request->data['object']['customer'])->first(); if($instance){ // send mail to instance notifications users $subject = __('general.new_invoice_created.subject'); $data = [ 'invoice_url' => $request->data['object']['hosted_invoice_url'], 'created_at' => Carbon::createFromTimestamp($request->data['object']['created'])->isoFormat('DD/MM/Y'), ]; foreach($instance->instance_notifications as $instanceNotification){ try{ Mail::to($instanceNotification->email)->queue(New NewInvoiceCreated($subject, $data)); }catch(\Exception $e){ // } } } return response()->json([ 'status' => 'success', 'invoice_customer_id'=> $request->data['object']['customer'] ], 200); } public function getReferralCoupon(Request $request) { $is_valid = false; $values = []; $couponCode = null; if($request->referral_id){ $instance_referral = Instance::where('referral_uuid',$request->referral_id)->first(); }else{ $instance_referral = Instance::where('id',$request->instance_id)->first(); } if($instance_referral && $instance_referral->voucher_id){ // Verificam daca trebuie pus un cod de reducere pt referral if($request->referral_id){ $voucher = Voucher::where('name','digital50')->first(); $couponCode = 'digital50'; }else{ $voucher = $instance_referral->voucher; if($voucher->discount_full == false && $voucher->name != "digital50" && Carbon::parse($instance_referral->created_at)->year < 2021){ $voucher = Voucher::where('name','digital50')->first(); $instance_referral->update([ 'voucher_id' => $voucher->id ]); } $couponCode = $voucher->name; } $db_coupons = [$voucher->stripe_dc_id_se, $voucher->stripe_dc_id_pe]; $is_valid = true; $packages = Package::where('display_for_subscription',1)->get(); try { $coupons = Stripe::coupons()->all(["limit" => 100]); } catch (\Cartalyst\Stripe\Exception\InvalidRequestException $e) { return response()->json([ 'status' => 'error', 'message' => $e, ], 500); } foreach ($coupons['data'] as $coupon) { if($coupon['valid'] && in_array($coupon['id'], $db_coupons)){ switch ($coupon['id']) { case $voucher->stripe_dc_id_se: $values[] = calculateDiscountBasedOnVoucher($coupon, 'Startup', 'EUR'); break; case $voucher->stripe_dc_id_pe: $resp = calculateDiscountBasedOnVoucher($coupon, 'Profesional', 'EUR'); $values[] = $resp; break; } } } if(empty($values)){ $is_valid = false; } } return response()->json([ 'status' => 'success', 'is_valid' => $is_valid, 'values' => $values, 'couponCode' => $couponCode ], 200); } public function validateCoupon(Request $request) { $is_valid = false; $values = []; $voucher = Voucher::where('name',$request->coupon)->first(); if($voucher){ $db_coupons = [$voucher->stripe_dc_id_se, $voucher->stripe_dc_id_pe]; $is_valid = true; $packages = Package::where('display_for_subscription',1)->get(); try { $coupons = Stripe::coupons()->all(["limit" => 100]); } catch (\Cartalyst\Stripe\Exception\InvalidRequestException $e) { return response()->json([ 'status' => 'error', 'message' => $e, ], 500); } foreach ($coupons['data'] as $coupon) { if($coupon['valid'] && in_array($coupon['id'], $db_coupons)){ switch ($coupon['id']) { case $voucher->stripe_dc_id_se: $values[] = calculateDiscountBasedOnVoucher($coupon, 'Startup', 'EUR'); break; case $voucher->stripe_dc_id_pe: $resp = calculateDiscountBasedOnVoucher($coupon, 'Profesional', 'EUR'); $values[] = $resp; break; } } } if(empty($values)){ $is_valid = false; } } return response()->json([ 'status' => 'success', 'is_valid' => $is_valid, 'values' => $values, 'coupon' => $coupons['data'], 'db_coupons' => $db_coupons ], 200); } public function subscriptionDeleted(Request $request) { $instance = Instance::where('stripe_customer_id', $request->data['object']['customer'])->first(); $canceledSubscriptionId = $request->data['object']['id']; if($instance){ try { $subscriptions = Stripe::subscriptions()->all($instance->stripe_customer_id); } catch (\Cartalyst\Stripe\Exception\InvalidRequestException $e) { return response()->json([ 'status' => 'error', 'message' => cardErrorTranslated($e), ], 500); } $activeSubscriptions = 0; if($subscriptions){ foreach ($subscriptions['data'] as $subscription) { if($subscription['status'] == 'active' && $subscription['id'] != $canceledSubscriptionId){ $activeSubscriptions += 1; } } } if($activeSubscriptions == 0){ $instance->update([ 'status' => Instance::STATUS_UNPAID, 'grace_period_date' => null, ]); // add user with tag in active campaign createCronjobActiveCampaign($instance->users->first(), 'tbf_digital_client_reziliat'); } } return response()->json([ 'status' => 'success', ], 200); } }
Back