LinkNacional / integration-rede-for-woocommerce

Integração do método de pagamento Rede para WooCommerce
https://wordpress.org/plugins/integration-rede-for-woocommerce/
GNU General Public License v2.0
11 stars 6 forks source link

Dúvida - ExpirationMonth #15

Closed rickdroio closed 3 years ago

rickdroio commented 3 years ago

Caros, Alguns clientes estão recebendo a seguinte mensagem após entrarem com os dados do cartão:

Cartão de crédito: ExpirationMonth: Invalid parameter formart.

Sabem me dizer o que poderia ser essa resposta da REDE?

Obrigado

marcos-alexandre82 commented 3 years ago

@rickdroio está com a última versão instalada? https://br.wordpress.org/plugins/woo-rede/

A mensagem informa que a data de validade do cartão está sendo inserida de forma errada. O campo aceita apenas números, sendo dois dígitos para o mês e dois ou quatro dígitos para o ano. Sabe se está sendo inserido algum outro tipo de caractere?

Pode ser que algum outro plugin ou o tema esteja interferindo neste campo, como por exemplo, não exibindo a barra "/" automaticamente e o cliente esteja digitando ela.

Recomendo testar, se possível em um ambiente de testes, colocar um tema padrão do WordPress/WooCommerce, como o Twenty Twenty-One ou Storefront e ver se o erro persiste. Se ainda persistir, teste desabilitar todos os outros plugins, mantendo apenas este, o WooCommerce e o Brazilian Market on WooCommerce (com seu tema atual e com um tema padrão), para ver se funciona. Se funcionar, só ir habilitando um por um e testando, até encontrar qual pode estar em conflito ;)

rickdroio commented 3 years ago

Olá Marcos, tudo bem?

Estou utilizando a Versão 2.1.0

Coletei o log do plugin de alguns casos que estão ocorrendo:

[2020-12-14 22:43:27] rede.DEBUG: Request Rede POST https://api.userede.com.br/erede/v1/transactions User-Agent: eRede/4.2.1 (PHP 7.4.13; Store 83720928; Linux 3.10.0-1160.6.1.el7.x86_64) curl/7.73.0 OpenSSL/1.1.1h Accept: application/json Content-Type: application/json; charset=utf8  {"capture":"true","kind":"credit","reference":xxxxxx,"amount":11135,"cardHolderName":"xxxxxxx","cardNumber":"***","expirationMonth":"04\/2025","expirationYear":"20","securityCode":"***"} [] []
[2020-12-14 22:43:28] rede.DEBUG: Response Rede Status Code: 400  {"returnCode":"33","returnMessage":"ExpirationMonth: Invalid parameter format."} [] []

[2020-12-14 20:08:48] rede.DEBUG: Request Rede POST https://api.userede.com.br/erede/v1/transactions User-Agent: eRede/4.2.1 (PHP 7.4.13; Store 83720928; Linux 3.10.0-1160.6.1.el7.x86_64) curl/7.73.0 OpenSSL/1.1.1h Accept: application/json Content-Type: application/json; charset=utf8  {"capture":"true","kind":"credit","reference":xxxxxx,"amount":17069,"installments":4,"cardHolderName":"xxxxxxxx","cardNumber":"***","expirationMonth":"11\/2026","expirationYear":"20","securityCode":"***"} [] []
[2020-12-14 20:08:49] rede.DEBUG: Response Rede Status Code: 400  {"returnCode":"33","returnMessage":"ExpirationMonth: Invalid parameter format."} [] []

Comparando com um LOG que está correto:

Correto: "expirationMonth":"01","expirationYear":"2029"
Erro: "expirationMonth":"11\/2026","expirationYear":"20"

Da para notar que ele está pegando o ano errado inclusive.... e o mês está indo como uma "string com texto", por isso o erro.

Fiz testes tanto no PC quando em Android e iOS, não consigo forçar colocar essa barra invertida de jeito nenhum (não sei se pode ser algo relacionado a regex nesse caso).

