Skip to content

scott-wyatt/trailpack-stripe

Repository files navigation

trailpack-stripe

NPM version NPM downloads Build status Dependency Status Code Climate

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.

Supported ORMs

Repo Build Status (edge)
trailpack-waterline Build status
trailpack-sequelize Build status
trailpack-js-data Build status

Don't see your ORM here? Make a PR!

Why Store Models from Stripe?

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.

Install

With yo:

$ yo trails:trailpack trailpack-stripe

With npm:

$ npm install --save trailpack-stripe

Configure

// 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

Usage Examples

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
  }
)