
Stripe: Search Customers
This item searches for customer objects on Stripe using a query.
Configs: Common
- Step Name
- Note
Configs
- C1: Authorization Setting in which API Secret Key is set *
- C2: Search Query#{EL}
- C3: Data item to save customer IDs
- C4: Data item to save URLs of the customer detail pages
- C5: Data item to save customers’ names
- C6: Data item to save customers’ email addresses
Notes
- To get Stripe’s API Secret Key, visit https://dashboard.stripe.com/apikeys (Stripe login required)
- See the Stripe Documentation for the fields and operators that can be used in Search Query
Capture

See also
Script (click to open)
- An XML file that contains the code below is available to download
- stripe-customer-search.xml (C) Questetra, Inc. (MIT License)
- If you are using Professional, you can modify the contents of this file and use it as your own add-on
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"));
}