Stripe + LineWorks + kintoneをMakeでつないでみた

はじめてのQiita記事です。うまく書けるかな。よろしくお願いします。

先日kintone Café 名古屋 Vol.13を開催しました。こちらはLT枠が埋まらなかったときのために用意していた発表内容です。

# 実現したい世界

決済サービスの雄Stripe。
ビジネス版LineであるLineWorks。
僕らのkintone。

うまくつながってくれたら素敵だと思いませんか？

## たとえば
Webサイトで商品の購入をしてくれたら、kintoneにデータが登録され、出荷・顧客対応管理が行えて、LineWorksのチャットを利用してチームで話しながら作業が行える。

そんな世界を、Make(https://www.make.com/en) で覗いてみようという試みです。

## 内容
この記事は以下の内容を解説したいと思っています。
- MakeでStripeの購入のイベントを受ける
- Makeでkintoneにイベントのレコードを登録する
- MakeでLineWorksのボットを呼び出す

また、次のようなポイントを強調したいです。
- LineWorksのボットをフリーかつノーコードで連携する方法
- Stripeのパス構造に着目して、kintoneでStripeへのリンクを作る方法
- Makeでのkintoneの利用と変数の使い方

**この内容はすべて無料で構築してみることが可能です。**

# 構築手順
では、システムの構築をはじめましょう。
## MakeでStripeの購入のイベントを受ける。

### Stripeの設定
Stripeでアカウントの開設を実施したら、開発者モードにして、テスト環境にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/8dbf9bf1-a311-559c-3a80-2ba4d8a64ac4.png)

APIキーを表示します。必要なものはシークレットキーです。
![スクリーンショット 2024-04-15 135936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/e27c82b0-48ba-1f7c-4446-9205badab603.png)

表示されたらメモしておきましょう。

---
### Makeの設定
Makeでシナリオ（一連の処理）を作っていきます。
アカウントを作成したら、Scenarios
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/ec575226-aab6-5010-da86-3c7aab3c52be.png)

「Create new Scenario」ボタンを押下してスタートします。
![スクリーンショット 2024-04-15 140953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/a7338db7-5384-145f-38fa-be904d574134.png)

Stripeを検索し、Watch Eventトリガーを選択します。
![スクリーンショット 2024-04-15 141225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/7dcafcbe-24e6-83b1-90fa-0d2ccc2c2c36.png)

下記のように設定できればOKです。
![スクリーンショット 2024-04-15 141542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/ab45118b-10de-fd20-31c0-618e1c970c00.png)

あたらしくConnectionを作る必要があるかもしれません。
![スクリーンショット 2024-04-15 141444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/3acd0adc-afcb-50af-f0dd-73f99e64378c.png)
わかりやすい名前と、先ほど控えておいたシークレットキーを入力します。

Stripeに戻ってみましょう。Webhookのタブを開くと、オンラインエンドポイントが新しく作成されているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/9a371b31-d5ff-d7b8-2c14-fb653105de92.png)

このWebhookが商品の購入時に発火して、Makeを呼び出してくれます。

---
## Makeでkintoneにイベントのレコードを登録する。

### kintoneの設定
まずはkintoneでアプリ（データベース）が作成されていなければなりません。
出荷のチェックがしたいので、こんな感じに作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/526102c1-0963-296c-ac1a-69c6728c8098.png)

【購入日時】はレコードの作成日時を利用しています。
【stripeリンク】は支払状況かくにんのためのpayment intentのリンクを入れたい。
【出荷前チェック】は業務上の作業内容をイメージして作ってみました。

出荷状況のステータス管理がしたいので、プロセス管理も一緒に組みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/84eade0f-a072-ba94-9907-15a2278f87f3.png)

アプリをリリースしたら、**アプリID**を控えます。
アプリIDはアプリのURL"https://XXXX.cybozu.com/k/79/" の「79」の部分です。


### Makeの設定
先ほど作ったStripeのWebhookトリガーの続きに作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/7069bfc3-338b-2ae6-3d94-9453553bbe63.png)
右の＋ボタンを押して、続きのアイテムを作成します。

kintoneで、Create a Recordを選択。
（makeが海外の製品なので、kintoneの"k"が大文字で、アイコンも違いますね。趣深い。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/7387f21f-13e8-bad9-dc60-f3d198d9f7ce.png)

Stripeのときと一緒で、Connectionを作る必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/af92798b-778c-7279-0788-c7d87f3b858d.png)
Sub Domainはcybozu.comを抜いた文字列を指定します。
Domain Nameは中国、アメリカがあるので、日本のcybozu.comを指定するように気をつけてください。

