Home

Awesome

lucid_shopify

lucid_shopify provides basic interfaces to the Shopify API including authentication, validation, webhooks, billing and a small subset of common API calls. Each interface is designed for extension and provides only a base from which to start.

It is designed around my own workflows and experiences and is not intended to cover every possible scenario. It is also unstable and subject to change as I figure out the details.

Examples

Authentication

Authentication is handled by LucidShopify::Authenticate. All you need is the shop handle/URI. See the source documentation for details.

Billing

Billing requires implementation of a plan interface responding to #handle and #price. For example:

class Plan < Struct.new( :handle, :price )

  # ...

end

With this, you can create a recurring application charge with #subscribe. If successful, this will return a confirmation URI with which to redirect the shop owner so they may accept of decline a charge. Ensure that you've set :billing_uri in LucidShopify.config as this is where the shop owner will return to your app.

confirmation_uri = billing_api.subscribe( plan )

When the user returns, the request params should include id, which you should pass to #process_subscription. If the shop owner accepted, this will activate the charge. If the shop owner declined, this will return nil.

billing_api.process_subscription( charge_id )

To unsubscribe, pass the charge_id to #unsubscribe (so keep track of that id).

Resource Mappings

Generally, interfaces to remote resources will be used with resource mappings which are provided by lucid_client. The following example illustrates how this might be achieved.

First we implement a model with the LucidClient::Model interface:

class Product

  include LucidClient::Model

  map_resources do
    { :name => 'title', :description => 'body_html' }
  end

end

Then we subclass the API and override the #all and #_fields methods:

class ProductAPI < LucidShopify::ProductAPI

  def all( params = {} )
    represent_each super( params )
  end

  private

  def _model
    ::Product
  end

end

Actually ... this second step is no longer necessary (but still serves as a nice example of wrapping the calls in subclasses) and now all that is needed is to set config[:product_model] which expects a callable:

LucidShopify.config[:product_model] = -> { ::Product }

Webhook Verification

When handling webhook requests, you'll almost always want to verify the source of the request. This can be done with LucidShopify::Policies::ValidWebhook which checks the request signature to ensure that the request originated from Shopify.

LucidShopify::Policies::ValidWebhook.new( request ).valid?