開発情報・ナレッジ

投稿者: ShiningStar株式会社 2025年5月16日 (金)

アンケート回答後ギフトコードを送付するサンプルプログラム

本記事では、アンケートの回答を受け付けた後、
メールにてギフトコードが閲覧可能なURLを送信する方法について紹介します。

全体像

予めギフトコードDBにギフトコードを格納しておきます。
アンケート回答フォームよりアンケートを回答すると、ギフトコードDBのギフトコードに紐づき、
アンケートDBに登録され回答者に通知がされます。

アンケート回答DBの非同期アクションの登録トリガにPHPを設置し、
ギフトコードDBのレコードIDを取得します。
フォームの登録時に発行された、アンケート回答DBのレコードの参照フィールドを更新することで紐づけを行い、
その後更新トリガにて消し込みを行います。

DB設定

以下2つのDBを作成します。
アンケート回答DB
ギフトコードDB

アンケート回答DB
フィールド名 フィールドタイトル フィールドタイプ 自動生成設定
アンケート管理ID enqueteId 参照フィールド(ギフトコードDBのIDを参照設定) 自動生成:使用しない
メールアドレス mail メールアドレス 自動生成:使用しない
ギフトコード giftCode テキスト 自動生成:使用しない

ギフトコードDB
フィールド名 フィールドタイトル フィールドタイプ 自動生成設定
ギフトコード giftCode テキスト 自動生成:使用しない
連携済みフラグ connectFlg セレクト(1:未連携、2:連携済み) デフォルト値:1(未連携)
連携日時 connectDate 日時 -

上記のフィールドは必須のフィールドになります。
その他のフィールドは、必要に応じて追加してください。

アンケートDBの非同期アクションの登録トリガにPHPを設置してください。

更新トリガには自DBと他DBの2つのアクションを作成し、
自DB更新アクションにはギフトコードを参照先DBのギフトコードフィールドにマッピングしてください。
他DB更新アクションには連携済みフラグを参照先DBの、
連携済みフラグフィールドに「2:連携済み」をマッピングしてください。

また連携日時フィールドには、自DBの最終更新日時をマッピングしてください。

非同期アクションの設定

アンケート回答DBに非同期アクションの登録トリガにPHPを設置してください。

登録トリガのPHPは以下のようになります。
PHP
<?php
define("API_URL", "https://api.spiral-platform.com/v1");
define("API_KEY", "");
define("APP_ROLE", ""); // 任意
define("APP_ID", "");
define("GIFT_DB_ID", "");
define("ENQUETE_DB_ID", "");

$commonBase = CommonBase::getInstance();

// ギフトコードDBからIDの小さい順に5件取得
$params = "?sort=_id:asc&limit=5";
$giftList = $commonBase->apiCurlAction("GET", "/apps/" . APP_ID . "/dbs/" . GIFT_DB_ID . "/records" . $params);

// ここで更新対象のレコードID(アンケートDB側)を設定
$record = $SPIRAL->getRecord();
$targetRecordId = $record["item"]["_id"];

foreach ($giftList["items"] as $gift) {
    // アンケートDBの特定レコードを更新
    $updateData = [
        "enqueteId" => $gift["_id"],
    ];

    $result = $commonBase->apiCurlAction("PATCH", "/apps/" . APP_ID . "/dbs/" . ENQUETE_DB_ID . "/records/" . $targetRecordId, $updateData);

    // エラーが存在するか確認
    if (isset($result["status"]) && $result["status"] === 400 && isset($result["errors"])) {
        // エラー配列をチェックして「value is duplicated」があるか調べる
        $isDuplicate = false;
        foreach ($result["errors"] as $error) {
            if (
                isset($error["message"]) &&
                strpos($error["message"], "duplicated") !== false &&
                isset($error["location"]) &&
                $error["location"] === "/enqueteId"
            ) {
                $isDuplicate = true;
                break;
            }
        }

        if ($isDuplicate) {
            // 重複なら次のギフトコードへ
            continue;
        } else {
            echo "更新エラー: " . json_encode($result["errors"]) . "\n";
            continue;
        }
    }

    // 成功した場合
    echo "更新成功: " . json_encode($result) . "\n";
    break; // 成功したらループ終了
}


//------------------------------
// 共通クラス
//------------------------------
class CommonBase {
    protected static $singleton;
    public function __construct() {
        if (self::$singleton) throw new Exception('must be singleton');
        self::$singleton = $this;
    }
    public static function getInstance() {
        return self::$singleton ?: new CommonBase();
    }

    function apiCurlAction($method, $addUrlPass, $data = null, $multiPart = null, $jsonDecode = false) {
        $header = [
            "Authorization: Bearer " . API_KEY,
            "X-Spiral-Api-Version: 1.1",
        ];
        $header[] = $multiPart ?: "Content-Type: application/json";
        if (APP_ROLE) $header[] = "X-Spiral-App-Role: " . APP_ROLE;

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_URL, API_URL . $addUrlPass);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

        if (in_array($method, ["POST", "PATCH", "DELETE"])) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $multiPart ? $data : json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        }

        $response = curl_exec($curl);
        if (curl_errno($curl)) echo curl_error($curl);
        curl_close($curl);

        return $jsonDecode ? $response : json_decode($response, true);
    }
}

            

アンケート回答フォームブロック設定

アンケート回答DBに対する認証エリアを発行してください。
クリックログインを有効にし、ログイン後ページにギフトコードの差し替えを出力してください。

メールアクションの設定を行い、上記認証エリアに対するクリックログインURLを記載して
フォームの設定は以上になります。

解決しない場合はこちら コンテンツに関しての
要望はこちら