Files
site/app/Http/Controllers/MoneyController.php

327 lines
12 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers;
use YooKassa\Client;
use Illuminate\Http\Request;
use App\Domain\Points\Models\Point;
use App\Domain\Payments\Models\Withdrawal;
use App\Domain\Points\Enums\DirectionEnum;
use App\Domain\PaymentGateway\Services\QiwiService;
use App\Domain\PaymentGateway\Services\UnitpayService;
use App\Domain\PaymentGateway\Services\YookassaService;
use App\Domain\PaymentGateway\Models\PaymentGatewayOrder;
use App\Domain\PaymentGateway\Services\InterkassaService;
use App\Domain\Subscriptions\Service\SubscriptionService;
class MoneyController extends Controller
{
public function startProcess(Request $request)
{
$this->validate($request, [
'sum' => 'required|integer|numeric',
]);
$sum = (int) abs($request->input('sum'));
$amount = round(($sum * 0.035) + $sum, 1);
$order = PaymentGatewayOrder::yookassa($sum);
$order_number = ['order_number' => $order->number];
$point = new Point;
$point->user_id = auth()->user()->id;
$point->point = $sum;
$point->type = 'Ожидание поступления';
$point->direction = DirectionEnum::PENDING();
$point->meta = json_encode($order_number);
$point->save();
return redirect(YookassaService::payments_link($amount, $order, auth()->user()));
}
// public function startProcess()
// {
// $amount = filter_input(INPUT_GET, 'sum', FILTER_VALIDATE_INT);
// if(empty($amount)){
// return redirect()->back();
// }
// $order = PaymentGatewayOrder::yookassa($amount);
// return redirect(YookassaService::payments_link($amount, $order, auth()->user()));
// }
public function checkPointPay($id)
{
$point = Point::findOrFail($id);
if($point->direction != 2){
return redirect()->route('setting.money')->with('error', 'Ошбика');
}
$order_number = json_decode($point->meta);
if(empty($order_number)){
return redirect()->route('setting.money')->with('error', 'Ошбика');
}
$order = PaymentGatewayOrder::where('number', $order_number->order_number)->first();
if(empty($order)){
return redirect()->route('setting.money')->with('error', 'Ошбика');
}
if($order->status !== 0){
return redirect()->route('setting.money')->with('error', 'Ошбика');
}
$YOOKASSA_SHOP_ID = env('YOOKASSA_SHOP_ID');
$YOOKASSA_KEY = env('YOOKASSA_KEY');
$client = new Client();
$client->setAuth($YOOKASSA_SHOP_ID, $YOOKASSA_KEY);
$payment = $client->getPaymentInfo($order->system_payment_id);
if ($payment->getStatus() === "succeeded")
{
$order->status = 1;
$order->save();
$point->point = $order->amount;
$point->type = 'Пополнение счета: ' . $order->type . ' # ' . $order->id;
$point->direction = DirectionEnum::COMING();
$point->save();
return redirect()->route('setting.money')->with('success', 'Счет успешно пополнен!');
}
else{
PaymentGatewayOrder::destroy($order->id);
Point::destroy($point->id);
return redirect()->route('setting.money')->with('error', 'Платеж не прошел. Попробуйте еще или выберите другой способ оплаты');
}
}
public function paymentStatus($number)
{
$order = PaymentGatewayOrder::where('number', $number)->firstOrFail();
if($order->status !== 0){
return redirect()->to('/');
}
$YOOKASSA_SHOP_ID = env('YOOKASSA_SHOP_ID');
$YOOKASSA_KEY = env('YOOKASSA_KEY');
$client = new Client();
$client->setAuth($YOOKASSA_SHOP_ID, $YOOKASSA_KEY);
$payment = $client->getPaymentInfo($order->system_payment_id);
$point = Point::where('meta->order_number', $number)->first();
if(empty($point)){
$point = new Point;
$point->user_id = auth()->user()->id;
}
if ($payment->getStatus() === "succeeded")
{
$order->status = 1;
$order->save();
$point->point = $order->amount;
$point->type = 'Пополнение счета: ' . $order->type . ' # ' . $order->id;
$point->direction = DirectionEnum::COMING();
$point->save();
return redirect()->route('setting.money')->with('success', 'Счет успешно пополнен!');
}
else{
PaymentGatewayOrder::destroy($order->id);
Point::destroy($point->id);
return redirect()->route('setting.money')->with('error', 'Платеж не прошел. Попробуйте еще или выберите другой способ оплаты');
}
}
// public function qiwiStatus($number)
// {
// $YOOKASSA_SHOP_ID = env('YOOKASSA_SHOP_ID');
// $YOOKASSA_KEY = env('YOOKASSA_KEY');
// $client = new Client();
// $client->setAuth($YOOKASSA_SHOP_ID, $YOOKASSA_KEY);
// $payment = $client->getPaymentInfo($number);
// dd($payment);
// $SECRET_KEY = env('QIWI_SECRET');
// $order = PaymentGatewayOrder::where('number', $number)->firstOrFail();
// if($order->status !== 0){
// return redirect()->to('/');
// }
// $billPayments = new \Qiwi\Api\BillPayments($SECRET_KEY);
// $response = $billPayments->getBillInfo($number);
// if ($response['status']['value'] === "PAID")
// {
// $order->status = 1;
// $order->save();
// $point = new Point;
// $point->user_id = auth()->user()->id;
// $point->point = $order->amount;
// $point->type = 'Пополнение счета: ' . $order->type . ' # ' . $order->id;
// $point->direction = DirectionEnum::COMING();
// $point->save();
// return redirect()->route('setting.money')->with('success', 'Счет успешно пополнен!');
// }
// else if ($response['status']['value'] === "WAITING")
// {
// echo "Ваш платеж в обработке \n Не закрывайте страницу и попробуйте обновить страницу позже";
// die;
// }
// PaymentGatewayOrder::destroy($order->id);
// $msg_error = 'Заказ завершен с ошибкой';
// if($response['status']['value'] === "REJECTED"){
// $msg_error .= ' - Счет отклонен';
// }
// return redirect()->route('setting.money')->with('error', $msg_error);
// }
public function unitpayStatus()
{
dd(request()->all());
}
public function interkassa()
{
$amount = filter_input(INPUT_GET, 'ik_am', FILTER_VALIDATE_INT);
if(empty($amount)){
return redirect()->back();
}
$order = PaymentGatewayOrder::interkassa($amount);
return redirect(InterkassaService::payments_link($amount, $order->id));
}
public function interkassaStatus()
{
$ik_co_id = request()->ik_co_id; // Идентификатор кассы
$ik_inv_id = request()->ik_inv_id; // Идентификатор платежа в системе Интеркасса
$ik_inv_st = request()->ik_inv_st; // Состояние платежа. - success; fail
$ik_pm_no = request()->ik_pm_no; // Номер заказа. example - ID_4233
if($ik_inv_st === 'success'){
$order = PaymentGatewayOrder::findOrFail($ik_pm_no);
if($order->status === 1){
return redirect()->back();
}
$order->status = 1;
$order->system_payment_id = $ik_inv_id;
$order->save();
$point = new Point;
$point->user_id = auth()->user()->id;
$point->point = $order->amount;
$point->type = 'Пополнение счета: ' . $order->type . ' # ' . $order->id;
$point->direction = DirectionEnum::COMING();
$point->save();
return redirect()->route('setting.money')->with('success', 'Счет успешно пополнен!');
}
return $this->fails($ik_pm_no, $ik_inv_st);
}
protected function fails($order_id, $status)
{
PaymentGatewayOrder::destroy($order_id);
$msg_error = 'Заказ завершен с ошибкой';
if($status === 'canceled'){
$msg_error = 'Заказ отменен';
}
return redirect()->route('setting.money')->with('error', $msg_error);
}
public function payouts()
{
$amount = request()->amount;
$user = auth()->user();
// $bankRequisites = $user->bank_requisites->first();
if(!$user->isVerifiedForWithdrawal()){
return redirect()->back()->with('error', 'Нужно верифицировать аккаунт, загрузить копию паспорта и ввести данные бик, инн, расчетный счет');
// return redirect()->back()->with('error', 'Нужно верифицировать ваш номер телефона');
}
// if(empty($bankRequisites)){
// return redirect()->back()->with('error', 'Заполните платежные реквизиты');
// }
$balance = SubscriptionService::calculate(auth()->user()->id);
if ($amount > $balance) {
return redirect()->back()->with('error', 'Недостаточно средств для вывода');
}
if($user->status == 1 || $user->status == 2){
if (!Withdrawal::canRequestWithdrawalPhysical($user->id, $amount)) {
return redirect()->back()->with('error', 'Превышен лимит выплат за текущий месяц (12000)');
}
}else{
if (!Withdrawal::canRequestWithdrawalLegal($user->id, $amount)) {
return redirect()->back()->with('error', 'Превышен лимит выплат за текущий месяц (150000)');
}
}
// $requisites = $bankRequisites->requisites;
// $detailsDescr[] = 'Тип: по номеру телефона';
// $detailsDescr[] = 'Номер телефона: ' . $user->phone;
$detailsDescr[] = 'Тип: Банк';
// $detailsDescr[] = 'Номер карты: ' . $bankRequisites->number;
$detailsDescr = implode(PHP_EOL, $detailsDescr);
$point = new Point;
$point->user_id = auth()->user()->id;
$point->point = $amount;
$point->type = 'Вывод средств (ожидает обработки)'; //YSV ENUM!
$point->direction = DirectionEnum::EXPENSE();
$point->save();
$withdrawal = new Withdrawal;
$withdrawal->point()->associate($point);
$withdrawal->user()->associate(auth()->user());
$withdrawal->requisites_id = 1;
// $withdrawal->requisites()->associate($requisites);
$withdrawal->amount = $amount;
$withdrawal->history_payment_details = $detailsDescr;
$withdrawal->save();
return redirect()->back()->with('success', 'Запрос на вывод денег успешно отправлен!');
}
}