Использование веб-перехватчиков Stripe с graphql-yoga и Prisma

У меня возникли проблемы с поиском способа перехвата вызовов веб-перехватчика Stripe в моем приложении. Использую graphql-yoga (экспресс) и призму.

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

Спасибо за помощь!

Вызовы вебхука Stripe выглядят так:

{
  "created": 1326853478,
  "id": "charge.expired_00000000000000",
  "type": "charge.expired",
  "object": "event",
  "request": null,
  "pending_webhooks": 1,
  "data": {
    "object": {
      "id": "ch_00000000000000",
      "object": "charge",
      "amount": 100,
      "captured": false,
      "created": 1537153592,
      "currency": "usd",
      "customer": null,
      "description": "My First Test Charge (created for API docs)",
      "invoice": null,
      "livemode": false,
      "on_behalf_of": null,
      "order": null,
      "outcome": null,
      "paid": true,
      "receipt_email": null,
      "receipt_number": null,
      "refunded": false,
      "review": null,
      "shipping": null,
      "source": {
        "id": "card_00000000000000",
        "object": "card",
        "address_city": null,
        "address_country": null,
        "address_line1": null,
        "address_line1_check": null,
        "address_line2": null,
        "address_state": null,
        "address_zip": "12919",
        "address_zip_check": "pass",
        "brand": "Visa",
        "country": "US",
        "customer": "cus_00000000000000",
        "cvc_check": null,
        "name": null,
        "tokenization_method": null
      },
      "statement_descriptor": null,
      "status": "succeeded",
    }
  }
}

person Marc Morin Deziel    schedule 17.09.2018    source источник


Ответы (1)


Поскольку Stripe Webhook возвращает общий http POST с JSON полезной нагрузкой, он не будет форматировать данные event в соответствии с Graphql языковым запросом.

На данный момент вы можете предоставить обычную конечную точку REST API, используя express [0] Graphql-Yoga

Я написал рабочий пример кода, вы можете попробовать

const { GraphQLServer } = require('graphql-yoga')
const typeDefs = `
  type Query {
    hello(name: String): String!
  }
`
const resolvers = {
  Query: {
    hello: (_, { name }) => `Hello ${name || 'World'}`,
  },
}

const server = new GraphQLServer({ typeDefs, resolvers, skipValidation: true })
server.express.use('/api/stripe/webhooks', (req, res) => {
    // Handle your callback here !!!!
    res.status(200).send();
})

server.start(() => console.log('Server is running on localhost:4000'))

Сообщите мне, если это поможет.

[0] https://github.com/prisma/graphql-yoga#how-to-eject-from-the-standard-express-setup.

person wsw    schedule 26.09.2018
comment
Спасибо за помощь ! Конечно, это отличное решение. Единственное, что мне не нравится в использовании сервера для прослушивания веб-перехватчиков, так это то, что в случае простоя все может стать довольно запутанным. Я думал о том, чтобы реализовать его на бессерверном решении или что-то в этом роде - person Marc Morin Deziel; 27.09.2018
comment
Фактически, у Stripe webhook есть механизм повтора в случае отказа вашего сервера. Он будет повторять попытку в течение 72 часов (stripe.com/docs/webhooks#responding-to -a-webhook), если ваш сервер не работает (надеюсь, ваш сервер не так долго :)). Но определенно вы можете использовать подход serverless, проанализировать ответ и передать webhook своей конечной точке Graphql, соответствующей схеме. - person wsw; 28.09.2018
comment
Это здорово, но как получить доступ к переменной ’ctx’ внутри экспресс-сервера? - person Alan; 10.06.2019