vindi / vindi-php Goto Github PK
View Code? Open in Web Editor NEWSDK PHP para a API de Recorrência da Vindi
Home Page: https://www.vindi.com.br
License: GNU General Public License v3.0
SDK PHP para a API de Recorrência da Vindi
Home Page: https://www.vindi.com.br
License: GNU General Public License v3.0
Devido a uma necessidade, acabei detectando um problema com a Lib, na hora de fazer uma subscription e verificar se o pagamento foi efetuado com sucesso, o json original retornado devolve subscription
e bill
, porém, ao fazer o parse e devolver o objeto do response nesta Lib, vocês estão associando apenas o que foi retornado no subscription
, ignorando totalmente o que foi retornado em bill
, fiz um workaround local pra resolver isso, que foi fazer o parse do response original e pegar as informações que necessitava, como segue o código abaixo (PS: no exemplo abaixo, customer_id
e plan_id
são dados falsos):
$data = array(
"plan_id" => 12356,
"customer_id" => 12356,
"payment_method_code" => "credit_card",
);
$subscriptionManage = new Vindi\Subscription;
$subscription = $subscriptionManage->create($data);
$body = json_decode((string) $subscriptionManage->getLastResponse()->getBody());
if($body->bill->status != 'paid') {
// Lógica para cancelar a inscrição aqui
}
Talvez adicionando os dados de bill
dentro da classe retornada, com um atributo de mesmo nome (bill
), resolveria o problema, isso evitaria ter que fazer toda essa volta que fiz, pra conseguir a informação que precisava, podendo fazer um acesso direto, como:
echo $subscription->bill->status;
Precisamos de alguma forma acessar os headers dos request, hoje ainda não é possível!
Olá,
Efetuando testes com um cliente, notei que o método response
do arquivo ApiRequester.php
tem o seguinte trecho:
if (!empty($decoded)) {
reset($decoded);
$data = current($decoded); // get first attribute from array, e.g.: subscription, subscriptions, errors.
}
$this->checkRateLimit($response)
->checkForErrors($response, $data);
return $data;
A linha onde é utilizada a função current faz com que somente o primeiro atributo do objeto de retorno seja enviado no retorno da função.
Em particular, no método de criação de assinaturas, isso faz com que nem todas as informações sejam retornadas, pois existem duas propriedades no mesmo nível, que são "subscription" e "bill". Desta forma, o atributo bill não é retornado.
Conforme orientado pela equipe da Vindi, foi indicado para usar o $subscriptionService->getLastResponse->getBody()
, para recuperar a string da última requisição feita. Dessa forma, sim, a resposta é exatamente igual à documentação.
Isto posto, como não verifiquei toda a documentação, seria interessante rever esta parte, pois podem haver outros métodos em que o mesmo problema aconteça.
Atenciosamente,
Hugo Silva
Descreva o bug
Tentando usar string como objeto. Possível mudança de retorno da API.
Como reproduzir
Passos para reprodução do comportamento:
Comportamento Esperado
Tratamento de exceptions
Estou tentando deletar uma subscription, pela documentação é possível passar o parâmetro cancel_bills. Mas a função delete não permite passar nenhum parâmetro
public function delete($id = null) {
return $this->apiRequester->request('DELETE', $this->url($id));
}
Olá!
Antes de abrir um PR preferi postar meu commit aqui p/ discussão.
Por padrão, as requisições à API da Vindi são serializadas no formato x-www-form-urlencoded, mas isso gera um erro de validação ao enviar um array de hashes. Esbarrei nesse erro ao criar uma nova assinatura usando o SDK, onde precisei informar o atributo product_items, que é um array de hashes.
Para evitar problemas de serialização, passei a usar JSON em vez de Form:
https://github.com/templateria/vindi-php/commit/2b0796b22d941e2b7bbb29dcd266d43f68bbda4c
Já passei por isso aqui na Templateria: nosso backend é Grape e o frontend é Lithium (PHP). Sempre que eu definia um endpoint que aceitava um paramêtro com type: Array[OutraClasse]
encontrava problemas. Creio que isso acontece porque a função http_build_query
do PHP adiciona índices nos arrays. Depois dessa dor de cabeça, passei a usar JSON apenas.
Acham que é uma boa mudar aqui também?
Olá, fiz um teste de assinatura na pagina sandbox de vcs e percebi um retorno completo, quando fiz download da sua SDK, além de ter que instalar várias bibliotecas que não estão no projeto, ele não retornou a futura (objeto BILL) sendo que usei o mesmo json de request da sua pagina sandbox. Vocês tem algum exemplo melhor do que aprensentado nessa biblioteca? Ou alguma ideia do pq isso ocorre?
O try catch block clássico:
try {
$customer_subscription = $this->customer_subscription_service->all($query);
}
catch (Exception $except) {
$status = array('Subs Ld', $except->getMessage(), 'critico');
}
quando dá errado, faz com que o getMessage() apresente o erro:
"Erros de validação foram encontrados!"
Mas este tipo de erro é muito amplo. O desenvolvedor fica sem saber se o erro é na duplicação do "code", se o erro é na sigla do Estado quando um cliente novo está sendo inserido, se o erro é no telefone, etc.
Para conseguir uma visão mais específica do erro com o mesmo try catch block, considere adicionar as seguintes linhas de código no arquivo ValidationException.php, dentro do __construct:
public function __construct($status, $errors, array $lastOptions = [])
{
parent::__construct($status, $errors, $lastOptions);
// novo código inserido -- start
$error_log = '';
if ( is_array( $errors ) ) {
if ( !empty($errors) ) {
$error_log .= ' --- ' . $errors[0]->id . ' --- ' . $errors[0]->parameter . ' --- ' . $errors[0]->message . ' --- ' ;
}
}
// novo código inserido -- end
$this->message = "Erros de validação foram encontrados!" . $error_log; // $error_log appended to error message.
}
Dessa forma fica fácil saber o erro específico, um de cada vez, com PHP puro, sem precisar instalar, instanciar um novo objeto do Guzzle dentro de um namespace específico.
Boa sorte!
Descreva o bug
A classe Movement.php subiu para master, porem não foi criada uma nova release e também não foi publicada no packagist.
Com isso não é possível usar o gerenciador de dependências da maneira correta.
Contexto adicional
A exception está sendo lançada com base no header Rate-Limit-Remaining, quando o ultimo request feito voltar com Rate-Limit-Remaining igual 0 a exception é lançada, mesmo que ele tenha sido realizado com sucesso!
Acredito que falta um parâmetro indicando que desejamos usar o modo Sandbox.
Quando estamos usando ambiente "real" (produção) ou "sandbox trial", a URL da API é
public static $apiBase = 'https://app.vindi.com.br/api/v1/';
Porém, em ambiente de sandbox (sem trial), a URL correta é:
public static $apiBase = 'https://sandbox-app.vindi.com.br/api/v1/';
Poderíamos passar como variável de ambiente, a exemplo da "VINDI_API_KEY", ex:
putenv('VINDI_API_KEY=A1B2C3D4E5');
putenv('VINDI_SANDBOX=1');
Local:
Line 17 in a5f13db
Descreva o bug
Quando preciso utilizar o ambiente de produção do Laravel, por não utilizar o variáveis de ambientes, da problemas com as chaves de API pois não é possivel utilizar as variaveis de ambiente
O erro é no tratamento de erros, no arquivo RequestException, linha 54. ErrorException Trying to get property of non-object.
Como reproduzir
Passos para reprodução do comportamento:
$productItem = new \Vindi\ProductItem;
$productItem->update(null, ['price' => 25.90]);
Comportamento Esperado
Retorno de uma mensagem de erro. Pode ser algo como "Endpoint não encontrado."
Forçar conexão HTTPS usando TLS 1.2. O suporte à versão 1.0 será descontinuado pela plataforma em junho/2016.
Corrigir user-agent para Vindi-PHP/[Versão]
RequestException não espera receber o seguinte json:
{
"errors": [
{
"id": "invalid_parameter",
"message": "Malformed parameter."
}
]
}
Como passar o tipo de consulta para realizar filtros com o método all (Resource.php) ?
Exemplo: Eu gostaria de filtrar Bill onde created_at seja >= alguma data
Is it possible to send the api key through constructor of vindi or method ?
env variable is not a really good way to store this.
Thanks
Olá, na hora que eu vou atualizar um customer, o state sempre dá erro na validação.
Na documentação diz: state (string, opcional): Código do estado no formato ISO 3166-2. Exemplo: SP. Porém, ao atualizar com SP (string), retorna erro na validação.
Após horas quebrando a cabeça, eu percebi que state não é obrigatório para gerar boletos (contrariando o que o suporte havia dito).
Não seria um problema não aceitar SP como State? A própria documentação cita SP como exemplo.
https://vindi.github.io/api-docs/dist/#!/customers/PUT_version_customers_id_format
Obrigado!
Sua requisição de nova feature é relacionado ao problema?. Por favor descreva-o
As versões mais novas do Laravel possuem dependência do Guzzle na versão 7. Esse pacote aceita apenas o Guzzle v. 6
Descreva a solução que você gostaria que a gente implementasse
Update para Guzzle 7
Estamos implementando recorrência através da Vindi, nosso sistema usa PHP 7.
O que funciona atualmente: Cadastro de clientes, formas de pagamento, faturas.
Agora precisamos liberar uma opção para efetuar a cobrança de uma fatura agendada, seguindo as recomendações da Vindi, claro.
Porém ao realizar a chamada, recebemos o seguinte erro:
An uncaught Exception was encountered
Type: Vindi\Exceptions\RequestException
Message: Recurso não encontrado: Charge
Filename: CAMINHO\vendor\vindi\vindi-php\src\ApiRequester.php
Line Number: 126
Todas as demais funções da SDK funcionam, só esta que não.
Código:
`require FCPATH . '/vendor/autoload.php';
putenv("VINDI_API_KEY=API");
putenv("VINDI_API_URI=END_HOMOLOGACAO");
$billService = new Vindi\Charge;
try {
$res = $billService->charge($id_cobranca, []);
print_r($res);
}
catch(Vindi\Exceptions\ValidationException $e){
print_r( $e->getErrors());
}`
Informações adicionais:
Servidor: Ubuntu Server
Framework PHP: CodeIgniter 3
Versão da SDK: 1.2
Podem me dar um apoio? Se precisarem de mais informações, é só pedir.
Bom dia. Sou cliente da VINDI. Responsável pelo TI da empresa hqbeds, usamos a plataforma de vocês para cobrar nossos clientes.
Quero integrar nossa base de clientes com a ferramenta de vocês. Estou tentando utilizar a SDK em PHP, porém não está funcionando. Fiz um teste bem simples, instalando via composer e chamando o executando o programa abaixo :
Estou com php 5.6 aqui..
<?php
require __DIR__.'/vendor/autoload.php';
$config['VINDI_API_KEY'] = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
$config['VINDI_API_URI'] = 'https://app.vindi.com.br/api/v1';
$customerService = new Vindi\Customer($config);
$customers = $customerService->all([
'sort_by' => 'created_at',
'sort_order' => 'desc'
]);
echo '<pre>';
print_r($customers);
?>
Não funciona.. O token está certinho, estou testando via chamada CURL direto aqui e está tudo okay, mas a SDK não rola....
1 | 0.0101 | 239872 | {main}( ) | .../index.php:0
2 | 0.1343 | 440936 | Vindi\Resource->all( ) | .../index.php:25
3 | 0.1343 | 441480 | Vindi\ApiRequester->request( ) | .../Resource.php:67
4 | 0.9384 | 662616 | Vindi\ApiRequester->response( ) | .../ApiRequester.php:53
5 | 0.9385 | 663536 | Vindi\ApiRequester->checkForErrors( ) | .../ApiRequester.php:72
Pessoal, é possível filtrar utilizando o método ALL dos serviços?
Não consegui entender ainda como fazer uma query , por customer_id por exemplo... Como devo passar o [] params?
Como a resposta retornam sempre o primeiro elemento do array, algumas requisições que deveriam retornam mais informações acabam retornando apenas uma parte delas.
Exemplo: ao criar uma assinatura deveria receber o objeto da assinatura criada juntamente com as cobranças e transações, mas está retornando apenas a assinatura.
Seria bom se tivesse outra maneira de usar a chave além de putenv. Por exemplo enviar junto a requisição, dessa forma seria possível usar clients http para fazer testes por exemplo.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.