diff --git a/README.md b/README.md index 0cfd8c2..465c601 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,1124 @@ - - # Pagar.me PHP SDK -PHP integration for [Pagar.me API](https://docs.pagar.me/api/) + + +
+ +Integração em PHP para a [Pagar.me API](https://docs.pagar.me/)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/4c34cc13-e52f-492e-a2f2-dbcd398135a2/mini.png)](https://insight.sensiolabs.com/projects/4c34cc13-e52f-492e-a2f2-dbcd398135a2) [![Coverage Status](https://coveralls.io/repos/github/pagarme/pagarme-php/badge.svg?branch=V3)](https://coveralls.io/github/pagarme/pagarme-php?branch=V3) -## Installation -Via Composer +# Índice + +- [Instalação e configuração](#Instalação-e-configuração) +- [Utilizando a SDK](#Utilizando-a-SDK) + - [Parâmetros page e count](#Parâmetros-page-e-count) + - [Transações](#Transações) + - [Criando uma transação](#Criando-uma-transação) + - [Capturando uma transação](#Capturando-uma-transação) + - [Estornando uma transação](#Estornando-uma-transação) + - [Estornando uma transação parcialmente](#Estornando-uma-transação-parcialmente) + - [Estornando uma transação com split](#Estornando-uma-transação-com-split) + - [Retornando transações](#Retornando-transações) + - [Retornando uma transação](#Retornando-uma-transação) + - [Retornando recebíveis de uma transação](#Retornando-recebíveis-de-uma-transação) + - [Retornando um recebível de uma transação](#Retornando-um-recebível-de-uma-transação) + - [Retornando o histórico de operações de uma transação](#Retornando-o-histórico-de-operações-de-uma-transação) + - [Notificando cliente sobre boleto a ser pago](#Notificando-cliente-sobre-boleto-a-ser-pago) + - [Retornando eventos de uma transação](#Retornando-eventos-de-uma-transação) + - [Calculando Pagamentos Parcelados](#Calculando-pagamentos-parcelados) + - [Testando pagamento de boletos](#Testando-pagamento-de-boletos) + - [Estornos](#Estornos) + - [Cartões](#Cartões) + - [Criando cartões](#Criando-cartões) + - [Retornando cartões](#Retornando-cartões) + - [Retornando um cartão](#Retornando-um-cartão) + - [Planos](#Planos) + - [Criando planos](#Criando-planos) + - [Retornando planos](#Retornando-planos) + - [Retornando um plano](#Retornando-um-plano) + - [Atualizando um plano](#Atualizando-um-plano) + - [Assinaturas](#Assinaturas) + - [Criando assinaturas](#Criando-assinaturas) + - [Split com assinatura](#Split-com-assinatura) + - [Retornando uma assinatura](#Retornando-uma-assinatura) + - [Retornando assinaturas](#Retornando-assinaturas) + - [Atualizando uma assinatura](#Atualizando-uma-assinatura) + - [Cancelando uma assinatura](#Cancelando-uma-assinatura) + - [Transações de assinatura](#Transações-de-assinatura) + - [Pulando cobranças](#Pulando-cobranças) + - [Postbacks](#Postbacks) + - [Retornando postbacks](#Retornando-postbacks) + - [Retornando um postback](#Retornando-um-postback) + - [Reenviando um Postback](#Reenviando-um-postback) + - [Saldo do recebedor principal](#Saldo-do-recebedor-principal) + - [Operações de saldo](#Operações-de-saldo) + - [Histórico das operações](#Histórico-das-operações) + - [Histórico de uma operação específica](#Histórico-de-uma-operação-específica) + - [Recebível](#Recebível) + - [Retornando recebíveis](#Retornando-recebíveis) + - [Retornando um recebível](#Retornando-um-recebível) + - [Transferências](#Transferências) + - [Criando uma transferência](#Criando-uma-transferência) + - [Retornando transferências](#Retornando-transferências) + - [Retornando uma transferência](#Retornando-uma-transferência) + - [Cancelando uma transferência](#Cancelando-uma-transferência) + - [Antecipações](#Antecipações) + - [Criando uma antecipação](#Criando-uma-antecipação) + - [Obtendo os limites de antecipação](#Obtendo-os-limites-de-antecipação) + - [Confirmando uma antecipação building](#Confirmando-uma-antecipação-building) + - [Cancelando uma antecipação pending](#Cancelando-uma-antecipação-pending) + - [Deletando uma antecipação building](#Deletando-uma-antecipação-building) + - [Retornando antecipações](#Retornando-antecipações) + - [Contas bancárias](#Contas-bancárias) + - [Criando uma conta bancária](#Criando-uma-conta-bancária) + - [Retornando uma conta bancária](#Retornando-uma-conta-bancária) + - [Retornando contas bancárias](#Retornando-contas-bancárias) + - [Recebedores](#Recebedores) + - [Criando um recebedor](#Criando-um-recebedor) + - [Retornando recebedores](#Retornando-recebedores) + - [Retornando um recebedor](#Retornando-um-recebedor) + - [Atualizando um recebedor](#Atualizando-um-recebedor) + - [Saldo de um recebedor](#Saldo-de-um-recebedor) + - [Operações de saldo de um recebedor](#Operações-de-saldo-de-um-recebedor) + - [Operação de saldo específica de um recebedor](#Operação-de-saldo-específica-de-um-recebedor) + - [Clientes](#Clientes) + - [Criando um cliente](#Criando-um-cliente) + - [Retornando clientes](#Retornando-clientes) + - [Retornando um cliente](#Retornando-um-cliente) +- [Suporte](#Suporte) +- [Licença](#Licença) +- [Contribuindo](#Contribuindo) + +# Instalação e configuração + +Para utilizar a biblioteca, você pode instalá-la via composer, com o comando: + ```sh -composer require 'pagarme/pagarme-php' +composer require 'pagarme/pagarme-php-v3.7.10' ``` -## Usage -### Basic -First you need to create an PagarMe object with your API-KEY (Avaliable on your [dashboard](https://dashboard.pagar.me/#/myaccount/apikeys)) +Então, basta importá-la para dentro de seu arquivo e instanciar o objeto `PagarMe`: + ```php +require __DIR__.'/vendor/autoload.php'; + $apiKey = 'ak_test_grXijQ4GicOa2BLGZrDRTR5qNQxJW0'; $pagarMe = new \PagarMe\Sdk\PagarMe($apiKey); ``` -### Wiki -Check the [wiki](https://github.com/pagarme/pagarme-php/wiki) for detailed documentation. -### Contributing +Nota: todos os exemplos listados aqui utilizam o objeto `$pagarMe` instanciado acima. + +# Utilizando a SDK + +## Parâmetros page e count + +`$page` representa o número da página e `$count` representa a quantidade de registros. Então, se você utilizar, `$page = 2` e `$count = 20` para buscar um objeto, serão retornados os 20~40 objetos mais recentes + +## Transações + +Nesta seção será explicado como utilizar transações no Pagar.me com essa biblioteca. + +### Criando uma transação + +```php + 13933139]; + +$customer = new \PagarMe\Sdk\Customer\Customer( + [ + 'name' => 'John Dove', + 'email' => 'john@site.com', + 'document_number' => '09130141095', + 'address' => [ + 'street' => 'rua teste', + 'street_number' => 42, + 'neighborhood' => 'centro', + 'zipcode' => '01227200', + 'complementary' => 'Apto 42', + 'city' => 'São Paulo', + 'state' => 'SP', + 'country' => 'Brasil' + ], + 'phone' => [ + 'ddd' => "15", + 'number' =>"987523421" + ], + 'born_at' => '15021994', + 'sex' => 'M' + ] +); + +$card = $pagarMe->card()->create( + '4242424242424242', + 'JOHN DOVE', + '0722' +); + +$recipient1 = $pagarMe->recipient()->get('re_civb4p9l7004xbm6dhsetkpj8'); +$recipient2 = $pagarMe->recipient()->get('re_civb4o6zr003u3m6e8dezzja6'); + +$splitRule1 = $pagarMe->splitRule()->percentageRule( + 40, + $recipient1, + true, // liable + true, // chargeProcessingFee, + true // chargeReminder +); + +$splitRule2 = $pagarMe->splitRule()->percentageRule( + 60, + $recipient, + true, // liable + true, // chargeProcessingFee, + false // chargeReminder +); + +$splitrules = new PagarMe\Sdk\SplitRule\SplitRuleCollection(); +$splitrules[0] = $splitRule1; +$splitrules[1] = $splitRule2; + +// Credit Card Transaction +$transaction = $pagarMe->transaction()->creditCardTransaction( + $amount, + $card, + $customer, + $installments, + $capture, + $postbackUrl, + $metadata, + ["split_rules" => $splitrules] +); + +// Boleto Transaction +$transaction2 = $pagarMe->transaction()->boletoTransaction( + $amount, + $customer, + $postbackUrl, + $metadata, + ["split_rules" => $splitrules] +); +``` + +### Capturando uma transação + +```php +transaction()->get(4752390); +$amountToCapture = 1000; +$metadata = ['idProduto' => '123']; // Parâmetro opcional + +$splitRules = new \PagarMe\Sdk\SplitRule\SplitRuleCollection(); // Parâmetro opcional + +$recipient1 = $pagarMe->recipient()->get('re_cjqgt03fv02bq4k6e3xbxxbia'); +$recipient2 = $pagarMe->recipient()->get('re_cjm0lfmy3001zaq6espflawv2'); + +$splitRule1 = $pagarMe->splitRule()->percentageRule( + 40, + $recipient1, + true, // liable + true, // chargeProcessingFee, + true // chargeReminder +); + +$splitRule2 = $pagarMe->splitRule()->percentageRule( + 60, + $recipient2, + true, // liable + true, // chargeProcessingFee, + false // chargeReminder +); + +$splitRules[] = $splitRule1; +$splitRules[] = $splitRule2; + +$pagarMe->transaction()->capture($transaction, $amountToCapture, $metadata, $splitRules); + +``` + +### Estornando uma transação + +```php +transaction()->get("1627830"); + +// Credit Card Refund +$transaction = $pagarMe->transaction()->creditCardRefund($transaction); + +// Boleto Refund +$bankAccount = $pagarMe->bankAccount()->create( + '341', + '0932', + '58054', + '5', + '26268738888', + 'API BANK ACCOUNT', + '1' +); + +$transaction = $pagarMe->transaction()->boletoRefund($transaciton, $bankAccount); +``` + +Esta funcionalidade também funciona com estornos parciais, ou estornos com split. Por exemplo: + +### Estornando uma transação parcialmente + +```php +transaction()->get("1627835"); +$amountRefunded = 20000; + +// Credit card +$transaction = $pagarMe->transaction()->creditCardRefund( + $transaction, + $amountRefunded +); + +// Boleto +$transaction = $pagarMe->transaction()->boletoRefund( + $transaciton, + $bankAccount, + $amountRefunded +); +``` + +### Estornando uma transação com split + +``` +Não possui essa feature. +``` + +### Retornando transações + +```php +transaction()->getList($page, $count); +``` + +### Retornando uma transação + +```php +transaction()->get($transactionId); +``` + +### Retornando recebíveis de uma transação + +``` +Não possui essa feature. +``` + +### Retornando um recebível de uma transação + +``` +Não possui essa feature. +``` + +### Retornando o histórico de operações de uma transação + +``` +Não possui essa feature. +``` + +### Notificando cliente sobre boleto a ser pago + +``` +Não possui essa feature. +``` + +### Retornando eventos de uma transação + +```php +$transactionId = "1627864"; +$transaction = $pagarMe->transaction()->get($transactionId); +$transactionEvents = $pagarMe->transaction()->events($transaction); +``` + +### Calculando pagamentos parcelados + +Essa rota não é obrigatória para uso. É apenas uma forma de calcular pagamentos parcelados com o Pagar.me. + +Para fins de explicação, utilizaremos os seguintes valores: + +`amount`: 1000, +`free_installments`: 4, +`max_installments`: 12, +`interest_rate`: 3 + +O parâmetro `free_installments` decide a quantidade de parcelas sem juros. Ou seja, se ele for preenchido com o valor `4`, as quatro primeiras parcelas não terão alteração em seu valor original. + +Nessa rota, é calculado juros simples, efetuando o seguinte calculo: + +valorTotal = valorDaTransacao * ( 1 + ( taxaDeJuros * numeroDeParcelas ) / 100 ) + +Então, utilizando os valores acima, na quinta parcela, a conta ficaria dessa maneira: + +valorTotal = 1000 * (1 + (3 * 5) / 100) + +Então, o valor a ser pago na quinta parcela seria de 15% da compra, totalizando 1150. + +Você pode usar o código abaixo caso queira utilizar essa rota: + +```php +calculation()->calculateInstallmentsAmount( + $amount, + $rate, + $rateFreeInstallments, + $maxInstallments +); + +$totalAmount = $installments[2]["total_amount"]; +$installmentAmount = $installments[2]["installment_amount"]; +``` + +### Testando pagamento de boletos + +```php +transaction()->payTransaction(1627871); +``` + +## Estornos + +Você pode visualizar todos os estornos que ocorreram em sua conta, com esse código: + +``` +Não possui essa feature. +``` + +## Cartões + +Sempre que você faz uma requisição através da nossa API, nós guardamos as informações do portador do cartão, para que, futuramente, você possa utilizá-las em novas cobranças, ou até mesmo implementar features como one-click-buy. + +### Criando cartões + +```php +card()->create( + $cardNumber, + $cardHolderName, + $cardExpirationDate, + $cardCvv +); + +//Create with card_hash +$card = $pagarMe->card()->createFromHash('card_hash'); +``` + +### Retornando cartões + +``` +Não possui essa feature. +``` + +### Retornando um cartão + +```php +$cardId = 'card_cj428xxsx01dt3f6dvre6belx'; +$card = $pagarMe->card()->get(cardId); +``` + +## Planos + +Representa uma configuração de recorrência a qual um cliente consegue assinar. +É a entidade que define o preço, nome e periodicidade da recorrência + +### Criando planos + +```php +$amount = 15000; +$days = 30; +$name = 'The Pro Plan - Platinum - Best Ever'; +$trialDays = 0; +$paymentsMethods = ['credit_card', 'boleto']; +$charges = null; +$installments = 1; + +$plan = $pagarMe->plan()->create( + $amount, + $days, + $name, + $trialDays, + $paymentsMethods, + $charges, + $installments +); +``` + +### Retornando planos + +```php +plan()->getList($page, $count); +``` + +### Retornando um plano + +```php +plan()->get(164526); +``` + +### Atualizando um plano + +```php +plan()->get(163871); +$oldPlan->setName('The Pro Plan - Susan'); +$oldPlan->setTrialDays('7'); + +$newPlan = $pagarMe->plan()->update($oldPlan); +``` + +## Assinaturas + +### Criando assinaturas + +```php +plan()->get($planId); + +$cardId = 'card_cizri9czn00csfi6e1ygzw9vz'; +$card = $pagarMe->card()->get($cardId); +$metadata = ['idAssinatura' => '123']; +$extraAttributtes = [ + 'soft_descriptor' => 'Minha empresa' +]; + +$postbackUrl = 'http://requestb.in/zyn5obzy'; + +$customer = new \PagarMe\Sdk\Customer\Customer( + [ + 'name' => 'John Dove', + 'email' => 'john@site.com', + 'document_number' => '09130141095', + 'address' => new \PagarMe\Sdk\Customer\Address([ + 'street' => 'rua teste', + 'street_number' => 42, + 'neighborhood' => 'centro', + 'zipcode' => '01227200', + 'complementary' => 'Apto 42', + 'city' => 'São Paulo', + 'state' => 'SP', + 'country' => 'Brasil' + ]), + 'phone' => new \PagarMe\Sdk\Customer\Phone([ + 'ddd' => "15", + 'number' =>"987523421" + ]), + 'born_at' => '15021994', + 'sex' => 'M' + ] +); + +// Credit card subscription +$subscription = $pagarMe->subscription()->createCardSubscription( + $plan, + $card, + $customer, + $postbackUrl, + $metadata, + $extraAttributes +); + +// Boleto Subscription +$subscription = $pagarMe->subscription()->createBoletoSubscription( + $transaction, + $customer, + $postbackUrl, + $metadata, + $extraAttributtes +); +``` + +### Split com assinatura + +```php +plan()->get($planId); + +$cardId = 'card_cizri9czn00csfi6e1ygzw9vz'; +$card = $pagarMe->card()->get($cardId); +$metadata = ['idAssinatura' => '123']; + +$postbackUrl = 'http://requestb.in/zyn5obzy'; + +$customer = new \PagarMe\Sdk\Customer\Customer( + [ + 'name' => 'John Dove', + 'email' => 'john@site.com', + 'document_number' => '09130141095', + 'address' => new \PagarMe\Sdk\Customer\Address([ + 'street' => 'rua teste', + 'street_number' => 42, + 'neighborhood' => 'centro', + 'zipcode' => '01227200', + 'complementary' => 'Apto 42', + 'city' => 'São Paulo', + 'state' => 'SP', + 'country' => 'Brasil' + ]), + 'phone' => new \PagarMe\Sdk\Customer\Phone([ + 'ddd' => "15", + 'number' =>"987523421" + ]), + 'born_at' => '15021994', + 'sex' => 'M' + ] +); + +$splitRules = new \PagarMe\Sdk\SplitRule\SplitRuleCollection(); + +$recipient1 = $pagarMe->recipient()->get('re_cjqgt03fv02bq4k6e3xbxxbia'); +$recipient2 = $pagarMe->recipient()->get('re_cjm0lfmy3001zaq6espflawv2'); + +$splitRule1 = $pagarMe->splitRule()->percentageRule( + 40, + $recipient1, + true, // liable + true, // chargeProcessingFee, + true // chargeReminder +); + +$splitRule2 = $pagarMe->splitRule()->percentageRule( + 60, + $recipient2, + true, // liable + true, // chargeProcessingFee, + false // chargeReminder +); + +$splitRules[] = $splitRule1; +$splitRules[] = $splitRule2; + + +// Credit card subscription +$subscription = $pagarMe->subscription()->createCardSubscription( + $plan, + $card, + $customer, + $postbackUrl, + $metadata, + ['split_rules' => $splitRules] +); + +// Boleto Subscription +$subscription = $pagarMe->subscription()->createBoletoSubscription( + $transaction, + $customer, + $postbackUrl, + $metadata, + ['split_rules' => $splitRules] +); +``` + +### Retornando uma assinatura + +```php +subscription()->get(205881); +``` + +### Retornando assinaturas + +```php +subscription()->getList($page, $count); +``` + +### Atualizando uma assinatura + +```php +subscription()->get(184577); +$newPlan = $pagarMe->plan()->get(166234); +$subscription->setPlan($newPlan); +$subscription->setPaymentMethod('credit_card'); +$card = $pagarMe->card()->get('card_cj41mpuhc01bb3f6d8exeo072'); +$subscription->setCard($card); + +$updatedSubscription = $pagarMe->subscription()->update($subscription); +``` + +### Cancelando uma assinatura + +```php +subscription()->get($subscriptionId); +$subscription = $pagarMe->subscription()->cancel($subscription); +``` + +### Transações de assinatura + +```php +subscription()->get($subscriptionId); +$transactions = $pagarMe->subscription()->transactions($subscription); +``` + +### Pulando cobranças + +``` +Não possui essa feature. +``` + +## Postbacks + +Ao criar uma transação ou uma assinatura você tem a opção de passar o parâmetro `postback_url` na requisição. Essa é uma URL do seu sistema que irá então receber notificações a cada alteração de status dessas transações/assinaturas. + +Para obter informações sobre postbacks, 3 informações serão necessárias, sendo elas: `model`, `model_id` e `postback_id`. + +`model`: Se refere ao objeto que gerou aquele POSTback. Pode ser preenchido com o valor `transaction` ou `subscription`. + +`model_id`: Se refere ao ID do objeto que gerou ao POSTback, ou seja, é o ID da transação ou assinatura que você quer acessar os POSTbacks. + +`postback_id`: Se refere à notificação específica. Para cada mudança de status de uma assinatura ou transação, é gerado um POSTback. Cada POSTback pode ter várias tentativas de entregas, que podem ser identificadas pelo campo `deliveries`, e o ID dessas tentativas possui o prefixo `pd_`. O campo que deve ser enviado neste parâmetro é o ID do POSTback, que deve ser identificado pelo prefixo `po_`. + +### Retornando postbacks + +```php +$transactionId = 1159049; +$transaction = $pagarMe->transaction()->get(transactionId); +$postbacks = $pagarMe->postback()->getList($transaction); +``` + +### Retornando um postback + +```php +transaction()->get($transactionId); + +$postbackId = 'po_ciat6ssga0022k06ng8vxg'; +$postbacks = $pagarMe->postback()->get( + $transaction, + $postbackId +); +``` + +### Reenviando um postback + +```php +transaction()->get($transactionId); + +$postbackId = 'po_cj4haa8l4131bpi73glgzbnpp'; +$postbacks = $pagarMe->postback()->redeliver( + $transaction, + $postbackId +); +``` + +### Validando uma requisição de postback + +```php +postback()->validateRequest($postbackBody, $signature) { + echo "POSTback válido"; +} else { + echo "POSTback inválido"; +} +``` + +Observação: o código acima serve somente de exemplo para que o processo de validação funcione. Recomendamos que utilize ferramentas fornecidas por bibliotecas ou frameworks para recuperar estas informações de maneira mais adequada. + +## Saldo do recebedor principal + +Para saber o saldo de sua conta, você pode utilizar esse código: + +```php +balance()->get(); +``` + +## Operações de saldo + +Com este objeto você pode acompanhar todas as movimentações financeiras ocorridas em sua conta Pagar.me. + +### Histórico das operações + +```php +balanceOperation()->getList(); +``` + +### Histórico de uma operação específica + +``` +$operation = $pagarme->balanceOperation()->get(4861); +``` + +## Recebível + +Objeto contendo os dados de um recebível. O recebível (payable) é gerado automaticamente após uma transação ser paga. Para cada parcela de uma transação é gerado um recebível, que também pode ser dividido por recebedor (no caso de um split ter sido feito). + +### Retornando recebíveis + +```php +payable()->getList($page, $count); +``` + +### Retornando um recebível + +```php +payable()->get("573310"); +``` + +## Transferências + +Transferências representam os saques de sua conta. + +### Criando uma transferência + +```php +recipient()->get('re_citkg218g00hl8q6dh1pr5mld'); + +$transfer = $pagarMe->transfer()->create( + $amount, + $recipient +); +``` + +### Retornando transferências + +```php +transfer()->getList($page, $count) +``` + +### Retornando uma transferência + +```php +transfer()->get("16264"); +``` + +### Cancelando uma transferência + +```php +transfer()->get("16264"); +$canceledTransfer = $pagarMe->transfer()->cancel($transfer); +``` + +## Antecipações + +Para entender o que são as antecipações, você deve acessar esse [link](https://docs.pagar.me/docs/overview-antecipacao). + +### Criando uma antecipação + +```php + $recipientId +]); + +$date = new \DateTime(); +$date->add(new \DateInterval("P10D")); +$timeframe = 'end'; +$requestedAmount = 13000; +$build = true; +$anticipation = $pagarMe->bulkAnticipation()->create( + $recipient, + $date, + $timeframe, + $requestedAmount, + $build +); +``` + +### Obtendo os limites de antecipação + +```php + recipientId +]); + +$paymentDate = new \DateTime(); +$paymentDate->add(new \DateInterval("P10D")); +$timeframe = 'end'; +$limits = $pagarMe->bulkAnticipation()->limits( + $recipient, + $paymentDate, + $timeframe +); +``` + +### Confirmando uma antecipação building + +```php + "re_ciu4jif1j007td56dsm17yew9" +]); + +$anticipation = new PagarMe\Sdk\BulkAnticipation\BulkAnticipation([ + "id" => "ba_cj3uppown001gvm6dqgmjw2ce" +]); + +$anticipation = $pagarMe->bulkAnticipation()->confirm( + $recipient, + $anticipation +); +``` + +### Cancelando uma antecipação pending + +```php + "re_ciu4jif1j007td56dsm17yew9" +]); + +$anticipation = new PagarMe\Sdk\BulkAnticipation\BulkAnticipation([ + "id" => "ba_cj3ur2rpl002bpn6ektsnc9lu" +]); + +$anticipation = $pagarMe->bulkAnticipation()->cancel( + $recipient, + $anticipation +); +``` + +### Deletando uma antecipação building + +```php + "re_ciu4jif1j007td56dsm17yew9" +]); + +$anticipation = new PagarMe\Sdk\BulkAnticipation\BulkAnticipation([ + "id" => "ba_cj3us6nal0022v86daxfamp4t" +]); + +$anticipation = $pagarMe->bulkAnticipation()->delete( + $recipient, + $anticipation +); +``` + +### Retornando antecipações + +```php + $recipientId +]); +$anticipationList = $pagarMe->bulkAnticipation()->getList( + $recipient, + $page, + $count +); +``` + +## Contas bancárias + +Contas bancárias identificam para onde será enviado o dinheiro de futuros pagamentos. + +### Criando uma conta bancária + +```php +bankAccount()->create( + $bankCode, + $agenciaNumber, + $accountNumber, + $accountDigit, + $documentNumber, + $legalName, + $agenciaDigit +); +``` + +## Retornando uma conta bancária + +```php +bankAccount()->get($bankAccountId); +``` + +## Retornando contas bancárias + +```php +bankAccount()->getList($page, $count); +``` + +# Recebedores + +Para dividir uma transação entre várias entidades, é necessário ter um recebedor para cada uma dessas entidades. Recebedores contém informações da conta bancária para onde o dinheiro será enviado, e possuem outras informações para saber quanto pode ser antecipado por ele, ou quando o dinheiro de sua conta será sacado automaticamente. + +## Criando um recebedor + +```php + 17490076 +]); + +$transferInterval = "monthly"; +$transferDay = 13; +$transferEnabled = true; +$automaticAnticipationEnabled = true; +$anticipatableVolumePercentage = 42; +$recipient = $pagarMe->recipient()->create( + $bankAccount, + $transferInterval, + $transferDay, + $transferEnabled, + $automaticAnticipationEnabled, + $anticipatableVolumePercentage +); +``` + +### Retornando recebedores + +```php +recipient()->getList($page, $count); +``` + +### Retornando um recebedor + +```php +recipient()->get($recipientId); +``` + +### Atualizando um recebedor + +```php + $recipientId, + "anticipatable_volume_percentage" => "50", + "transfer_enabled" => true, + "transfer_interval" => "monthly", + "transfer_day" => 15, + "bank_account" => new \PagarMe\Sdk\BankAccount\BankAccount([ + "id" => "17492906" + ]) +]); + +$updatedRecipient = $pagarMe->recipient()->update( + $recipient +); +``` + +### Saldo de um recebedor + +```php +recipient()->get($recipientId); +$balance = $pagarMe->recipient()->balance($recipient); +``` + +### Operações de saldo de um recebedor + +```php +recipient()->get($recipientId); +$balance = $pagarMe->recipient()->balanceOperations($recipient, $page, $count); +``` + +### Operação de saldo específica de um recebedor + +```php +recipient()->get($recipientId); +$balanceOperationId = 2043993; +$operation = $pagarMe->recipient()->balanceOperation($recipient, $balanceOperationId); +``` + +## Clientes + +Clientes representam os usuários de sua loja, ou negócio. Este objeto contém informações sobre eles, como nome, e-mail e telefone, além de outros campos. + +### Criando um cliente + +```php +customer()->create( + 'John Dove', + 'john@site.com', + '09130141095', + /** @var $address \PagarMe\Sdk\Customer\Address */ + $address, + /** @var $phone \PagarMe\Sdk\Customer\Phone */ + $phone, + '15021994', + 'M' +); +``` + +### Retornando clientes + +```php +customer()->getList(); +``` + +### Retornando um cliente + +```php +customer()->get(11222); +``` + +# Suporte + +Se você tiver qualquer problema ou sugestão, por favor abra uma issue [aqui](https://github.com/pagarme/pagarme-php/issues). + +# Contribuindo -**Also** checkout our [contributing guide](CONTRIBUTING.md) before you send us any contribution. +Veja nosso [guia de contribuição](CONTRIBUTING.md) antes de nos enviar sua contribuição. diff --git a/composer.json b/composer.json index c3937e6..6b9f76d 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "pagarme/pagarme-php", + "name": "liveecommerce/pagarme-php", "description": "Pagar.Me PHP Library", "type": "lib", "keywords": [ @@ -14,7 +14,7 @@ "license": "MIT", "require": { "php": ">=5.4.0", - "guzzlehttp/guzzle": ">=5.3" + "guzzlehttp/guzzle": "7.5.*" }, "require-dev": { "ext-mbstring": "*", diff --git a/lib/CaseConverter.php b/lib/CaseConverter.php index e233520..adad2c7 100644 --- a/lib/CaseConverter.php +++ b/lib/CaseConverter.php @@ -4,8 +4,6 @@ trait CaseConverter { - use CaseConverter; - /** * @param string $sentence * @return string diff --git a/lib/Client.php b/lib/Client.php index 6052a1f..7486e54 100644 --- a/lib/Client.php +++ b/lib/Client.php @@ -53,15 +53,16 @@ public function __construct( */ public function send(RequestInterface $apiRequest) { - $request = $this->buildRequest($apiRequest); + $options = array_merge($this->requestOptions, [ + 'body' => json_encode($this->buildBody($apiRequest)), + 'headers' => [ + 'Content-Type' => 'application/json', + 'ServiceRefererName' => '62fa7b926ae07600199d7dfc' + ] + ]); try { - $response = $this->client->send( - $request, - $this->requestOptions - ); - - return json_decode($response->getBody()->getContents()); + $response = $this->client->request($apiRequest->getMethod(), $apiRequest->getPath(), $options); } catch (\GuzzleHttp\Exception\ClientException $exception) { $message = $exception->getResponse()->getBody()->getContents(); $code = $exception->getResponse()->getStatusCode(); @@ -72,36 +73,8 @@ public function send(RequestInterface $apiRequest) $exception->getCode() ); } - } - - /** - * @param RequestInterface $apiRequest - * @return mixed - */ - private function buildRequest($apiRequest) - { - if (class_exists('\\GuzzleHttp\\Message\\Request')) { - $options = array_merge( - $this->requestOptions, - ['json' => $this->buildBody($apiRequest)] - ); - return $this->client->createRequest( - $apiRequest->getMethod(), - $apiRequest->getPath(), - $options - ); - } - - if (class_exists('\\GuzzleHttp\\Psr7\\Request')) { - return new \GuzzleHttp\Psr7\Request( - $apiRequest->getMethod(), - $apiRequest->getPath(), - ['Content-Type' => 'application/json'], - json_encode($this->buildBody($apiRequest)) - ); - } - throw new \Exception("Can't build request"); + return json_decode($response->getBody()->getContents()); } /** diff --git a/lib/Customer/CustomerBuilder.php b/lib/Customer/CustomerBuilder.php index 427720c..1e4ebc5 100644 --- a/lib/Customer/CustomerBuilder.php +++ b/lib/Customer/CustomerBuilder.php @@ -10,11 +10,15 @@ trait CustomerBuilder */ private function buildCustomer($customerData) { - $customerData->address = new Address( - get_object_vars($customerData->addresses[0]) - ); + if (count($customerData->addresses) > 0) { + $customerData->address = new Address( + get_object_vars($customerData->addresses[0]) + ); + } - $customerData->phone = new Phone($customerData->phones[0]); + if (count($customerData->phones) > 0) { + $customerData->phone = new Phone($customerData->phones[0]); + } $customerData->date_created = new \DateTime( $customerData->date_created diff --git a/lib/PagarMe.php b/lib/PagarMe.php index bec8f1a..0ec812e 100644 --- a/lib/PagarMe.php +++ b/lib/PagarMe.php @@ -10,6 +10,7 @@ use PagarMe\Sdk\Recipient\RecipientHandler; use PagarMe\Sdk\Plan\PlanHandler; use PagarMe\Sdk\SplitRule\SplitRuleHandler; +use PagarMe\Sdk\PixAdditionalField\PixAdditionalFieldHandler; use PagarMe\Sdk\Transfer\TransferHandler; use PagarMe\Sdk\Company\CompanyHandler; use PagarMe\Sdk\BankAccount\BankAccountHandler; @@ -25,6 +26,8 @@ class PagarMe { + const VERSION = '3.9.2'; + /** * @param Client */ @@ -65,6 +68,11 @@ class PagarMe */ private $splitRuleHandler; + /** + * @param PixAdditionalFieldHandler + */ + private $pixAdditionalFieldHandler; + /** * @param TransferHandler */ @@ -136,13 +144,15 @@ public function __construct( $headers = [], $requestOptions = [] ) { + $requestHeaders = new RequestHeaders(); + $this->client = new Client( new GuzzleClient( [ 'base_url' => 'https://api.pagar.me/1/', 'base_uri' => 'https://api.pagar.me/1/', 'defaults' => [ - 'headers' => $headers + 'headers' => $requestHeaders->getSdkHeaders($headers) ] ] ), @@ -236,6 +246,18 @@ public function splitRule() return $this->splitRuleHandler; } + /** + * @return PixAdditionalFieldHandler + */ + public function pixAdditionalField() + { + if (!$this->pixAdditionalFieldHandler instanceof PixAdditionalFieldHandler) { + $this->pixAdditionalFieldHandler = new PixAdditionalFieldHandler(); + } + + return $this->pixAdditionalFieldHandler; + } + /** * @return transferHandler */ diff --git a/lib/PixAdditionalField/PixAdditionalField.php b/lib/PixAdditionalField/PixAdditionalField.php new file mode 100644 index 0000000..31d536d --- /dev/null +++ b/lib/PixAdditionalField/PixAdditionalField.php @@ -0,0 +1,42 @@ +fill($pixAdditionalFieldData); + } + + /** + * @return string + * @codeCoverageIgnore + */ + public function getName() + { + return $this->name; + } + + /** + * @return string + * @codeCoverageIgnore + */ + public function getValue() + { + return $this->value; + } +} diff --git a/lib/PixAdditionalField/PixAdditionalFieldBuilder.php b/lib/PixAdditionalField/PixAdditionalFieldBuilder.php new file mode 100644 index 0000000..ea2c289 --- /dev/null +++ b/lib/PixAdditionalField/PixAdditionalFieldBuilder.php @@ -0,0 +1,25 @@ +date_created = new \DateTime($field->date_created); + $field->date_updated = new \DateTime($field->date_updated); + $fields[] = new PixAdditionalField(get_object_vars($field)); + } + } + + return $fields; + } +} diff --git a/lib/PixAdditionalField/PixAdditionalFieldCollection.php b/lib/PixAdditionalField/PixAdditionalFieldCollection.php new file mode 100644 index 0000000..b59a8a5 --- /dev/null +++ b/lib/PixAdditionalField/PixAdditionalFieldCollection.php @@ -0,0 +1,81 @@ +fields[] = $value; + } else { + $this->fields[$offset] = $value; + } + } + + public function offsetExists($offset) + { + return isset($this->fields[$offset]); + } + + public function offsetUnset($offset) + { + unset($this->fields[$offset]); + } + + public function offsetGet($offset) + { + return isset($this->fields[$offset]) ? $this->fields[$offset] : null; + } + + public function rewind() + { + $this->position = 0; + } + + public function current() + { + return $this->fields[$this->position]; + } + + public function key() + { + return $this->position; + } + + public function next() + { + ++$this->position; + } + + public function valid() + { + return isset($this->fields[$this->position]); + } + + /** + * @return int + */ + public function count() + { + return count($this->fields); + } +} diff --git a/lib/PixAdditionalField/PixAdditionalFieldHandler.php b/lib/PixAdditionalField/PixAdditionalFieldHandler.php new file mode 100644 index 0000000..e511c07 --- /dev/null +++ b/lib/PixAdditionalField/PixAdditionalFieldHandler.php @@ -0,0 +1,23 @@ + $name, + 'value' => $value, + ] + ); + } +} diff --git a/lib/PixAdditionalFieldSerializer.php b/lib/PixAdditionalFieldSerializer.php new file mode 100644 index 0000000..616e9cc --- /dev/null +++ b/lib/PixAdditionalFieldSerializer.php @@ -0,0 +1,29 @@ + $pixAdditionalField) { + $field = [ + 'name' => $pixAdditionalField->getName(), + 'value' => $pixAdditionalField->getValue() + ]; + + $fields[$key] = $field; + } + + return $fields; + } +} diff --git a/lib/RequestHeaders.php b/lib/RequestHeaders.php new file mode 100644 index 0000000..38b76f2 --- /dev/null +++ b/lib/RequestHeaders.php @@ -0,0 +1,65 @@ +addUserAgentHeader($headers); + $headerWithPagarMeUserAgent = $this->addPagarMeUserAgentHeader( + $headerWithUserAgent + ); + + return $headerWithPagarMeUserAgent; + } + + /** + * @param array $headers + * + * @return array + */ + private function addPagarMeUserAgentHeader($headers) + { + if (isset($headers['X-PagarMe-User-Agent'])) { + $headers['X-PagarMe-User-Agent'] .= ' ' . $this->getDefaultHeaders(); + + return $headers; + } + + $headers['X-PagarMe-User-Agent'] = $this->getDefaultHeaders(); + + return $headers; + } + + /** + * @param array $headers + * + * @return array + */ + private function addUserAgentHeader($headers) + { + if (isset($headers['User-Agent'])) { + $headers['User-Agent'] .= ' ' . $this->getDefaultHeaders(); + + return $headers; + } + + $headers['User-Agent'] = $this->getDefaultHeaders(); + + return $headers; + } + + /** + * @return string + */ + private function getDefaultHeaders() + { + return 'pagarme-php/' . PagarMe::VERSION . ' php/' . phpversion(); + } +} diff --git a/lib/Transaction/AbstractTransaction.php b/lib/Transaction/AbstractTransaction.php index ca08262..c5a8ef8 100644 --- a/lib/Transaction/AbstractTransaction.php +++ b/lib/Transaction/AbstractTransaction.php @@ -16,6 +16,8 @@ abstract class AbstractTransaction const WAITING_PAYMENT = 'waiting_payment'; const PENDING_REFUND = 'pending_refund'; const REFUSED = 'refused'; + const PENDING_REVIEW = 'pending_review'; + const ANALYZING = 'analyzing'; /** * @var int @@ -483,6 +485,22 @@ public function isRefused() return $this->status == self::REFUSED; } + /** + * @return boolean + */ + public function isPendingReview() + { + return $this->status == self::PENDING_REVIEW; + } + + /** + * @return boolean + */ + public function isAnalyzing() + { + return $this->status == self::ANALYZING; + } + /** * @return \PagarMe\Sdk\SplitRule\SplitRuleCollection * @codeCoverageIgnore diff --git a/lib/Transaction/PixTransaction.php b/lib/Transaction/PixTransaction.php new file mode 100644 index 0000000..ba5e38f --- /dev/null +++ b/lib/Transaction/PixTransaction.php @@ -0,0 +1,73 @@ +paymentMethod = self::PAYMENT_METHOD; + } + + /** + * @return \DateTime + * @codeCoverageIgnore + */ + public function getPixExpirationDate() + { + return $this->pixExpirationDate; + } + + /** + * @return string + * @codeCoverageIgnore + */ + public function getPixQrCode() + { + return $this->pixQrCode; + } + + /** + * @return string + * @codeCoverageIgnore + */ + public function getSoftDescriptor() + { + return $this->softDescriptor; + } + + /** + * @return \PagarMe\Sdk\PixAdditionalField\PixAdditionalFieldCollection + * @codeCoverageIgnore + */ + public function getPixAdditionalFields() + { + return $this->pixAdditionalFields; + } +} diff --git a/lib/Transaction/Request/PixTransactionCreate.php b/lib/Transaction/Request/PixTransactionCreate.php new file mode 100644 index 0000000..5dbd3ff --- /dev/null +++ b/lib/Transaction/Request/PixTransactionCreate.php @@ -0,0 +1,40 @@ +transaction = $transaction; + } + + /** + * return array + */ + public function getPayload() + { + $basicData = parent::getPayload(); + + $pixData = [ + 'pix_expiration_date' => $this->transaction->getPixExpirationDate(), + 'soft_descriptor' => $this->transaction->getSoftDescriptor(), + ]; + + if ($this->transaction->getPixAdditionalFields() instanceof PixAdditionalFieldCollection) { + $pixData['pix_additional_fields'] = $this->getPixAdditionalFieldsInfo( + $this->transaction->getPixAdditionalFields() + ); + } + + return array_merge($basicData, $pixData); + } +} diff --git a/lib/Transaction/Request/PixTransactionRefund.php b/lib/Transaction/Request/PixTransactionRefund.php new file mode 100644 index 0000000..c2f30a4 --- /dev/null +++ b/lib/Transaction/Request/PixTransactionRefund.php @@ -0,0 +1,55 @@ +transaction = $transaction; + $this->amount = $amount; + } + + /** + * @param string + */ + public function getPayload() + { + return [ + 'amount' => $this->amount + ]; + } + + /** + * @param string + */ + public function getPath() + { + return sprintf('transactions/%d/refund', $this->transaction->getId()); + } + + /** + * @param string + */ + public function getMethod() + { + return self::HTTP_POST; + } +} diff --git a/lib/Transaction/TransactionBuilder.php b/lib/Transaction/TransactionBuilder.php index aead47a..bd94823 100644 --- a/lib/Transaction/TransactionBuilder.php +++ b/lib/Transaction/TransactionBuilder.php @@ -54,6 +54,10 @@ private function buildTransaction($transactionData) return new CreditCardTransaction(get_object_vars($transactionData)); } + if ($transactionData->payment_method == PixTransaction::PAYMENT_METHOD) { + return new PixTransaction(get_object_vars($transactionData)); + } + throw new UnsupportedTransaction( sprintf( 'Transaction type: %s, is not supported', diff --git a/lib/Transaction/TransactionHandler.php b/lib/Transaction/TransactionHandler.php index 52c2211..b4a6541 100644 --- a/lib/Transaction/TransactionHandler.php +++ b/lib/Transaction/TransactionHandler.php @@ -7,6 +7,7 @@ use PagarMe\Sdk\Payable\PayableBuilder; use PagarMe\Sdk\Transaction\Request\CreditCardTransactionCreate; use PagarMe\Sdk\Transaction\Request\BoletoTransactionCreate; +use PagarMe\Sdk\Transaction\Request\PixTransactionCreate; use PagarMe\Sdk\Transaction\Request\TransactionGet; use PagarMe\Sdk\Transaction\Request\TransactionList; use PagarMe\Sdk\Transaction\Request\TransactionCapture; @@ -14,12 +15,14 @@ use PagarMe\Sdk\Transaction\Request\TransactionPayables; use PagarMe\Sdk\Transaction\Request\CreditCardTransactionRefund; use PagarMe\Sdk\Transaction\Request\BoletoTransactionRefund; +use PagarMe\Sdk\Transaction\Request\PixTransactionRefund; use PagarMe\Sdk\Transaction\Request\TransactionPay; use PagarMe\Sdk\BankAccount\BankAccount; use PagarMe\Sdk\Card\Card; use PagarMe\Sdk\Customer\Customer; use PagarMe\Sdk\Recipient\Recipient; use PagarMe\Sdk\SplitRule\SplitRuleCollection; +use PagarMe\Sdk\PixAdditionalField\PixAdditionalFieldCollection; class TransactionHandler extends AbstractHandler { @@ -102,9 +105,51 @@ public function boletoTransaction( return $this->buildTransaction($response); } + /** + * @param int $amount + * @param \PagarMe\Sdk\Customer\Customer $customer + * @param string $postBackUrl + * @param mixed $metadata + * @param \DateTime $pixExpirationDate + * @param array $extraAttributes + * @return PixTransaction + */ + public function pixTransaction( + $amount, + Customer $customer, + $postBackUrl, + $metadata = null, + $pixExpirationDate = null, + $extraAttributes = [] + ) { + $transactionData = array_merge( + [ + 'amount' => $amount, + 'customer' => $customer, + 'postbackUrl' => $postBackUrl, + 'metadata' => $metadata, + 'pix_expiration_date' => $pixExpirationDate + ], + $extraAttributes + ); + + $transaction = new PixTransaction($transactionData); + + $request = new PixTransactionCreate($transaction); + + try { + $response = $this->client->send($request); + return $this->buildTransaction($response); + } catch (Exception $e) { + $message = $e->getMessage(); + $code = $e->getCode(); + throw new Exception($message, $code); + } + } + /** * @param int $transactionId - * @return BoletoTransaction | CreditCardTransaction + * @return BoletoTransaction | CreditCardTransaction | PixTransaction */ public function get($transactionId) { @@ -207,6 +252,19 @@ public function boletoRefund( return $this->buildTransaction($response); } + /** + * @param PixTransaction $transaction + * @param int $amount + * @return PixTransaction + */ + public function pixRefund(PixTransaction $transaction, $amount = null) + { + $request = new PixTransactionRefund($transaction, $amount); + $response = $this->client->send($request); + + return $this->buildTransaction($response); + } + /** * @param BoletoTransaction $transaction * @return BoletoTransaction diff --git a/tests/acceptance/BulkAnticipationContext.php b/tests/acceptance/BulkAnticipationContext.php index 114907a..799e021 100644 --- a/tests/acceptance/BulkAnticipationContext.php +++ b/tests/acceptance/BulkAnticipationContext.php @@ -66,15 +66,15 @@ public function registerAAnticipationWith($paymentDate, $timeframe, $requestedAm { $build = filter_var($build, FILTER_VALIDATE_BOOLEAN); - $paymentDate = new \Datetime($paymentDate); + $paymentDate = new \Datetime($paymentDate, new \DateTimeZone('UTC')); $weekday = $paymentDate->format('w'); if (in_array($weekday, [0,6])) { - $paymentDate = new \Datetime('+3 days'); + $paymentDate = new \Datetime('+3 days', new \DateTimeZone('UTC')); } - $paymentDate->setTime(0, 0, 0); + $paymentDate->setTime(3, 0, 0); $this->expectedPaymentDate = $paymentDate; $this->expectedTimeframe = $timeframe; @@ -106,10 +106,10 @@ public function aAnticipationMustBeCreated() */ public function mustAnticipationContainSameData() { - assertEquals($this->anticipation->getPaymentDate(), $this->expectedPaymentDate); - assertEquals($this->anticipation->getTimeframe(), $this->expectedTimeframe); + assertEquals($this->expectedPaymentDate, $this->anticipation->getPaymentDate()); + assertEquals($this->expectedTimeframe, $this->anticipation->getTimeframe()); - assertEquals($this->anticipation->getStatus(), $this->expectedStatus); + assertEquals($this->expectedStatus, $this->anticipation->getStatus()); } /** diff --git a/tests/acceptance/TransactionContext.php b/tests/acceptance/TransactionContext.php index dff5fcc..05da947 100644 --- a/tests/acceptance/TransactionContext.php +++ b/tests/acceptance/TransactionContext.php @@ -244,6 +244,8 @@ public function thenTransactionMustBeRetriavable() */ public function thenTransactionPayablesMustBeRetriavable() { + sleep(10); + $payables = self::getPagarMe() ->transaction() ->payables($this->transaction->getId()); @@ -297,6 +299,8 @@ public function aPaidTransactionMustBeCreatedWithPaidAmount($amount) */ public function fullRefundTheTransaction() { + sleep(5); + $this->transaction = $transaction = self::getPagarMe() ->transaction() ->creditCardRefund($this->transaction); @@ -316,6 +320,8 @@ public function theTransactionMustBeRefunded() */ public function refundGivenTheTransaction($amount) { + sleep(5); + $this->transaction = $transaction = self::getPagarMe() ->transaction() ->creditCardRefund($this->transaction, $amount); diff --git a/tests/acceptance/features/transaction.feature b/tests/acceptance/features/transaction.feature index 4873156..8c72cfa 100644 --- a/tests/acceptance/features/transaction.feature +++ b/tests/acceptance/features/transaction.feature @@ -10,9 +10,9 @@ Feature: Transaction Then a paid transaction must be created Examples: | number | holder | expiration | amount | installments | - | 4556425889100276 | João Silva | 0623 | 20000 | 1 | + | 4556425889100276 | João Silva | 0623 | 20000 | 3 | | 5435375979338399 | Maria Silva | 0623 | 9900 | 7 | - | 30171632321686 | Pedro Silva | 0623 | 250 | 3 | + | 30171632321686 | Pedro Silva | 0623 | 250 | 1 | | 341611978581611 | Cesar Silva | 0623 | 1337 | 12 | | 6062825718246608 | Carla Silva | 0623 | 123456 | 10 | | 6363685469431429 | Marta Silva | 0623 | 1000001 | 1 | @@ -25,10 +25,10 @@ Feature: Transaction And the transaction must be refunded Examples: | number | holder | expiration | amount | installments | - | 4539225249511077 | João Silva | 0623 | 1000 | 1 | + | 4539225249511077 | João Silva | 0623 | 1000 | 3 | | 5326284789092430 | Maria Silva | 0623 | 1300 | 7 | - | 36016500807288 | Pedro Silva | 0623 | 1500 | 3 | - | 377255656605321 | Cesar Silva | 0623 | 2100 | 12 | + | 36016500807288 | Pedro Silva | 0623 | 500 | 1 | + | 377255656605321 | Cesar Silva | 0623 | 210 | 2 | | 6062820984030620 | Carla Silva | 0623 | 4000 | 10 | | 5041754009357643 | Marta Silva | 0623 | 5000 | 1 | @@ -39,10 +39,10 @@ Feature: Transaction Then refund given "" the transaction And the transaction must be refunded with "" Examples: - | number | holder | expiration | amount | installments | value | - | 4539225249511077 | João Silva | 0623 | 1000 | 1 | 500 | + | number | holder | expiration | amount | installments | value | + | 4539225249511077 | João Silva | 0623 | 1000 | 3 | 500 | | 5326284789092430 | Maria Silva | 0623 | 1300 | 7 | 700 | - | 36016500807288 | Pedro Silva | 0623 | 1500 | 3 | 1300 | + | 36016500807288 | Pedro Silva | 0623 | 1500 | 1 | 1300 | | 377255656605321 | Cesar Silva | 0623 | 2100 | 12 | 2000 | | 6062820984030620 | Carla Silva | 0623 | 4000 | 10 | 1337 | | 5041754009357643 | Marta Silva | 0623 | 5000 | 1 | 2500 | @@ -54,9 +54,9 @@ Feature: Transaction Then a authorized transaction must be created Examples: | number | holder | expiration | amount | installments | - | 4556655568781331 | João Silva | 0623 | 20000 | 1 | + | 4556655568781331 | João Silva | 0623 | 20000 | 3 | | 5312843659611045 | Maria Silva | 0623 | 9900 | 7 | - | 38207356445228 | Pedro Silva | 0623 | 250 | 3 | + | 38207356445228 | Pedro Silva | 0623 | 250 | 1 | | 371604330597394 | Cesar Silva | 0623 | 1337 | 12 | | 6062824410079680 | Carla Silva | 0623 | 123456 | 10 | | 5041754485700738 | Marta Silva | 0623 | 1000001 | 1 | @@ -69,9 +69,9 @@ Feature: Transaction Then a paid transaction must be created Examples: | number | holder | expiration | amount | installments | - | 4539927448873758 | João Silva | 0623 | 20000 | 1 | + | 4539927448873758 | João Silva | 0623 | 20000 | 3 | | 5475972816746627 | Maria Silva | 0623 | 9900 | 7 | - | 30323500265699 | Pedro Silva | 0623 | 250 | 3 | + | 30323500265699 | Pedro Silva | 0623 | 250 | 1 | | 371733354333913 | Cesar Silva | 0623 | 1337 | 12 | | 6062822300852208 | Carla Silva | 0623 | 123456 | 10 | | 4514161325131598 | Marta Silva | 0623 | 1000001 | 1 | @@ -84,9 +84,9 @@ Feature: Transaction Then a paid transaction must be created with "" paid amount Examples: | number | holder | expiration | amount | installments | capture | - | 4556111382970890 | João Silva | 0623 | 20000 | 1 | 14900 | + | 4556111382970890 | João Silva | 0623 | 20000 | 3 | 14900 | | 5157798910157725 | Maria Silva | 0623 | 9900 | 7 | 9899 | - | 30257387840192 | Pedro Silva | 0623 | 250 | 3 | 230 | + | 30257387840192 | Pedro Silva | 0623 | 250 | 1 | 230 | | 345066740083873 | Cesar Silva | 0623 | 1337 | 12 | 509 | | 6062827431932910 | Carla Silva | 0623 | 123456 | 10 | 78910 | | 4514164981119485 | Marta Silva | 0623 | 1000001 | 1 | 10001 | diff --git a/tests/unit/Customer/CustomerBuilderTest.php b/tests/unit/Customer/CustomerBuilderTest.php index d4de497..87ab05b 100644 --- a/tests/unit/Customer/CustomerBuilderTest.php +++ b/tests/unit/Customer/CustomerBuilderTest.php @@ -50,4 +50,32 @@ public function mustNotCreateCustomerFromResponse() $this->assertNull($customer); } + + /** + * @test + */ + public function mustCreateCustomerWithoutAddressCorrectly() + { + // @codingStandardsIgnoreLine + $payload = '{"object":"customer","document_number":"25123317171","document_type":"cpf","name":"John Doe","email":"john@test.com","born_at":null,"gender":null,"date_created":"2016-12-28T19:38:28.618Z","id":122444,"addresses":[],"phones":[{"object":"phone","ddi":"55","ddd":"11","number":"44445555","id":65844}]}'; + + $customer = $this->buildCustomer(json_decode($payload)); + + $this->assertInstanceOf('PagarMe\Sdk\Customer\Customer', $customer); + $this->assertInstanceOf('\DateTime', $customer->getDateCreated()); + } + + /** + * @test + */ + public function mustCreateCustomerWithoutPhoneCorrectly() + { + // @codingStandardsIgnoreLine + $payload = '{"object":"customer","document_number":"25123317171","document_type":"cpf","name":"John Doe","email":"john@test.com","born_at":null,"gender":null,"date_created":"2016-12-28T19:38:28.618Z","id":122444,"addresses":[{"object":"address","street":"Rua Teste","complementary":null,"street_number":"123","neighborhood":"Centro","city":null,"state":null,"zipcode":"01034020","country":null,"id":68136}],"phones":[]}'; + + $customer = $this->buildCustomer(json_decode($payload)); + + $this->assertInstanceOf('PagarMe\Sdk\Customer\Customer', $customer); + $this->assertInstanceOf('\DateTime', $customer->getDateCreated()); + } } diff --git a/tests/unit/RequestHeadersTest.php b/tests/unit/RequestHeadersTest.php new file mode 100644 index 0000000..c74058d --- /dev/null +++ b/tests/unit/RequestHeadersTest.php @@ -0,0 +1,48 @@ +getSdkHeaders([]); + $expectedUserAgent = sprintf( + 'pagarme-php/%s php/%s', + PagarMe::VERSION, + phpversion() + ); + $expectedHeaders = [ + 'X-PagarMe-User-Agent' => $expectedUserAgent, + 'User-Agent' => $expectedUserAgent + ]; + + $this->assertEquals($defaultHeaders, $expectedHeaders); + + $filledHeaders = [ + 'X-PagarMe-User-Agent' => 'Magento/1.9.1.0', + 'User-Agent' => 'Magento/1.9.1.0' + ]; + + $sdkHeadersFilled = $requestHeaders->getSdkHeaders($filledHeaders); + + $expectedUserAgent = sprintf( + 'Magento/1.9.1.0 pagarme-php/%s php/%s', + PagarMe::VERSION, + phpversion() + ); + $expectedHeaders = [ + 'X-PagarMe-User-Agent' => $expectedUserAgent, + 'User-Agent' => $expectedUserAgent + ]; + + $this->assertEquals($sdkHeadersFilled, $expectedHeaders); + } +}