Como está ocorrendo diretamente com cliente, não tenho acesso ao cartão que a pessoa está tentando fazer o pagamento... pelos meus testes locais está funcionando normalmente.

Obrigado pelo suporte!!

rickdroio commented 3 years ago

Obrigado pelo suporte!!

Esqueci de comentar que está acontecendo com uma frequência alta com pessoas diferentes, então não é algo isolado.

rickdroio commented 3 years ago

Estou dando uma olhada no código na parte da captura, encontrei a seguinte parte:

$expiration = explode( ' / ', $_POST['rede_credit_expiry'] );

            $card_data = array(
                'card_number' => preg_replace( '/[^\d]/', '', sanitize_text_field( $_POST['rede_credit_number'] ) ),
                'card_expiration_month' => sanitize_text_field( $expiration[0] ),
                'card_expiration_year' => $this->normalize_expiration_year( sanitize_text_field( $expiration[1] ) ),
                'card_cvv' => sanitize_text_field( $_POST['rede_credit_cvc'] ),
                'card_holder' => sanitize_text_field( $_POST['rede_credit_holder_name'] ),
            );

Então para que ocorra o problema $_POST['rede_credit_expiry'] deve estar retornando a "/" com o "escape" em algumas situações.

Fiz uma pesquisa rápida na internet e vi que o PHP tem algumas features de "magic quotes" (não sou especialista em PHP para ter certeza que isso está ocorrendo): https://stackoverflow.com/questions/6642901/php-5-3-automatically-escapes-get-post-from-form-strings

Estou utilizando o PHP 7.4.13 no meu server.

Consigo fazer um fix fácil para esse caso do "\ /", procurando e removendo o caracter de escape, mas gostaria da sua opinião para ver se há uma maneira melhor.

Valeu!!

marcos-alexandre82 commented 3 years ago

@rickdroio chegou a ver se tem algum erro de JavaScript no console do navegador? Pode ser um JS de algum plugin ou o tema interferindo nesse campo, por isso são importantes os testes sem outros plugins e com um tema padrão (caso apresente um erro no console).

Seria bom verificar qual o navegador e versão, por exemplo, o erro ocorre. Ver se tem alguma extensão instalada...

rickdroio commented 3 years ago

@marcos-alexandre82 no meu ambiente de teste o problema não ocorre... alguma dica para tentar pegar log mais detalhado do cliente?

rickdroio commented 3 years ago

@marcos-alexandre82 fiz diversos testes e consegui forçar a situação do log do meu site... o que está ocorrendo na verdade é que ao utilizar o explode para separar o mês e ano estava sendo considerado a formatação com espaços entre a barra... em alguns casos (não sei dizer ainda o porque) o browser está trazendo sem essa formatação e o explode falha. Fiz um pull request dessa solução, fiz vários testes e deram ok... mas de qlq forma vou aplicar na minha plataforma e dou o feedback se está funcionando corretamente.

16

marcos-alexandre82 commented 3 years ago

@rickdroio teve mais algum erro no log referente à data de validade do cartão ou sua correção resolveu o problema? Teve um fluxo legal de testes?

rickdroio commented 3 years ago

Fala @marcos-alexandre82 Está rodando em produção já 1 dia com diversos pagamentos e não tive nenhum problema... vou aguardar mais um tempo e te confirmo.

rickdroio commented 3 years ago

@marcos-alexandre82 está rodando em minha plataforma já a 5 dias sem nenhum problema \o/

marcos-alexandre82 commented 3 years ago

@rickdroio obrigado pela correção e feedback ;)

cod3pix commented 3 years ago

@marcos-alexandre82 fiz diversos testes e consegui forçar a situação do log do meu site... o que está ocorrendo na verdade é que ao utilizar o explode para separar o mês e ano estava sendo considerado a formatação com espaços entre a barra... em alguns casos (não sei dizer ainda o porque) o browser está trazendo sem essa formatação e o explode falha. Fiz um pull request dessa solução, fiz vários testes e deram ok... mas de qlq forma vou aplicar na minha plataforma e dou o feedback se está funcionando corretamente.

