artistas / laravel-pagseguro

Checkout Transparente e Pagamentos Recorrentes (Assinaturas)
MIT License
228 stars 72 forks source link

Method of payment currently unavailable. #86

Closed gcjbr closed 6 years ago

gcjbr commented 6 years ago

Estou obtendo esse erro ao envivar o pedido para um pagamento recorrente.

Eis o log da transação:

HTTP/1.1 POST /pre-approvals?email=teste@gmail.com&token=BD87C05155854599A18019952E563F78

host: ws.sandbox.pagseguro.uol.com.br accept: application/vnd.pagseguro.com.br.v3+json;charset=ISO-8859-1 content-type: application/json; charset=UTF-8 connection: Keep-Alive {"reference":"ID do pedido","plan":"0DFB3756BFBF81E114E7BF9B14A84AA3","sender":{"name":"Nome Completo","email":"teste@sandbox.pagseguro.com.br","ip":"123.123.123.123","hash":"36cb99ebc5a34567a89cb3651de29b65","phone":{"areaCode":"32","number":"988448523"},"documents":[{"type":"CPF","value":"06003738600"}],"address":{"street":"Rua\/Avenida","number":"N\u00famero","complement":"Complemento","district":"Bairro","postalCode":"12345678","city":"Cidade","state":"RS","country":"BRA"}},"paymentMethod":{"type":"CREDITCARD","creditCard":{"token":"36cb99ebc5a34567a89cb3651de29b65","holder":{"name":"Nome Completo","birthDate":"10\/02\/1940","phone":{"areaCode":"32","number":"988448523"},"documents":[{"type":"CPF","value":"22233344455"}],"billingAddress":{"street":"Rua\/Avenida","number":"N\u00famero","complement":"Complemento","district":"Bairro","postalCode":"12345678","city":"Cidade","state":"RS","country":"BRA"}}}}}

400 Content-Type: application/vnd.pagseguro.com.br.v3+json;charset=ISO-8859-1 {"error":true,"errors":{"10009":"Method of payment currently unavailable."}}

gabriel89oliveira commented 6 years ago

Estou tendo o mesmo problema. Não consigo achar o erro. Eu vi que já tivemos essa dúvida antes #48 , mas o problema foi solucionado misteriosamente.

fernandobandeira commented 6 years ago

Pelo que eu me lembro em algumas situações o PagSeguro não tem uma mensagem de erro, então ele retorna este erro genérico Method of payment currently unavailable. Tenta se certificar que as credenciais estão corretas (email e token) e se estiverem tenta colocar um cpf válido também na hora de mandar a requisição...

gabriel89oliveira commented 6 years ago

Eu vi que na função "setSenderInfo" ele coloca o e-mail default 'teste@sandbox.pagseguro.com.br' caso esteja em sandbox. Pode ser esse o problema? Ele não reconhece esse e-mail?

public function setSenderInfo(array $senderInfo) { $senderEmail = $this->sandbox ? 'teste@sandbox.pagseguro.com.br' : $this->sanitize($senderInfo, 'senderEmail'); $senderPhone = $this->sanitizeNumber($senderInfo, 'senderPhone');

fernandobandeira commented 6 years ago

Não, no sandbox só é aceito esse email, se tu colocar outro ele manda um erro de volta recusando o email por estar no sandbox.

gabriel89oliveira commented 6 years ago

Estou criando um hash para criar o plano, gero um id de sessão e depois tendo fazer a adesão. Eu confirmei todos os códigos, tokens e e-mail do pagseguro (sandbox) e estão corretos. Por acaso estou criando o código da sessão de forma errada? Isso tudo eu estou fazendo dentro de um Controller.

        $hash = PagSeguroRecorrente::sendPreApprovalRequest([
            'preApprovalName' => 'Plano de adesao teste',
            'preApprovalCharge' => 'MANUAL', 
            'preApprovalPeriod' => 'MONTHLY', 
            'preApprovalAmountPerPayment' => '100.00',
        ]);

        $sessao = PagSeguroRecorrente::startSession();

    $adesao = PagSeguroRecorrente::setPlan($hash)
            ->setSenderInfo([
                'senderName' => 'Gabriel Oliveira',
                'senderPhone' => '19 987654321', 
                'senderEmail' => 'estou usando um email valido',
                'senderHash' => $sessao,
                'senderCPF' => 'estou usando um cpf valido' 
            ])
            ->setCreditCardHolder([
                'creditCardHolderBirthDate' => '10/02/1940',
             ])
            ->setSenderAddress([
                'senderAddressStreet' => 'Rua Francisco Glicerio',
                'senderAddressNumber' => '123',
                'senderAddressDistrict' => 'Bairro',
                'senderAddressPostalCode' => '13012-902',
                'senderAddressCity' => 'Campinas',
                'senderAddressState' => 'SP'
            ])
            ->sendPreApproval([
                'creditCardToken' => $sessao
            ]);
fernandobandeira commented 6 years ago

Sim, o senderHash eh gerado pelo javascript e não pelo PHP, da uma olhada nessa linha:

https://github.com/artistas/laravel-pagseguro/blob/ff06237a10e4b0f8678d3544429564c2a8cf3b9d/src/Artistas/views/custom/formJs.blade.php#L78

Ele eh gerado usando a biblioteca js do javascript, da uma olhada nessa parte. Essa sessão gerada pelo PHP é usada apenas para iniciar uma instância da biblioteca javascript:

https://github.com/artistas/laravel-pagseguro/wiki/1.1.-Implementação-Javascript

gabriel89oliveira commented 6 years ago

Eu finalmente consegui fazer o pagamento. Eu não tinha acesso a esses forms até você enviar esse link. Com ele, tudo foi mais fácil.

O problema era que eu não estava gerando o hash com o JS. Então eu adicionei os forms, e deu tudo certo.

Obrigado pela ajuda!

fernandobandeira commented 6 years ago

Ok, vou fechar e atualizar um pouco a wiki qualquer coisa reabro.