kintoneを情報基盤にした業務効率化支援をしていますが、最近業務効率化のその先にある「売上向上」を目的としたkintone活用の相談が増えてきています。
今回のクライアントは今流行りのEコマースSaaSである「Shopify」とkintoneを連携させて、顧客と商品管理をkintoneとShopify間で同期させたい、ということでした。
kintoneとShopifyには豊富なAPIが用意されており、いつもの通りAWSを中間サーバーにすれば要望の機能が果たせそうです。
今回は事前調査としてShopifyのストアにカスタムアプリを導入してそのカスタムアプリを通じてデータをIN/OUTしてみましたが、最初のOAuth認証部分が想像より大変だったので今後のためにもメモしておきます。公式ドキュメントなどそこそこ文献は揃っていましたがバージョンが古かったりして手こずりました。
また認証はできたものの、謎の動きの理由が残ったままなので継続調査が必要です。とりあえずトークンだけ取れればいい、という場合は以下の手順を参考にして下さい。
Shopifyアプリの作成
shopify-cliというコマンドラインでShopifyを操作できるツールをインストールします
$ brew install shopify-cli
カスタムアプリを作成します
$ shopify node create
この時点でShopify PartnerのWeb管理画面には作成したアプリが表示されているのでそのAPIキーとAPIシークレットをメモしておきます
作成されたプロジェクトフォルダに移動します
$ cd test-app
$shopify node serve を実行して認証用のコールバックサーバNGROKを起動します
NGROKはローカルに仮のSSLコールバックサーバを立ててくれるサービスです(雑な説明)
Do you want to update your application url? はYes と回答します
To install and start using your app, open this URL in your browser:
https://6972-240f-74-2d17-1-3927-87d0.ngrok.io/auth?shop=xxxx.myshopify.com
上記の表示が出るので、開発ストアにインストールします。
そうすると自動的にWebの管理画面のリダイレクトURL欄にNGROKのURLが登録されています(便利ですね)
OAuth認証の用意が整ったのでトークンを取得します。
トークンはPythonのShopify APIを利用します。
https://github.com/Shopify/shopify_python_api/blob/master/README.md
$ pip install –upgrade ShopifyAPI
Python
shopify.Session.setup(api_key=API_KEY, secret=API_SECRET)
state = binascii.b2a_hex(os.urandom(15)).decode(“utf-8”)
redirect_uri = “https://xxxxxxxx.ngrok.io/auth/callback”
scopes = [‘read_products’, ‘read_orders’]
newSession = shopify.Session(shop_url, api_version)
auth_url = newSession.create_permission_url(scopes, redirect_uri, state)
print(auth_url)
上記を実行して表示されたURLをブラウザから実行して、ユーザー認証します。
どハマりポイント1
このままいけばURLにcodeが表示されるはずなのですが、何回かリダイレクトした後NGROKの画面はきちんと出てくるものの肝心のcodeが取得できません。色々試行錯誤した結果、NGROKを落とした状態で再度ユーザー認証すると途中でリダイレクトが終わってcodeが取得できました。。。
どハマりポイント2
やっとcodeが取れたのであとはトークン取得するところでまたまたエラーとなってしまいました。
Python
access_token = session.request_token(request_params) # Error
どうやらaccess_token = session.request_token(request_params)の関数の中でパラメータ(code / timestamp / hmac)のverifyがうまくいっていない模様です。
そこで、こちらのドキュメントにPOSTで取得する方法が載っていたのでやってみると。。。
https://shopify.github.io/shopify_python_api/
POST https://SHOP_NAME.myshopify.com/admin/oauth/access_token
with the following parameters:
client_id – Required – The API key for your app
client_secret – Required – The shared secret for your app
code – Required – The code you received in step 3
Python
url = “https://{}.myshopify.com/admin/oauth/access_token”.format(shop_name)
_header = {“Content-Type” : “application/json”}
PARAMS = {“client_id”:API_KEY, “client_secret”:API_SECRET, “code”:code}
resp = requests.post(url, headers=_header, json=PARAMS)
r = json.loads(resp.text)
at = r[“access_token”]
見事トークンが取得できました!
取得できたはいいものの何故動いているかが分からないので、ちょっとこのままでは使えそうにないです。継続調査が必要ですね。どなたかわかる方いれば〜〜。
なお、実ストアへのインストールは管理画面から「マーチャントインストールリンク」を発行して、ストアのアカウントでログイン後、このリンクでインストールを承認します。パートナーでログイン中のブラウザでこれをやろうとするとエラーになるので、ブラウザをあたらに起動して実行します。
参考にしたURL
https://dev.classmethod.jp/articles/shopify-with-eventbridge/
https://shopify.github.io/shopify_python_api/