💰

Stripe WebhookとGASでStripeのイベントを受信し、購入者に自動でメールを送る

2022/02/22に公開約3,000字

Stripeで商品が買われたときに手動でメールでご案内するのが面倒...自動化したい!

Stripeには、商品購入後に領収書メールを自動送信する機能があります。
しかし、その内容をカスタマイズすることはできません。

自分の商品が購入されたときに、
お客さんに自動返信メールで「お礼」と、「商品の案内」を送りたい!
手動でいちいちメールを送るのは嫌だ!
というわけで、作ってみました。

試す場合は自己責任でお願いいたします。

完成イメージはこちら

https://twitter.com/hedgehog_noodl/status/1495793876791177223

欲しい機能

  • Stripeから商品を購入してくれた人に自動でお礼メールを送る
  • メールの内容は商品ごとに出し分ける

使ったもの

  • Stripe Webhook
  • Stripe API
  • GAS/スプレッドシート

さっそく作ってみる

Stripeの設定

  1. Stripe右上の「テスト環境」をONにする ※開発が完了したら本番に戻し、APIキーの書き換えを行ってください。
  2. 「開発者」をクリック。APIやWebhookのメニューが表示されます。
  3. 左メニューAPIをクリックし、API Keyを確認
  4. 左メニューWebhookをクリックし、「+エンドポイントを追加」する
  • エンドポイント URL: GASで作ったウェブアプリのURLを入力
  • リッスンするイベントの選択: checkout.session.completed (購入完了のイベント)

スプレッドシート/GAS側の準備

欲しい機能の一つである「メールの内容は商品ごとに出し分ける」を実現するため、
出し分けるテキストの内容をスプレッドシートで管理することにしました。
流れは以下になります。

  1. 購入されたStripeの商品名を取得
  2. 同じ商品名のセルがあるかスプレッドシート内を検索
  3. 隣の列の文章(メールに入れたい文章)を取得
  4. メール送信

では商品名と商品ごとのメールテキストデータを作っていきましょう。
新規スプレッドシートを作成し、
1列目に商品名(Stripeの商品名と完全に一致させること)、
2列目にメールテキストを入れてください。

データが完成したら、

  1. スプレッドシートのメニューからGASのエディタを立ち上げる
  2. 下記コードをコピペ
  3. APIキーやメールアドレスを書き換える
  4. デプロイ
  5. WEBアプリのURLをコピーし、StripeのWebhook エンドポイントを追加に入力。

function doPost(e) {
  
  //Stripeのイベント
  const jsonString = e.postData.getDataAsString();
  const data = JSON.parse(jsonString);
  const customerMail = data.data.object.customer_details.email;

  const APIKEY = '【あなたのStripe APIキー】';
  const SET = {
   headers: {
     Authorization: 'Basic ' + Utilities.base64Encode(APIKEY)
   },
   muteHttpExceptions: true,
   method: 'GET'
   }

   const response = UrlFetchApp.fetch("https://api.stripe.com/v1/checkout/sessions/"+ data.data.object.id + "/line_items",SET
);
  const responseData = JSON.parse(response);
  const itemName = responseData.data[0]['description'];
  console.log(itemName);

  //スプレッドシート
    var spread = SpreadsheetApp.getActiveSpreadsheet() ;
    var sheet = spread.getSheets()[0] ;
    var textFinder = sheet.createTextFinder(itemName);
    var range= textFinder.findAll(); 
    var row = range[range.length - 1].getRow();
    var itemIntro = sheet.getRange(row,2).getValue();
    Logger.log(itemIntro) ;

  // 購入者に送る自動返信メールの情報
    var sendToAddress ="【あなたのメールアドレス】";
    var subject = itemName +'をご購入いただきありがとうございます';
    var option = {};
    option.from = sendToAddress;

  // 自動返信メール本文
  var body = 
    'この度は'+itemName +'をご購入いただき、誠にありがとうございました。' +
    '\n' +
    itemIntro+
    '\n' +
    '不明点などございましたら、公式LINEよりお問い合わせください。\n' + 
    '\n' +
    '─────────────────────────\n' +
    '署名 \n' +
    '─────────────────────────\n' +
    '\n';

    // メール送信
    GmailApp.sendEmail(customerMail,subject,body,option); //自動返信メール
    GmailApp.sendEmail(sendToAddress,subject,body,option); //自分にも同じ内容を送信

}

これで、商品を購入したとき、商品ごとに異なる内容の自動返信メールを送れるようになりました!

Discussion

ログインするとコメントできます