Biblioteca Mechado Pago não permite enviar novo campo do formulário

18/05/2021

0

Copiei o código abaixo do documentação do Mercado Pago e desde então estou tentando adaptar, mas não estou conseguindo entender o funcionamento Gostaria de entender como funciona o envio dos campos do formulário pois acrescentei um campo order que envia o número do pedido e por nada ele chega no PHP.

Gostaria também de retirar um campo amount, que imagino se referir ao valor total do pedido, imagino porque na documentação não explica, mas quando retiro, a biblioteca reclama que precisa do campo. No entanto, o valor eu não costumo enviar via formulário mas sim capturo com uma consulta ao banco de dados. No entanto, não dá para fazer essa pesquisa pois dependo do número do pedido e não estou sabendo como enviá-lo.

Estou seguinte essa documentação:

https://www.mercadopago.com.br/developers/pt/guides/online-payments/checkout-api/v2/receiving-payment-by-card

E aqui a biblioteca:

https://sdk.mercadopago.com/js/v2

E cheguei nesse código:

const mp = new MercadoPago('SAND_BOX');

var cardNumber = document.querySelector('#form-checkout__cardNumber');
var brand = document.querySelector('.brand');

cardNumber.addEventListener("keyup", function() {
  if (cardNumber.value.length < 6) {
      brand.style.display = "none";
  }
});

const cardForm = mp.cardForm({
  amount: "100.5",  //Desnecessário aqui, remover
  autoMount: true,  //Desnecessário aqui, remover
  form: {
    id: "form-checkout",
    cardholderName: {
      id: "form-checkout__cardholderName",
      placeholder: "Titular do cartão",
    },
    cardholderEmail: {
      id: "form-checkout__cardholderEmail",
      placeholder: "E-mail",
    },
    cardNumber: {
      id: "form-checkout__cardNumber",
      placeholder: "Número do cartão",
    },
    cardExpirationMonth: {
      id: "form-checkout__cardExpirationMonth",
      placeholder: "Mês de vencimento",
    },
    cardExpirationYear: {
      id: "form-checkout__cardExpirationYear",
      placeholder: "Ano de vencimento",
    },
    securityCode: {
      id: "form-checkout__securityCode",
      placeholder: "Código de segurança",
    },
    installments: {
      id: "form-checkout__installments",
      placeholder: "Parcelas",
    },
    identificationType: {
      id: "form-checkout__identificationType",
      placeholder: "Tipo de documento",
    },
    identificationNumber: {
      id: "form-checkout__identificationNumber",
      placeholder: "Número do documento",
    },
    issuer: {
      id: "form-checkout__issuer",
      placeholder: "Banco emissor",
    },
    order: {
      id: "form-checkout__order",
      placeholder: "Id do pedido",
    },
  },
  callbacks: {
    onFormMounted: error => {
      if (error) return console.warn("Form Mounted handling error: ", error);
      console.log("Form mounted");
    },
    onSubmit: event => {
      event.preventDefault();
      console.log(cardForm.getCardFormData());
      const {
        paymentMethodId: payment_method_id,
        issuerId: issuer_id,
        cardholderEmail: email,
        amount,
        token,
        installments,
        identificationNumber,
        identificationType,
        order : order, //necessário enviar mas não está chegando no PHP

      } = cardForm.getCardFormData();

      fetch("/loja/process_payment", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          token,
          issuer_id,
          payment_method_id,
          transaction_amount: Number(amount),
          installments: Number(installments),
          description: "Descrição do produto",
          email,
          type: identificationType,
          number: identificationNumber,
          order: order,  //necessário enviar mas não está chegando no PHP
          //order: $("#form-checkout__order").value,
        }),
      }).then(function(response) {
        response.json().then(function(json) {
          
          if (json.status == "approved") {
            window.location.href = "ok.php";
            console.log(json.status);
          } else 
            console.log(json);
        });
      });
    },
    onPaymentMethodsReceived: (error, paymentMethods) => {
        if (error) return console.warn('paymentMethods handling error: ', error);
        if (cardNumber.value.length >= 6) {
            brand.style.display = "flex";
            brand.innerHTML="<img src='" + paymentMethods[0].thumbnail + "' alt='Bandeira do Cartão'>";
        } 
    },
    onFetching: (resource) => {
      console.log("Fetching resource: ", resource);
      // Animate progress bar
      const progressBar = document.querySelector(".progress-bar");
      progressBar.removeAttribute("value");

      return () => {
        progressBar.setAttribute("value", "0");
      };
    },
  },
});

Segue o formulário:

<form id="form-checkout" >
   <input type="text" name="cardNumber" id="form-checkout__cardNumber" />
   <div class="brand"></div>
   <input type="text" name="cardExpirationMonth" id="form-checkout__cardExpirationMonth" />
   <input type="text" name="cardExpirationYear" id="form-checkout__cardExpirationYear" />
   <input type="text" name="securityCode" id="form-checkout__securityCode" />
   <input type="text" name="cardholderName" id="form-checkout__cardholderName"/>
   <input type="email" name="cardholderEmail" id="form-checkout__cardholderEmail"/>
   <select name="issuer" id="form-checkout__issuer"></select>
   <select name="identificationType" id="form-checkout__identificationType"></select>
   <input type="text" name="identificationNumber" id="form-checkout__identificationNumber"/>
   <select name="installments" id="form-checkout__installments"></select>
   <input type="hidden" name="order" id="form-checkout__order" value="68" />
   <button type="submit" id="form-checkout__submit">Pagar</button>
   <progress value="0" class="progress-bar">Carregando...</progress>
</form>

Gostara muito de entender esse mistério.
Carlos Rocha

Carlos Rocha

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar