Stripe API Trailpack for Trails
Handles and validates Stripe Webhooks.
It checks the time the webhooks were received and keeps the DB in sync by adding a lastStripeEvent
attribute to each event.
Optionally, it can perform Round Trip
validation of every Stripe webhook that hits the endpoint.
Stores Stripe event models with lifecyle handler for after a Stripe event occurs.
Makes call via Stripe API using a Stripe Service.
Repo | Build Status (edge) |
---|---|
trailpack-waterline | |
trailpack-sequelize | |
trailpack-js-data |
Don't see your ORM here? Make a PR!
Stripe has a great API, but performing complex queries through it are not really possible. By storing events and models from Stripe, you get the ability to do complex queries and analytics. This also allows you to interact qucikly with an entry that you've just created instead of waiting for Stripe Webhooks.
With yo:
$ yo trails:trailpack trailpack-stripe
With npm:
$ npm install --save trailpack-stripe
// config/main.js
module.exports = {
packs: [
// ... other trailpacks
require('trailpack-stripe')
]
}
// config/stripe
module.exports = {
// Public Key
public: process.env.STRIPE_PUBLIC || '<test_public_key>',
// Secret Key
secret: process.env.STRIPE_SECRET || '<test_secret_key>',
// Validate Events with Stripe
validate: process.env.STRIPE_VALIDATE || false
}
Then on Stripe
In Account settings Webhooks
Point webhook to <yourdomain>/stripe/webhook
Enable whatever webhooks you desire
Get a Full list of API calls here
var const StripeService = this.app.services.StripeService
// Create a Customer
StripeService.customers.create({
description: 'Customer for test@example.com',
source: "tok_189fGA2eZvKYlo2C3pWnuPIc" // obtained with Stripe.js
}, (err, customer) => {
// asynchronously called
// Stripe will issue a webhook after this is called and add it to the database.
// However, you may wish to interact with the customer before the webhook is delivered
// In which case we can ignore the webhook by adding `lastStripeEvent` manually
customer.lastStripeEvent = new Date(customer.created * 1000)
this.app.services.FootprintService.create('Customer',customer)
})
// Retreive a Customer
StripeService.customers.retrieve(
"cus_8jZwX4LTADczc2",
(err, customer) => {
// asynchronously called
}
)