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

Encontrei um print_r() que esta me dando problema #28

Closed felipemarques closed 4 years ago

felipemarques commented 4 years ago

Boa noite,

Primeiramente muito obrigado pela sua contribuição. A biblioteca é excelente.

Fiz a instalação e configuração do modulo em um projeto laravel e estou com problemas. O problema esta ao utilizar a function $user->findCard($cardId).

Fiz o rastreamento de um output estranho:

Array
(
    [0] => Array
        (
            [id] => 7ED3E28FEBE14114959006040D66C406
            [customer_id] => 1420190D6E72465790073B9120AD4122
        )

    [1] => Array
        (
            [customer_id] => 1420190D6E72465790073B9120AD4122
        )

)

E cheguei no arquivo ./vendor/iugu/lib/Iugu/APIChildResource.php

E agora acabei de descobrir que o erro não é na sua lib .. e sim na lib da Iugu. Observe o ultimo metodo da classe abaixo, o fetch:

<?php

class APIChildResource {
  private $_parentKeys;
  private $_fabricator;

  function __construct($parentKeys=Array(), $className) {
    $this->_fabricator = $className;
    $this->_parentKeys = $parentKeys;
  }

  function mergeParams( $attributes ) {
    return array_merge( $attributes, $this->_parentKeys );
  }

  private function configureParentKeys($object) {
    foreach ($this->_parentKeys as $key => $value)  {
      $object[$key] = $value;
    }
    return $object;
  }

  public function create($attributes=Array()) {
    $result = call_user_func_array($this->_fabricator . '::create', array( $this->mergeparams($attributes), $this->_parentKeys ));
    if ($result) $this->configureParentKeys( $result );
    return $result;
  }

  public function search($options=Array()) {
    $results = call_user_func_array($this->_fabricator . '::search', Array( $this->mergeParams($options), $this->_parentKeys ));
    if ($results && $results->total()) {
      $modifiedResults = $results->results();
      for ($i=0;$i<count($modifiedResults);$i++) {
        $modifiedResults[$i] = $this->configureParentKeys( $modifiedResults[$i] );
      }
      $results->set($modifiedResults, $results->total());
    }
    return $results;
  }

  public function fetch($key=Array()) {
    if (is_string($key)) {
      $key = Array( "id" => $key );
    }

    print_r(Array( $this->mergeParams($key), $this->_parentKeys ));

    $result = call_user_func_array($this->_fabricator . '::fetch', Array( $this->mergeParams($key), $this->_parentKeys ));
    if ($result) $this->configureParentKeys( $result );
    return $result;
  }
}

Vou entrar em contato no outro repositorio

felipemarques commented 4 years ago

Se for pra contribuir tambem ... criei um service ... e atraves dele .. usei outra classe do Iugu ... Iugu_APIRequest ... e esta nao gerou erro:

<?php
namespace Modules\AppMobile\Services;

use Iugu;
use Iugu_APIRequest;
use Illuminate\Support\Facades\Redis;
use Modules\LiveWebinar\Entities\Webinar;
use Modules\LiveWebinar\Exceptions\WebinarException;

/**
 * Class IuguService
 * @package Modules\AppMobile\Services
 */
class IuguService
{

    /**
     * get payment token from gateway
     *
     * @param string $number
     * @param string $name
     * @param string $expirationDate
     * @param string $cvv
     * @return string
     */
    public static function getPaymentToken($number, $name, $expirationDate, $cvv)
    {
        Iugu::setApiKey( env('IUGU_APIKEY') );

        $name = getFirsAndLastName($name, true, true);
        $expirationDate = getExpirationDate($expirationDate);

        $iugu = new Iugu_APIRequest;
        $paymentTokenResult = $iugu->request('POST', 'https://api.iugu.com/v1/payment_token', array(
            'account_id' => env('IUGU_ID'),
                'method' => 'credit_card',
                'test' => true,
                'data' => [
                    'number' => $number,
                    'verification_value' => $cvv,
                    'first_name' => $name->firstName,
                    'last_name' => $name->lastName,
                    'month' => $expirationDate->month,
                    'year' => $expirationDate->year
                ]
        ));

        if (!empty($paymentTokenResult->errors)) {

            $errors = $paymentTokenResult->errors;
            $errorMessage = '';

            if (!is_array($errors)) {
                $errorMessage = $errors;
            } else {

                foreach ($errors as $k => $v) {
                    $errorMessage .= $k . ' => ' . implode(', ', $v) . PHP_EOL;
                }

            }

            throw new \Exception($errorMessage);

        } else {

            $creditCardToken = $paymentTokenResult->id;

            return $creditCardToken;

        }

    }

    /**
     * findCard
     *
     * @param string $customerId
     * @param string $cardId
     * @return string|bool
     */
    public static function findCard($customerId, $cardId)
    {
        Iugu::setApiKey( env('IUGU_APIKEY') );

        $iugu = new Iugu_APIRequest;
        $result = $iugu->request('GET', "https://api.iugu.com/v1/customers/{$customerId}/payment_methods/{$cardId}");

        if (isset($result->id)) {
            return $result->id;
        } else {
            return false;
        }
    }

    /**
     * listAllCards
     *
     * @param string $customerId
     * @return array|bool
     */
    public static function listAllCards($customerId)
    {
        Iugu::setApiKey( env('IUGU_APIKEY') );

        $iugu = new Iugu_APIRequest;
        $result = $iugu->request('GET', "https://api.iugu.com/v1/customers/{$customerId}/payment_methods");

        return $result;
    }

}
felipemarques commented 4 years ago

Pra usar o service acima é semelhante ao que se usa na lib aqui do GuPayment.. porem:

$creditCardToken = IuguService::findCard($user->iugu_id, $gatewayCardId);
gabrielpeixoto commented 4 years ago

Olá @felipemarques obrigado por notar e informar o problema.

E valeu pelo trecho de código também. Vou simular o erro, ajustar no pacote e pegar as dicas do código que enviou.

Abraços

gabrielpeixoto commented 4 years ago

Olá, não consegui simular o que mandou, o retorno do método findCard retorna o seguinte: image

andrekutianski commented 4 years ago

Realmente, na linha 58 da biblioteca Iugu em /lib/Iugu/APIChildResource.php existe um print_r:

print_r([$this->mergeParams($key), $this->_parentKeys]);

retornando no HTML da view que requisita $user->findCard() o seguinte:

image

felipemarques commented 4 years ago

@gabrielpeixoto outro dev relatou o mesmo problema, consegue dar uma olhada novamente?

andrekutianski commented 4 years ago

@felipemarques este problema está na biblioteca da Iugu, acredito que seria interessante comentar no repositório deles para ver se corrigem ou fazer um PR no repositório. Eles não são nada ativos ou solicitos via github então dependendo da sua urgência acho que vale tentar contato com o suporte via canais oficiais.

gabrielpeixoto commented 4 years ago

Olá Pessoal, já tentei solicitar algumas mudanças no pacote deles, mas eles não fazem mais alterações lá.