更新:2018年1月頃から、Stripeのemail
パラメーターを使用して検索できるようになりました。 受け入れられた答え を参照してください。
Stripe APIを使用しているときに、メールアドレスのみで顧客を検索できるかどうか疑問に思っていました。
ドキュメント は、以下による検索のみを示します。
created,
ending_before,
limit,
starting_after
email
ではありません。
同じメールアドレスを持つ顧客を見つけるために、すべての顧客をリストアップする必要はありません。
Stripeでは、メールで顧客をフィルタリングできるようになりました。
https://stripe.com/docs/api#list_customers
Map<String, Object> options = new HashMap<>();
options.put("email", email);
List<Customer> customers = Customer.list(options).getData();
if (customers.size() > 0) {
Customer customer = customers.get(0);
...
これは、顧客の重複を防ぐために重要です。 Stripeで顧客を作成し、単一トランザクション内でシステムにStripe顧客IDを保存することはできないため、新しい顧客を作成する前に特定の顧客が存在するかどうかを確認するフェールセーフを組み込む必要があります。そのためには、顧客をメールで検索することが重要です。
これを行うには、次のAPIリクエストを使用しました。これはストライプドキュメントでは利用できませんでした。ブラウザー開発者ツールを使用してダッシュボードエリアで検索を追跡することでこれを取得しました。
url :https://api.stripe.com/v1/search?query="+email+"&prefix=false",
method: GET
headers: {
"authorization": "Bearer Your_seceret Key",
"content-type": "application/x-www-form-urlencoded",
}
警告これは、ダッシュボードに固有の文書化されていないAPIを使用します。現在は動作する可能性がありますが、将来も動作し続ける保証はありません。
データベースに他の顧客の詳細とともにStripeの顧客IDを取得して保存する必要があります。次に、データベースでメールアドレスを検索し、 Stripeから顧客レコードを取得 Stripe顧客IDを使用します。
メールで直接検索することはできません。
ただし、少しハッキングしてすべてのユーザーをリストし、メールの世話をすることができます。
これが私のコード(PHP)です。
$last_customer = NULL;
$email = "[email protected]";
while (true) {
$customers = \Stripe\Customer::all(array("limit" => 100, "starting_after" => $last_customer));
foreach ($customers->autoPagingIterator() as $customer) {
if ($customer->email == $email) {
$customerIamLookingFor = $customer;
break 2;
}
}
if (!$customers->has_more) {
break;
}
$last_customer = end($customers->data);
}
https://stripe.com/docs/api/php#list_customers
/**
* Remember that Stripe unfortunately allows multiple customers to have the same email address.
* If we ever have more customers with a matching email address than can be returned by a single 'page' of the API request, we'll need a more complicated approach.
* @see https://stackoverflow.com/a/38492724/470749
* @param string $emailAddress
* @return array
*/
public function getCustomersByEmailAddress($emailAddress) {
try {
$response = \Stripe\Customer::all(["limit" => 100, "email" => $emailAddress]);
return $response->data;
} catch (\Exception $e) {
Log::error($e);
return [];
}
}
指定したので
ドキュメントは、作成、ending_before、limit、starting_afterによる検索のみを示しており、「電子メール」は示していません。
あなたは正しい、あなたは電子メールを使用して検索することはできません。
それでもそれを行いたい場合は、代わりにできることは、すべての顧客のリストを取得し、email
を使用して取得した応答でフィルタリングすることです。
たとえば、Ruby
では、次のように実行できます。
customers = Stripe::Customer.all
customer_i_need = customers.select do |c|
c.email == "[email protected]"
end
PS:Stripeでは、1つの電子メールアドレスに複数の顧客を関連付けることができます。
この行を書くだけです
\Stripe\Customer::all(["email" => "YourDesiredEmail"]);
Stripe APIは、メールによる検索機能をサポートしていません。この検索はダッシュボードにありますが、APIにはリリースされていません。アーキテクチャの概念から、これをAPIに含める可能性やストライプの計画はないと思われます。 API内のすべてのオブジェクトは、作成中にstripによって指定された特定のオブジェクトIDによってのみ取得可能です。たぶん、彼らはサードパーティのアプリケーション開発者の関与の範囲としてそれを保持している!!
したがって、明らかな解決策は、将来的に検索可能にしたい独自のデータベースに顧客を保存することです- Simeon Visser が 上記 を言ったように
ところで、回避策として、すでにストライプAPIを多く使用しており、検索可能にする必要がある顧客データが多数ある場合-唯一の方法は、APIの 'List all customers'機能を使用することです &独自の目的のためにデータベースを構築します;もちろん、 ページネーションのショートカットを使用 を実行して、リスト全体を繰り返し処理します。
$customers = \Stripe\Customer::all(array("limit" => 3));
foreach ($customers->autoPagingIterator() as $customer) {
// Do something with $customer
}
ここに非同期待機方法があります。このメソッドは、特にNodejsを使用したすべてのサードパーティヒットに使用できます
const configuration = {
headers: {
"authorization": `Bearer ${Your stripe test key}`,
"content-type": "application/x-www-form-urlencoded",
}
};
const requestUrl = `https://api.stripe.com/v1/search?
query=${'email you are to use'} &prefix=false`
const emailPayment = await axios.get(requestUrl,
configuration)
Axiomは、httpリクエストを作成するためのNpmです...非常にクールでシンプルです