16

Fala @marcos-alexandre82 e @rickdroio , ontem comecei a utilizar o plugin com a versão do repositório do wp e os mesmos problemas começaram a aparecer. Depois de muita procura e testes acabamos encontrando o mesmo workaround (alterar o explode removendo os espaços. Em nosso caso removemos também os espaços da máscara do jquery-card.js.

De toda forma estou escrevendo aqui pois notei que muitos não conseguiram simular o erro e em nosso caso encontramos um dos gatilhos para que o problema ocorresse. O problema acontece com o Google Pay que faz um autofill dos dados do cartão do usuário, e a máscara não é aplicada com os espaços com esse preenchimento automático.

Espero que essa informação ajude outras pessoas pois não foi um erro fácil de simular.

Gostaria de saber se existe uma previsão para essa correção ser publicada no repositório do WP.

marcos-alexandre82 commented 3 years ago

@cod3pix ainda não tenho previsão de aplicar está correção, mas se quiser enviar um PR com ela, ficarei grato :)

A meta é mesclar as atualizações do plugin que a equipe da Rede fez e trazer a função débito para esse também. Assim que eu tiver um tempinho, quero trabalhar nisso ;)

rickdroio commented 3 years ago

Fala pessoal!! Depois de +de 1 mês não ocorreu nenhum problema com a atualização que fiz, porém hoje voltar a dar um problema similar:

[2021-01-27 19:52:53] rede.DEBUG: Request Rede POST https://api.userede.com.br/erede/v1/transactions User-Agent: eRede/4.2.1 (PHP 7.4.14; Store 83720928; Linux 3.10.0-1160.11.1.el7.x86_64) curl/7.74.0 OpenSSL/1.1.1i Accept: application/json Content-Type: application/json; charset=utf8 {"capture":"true","kind":"credit","reference":1611899746,"amount":23019,"installments":3,"cardHolderName":"xxxx xxx","cardNumber":"***","expirationMonth":"0325","expirationYear":"20","securityCode":"***"} [] [] [2021-01-27 19:52:54] rede.DEBUG: Response Rede Status Code: 400 {"returnCode":"33","returnMessage":"ExpirationMonth: Invalid parameter format."} [] []

Entrei em contato com a cliente, ela me confirmou que a data de expiração é 03/2025... vou tentar simular alguma situação para que aconteça isso e tentar achar uma solução.

@cod3pix se tiver alguma idéia da entrada que poderia gerar isso, compartilhe com a gente :)

Valeu!!

cod3pix commented 3 years ago

@rickdroio após remover os espaços da máscara, o problema diminuiu. Contudo em uma pequena parcela de clientes me parece q a máscara não é aplicada ao campo, não inserindo a barra "/". Pensei em 2 formas para contornar o erro. Uma seria trocar o input do vencimento do cartão para um select para o mês e outro para ano. Outra forma seria alterar a forma como são separados mês e ano contando os caracteres.

Pensei em algo assim:

$credit_expiry = $_POST['rede_credit_expiry'];

if (strpos($credit_expiry, '/') !== false) {
    $expiration   = explode( '/', $credit_expiry );
} else {
    $expiration = [
        substr($credit_expiry, 0, 2),
        substr($credit_expiry, -2, 2),
    ];
}

O que acha @marcos-alexandre82 ?

rickdroio commented 3 years ago

@cod3pix usei sua sugestão e fiz alguns testes de input com e sem mascaras, todos passaram!!! vou colocar para rodar no meu site, dou o feedback para vocês de como está indo

potter991 commented 3 years ago

@cod3pix usei sua sugestão e fiz alguns testes de input com e sem mascaras, todos passaram!!! vou colocar para rodar no meu site, dou o feedback para vocês de como está indo

Algum feedback amigo? Estou com o mesmo problema aqui :(

rickdroio commented 3 years ago

@cod3pix estou usando desde o ano passado, não tive mais problemas @potter991 pode usar que é sucesso!