Как получить метаданные из объекта сеанса Stripe NodeJS - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь передать UID и идентификатор покупки с помощью объекта сеанса Stripe Checkout (используя метаданные ). Генерация идентификатора сеанса на моем сервере с присоединением метаданных работает очень хорошо. Stripe также правильно размещает все на моем сервере webhook. Проблемы возникают при получении метаданных из объекта сеанса, POSTed Stripe.

Вот ошибка, которую я получаю

TypeError: Cannot read property 'metadata' of undefined at /app/app.js:35:32

Вот объект сеанса, опубликованный Stripe-

{
  "id": "evt_1GRC7lAfcfWZXl7jQ3VzNo4y",
  "object": "event",
  "api_version": "2019-10-17",
  "created": 1585292221,
  "data": {
    "object": {
      "id": "cs_test_gLsHqtF8XhB3C3DlWKcLtNdTitp0St8ju5qgJgl6tHrMxxWvju9gb9Li",
      "object": "checkout.session",
      "billing_address_collection": null,
      "cancel_url": "https://andropaym.firebaseapp.com/fail.html",
      "client_reference_id": null,
      "customer": "cus_GzASi1Klpydh8x",
      "customer_email": null,
      "display_items": [
        {
          "amount": 37500,
          "currency": "inr",
          "custom": {
            "description": "Carefully modified Linux Distro Bundle for Android.",
            "images": null,
            "name": "Modded OS Bundle"
          },
          "quantity": 1,
          "type": "custom"
        }
      ],
      "livemode": false,
      "locale": null,
      "metadata": {
        "uid": "EB1m6nAOTVNcQhHO2O7COspap8y1",
        "payID": "GPA.5620-9852-7063-44324"
      },
      "mode": "payment",
      "payment_intent": "pi_1GRC7EAfcfWZXl7jhixrWHRS",
      "payment_method_types": [
        "card"
      ],
      "setup_intent": null,
      "shipping": null,
      "shipping_address_collection": null,
      "submit_type": null,
      "subscription": null,
      "success_url": "https://andropaym.firebaseapp.com/success.html"
    }
  },
  "livemode": false,
  "pending_webhooks": 4,
  "request": {
    "id": null,
    "idempotency_key": null
  },
  "type": "checkout.session.completed"
}

Вот мой код webhook -

const express = require('express');

const app = express();
const bodyParser = require('body-parser');

const stripe = require('stripe')('sk_test_xxxx');
const endpointSecret = 'whsec_xxxx';

// set the port of our application
// process.env.PORT lets the port be set by Heroku
var port = process.env.PORT || 8080;


app.post('/', bodyParser.raw({type: 'application/json'}), (request, response) => {
const sig = request.headers['stripe-signature'];
let event;

try {
    event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret);
} catch (err) {
    return response.status(400).send(`Webhook Error: ${err.message}`);
}

function handleCheckoutSession(uid) {
    // Here we are getting the session obj and we can process it to check for the things we need

    console.log("UID is " + uid);


}

// Handle the checkout.session.completed event
if (event.type === 'checkout.session.completed') {
    const session = event.data.object;
    let uid = request.data.metadata.uid;

    // Fulfill the purchase...
    handleCheckoutSession(uid);
}

// Return a response to acknowledge receipt of the event
response.json({received: true});
});

app.listen(port, function () {
console.log('Our app is running on http://localhost:' + port);
});

module.exports = app;

Код работает без разбора метаданных

Дополнительные ссылки на код: 1. Выделенный код ошибки webhook - https://gist.github.com/imprakharshukla/1e2315615983e0e9d492d2288e159832#file -webhook_backend- js -L40

1 Ответ

1 голос
/ 27 марта 2020

Вам нужно использовать объект, возвращаемый stripe.constructEvent, а не тело запроса.

Измените

let uid = request.data.metadata.uid;

на

let uid = session.metadata.uid

, и все должно работать как положено.

...