All Projects → getconversio → go-shopify

getconversio / go-shopify

Licence: MIT license
DEPRECATION NOTICE: Continuing support for the go-shopify library will be at Bold Commerce's fork. Please open issues and pull requests over there.

Programming Languages

go
31211 projects - #10 most used programming language
Dockerfile
14818 projects

Projects that are alternatives of or similar to go-shopify

Nuxt Shopify
🛍 Seamless Shopify Buy SDK integration with Nuxt.js.
Stars: ✭ 210 (+328.57%)
Mutual labels:  shopify
react-autofill
Automate the filling of checkout forms, increasing your chance of purchasing limited release items.
Stars: ✭ 57 (+16.33%)
Mutual labels:  shopify
awesome-shopify
👩‍🎓👨‍🎓 Must-read articles, videos and books for store owners, app and theme developers.
Stars: ✭ 86 (+75.51%)
Mutual labels:  shopify
Shopify-Serverless-Starter-App
Shopify Serverless Starter Application built on Serverless Framework and Polaris UI (React.js)
Stars: ✭ 56 (+14.29%)
Mutual labels:  shopify
koa-shopify-auth
DEPRECATED Middleware to authenticate a Koa application with Shopify
Stars: ✭ 82 (+67.35%)
Mutual labels:  shopify
shopify-mail-notifications
Blazing-fast Shopify mail notifications templating environment with Liquid, MJML and Twig
Stars: ✭ 25 (-48.98%)
Mutual labels:  shopify
Gatsby Theme Storefront Shopify
Create a Shopify store with Gatsby JS 🛍️ 🛒
Stars: ✭ 175 (+257.14%)
Mutual labels:  shopify
jimbo
Jimbo - The Free to use and powerful Shopify Bot
Stars: ✭ 22 (-55.1%)
Mutual labels:  shopify
vox
⚡️ instant interactivity for the web 💫
Stars: ✭ 85 (+73.47%)
Mutual labels:  shopify
gridsome-starter-shopify
Gridsome Shopify Starter
Stars: ✭ 46 (-6.12%)
Mutual labels:  shopify
Ajaxinate
🎡 Ajax pagination plugin for Shopify themes
Stars: ✭ 107 (+118.37%)
Mutual labels:  shopify
shopify-node-express-app
Simple Shopify app with Express and Node.js that connects to a Shopify store via OAuth.
Stars: ✭ 20 (-59.18%)
Mutual labels:  shopify
ShopifyCheckoutJS
A little code for having a better experience manipulating Shopify´s Checkout via JS.
Stars: ✭ 55 (+12.24%)
Mutual labels:  shopify
Developer Tools
Shopify Developer Tools is a macOS app that connects to your Shopify store(s) and allows you to make authenticated calls to the Admin API, generate dummy data, and view and customize Polaris components.
Stars: ✭ 254 (+418.37%)
Mutual labels:  shopify
ecommerce integrations
Ecommerce integrations for ERPNext
Stars: ✭ 54 (+10.2%)
Mutual labels:  shopify
Midway
Headless Starter with Sanity + Gatsby + Shopify Repo
Stars: ✭ 195 (+297.96%)
Mutual labels:  shopify
mechanic-tasks
Public task repository for Mechanic (https://mechanic.dev)
Stars: ✭ 42 (-14.29%)
Mutual labels:  shopify
7cart
7cart is a php7 project for building online shops, catalogs or service platforms. 7cart built with simple code and database schema. It is easy to support and fast.
Stars: ✭ 27 (-44.9%)
Mutual labels:  shopify
gridsome-starter-shopify-advanced
A Gridsome starter for Shopify, complete with authentication 🔐
Stars: ✭ 16 (-67.35%)
Mutual labels:  shopify
next-shopify-starter
Nextjs + Tailwind CSS + Shopify Starter
Stars: ✭ 385 (+685.71%)
Mutual labels:  shopify

DEPRECATION NOTICE

Continuing support for the go-shopify library will be at Bold Commerce's fork over here. Please open issues and pull requests over there.

go-shopify

Another Shopify Api Library in Go.

Note: The library does not have implementations of all Shopify resources, but it is being used in production by Conversio and should be stable for usage. PRs for new resources and endpoints are welcome, or you can simply implement some yourself as-you-go. See the section "Using your own models" for more info.

Build Status codecov

Install

$ go get github.com/getconversio/go-shopify

Use

import "github.com/getconversio/go-shopify"

This gives you access to the goshopify package.

Oauth

If you don't have an access token yet, you can obtain one with the oauth flow. Something like this will work:

// Create an app somewhere.
app := goshopify.App{
    ApiKey: "abcd",
    ApiSecret: "efgh",
    RedirectUrl: "https://example.com/shopify/callback",
    Scope: "read_products,read_orders",
}

// Create an oauth-authorize url for the app and redirect to it.
// In some request handler, you probably want something like this:
func MyHandler(w http.ResponseWriter, r *http.Request) {
    shopName := r.URL.Query().Get("shop")
    authUrl := app.AuthorizeURL(shopName)
    http.Redirect(w, r, authUrl, http.StatusFound)
}

// Fetch a permanent access token in the callback
func MyCallbackHandler(w http.ResponseWriter, r *http.Request) {
    // Check that the callback signature is valid
    if ok, _ := app.VerifyAuthorizationURL(r.URL); !ok {
        http.Error(w, "Invalid Signature", http.StatusUnauthorized)
        return
    }

    query := r.URL.Query()
    shopName := query.Get("shop")
    code := query.Get("code")
    token, err := app.GetAccessToken(shopName, code)

    // Do something with the token, like store it in a DB.
}

Api calls with a token

With a permanent access token, you can make API calls like this:

// Create an app somewhere.
app := goshopify.App{
    ApiKey: "abcd",
    ApiSecret: "efgh",
    RedirectUrl: "https://example.com/shopify/callback",
    Scope: "read_products",
}

// Create a new API client
client := goshopify.NewClient(app, "shopname", "token")

// Fetch the number of products.
numProducts, err := client.Product.Count(nil)

Private App Auth

Private Shopify apps use basic authentication and do not require going through the OAuth flow. Here is an example:

// Create an app somewhere.
app := goshopify.App{
	ApiKey: "apikey",
	Password: "apipassword",
}

// Create a new API client (notice the token parameter is the empty string)
client := goshopify.NewClient(app, "shopname", "")

// Fetch the number of products.
numProducts, err := client.Product.Count(nil)

Query options

Most API functions take an options interface{} as parameter. You can use one from the library or create your own. For example, to fetch the number of products created after January 1, 2016, you can do:

// Create standard CountOptions
date := time.Date(2016, time.January, 1, 0, 0, 0, 0, time.UTC)
options := goshopify.CountOptions{createdAtMin: date}

// Use the options when calling the API.
numProducts, err := client.Product.Count(options)

The options are parsed with Google's go-querystring library so you can use custom options like this:

// Create custom options for the orders.
// Notice the `url:"status"` tag
options := struct {
    Status string `url:"status"`
}{"any"}

// Fetch the order count for orders with status="any"
orderCount, err := client.Order.Count(options)

Using your own models

Not all endpoints are implemented right now. In those case, feel free to implement them and make a PR, or you can create your own struct for the data and use NewRequest with the API client. This is how the existing endpoints are implemented.

For example, let's say you want to fetch webhooks. There's a helper function Get specifically for fetching stuff so this will work:

// Declare a model for the webhook
type Webhook struct {
    ID int         `json:"id"`
    Address string `json:"address"`
}

// Declare a model for the resource root.
type WebhooksResource struct {
    Webhooks []Webhook `json:"webhooks"`
}

func FetchWebhooks() ([]Webhook, error) {
    path := "admin/webhooks.json"
    resource := new(WebhooksResoure)
    client := goshopify.NewClient(app, "shopname", "token")

    // resource gets modified when calling Get
    err := client.Get(path, resource, nil)

    return resource.Webhooks, err
}

Webhooks verification

In order to be sure that a webhook is sent from ShopifyApi you could easily verify it with the VerifyWebhookRequest method.

For example:

func ValidateWebhook(httpRequest *http.Request) (bool) {
    shopifyApp := goshopify.App{ApiSecret: "ratz"}
    return shopifyApp.VerifyWebhookRequest(httpRequest)
}

Develop and test

There's nothing special to note about the tests except that if you have Docker and Compose installed, you can test like this:

$ docker-compose build dev
$ docker-compose run --rm dev

Testing the package is the default command for the dev container. To create a coverage profile:

$ docker-compose run --rm dev bash -c 'go test -coverprofile=coverage.out ./... && go tool cover -html coverage.out -o coverage.html'
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].