この次にハマりポイントがあって、そのままだと入力ができません。
MapトグルをONにして、先ほど控えた**アプリID**を手入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/6a071fb2-8f06-5178-e40c-9a92040afa87.png)

この状態から、refreshボタンを押下すると、Makeがアプリの構造情報を読み取ってくれます。

データのマッピングを入力します。
Stripeリンクを入力したいですが、いまはまだStripeからのWebhookを一回もこのシナリオで受け取ったことがないので、Makeがデータ構造を記憶していません。

とりあえず、イベントIDにStripeのEvent IDを入れておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/014549e4-67c7-125b-2cc4-10bdf7e2f673.png)

valueにカーソルを合わせると、参照できるデータの選択モーダルが出ます。
StripeのEvent IDを選択します。

---
## MakeでLineWorksのボットを呼び出す。

### LineWorksの設定    

LineWorksはStripe, kintoneと比較すると少し手順がありますので、まとめてみます。
1. アプリの新規作成(DeveloperConsole画面)
2. ボットの新規作成(DeveloperConsole画面)
3. ボットの導入(管理者画面)
4. トークルームの作成(LineWorks画面)

細かい設定が多いので、気をつけながら進めます。
また画面が、DeveloperConsole画面、管理者画面、利用画面と３つあるので、
明記しながら進めていきたいと思います。

#### アプリの新規作成(DeveloperConsole)
DeveloperConsoleにて、**API**を選択し、アプリの新規追加を選びます。
![スクリーンショット 2024-04-15 151041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/00fede01-ead8-2eb6-30ca-caa1345760d8.png)

つぎに、APIの設定をしますが、ポイントは２つ
![スクリーンショット 2024-04-15 151806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/e51a7ef2-33f5-18cf-1784-be454f165528.png)
1. Redirect URLはMakeの指定のURLになります。    
    "https://www.integromat.com/oauth/cb/oauth2" が指定のURLになります
2. OAuthにはスコープが必要です。 
    今回は"bot"を選択します

この２つは重要なポイントですので、間違えないようにします。

登録すると**Client ID**と**Client Secret**が発行されるので、控えておきます。

#### ボットの新規作成(DeveloperConsole)
ボットとは、ユーザーのようにメッセージを送信するシステムです。
DeveloperConsoleから、Bot＞登録ボタンを押して、新規作成します。
![スクリーンショット 2024-04-15 154608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/2b7b6467-ce47-50d5-2b1c-6a57f5de31e5.png)

ボットに名前をつけ、必要な設定をします。**主担当**に管理者のアカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/556fc1ac-26fc-a0c0-e042-42b4af34adbb.png)
ボットのポイントは、**メッセージ対象が複数人か、個人か**という点です。
特定の一人にメッセージを出す目的なら、個人となりますが、
今回はチームにメッセージを出したいので、チャットルームを指定してそこへメッセージを投下するイメージです。

なので、**Botポリシーを複数人のトークルームに招待可**とします。

招待を可能にしても、管理者画面でボットへアクセスできるユーザーは絞ることができます。

**Bot ID**はMakeからのメッセージ送信に利用しますので、控えておきます。

#### ボットの導入(管理者画面)
LineWorksの管理者として、環境にボットを導入します。
管理者画面へは、右端のプロフィールアイコンから、移動することができます。
![スクリーンショット 2024-04-15 160107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/8b59b367-81b3-b40c-cc7b-9b98e066094c.png)

Bot追加ボタンからBotを選択して追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/bf0eebe8-4349-3dcb-b5fc-6a676d96f3f0.png)

ここにも**ハマりポイント**があります。
Botの状態には、非公開というものがあります。これはBotとして導入されているが、運用されていない状態です。

追加した行をクリックして、モーダルを開きます。
![スクリーンショット 2024-04-15 160341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/08e65f5e-8ebf-0c11-df1c-e84ca473a171.png)

![スクリーンショット 2024-04-15 160750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/46c15785-f988-62e8-30b7-b26c8819e9ec.png)

修正ボタンを押して、編集をします。
![スクリーンショット 2024-04-15 160926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/f74e868c-b3d7-ff20-e1b7-daab619497bf.png)
1. 使用権限を「すべて」に
2. 公開設定をONにします。


#### トークルームの作成(LineWorks画面)
さあ、Botとおしゃべりするトークルームを作りましょう。
ここもポイントがあります。
1. トークルームは二人以上のアカウントで作成
2. トークルームのチャンネルIDを控える

