株式会社スマレジの開発部でスマレジのサーバサイドを作っています

アプリ購入・キャンセル時の処理を実装する

こんにちは!株式会社スマレジ、開発部のmasaです!

大阪本社では、インフルエンザの予防接種のアナウンスが先日あって、「あー、もうそんな時期なんだな」と、時間の流れを感じます。 特に今年はコロナのせいで生活スタイル自体が劇的に変化したこともあり、あっという間だったなーと感じる人は多いんじゃないでしょうか? 来年はいつも通りの時間の流れの中で、生活できるようになりたいですね。

さて、今回もプラットフォーム・アプリネタです。

Developersサイトに、アプリ購入時のWebhookを試す機能が追加されました

前回のアップデートで、サンドボックス環境では検証できなかった「アプリ・マーケットでアプリを購入した時に発信するWebhook」についてテストできるようになりました。 今回はそれを利用して、アプリ購入時の処理を実装します。

通知の飛ばし方

f:id:masa2019:20201004212523p:plain
サンドボックス環境で、購入通知をテストする機能
アプリの「環境設定」(上記画像参照。URLを設定している画面です)の「利用者契約通知URL」の下に「テスト通知を送信」というボタンがあります。 このボタンは「購入時」と「購入解除時」の二種類のリクエストをトグルさせて送信してくれます。

リクエストの詳細については、下記をご覧ください。

developers.smaregi.dev

通知内容をGASを使って受信する

GASを使用して、通知内容を受信する場合使用できる手段にdoPost(e)を使う方法があります。 ここでは、「contract_infoテーブルという購入者の情報を保持するテーブルがあり、そこに通知内容を登録する」という想定で 処理を記載します。

ソースコード

/**
 * アプリ購入時の処理
 * @param e postデータ
 */
function doPost(e) {
    const requestStr = e.postData.contents;
    const requestJson = JSON.parse(requestStr);
    const exist = executeSQL("select * from contract_info where contract_id = ?", [requestJson.contractId]);
    let contractId = "";
    while (exist.next()) {
        contractId = exist.getString('contract_id');
    }
    if(contractId.length > 0) {
        throw('既に購入情報が存在しています: ' + spreadSheetId);
    } else {
        const results = executeSQL("insert into contract_info(contract_id) values(?)", [requestJson.contractId], true);

    }
}


/**
 * SQL実行汎用メソッド
 */
function executeSQL(sql, params = [], isUpdate = false) {
    let ipAddress = PropertiesService.getScriptProperties().getProperty("DB_SERVER_IP_ADDRESS");
    let dbName = PropertiesService.getScriptProperties().getProperty("DB_NAME");
    let userName = PropertiesService.getScriptProperties().getProperty("DBMS_USER_NAME");
    let password = PropertiesService.getScriptProperties().getProperty("DBMS_USER_PASSWORD");

    let connection = Jdbc.getConnection("jdbc:mysql://" + ipAddress + ":3306/" + dbName, userName, password);
    let statement = "";
    if (params.length > 0) {
        statement = connection.prepareStatement(sql);
        for (let i = 0; i < params.length; i++) {
            statement.setString(i + 1, params[i]);
        }
        if (isUpdate) {
            statement.executeUpdate();
            return true;
        } else {
            return statement.executeQuery();
        }
    } else {
        statement = connection.createStatement();
        if (isUpdate) {
            statement.executeUpdate(sql);
            return true;
        } else {
            return statement.executeQuery(sql)
        }
    }
    statement.close();
    connection.close();
}

上記のように実装したら、[公開]->[ウェブアプリケーションとして導入]からウェブアプリとして公開し、URLを取得します。 URLは1度公開すれば、同じように[公開]->[ウェブアプリケーションとして導入]から下記画像で示している部分に記載があります。 (公開時にも表示されます)

あとは、取得したURLを「利用者契約通知URL」に入れて、ボタンを押せば挙動を確認できます。 お試しくださいませ!