My SMM panel
 
 
 
 
 
 

150 lines
4.4 KiB

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use Stripe\Stripe;
  5. use Stripe\Customer;
  6. use Stripe\PaymentIntent;
  7. use Stripe\PaymentMethod;
  8. use Illuminate\Support\Facades\Log;
  9. use Illuminate\Support\Facades\Auth;
  10. use App\Models\Transaction;
  11. class BillingController extends Controller
  12. {
  13. protected $stripe;
  14. protected $user;
  15. public function __construct() {
  16. $this->stripe = new \Stripe\StripeClient(config('services.stripe.secret'));
  17. Stripe::setApiKey(config('services.stripe.secret'));
  18. $this->user = Auth::user();
  19. }
  20. protected function attempt(Request $request) {
  21. $user = Auth::user();
  22. $amount = $request->packs[ 'credits10' ]*1099 +
  23. $request->packs[ 'credits50' ]*5499 + $request->packs[ 'credits100' ]*10999
  24. + $request->packs[ 'credits1000' ]*101000;
  25. $transaction = new Transaction;
  26. $transaction->credits = $request->packs['credits10']*1000 +
  27. $request->packs['credits50']*5000 +
  28. $request->packs['credits100']*10000 +
  29. $request->packs['credits1000']*100000;
  30. $transaction->credits_extra =
  31. $request->packs['credits50']*500 +
  32. $request->packs['credits100']*1000 +
  33. $request->packs['credits1000']*15000;
  34. $transaction->user_id = $user->id;
  35. $transaction->charge = $amount;
  36. $transaction->status = 'processing';
  37. $transaction->completed = false;
  38. $transaction->save();
  39. return $transaction;
  40. }
  41. //Expects an array 'packs' representing the amount of each multiple of credits.
  42. //Should validate that all amounts are positive integers in a reasonable range
  43. public function stripeSecret(Request $request) {
  44. $user = Auth::user();
  45. $transaction = $this->attempt($request);
  46. $intent = PaymentIntent::create([
  47. 'amount' => $amount,
  48. 'currency' => 'usd',
  49. 'customer' => $user->customer_id,
  50. 'description' => "You have received $total_credits credits.",
  51. 'receipt_email' => Auth::user()->email,
  52. 'metadata' => ['transaction_id' => $transaction->id]
  53. ]);
  54. $transaction->intent_id = $intent->id;
  55. //Save the card as a default if none is set and it was selected
  56. if ($user->payment_method == null && $request->card) {
  57. $this->changeDefaultCard($request->card);
  58. }
  59. $transaction->save();
  60. return $intent->client_secret;
  61. }
  62. public function getCards() {
  63. return PaymentMethod::all([
  64. 'customer' => Auth::user()->customer_id,
  65. 'type' => 'card'
  66. ]);
  67. }
  68. //Adds correct credit amount to the charged user, precise to two decimal places
  69. public function chargeEvent(Request $request) {
  70. $event = \Stripe\Event::constructFrom($request->all());
  71. $charge = $event->data->object;
  72. $transaction = Transaction::where('intent_id', $charge->payment_intent)->first();
  73. $user = $transaction->user;
  74. if ($event->type == 'charge.succeeded') {
  75. $user->credits = $user->credits + $transaction->credits + $transaction->credits_extra;
  76. $transaction->status = 'completed';
  77. $transaction->completed = true;
  78. $user->save();
  79. $transaction->save();
  80. } else {
  81. $transaction->status = $charge->status;
  82. $transaction->save();
  83. }
  84. }
  85. public function changeDefaultCard(String $card) {
  86. $user = Auth::user();
  87. $user->payment_method = $card;
  88. $user->save();
  89. $cards = $this->getCards();
  90. return PaymentMethod::all([
  91. 'customer' => Auth::user()->customer_id,
  92. 'type' => 'card'
  93. ]);
  94. }
  95. public function deleteCard(Request $request) {
  96. $this->stripe->paymentMethods->detach($request->card);
  97. $user = Auth::user();
  98. if ($request->card == $user->payment_method) {
  99. $user->payment_method = null;
  100. $user->save();
  101. }
  102. return ($this->getCards());
  103. }
  104. //Receives a request with a packs. It is an array of each type of credit
  105. //amount to be bought
  106. public function payeer(Request $request) {
  107. $transaction = $this->attempt($request);
  108. $shopid = config('services.payeer.id');
  109. $secret = config('services.payeer.secret');
  110. $param_key = config('services.payeer.param_key');
  111. $total = $transaction->credits + $transaction->credits_extra;
  112. $arHash = [$shopid, $transaction->id, $transaction->charge, 'USD', "You
  113. will receive $total credits."];
  114. $params = ['reference' => ['transaction_id' => $transaction->id]];
  115. $key = md5($param_key.$transaction->id);
  116. $encodedParams = urlencode(base64_encode(openssl_encrypt(
  117. json_encode($params), 'AES-256-CBC', $key, OPENSSL_RAW_DATA
  118. )));
  119. $arHash[] = $encodedParams;
  120. $arHash[] = $secret;
  121. $signature = strtoupper(hash('sha256', implode(':', $arHash)));
  122. return [ 'signature' => $signature, 'params' => $encodedParams, 'shop'
  123. => $shopid, 'transaction' => $transaction->id ];
  124. }
  125. }