LineWorks＞トークから「社内メンバーとトークを」選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/182a7086-192b-6c2c-9878-bcd31ce8cfcc.png)

作成したBotとメンバーを選択して、ルームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/a1e894cd-d0d7-bc7a-5b34-d1ea0dab99db.png)

トークルーム（チャンネル）の**チャンネルID**は三点リーダーから出るメニューの下のほうにあります。
![スクリーンショット 2024-04-15 161829.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/2078ea89-d8bb-2498-601c-3b43711a5820.png)
画面外まではみ出して見えない場合があるので注意します。（スクロールできないので、画面の表示を縮小してあげると見えます。）

さあ、これでLineWorksの設定はおわりです。下記の情報を控えているか、確認してください。
1. Client ID (アプリの設定より)
2. Client Secret (アプリの設定より)
3. Bot ID (Botの設定より)
4. チャンネルID (トークルームの設定より)

### Makeの設定
kintoneのアイテムの次に、つなげていきますが、**LineWorksはアイテムがありません**
そのため、LineWorksが準拠している、標準のHTTPS+OAuth2.0を利用することになります。

HTTPを検索し、OAuth2.0を探します。
![スクリーンショット 2024-04-15 163438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/73b4aa5e-67a0-c013-4c45-be90b7c29ca2.png)

つぎはすべてのポイントで、正しく設定していなければいけません。
![スクリーンショット 2024-04-15 163947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/b1bdf95d-7e1d-6887-abe4-a96af71328ac.png)
コネクションを作成します。

【Flow type】
Authorization Code（デフォルト）を利用します。

【Authorize URI】
LineWorksの固定値です。
https://auth.worksmobile.com/oauth2/v2.0/authorize

【Token URI】
LineWorksの固定値です。
https://auth.worksmobile.com/oauth2/v2.0/token

【Scope】
API(アプリ)を作成したときに、Botを選択しましたので、"bot"とします。

【Client ID】
先ほど控えたClient IDです。

【Client Secret】
先ほど控えたClient Secretです。

この状態でSaveを押下すると、小窓が開いて認証が走ります。

ここがうまくいかない場合は、LineWorksでの設定が間違っている可能があるので、
一度戻って確認してみてください。

Connectionが作成出来たら、リクエストの内容を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/d7b9cbc7-8fb0-26ab-fdea-c65a616be3cd.png)

【URL】
フォーマットは下記です。
```
https://www.worksapis.com/v1.0/bots/{{Bot ID}}/channels/{{Channel ID}}/messages
```
Bot IDとChannel IDは控えておいたものを設定します。

【Method】
POSTリクエストです。

【Headers】
JSON形式のBody部をPOSTするので、content-type="application/json"となります。

【Body type】
Raw(そのまま)を選びます。

【Content type】
Header指定と被りますが、application/jsonです。

【Request content】
LineWorksのメッセージ形式に準拠します。
メッセージタイプの内容でPOSTします。
参考(https://developers.worksmobile.com/jp/docs/bot-send-text)

Makeの設定はここまでです。保存してみましょう。
![スクリーンショット 2024-04-15 170524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/f1f81243-c9e7-0368-59c3-38d6ebadc3e6.png)

保存ボタンを押して、内容を記録します。


## 動かしてみる
### Stripe Payment Linksの作成
実際に動作させるために、テスト環境にPaymentLinksを作ってみます。
Stripeの機能で、ノーコードの決済画面を簡単に作ることができます。

Stripeダッシュボード＞その他＞商品カタログ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/87f9aecd-a8e2-dc82-8517-648d839366b4.png)

商品を追加
![スクリーンショット 2024-04-15 170900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/dcae5fda-61c4-0ae5-01ca-66fd1590c4ea.png)

適当に商品をつくります。
![スクリーンショット 2024-04-15 171045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/1d9813ba-b35c-143a-e069-5d195fbc9e4b.png)

支払リンクを作成
![スクリーンショット 2024-04-15 171129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/1996896b-8433-ae0d-5b4a-a950d1d89ea4.png)

右上の「リンクを作成」を実行して作ります。
![スクリーンショット 2024-04-15 171327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/f37366fb-793c-ca2d-f914-ef8a024985c6.png)

これで支払いリンクが作成されました。「コピー」でURLをコピーできるので、そのURLにアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/14522187-6a9d-7726-7862-7c9e0a2e2151.png)

