LaravelでShopifyアプリを開発する方法

# はじめに
Laravelを使ってShopifyアプリを作成してみたので、Laravelインストール〜ショップ管理画面でアプリとして表示するまでをご紹介します。

## 動作環境
Mac OS Catalina
PHP 7.3.24
Laravel Framework 8.17.2

## Laravel インストール
```shell
$ composer create-project laravel/laravel --prefer-dist sample-app
```

## PHP Shopify SDK インストール
Shopifyフォーラムでおすすめされていた[php-shopify](https://github.com/phpclassic/php-shopify)を選定しました。
全て確認はできていませんが、ほとんどのShopifyAPIを網羅していると思われます。

```shell
$ cd sample-app/
$ composer require phpclassic/php-shopify
```

## 認証URL作成
### コントローラ作成
```shell
$ php artisan make:controller AuthorizeController
Controller created successfully.
```
作成したコントローラを以下のように修正します。
ApiKeyとSharedSecretに関しては後述するアプリ作成手順で確認できます。
redirectUrlに関しては後述するngrokで確認できます。

```php:app/Http/Controllers/AuthorizeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use PHPShopify\ShopifySDK;
use PHPShopify\AuthHelper;

class AuthorizeController extends Controller
{
    public function index()
    {
        ShopifySDK::config([
            'ShopUrl' => 'yourshop.myshopify.com',          // アプリをインストールするショップURL
            'ApiKey' => '***YOUR-PRIVATE-API-KEY***',       // アプリ管理画面に表示されるAPIキー
            'SharedSecret' => '***YOUR-SHARED-SECRET***',   // アプリ管理画面に表示されるAPIシークレットキー
        ]);
        
        $scopes = 'read_products,write_products,read_script_tags,write_script_tags';
        $redirectUrl = '***YOUR-REDIRECT-URL***';           // アプリのリダイレクトURL
        AuthHelper::createAuthRequest($scopes, $redirectUrl);

        exit;
    }
}

```

### ルーティング設定
以下のルーティングを追記します。

```php:routes/web.php
...
Route::get('/authorize', 'App\Http\Controllers\AuthorizeController@index');
```

## リダイレクトURL作成
### コントローラ作成
```shell
$ php artisan make:controller CallbackController
Controller created successfully.
```
作成したコントローラを以下のように修正します。
ApiKeyとSharedSecretに関しては後述するアプリ作成手順で確認できます。

```php:app/Http/Controllers/CallbackController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use PHPShopify\ShopifySDK;
use PHPShopify\AuthHelper;

class CallbackController extends Controller
{
    public function index()
    {
        ShopifySDK::config([
            'ShopUrl' => 'yourshop.myshopify.com',          // アプリをインストールするショップURL
            'ApiKey' => '***YOUR-PRIVATE-API-KEY***',       // アプリ管理画面に表示されるAPIキー
            'SharedSecret' => '***YOUR-SHARED-SECRET***',   // アプリ管理画面に表示されるAPIシークレットキー
        ]);

        $accessToken = AuthHelper::getAccessToken();

        // ここで生成したアクセストークンはDBに保存しますが、今回は省略します

        if (!isset($accessToken))
        {
            exit;
        }

        $config = ShopifySDK::$config;
        // ShopifySDKオブジェクト 取得
        $shopify = new ShopifySDK([
            'ShopUrl' => $config['ShopUrl'],
            'AccessToken' => $accessToken
        ]);

        // app handle 取得
        $graphQL =
            <<<Query
query {
  app {
    handle
  }
}
Query;
        $appResponse = $shopify->GraphQL->post($graphQL);
        header('Location: '.$config['AdminUrl'].'apps/'.$appResponse['data']['app']['handle']);

        exit;
    }
}

```

### ルーティング設定
以下のルーティングを追記します。

```php:routes/web.php
...
Route::get('/callback', 'App\Http\Controllers\CallbackController@index');
```

## 起動
### Laravel
```shell
$ php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
```

### ngrok
ngrokを利用して開発環境を公開します。

```shell
$ npm install ngrok -g
$ ngrok http 8000
```

実行すると以下のようになります。
![スクリーンショット 2020-12-04 23.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672074/a202ae96-b7b1-967d-80dd-fb22d2594c47.png)

## アプリ作成
shopifyパートナーダッシュボードのアプリ管理からアプリを作成します。
URLは先ほどngrokで生成したURLに置き換えてください。
![partners.shopify.com_760263_apps_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672074/88f60a4d-ce2f-9e2b-749b-511e8a71fdda.png)


## アプリインストール
[ngrokで生成したURL]/authorizeにアクセスすると認証画面が表示されます。
![kamizuru-test.myshopify.com_admin_oauth_request_grant_client_id=5dd5525e5e87e0c2371e87ef152673bc&redirect_uri=https%3A%2F%2Fbb0989b63cc3.ngrok.io%2Fcallback&scope=read_products%2Cwrite_products%2Cread_script_tags%2Cwrite_script_tags (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672074/1a2b9c22-5f8d-13ab-0694-da3015858753.png)

「未掲載のアプリをインストールする」をクリックすると、先ほど設定したリダイレクトURLがコールされアプリ画面が表示されます。
Laravelのデフォルト画面が表示されれば無事インストール完了です。
![kamizuru-test.myshopify.com_admin_oauth_request_grant_client_id=5dd5525e5e87e0c2371e87ef152673bc&redirect_uri=https%3A%2F%2Fbb0989b63cc3.ngrok.io%2Fcallback&scope=read_products%2Cwrite_products%2Cread_script_tags%2Cwrite_script_tags (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672074/c992ba72-c597-2a80-3d66-d7ab61702503.png)

## API利用について
[php-shopify](https://github.com/phpclassic/php-shopify)にサンプルがありますが、例として商品情報を取得する場合は以下のようになります。
### 全ての商品情報を取得
```php
$products = $shopify->Product->get();
```
### 特定の商品情報を取得
```php
$productID = 23564666666;
$product = $shopify->Product($productID)->get();
```
## 最後に
アプリのトップURLで認証を同時に行う、生成したトークンをDBに保存する、などの実用に向けた処理は今回省略していますが、作成したアプリをショップにインストールまでの大枠の手順はご紹介できたかと思います。
今後、ShopifyアプリをLaravelで開発する方への参考になれば幸いです。