Как передать описание переменной в бэкэнд Stripe Checkout Express - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю интеграцию Stripe Custom Checkout, которая позволяет пользователям регистрироваться и оплачивать событие.Варианты регистрации очень просты и состоят всего из 4 категорий - все по одной цене.

Мне удалось передать заголовки категорий параметру description во всплывающем окне Stripe Checkout, но у меня возникают проблемы при передачетот же параметр описания для API Stripe.

После успешного тестирования, Stripe возвращает объект с 'description: null'.

Добавление строки к параметру description корректно возвращает строку, однако мне бы хотелось, чтобы она возвращалазаголовок категории указан в моей форме.

INDEX.HTML

   <script>      

        var checkoutHandler = StripeCheckout.configure({
            key: "pk_test_stripeTestKey",
            locale: "auto",
        });

       // var button = document.getElementById("submitButton");
        // button.addEventListener("click", function(ev) {

        function checkout(ev) {
        var description = $('#categoryDesc').val();
        checkoutHandler.open({
        image: "/cj-stripe-icon.jpg",
        name: 'The EVENT 2019',
        description: description, //$("#categoryDesc").val() + " - " + "$130",
        amount: 13000,
        token: handleToken
    });
};
// });

            function handleToken(token) {
                fetch("/charge", {
                    method: "POST",
                    headers: {"Content-Type": "application/json"},
                    body: JSON.stringify(token)
                })
                .then(response => {
                    if (!response.ok)
                        throw response;
                    return response.json();
                })
                .then(output => {
                    console.log("Purchase succeeded:", output);
                    submitToAPI(event);
                    document.getElementById("shop").innerHTML = "<h2>Thank you for registering!</h2><h3>You should receive an email confirmation shortly.</h3>";
                })
                .catch(err => {
                    console.log("Purchase failed:", err);
                })
            }               

            </script>

APP.JS

onst express = require("express");
const stripe = require("stripe")(keySecret);
const bodyParser = require("body-parser");

const app = express();
app.use(express.static("public")); // serves content from the public directory

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

app.post("/charge", (req, res) => {
  let amount = 13000;

  stripe.customers.create({
    email: req.body.email,
    card: req.body.id
  })
  .then(customer =>
    stripe.charges.create({
      amount,
      currency: "usd",
      description: req.body.description,
      customer: customer.id
    }))
    .then(charge => res.send(charge))
    .catch(err => {
      console.log("Error:", err);
      res.status(500).send({error: "Purchase Failed"});
    });
});

1 Ответ

0 голосов
/ 10 апреля 2019

Я бы построил новый объект Javascript, когда вы получите ответ токена в своем интерфейсе. Он должен содержать два атрибута: (a) ваш идентификатор токена и (b) некоторое ENUM / описание, которое соответствует установленной цене / услуге на вашем бэкэнде.

например.

var payload = {
  tokenId: token.id,
  productId: <<some product id>>
}

Затем на вашем бэкэнде вы должны получить эту информацию.

например.

var PRODUCTS = {
  // productId: {description: 'Cat Mittens', price: 2000, ...}
  product1: {description: 'Product #1', price: 1000},
  product2: {description: 'Product #2', price: 2000}
}

if (!(req.body.productId in PRODUCTS)) {
  // Couldn't find the product id in the product list-- raise an error!
}

var product = PRODUCTS[req.body.productId];

Таким образом, вы можете получить описание для сопоставления между вашим интерфейсом и сервером. Если вы не сделаете что-то подобное, злоумышленник может изменить продукт, который он покупает, или описание продукта, который он покупает, или, возможно, даже стоимость продукта, который он покупает. Так что лучшая практика здесь - делиться чем-то вроде перечисления.

Еще одна интересная вещь, которую вы можете сделать, это проверить токен на вашем бэкэнде. Вы можете увидеть более подробную информацию о токене, когда попытаетесь получить его с помощью секретного ключа API, но не сможете увидеть его, просто создав его с помощью публикуемого ключа API.

Надеюсь, это поможет!

...