Potelo / GuPayment

GuPayment é um pacote para o Laravel que fornece uma interface para controlar assinaturas e pagamentos com o iugu.com
MIT License
79 stars 21 forks source link

Error: "Trying to get property 'status' of non-object" #35

Closed VictorRabelo closed 3 years ago

VictorRabelo commented 3 years ago

Estou com esse erro(" Error: "Trying to get property 'status' of non-object" ") ao efetuar pagamentos com cartão de crédito, pagamentos com a opção boleto bancário está ok, único problema está no cartão de credito, o erro está vindo da biblioteca, o trecho de código em especifico " $subscriptionIugu = $this->user->createIuguSubscription($this->buildPayload($customer->id)); ", está localizado no caminho " poleto/gu-payment/src/SubscriptionBuilder.php ", que esta dentro do método " create($token = null, array $options = []) "

gabrielpeixoto commented 3 years ago

Olá @VictorRabelo tem como você colar o trecho de código de seu lado, para eu ver como estão as chamadas?

VictorRabelo commented 3 years ago

Bom eu tenho dois arquivos que trata a requisição vinda do front, o primeiro é o App\Traits\UserTrait.php que contém esse método

`public function _userStore($request, $sing) {

    try {
        $plan = '';
        if(!empty($request->type_payment) && $request->type_payment == 'boleto') {
            $plan = "PLANO PADRAO BOLETO";
        }elseif(!empty($request->type_payment) && $request->type_payment == 'cartao') {
            $plan = "PLANO PADRAO";
        }

        $url  = '';

        if(isset($request->new_account) && $request->new_account == 'no') {
            $user = User::where('cpf', $this->soNumero($request->cpf))->first();

            if(!empty($user)):
                // Criar cliente no Iugu
                //$user->createAsIuguCustomer();

                if($sing):
                    if($request->type_payment == 'cartao' && isset($request->credit_card) && is_array($request->credit_card)) {
                        $invoice = $user->singSubscription($plan, $request->type_payment, $request->credit_card);
                        if($invoice->status == 'paid') {
                            $this->activateAccount($user);
                        }
                        $url = $invoice->secure_url;
                    }else{
                        $invoice = $user->singSubscription($plan, $request->type_payment);
                        if($invoice->status == 'paid') {
                            $this->activateAccount($user);
                        }
                        $url = $invoice->secure_url;
                    }
                endif;

                if(empty($url)):
                    return response()->json(['status' => false, 'error' => 'Ocorreu um erro ao processar o pedido!'], 400);
                endif;

                return response()->json(['status' => true, 'user' => $user, 'url' => $url, 'message' => 'Recebemos seus dados com sucesso, e você será redirecionado!'], 200);
            endif;
        }else{

            $data = $this->prepareData($request);

            if(User::where('cpf', $data['cpf'])->first()) {
                return response()->json(['status' => false, 'error' => 'Já existe esse CPF cadastrado!'], 400);
            }

            $user = User::where('email', trim($request->email))->first();

            if(empty($user)) {

                $user = User::create($data);

                $user->role()->create([
                    'role' => 'guest'
                ]);

            }

            if($user):
                if($sing):
                    if($request->type_payment == 'cartao' && isset($request->credit_card) && is_array($request->credit_card)) {
                        $invoice = $user->singSubscription($plan, $request->type_payment, $request->credit_card);

                        if($invoice->status == 'paid') {
                            $this->activateAccount($user);
                        }
                        $url = $invoice->secure_url;
                    }else{
                        $invoice = $user->singSubscription($plan, $request->type_payment);
                        if($invoice->status == 'paid') {
                            $this->activateAccount($user);
                        }
                        $url = $invoice->secure_url;
                    }
                endif;

                if(empty($url)):
                    return response()->json(['status' => false, 'error' => 'Ocorreu um erro ao processar o pedido!'], 400);
                endif;

                return response()->json(['status' => true, 'user' => $user, 'url' => $url, 'message' => 'Recebemos seus dados com sucesso, e você será redirecionado!'], 200);
            else:
                return response()->json(['status' => false, 'error' => 'Existe um erro, fale com o administrador!'], 400);
            endif;
        }
    } catch (\Exception $e) {

        return response()->json(['status' => false, 'error' => $e->getMessage()], 400);
    }
}`

PS: a variável $invoice recebe uma função que não esta retornando nada.

E o segundo é App\Models\User.php que contem esse trecho de código em especifico pois é o trecho que não está retornando nada, `public function singSubscription($plan, $type, $credit_card = null) { $qtdDiasAteVencimento = 3; $payable_with = '';

    if($type == 'boleto') {
        $payable_with = "bank_slip";
    }elseif($type == 'cartao') {
        $payable_with = "credit_card";
    }

    $subscriptionBuilder = $this->newSubscription($plan, $plan, [], ['payable_with' => $payable_with]);

    if($type == 'boleto') {
        $subscriptionBuilder->daysToExpire($qtdDiasAteVencimento );
    }

    $options = [
        'name'      => $this->name,
        'street'    => $this->rua,
        'district'  => $this->bairro,
        'cpf_cnpj'  => $this->cpf,
        'zip_code'  => $this->cep,
        'number'    => $this->numero,
    ];

    $creditCardToken = null;

    if(!empty($credit_card)) {
        $creditCardToken = $this->getToken($credit_card);
    }

    $signature = $subscriptionBuilder->create($creditCardToken, $options);

    if ($signature) {
        $invoice = null;
        if ($signature && isset($signature['recent_invoices'])):
            foreach ($signature->recent_invoices as $invoiceData):
                $invoice = $invoiceData;
            endforeach;
        endif;

        return $invoice;
    } else {
        $erros = $subscriptionBuilder->getLastError();

        if (is_array($erros)) {
            // array
        } else {
            // string
        }
    }
}`
gabrielpeixoto commented 3 years ago

Uma dica. Aqui $this->newSubscription($plan, $plan, [], ['payable_with' => $payable_with]); usa um nome fixo no primeiro parâmetro em vez de $plan, pois isso aí só serve para quando você tem 2 assinaturas de produtos diferentes no site.

Sobre o erro ainda não consegui identificar, você conseguiria colar o trace completo aqui do erro?

VictorRabelo commented 3 years ago

@gabrielpeixoto, Agora está me retornando uma resposta de dd(), "plan_identifier" => array:1 [ 0 => "não é válido" ],

Creio eu que fica mais fácil de resolver esse problema

gabrielpeixoto commented 3 years ago

Ahhh, no iugu tem um identificador do plano, é ele que deve ser passado por parâmetro.

Como está o identificador dos planos em https://alia.iugu.com/receive/plans? Clicando no plano, na página de detalhes mostra o identificador. image

Esse valores que você deve passar ali onde passou o "PLANO PADRAO BOLETO"

VictorRabelo commented 3 years ago

@gabrielpeixoto Muitooooooo obrigado cara! Sucessos ai