ecomplus / app-infinitepay

E-Com Plus app to integrate InfinitePay payment link
MIT License
5 stars 2 forks source link

Pagamento por cartão de crédito trasnparente #77

Closed leomp12 closed 2 years ago

leomp12 commented 2 years ago

Checkout transparente com cartão de crédito mais ou menos no padrão de sempre, com tokenização client side e criação da transação pelo hash do cartão. O app https://github.com/ecomplus/app-pagarme pode ser usado como referência, vai ser praticamente a mesma coisa à excessão de que no caso da Inifinitepay no https://github.com/ecomplus/app-infinitepay/blob/master/functions/routes/ecom/modules/list-payments.js é necessário gerar um JWT que será usado client side (é o equivalente ao https://github.com/ecomplus/app-pagarme/blob/master/functions/routes/ecom/modules/list-payments.js#L107). Esse JWT pode ser salvo em Firestore com o prazo de expiração retornaro pra evitar gerar um por listagem de pagamentos, se o JWT não estiver salvo pelo store ID ou se estiver vencido geramos um novo.

Acho que na configuração https://github.com/ecomplus/app-infinitepay/blob/master/functions/ecom.config.js só temos que adicionar duas opções (booleanos) para desabilitar o link de pagementos ou o checkout transparente.

O próximo passo é adicionar Pix no app também, se já quiser ir pensando sobre isso durante essa implementação pra cartão...

leomp12 commented 2 years ago

https://www.infinitepay.io/docs


Do e-mail:

Primeiramente, você vai precisar gerar um token JWT (server side):

curl --request POST \ --url https://api.infinitepay.io/v2/oauth/token \ --header 'Content-Type: application/json' \ --data '{ "grant_type": "client_credentials", "client_id": "[client_id]", "client_secret": "[client_secret]", "scope": "card_tokenization" }'

A resposta contém o access_token:

{ "access_token":"eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxNTk4OCwiZXhwIjoxNjU3ODI2MTQ1fQ.LS7GrN_YeBEmeCohPuNdzZTIqeexaN479WUmbzCq7zM", "token_type":"Bearer", "expires_in":"07-14-2022 19:15", "refresh_token":"eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxNTk4OCwiZXhwIjoxNjUyODc4MDQxfQ.YQM0FYoIV53XJTRgy_LHIa9J55QrmT4kzBcY5SWu6Dg" }

Em seguida, fazer a request para a geração do token do cartão de crédito. Essa request precisa ser feita em client side (javascript):

curl --request POST \ --url 'https://api.infinitepay.io/cards/tokenize' \ --header 'Content-type: application/json' \ --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxNTk4OCwiZXhwIjoxNjU3ODI2MTQ1fQ.LS7GrN_YeBEmeCohPuNdzZTIqeexaN479WUmbzCq7zM' \ --data '{ "number": "5252525252525225", "expiration_month": "01", "expiration_year": "25" }'

A resposta contém o token do cartão:

{ "token":"1f5c810415ed11aa75460217e1decb8f65a3f4527a0b95" }

Para autorizar um pagamento, primeiramente gerar o JWT:

curl --request POST \ --url https://api.infinitepay.io/v2/oauth/token \ --header 'Content-Type: application/json' \ --data '{ "grant_type": "client_credentials", "client_id": "[client_id]", "client_secret": "[client_secret]", "scope": "transactions" }'

Em seguida, fazer a request de autorização informando o token do cartão de crédito gerado no client side:

curl -X POST "https://api.infinitepay.io/v2/transactions" \ -H"Accept: application/json" \ -H"Content-type: application/json" \ -H"Authorization: Bearer [jwt_access_token]" \ -d '{ "payment": { "amount":100, "capture_method":"ecommerce", "payment_method":"credit" }, "card": { "cvv": "123", "token": "1f5c810415ed11aa75460217e1decb8f65a3f4527a0b95", "card_holder_name":"CARDHOLDER NAME" }, "metadata": { "origin": "ecomplus", "store_url": "https://urldasualoja.com/", "risk": { "session_id": "fingerprint-gerado-pelo-ipayjs", "payer_ip": "127.0.0.1" } } }'

Enviar também as informações no metadata a fim de identificar a plataforma e loja do merchant. O detalhamento do payload pode ser consultado nesta documentação (wip): https://cloudwalk.github.io/infinitepay-docs/#autorizacao

Os demais fluxos e payloads permanecem os mesmos. Se precisar de mais alguma informação, só chamar.

leomp12 commented 2 years ago

cc @matheusgnreis

leomp12 commented 2 years ago

Já te adicionei no projeto do Firebase e no repo @wisley7l 😃 👍🏾

wisley7l commented 2 years ago

https://apx-mods.e-com.plus/api/v1/create_transaction/schema.json?store_id=100

Pessoal eu não consegui encontrar um meio de recuperar e/ou gerar o session_id para enviar a requisição com o metadata para criar a transação no InfinitePay 😐, aparentemente o metadata não é requirido para request, porém se enviar o metada o session é requerido

leomp12 commented 2 years ago

Uai mas o session_id é o hash do cartão nesse caso... Você passa ele da mesma forma que fez pro Galaxpay por exemplo, nesse caso na verdade você precisa enviar o IP também pelo jeito né, concatena os dois separados por / ou coisa do tipo, depois voce vai pegar isso no backend pelo hash.

leomp12 commented 2 years ago

Na verdade eles geram um hash e um session ID pelo cliente JS, pega ambos, junta com o IP do cliente também e envia como credit_card.hash (resolve a promise da transação cliente side com eles concatenados...)