如何将变量描述传递给Stripe Checkout Express后端

时间:2019-04-09 21:40:10

标签: javascript node.js express stripe-payments

我正在建立一个Stripe Custom Checkout集成,该集成允许用户注册事件并为事件付费。注册选项非常简单,仅包含4个类别-所有价格相同。

我已经成功地将类别标题传递给Stripe Checkout弹出窗口中的description参数,但是在将相同的description参数传递给Stripe API时遇到了麻烦。

成功进行测试充电后,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 :(得分:0)

当您在前端获得令牌响应时,我将构建一个新的Javascript对象。它应该包含两个属性:(a)您的令牌ID和(b)一些ENUM /说明,该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];

这样,您就可以获取描述以在前端和后端之间进行映射。如果您不做这样的事情,那么恶意者可能会更改他们正在购买的产品或他们正在购买的产品的描述,甚至可能是他们正在购买的产品的价值。因此,这里的最佳实践是共享某种枚举。

这让您做的另一件很酷的事情是验证后端的令牌。尝试使用您的Secret API密钥检索令牌时,您会看到有关令牌的更多详细信息,而仅使用Publishable API密钥创建令牌时看不到。

希望有帮助!