URLは有効のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/627aa9e8-317d-a403-53af-aa4b16dff0c4.png)

この画面から、支払いを試すことができます。

### Makeで動作を確認
作成したMakeのシナリオを一回だけ起動させます。
「Run Once」を実行します。
![スクリーンショット 2024-04-15 171823.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/d0c6468c-ee99-e041-bdfd-872517047a71.png)


Stripeでは**テストカード**を利用して、テストできます。
先ほど作ったPaymentLinksのURLに、カード番号4242 4242 4242 4242を利用し、適当なデータを入れて、アクセスできるか確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/91dd7895-9c91-107d-46d8-0f44f46f8945.png)



実行に成功すると、Scenario内のアイテムにログが浮かびます。
![スクリーンショット 2024-04-15 171959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/08ea0c3d-e2fd-18bf-d75a-8734d0bbbafa.png)
ここをクリックすすと、IN-OUTのデータの状況や、実行の成否を見ることができます。

### うまくできましたか？
PaymentLinksから購入してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/38df5856-3d83-5f1b-79e6-573c7a12767a.png)

kintoneにデータができ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/8f6f2f3e-0dc5-2483-12f3-c15e9b9a0583.png)

Botもしゃべってくれました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/49472c4e-6f04-7f2b-e961-335c0c0f5273.png)

## ブラッシュアップ
はじめてStripeのCheckoutWebhookを受けましたね！
これでMakeはオブジェクト構造を記憶してくれました。
ここからさらに高度な設定が可能になります。

特に、Checkout(購入)を実施したことで、PaymentIntentが作成されました。
![スクリーンショット 2024-04-15 173501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/6cdcc066-d744-82cd-0858-2a72a95e5f67.png)


Stripe上のパスの、最後の[pi_xxxxxx]の部分がPaymentIntentのIDとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/9ca77b8b-3603-20a8-a316-e6b2f9c35248.png)
このパス設計の妙がStripeの長所です！

では、kintoneの【Stripeリンク】フィールドにこれを埋め込んで、kintoneからStripeの支払い状況へ飛べるようにしてみましょう。

末尾のPayment Intent IDを利用できるようになったStripeの変数に書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/9291f2c2-8631-2436-34f9-71b21ac4a837.png)

また、LineWorksへのメッセージも変えてみましょう！

kintoneにレコードが作成されたときに、Record Numberが作成されます。
kintoneのパス設計は
```
https://xxx.cybozu.com/k/{アプリID}/show#record={Record Number}
```
となりますから、このURLをメッセージに追加してあげましょう。

このとき、HTTPリクエストのJSONをそのまま編集すると
改行が見にくくて大変なので、いったん、変数にセットします。

Tool＞Set Variableを呼び出して、新しいアイテムを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/1e4498b7-c930-9521-6640-cb62a35d9cdc.png)

これをkintoneとLineWorksの間にセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/383df3f5-8aa7-1d0c-26b0-c42a16b07b47.png)

テキスト部分を変数に置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/ddc4f19f-5481-130a-241a-1cf99085ee42.png)
と、おきたいところですが、**このままだとJSON構造が崩れます**。

改行コードをエスケープします。
![スクリーンショット 2024-04-15 181344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/8804b90b-aed8-0cd9-42e2-b0df961ca9a9.png)

replaceにて、newlineを"\n"に変えています。


## リリース
さあ、開発は終わりました。Makeをリリースしましょう。
左下のトグルスイッチをONにします。
![スクリーンショット 2024-04-15 180335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/b299ab5b-ea78-3c54-f0a3-816c8a999ed2.png)

これで、Payment Linksから購入があったときはいつでも、Makeがkintoneにレコードを作り、LineWorksで案内してくれるようになりました。

試してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712902/fb78e55c-3dcb-ceb8-5fcb-f13b89f88de9.png)

いい感じですね😊

# まとめ
LineWorksの認証が難しいと思っていたので、OAuth2.0で実装できてしまったことに感動しました！　LineWorksの認証回りがちゃんと標準的な実装になっていたからできたのでしょうね。

Stripeとkintoneは専用モジュールを利用して手軽に作ることができました。ただ、LineWorksが専用モジュールがないのもあり、手順通りに実装しないとハマるポイントが多いので、開発者向けだなと思いました。

Makeとの比較はYoomが一番手かと思います。価格帯が違うのと、できることの幅がMakeの場合コーディングしている感覚なので、広いと思います。

SE開発者ならMake。ユーザー開発者ならYoom。あとは利用できる予算によりますでしょうか。