Stripe: 顧客を検索

Stripe: 顧客を検索 (Stripe: Search Customers)
この工程は、検索クエリに合致する Stripe 上の顧客オブジェクトを検索します。
Configs:共通設定
  • 工程名
  • メモ
Configs
  • C1: API シークレットキーを設定した認証設定 *
  • C2: 検索クエリ#{EL}
  • C3: 顧客 ID の一覧を保存するデータ項目
  • C4: 顧客詳細ページの URL の一覧を保存するデータ項目
  • C5: 顧客の名前の一覧を保存するデータ項目
  • C6: 顧客のメールアドレスの一覧を保存するデータ項目

Notes

Capture

See also

Script (click to open)
  • 下記のスクリプトを記述した XML ファイルをダウンロードできます
    • stripe-customer-search.xml (C) Questetra, Inc. (MIT License)
    • Professional をご利用であればファイルの内容を改変することでオリジナルのアドオンとして活用できます


const STRIPE_API_VERSION = '2022-08-01';

main();

function main(){
    //// == Config Retrieving / 工程コンフィグの参照 ==
    const auth = configs.get('conf_Auth');
    let query = configs.get('conf_Query');
    if (query === '') { // 検索クエリが空の場合、全件取得する
        query = 'created>0';
    }
    const customerIdsDef = configs.getObject('conf_CustomerIds');
    const customerUrlsDef = configs.getObject('conf_CustomerUrls');
    const customerNamesDef = configs.getObject('conf_CustomerNames');
    const customerEmailsDef = configs.getObject('conf_CustomerEmails');

    //// == Calculating / 演算 ==
    const singleLineFlag = checkDataDefs(customerIdsDef, customerUrlsDef, customerNamesDef, customerEmailsDef);
    const {customerIds, customerNames, customerEmails} = searchCustomers(auth, query, singleLineFlag);

    //// == Data Updating / ワークフローデータへの代入 ==
    saveData(customerIdsDef, customerIds);
    saveData(customerUrlsDef, customerIds.map(id => `https://dashboard.stripe.com/customers/${id}`));
    saveData(customerNamesDef, customerNames);
    saveData(customerEmailsDef, customerEmails);
}

/**
  * 保存先データ項目をチェックし、以下の場合にエラー
  * - 保存先データ項目が一つも設定されていない
  * - 保存先データ項目が重複
  * @param {ProcessDataDefinitionView} customerIdsDef 顧客 ID を保存するデータ項目
  * @param {ProcessDataDefinitionView} customerUrlsDef 顧客詳細ページの URL を保存するデータ項目
  * @param {ProcessDataDefinitionView} customerNamesDef 顧客の名前を保存するデータ項目
  * @param {ProcessDataDefinitionView} customerEmailsDef 顧客のメールアドレスを保存するデータ項目
  * @return {boolean} singleLineFlag 保存先データ項目のいずれかが単一行であれば true
  */
function checkDataDefs(customerIdsDef, customerUrlsDef, customerNamesDef, customerEmailsDef) {
    const dataDefList = [customerIdsDef, customerUrlsDef, customerNamesDef, customerEmailsDef]
        .filter(dataDef => dataDef !== null);
    if (dataDefList.length === 0) { // 保存先データ項目が一つも設定されていない
        throw 'No data item to save the search result is set.';
    }
    const dataNumSet = new Set(dataDefList.map(dataDef => dataDef.getNumber())); // 重複確認用
    if (dataNumSet.size < dataDefList.length) { // 保存先データ項目が重複
        throw 'Same data item is set multiple times.';
    }
    return dataDefList.some(dataDef => dataDef.matchDataType("STRING_TEXTFIELD"));
}

/**
  * 顧客を検索する
  * @param {String} oauth 認証設定
  * @param {String} query 検索クエリ
  * @param {boolean} singleLineFlag 保存先データ項目のいずれかが単一行であれば true
  * @return {Object} returnObj
  * @return {List<String>} returnObj.customerIds 顧客 ID の一覧
  * @return {List<String>} returnObj.customerNames 顧客の名前の一覧
  * @return {List<String>} returnObj.customerEmails 顧客のメールアドレスの一覧
  */
function searchCustomers(auth, query, singleLineFlag) {
    const customerIds = [];
    const customerNames = [];
    const customerEmails = [];
    let nextPage = search(auth, query, null, customerIds, customerNames, customerEmails);
    if (singleLineFlag && customerIds.length > 1) { // 保存先データ項目が単一行なのに複数件あればエラー
        throw 'More than one customers were found while the data item to save the result is Single-Line.';
    }
    while (nextPage !== null) {
        engine.log(`Current search result: ${customerIds.length} customers found. Fetching next page...`);
        nextPage = search(auth, query, nextPage, customerIds, customerNames, customerEmails);
    }
    engine.log(`Search result: ${customerIds.length} customers found.`);
    return {customerIds, customerNames, customerEmails};
}

/**
  * 顧客を検索する API リクエストを送信する
  * @param {String} oauth 認証設定
  * @param {String} query 検索クエリ
  * @param {String} page 取得するページ。最初のリクエストの場合は null
  * @param {List<String>} customerIds 検索結果の顧客 ID を格納する配列
  * @param {List<String>} customerNames 検索結果の顧客の名前を格納する配列
  * @param {List<String>} customerEmails 検索結果の顧客のメールアドレスを格納する配列
  * @return {String} nextPage 次のページ
  */
function search(auth, query, page, customerIds, customerNames, customerEmails) {
    const apiUri = 'https://api.stripe.com/v1/customers/search';
    const request = httpClient.begin()
        .authSetting(auth) // with "Authorization: Bearer XX"
        .header('Stripe-Version', STRIPE_API_VERSION)
        .queryParam('query', query) // required
        .queryParam('limit', '100'); // maximum limit
    if (page !== null) {
        request.queryParam('page', page);
    }
    const response = request.get(apiUri);
    const status = response.getStatusCode();
    const responseStr = response.getResponseAsString();
    if (status !== 200) {
        engine.log(responseStr);
        throw `Failed to search customers. status: ${status}`;
    }
    const responseObj = JSON.parse(responseStr);
    const customers = responseObj.data;
    if (page === null && customers.length === 0) { // 1 回目の検索で、結果の件数が 0
        throw 'No customers found.';
    }
    // 結果を配列に追加
    Array.prototype.push.apply(customerIds, customers.map(customer => customer.id));
    Array.prototype.push.apply(customerNames, customers.map(customer => customer.name));
    Array.prototype.push.apply(customerEmails, customers.map(customer => customer.email));
    if (responseObj.has_more) { // 次のページがある場合
        return responseObj.next_page;
    }
    // 次のページがない場合
    return null;
}

/**
  * データ項目に出力する
  * @param {ProcessDataDefinitionView} dataDef 保存先データ項目
  * @param {List<String>} dataList 保存するデータの配列
  */
function saveData(dataDef, dataList) {
    if ( dataDef === null ) {
      return;
    }
    engine.setData(dataDef, dataList.join("\n"));
}

    

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

上部へスクロール