2014-11-05 3 views
27

Ich frage mich, ob es möglich war, einen Kunden nur anhand seiner E-Mail-Adresse zu suchen, wenn er die Stripe-API verwendet.Streifen, ist es möglich, einen Kunden per E-Mail zu suchen?

Die documentation zeigt nur durch die Suche aber nicht email

created, 
ending_before, 
limit, 
starting_after 

.

Ich möchte vermeiden, über alle meine Kunden auflisten, welche die gleichen E-Mail-Adressen haben.

+0

Außerdem ist die maximale Grenze 100, wenn Sie also mehr als 100 Kunden haben, kann die Suche per E-Mail nicht dazu führen, dass Sie einen Kunden per E-Mail finden. – Greeso

+1

Angeblich können Sie jetzt per E-Mail suchen, aber Stripe erlaubt immer noch dummerweise mehrere Kunden mit derselben E-Mail, so dass wir mit Duplikaten in den Ergebnissen umgehen müssen: https://stackoverflow.com/a/40482496/470749 – Ryan

Antwort

2

Streifen jetzt können Sie Kunden per E-Mail filtern.

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); 
    ... 

Dies ist wichtig, dass Sie doppelte Kunden nicht schaffen, um sicherzustellen. Da Sie die Erstellung eines Kunden in Stripe und das Speichern der Stripe-Kunden-ID in Ihrem System nicht innerhalb einer einzigen Transaktion vornehmen können, müssen Sie einige fehlgeschlagene Safes einbauen, die prüfen, ob ein bestimmter Kunde vorhanden ist, bevor Sie einen neuen erstellen. Die Suche nach Kunden per E-Mail ist in dieser Hinsicht wichtig.

16

Sie müssen die Stripe-Kundennummer zusammen mit den anderen Kundendaten in Ihrer Datenbank abrufen und speichern. Sie können dann die E-Mail-Adresse in Ihrer Datenbank und retrieve the customer record from Stripe mithilfe der Stripe-Kundennummer suchen.

1

Die Stripe-API unterstützt keine Suche per E-Mail. Sie haben diese Suche in ihrem Dashboard, aber nicht in der API veröffentlicht; Aus dem architektonischen Konzept scheint es, dass es keine Möglichkeit oder Plan von Stripe gibt, dies in API zu integrieren; Jedes Objekt in seiner API kann nur durch die spezifische Objekt-ID abgerufen werden, die während der Erstellung durch stripe angegeben wurde. Möglicherweise haben sie es als ein Bereich für Drittanbieter-Anwendungsentwickler gehalten !!

So ist die offensichtliche Lösung ist es, die Kunden in einer eigenen Datenbank zu speichern, die Sie in Zukunft sein durchsuchbare wollen - wie Simeon Visser gesagt hat above

btw, für dieses Problem zu umgehen, wenn Sie bereits die Streifen API verwendet haben eine Menge und es gibt viele Kundendaten, die Sie jetzt durchsuchbar sein müssen - der einzige Weg ist, durch die 'List all customers' functionality of API & die Datenbank für Ihren eigenen Zweck zu bauen; Natürlich musst du use pagination shortcut durch die ganze Liste iterieren, um dies zu tun.

$customers = \Stripe\Customer::all(array("limit" => 3)); 
foreach ($customers->autoPagingIterator() as $customer) { 
    // Do something with $customer 
} 
2

Da Sie angegeben, dass

Die Dokumentation zeigen nur erstellt, ending_before, Grenze und starting_after suchen, aber keine "E-Mail".

Sie haben Recht, Sie können nicht mit E-Mails suchen.

Wenn Sie das immer noch tun möchten, können Sie stattdessen eine Liste aller Kunden abrufen und die Antwort filtern, die Sie mit email erhalten.

zum Beispiel in ruby Sie können es wie folgt:

customers = Stripe::Customer.all 

customer_i_need = customers.select do |c| 
    c.email == "[email protected]" 
end 

PS: Streifen können mehrere Kunden mit einer E-Mail-Adresse zugeordnet ist.

4

Ich bin wirklich enttäuscht, dass Stripe es nicht erlaubt, einen Kunden über seine E-Mail-Adresse abzurufen (und mehrere Kunden mit derselben E-Mail-Adresse zulässt).

Hier ist ein Hack/Workaround, den ich in PHP verwende.

Wenn Sie das Erstellungsdatum des Kunden schätzen können, können Sie die Liste der Kunden wahrscheinlich einschränken und dann prüfen, ob sie mit der E-Mail-Adresse übereinstimmt.

/** 
* Because email address is not uniquely indexed in Stripe and Stripe does not allow retrieving a customer by email address, here is a function that allows searching for customers based on email address with creation date between two provided dates. 
* @return array 
*/ 
function getCustomerByEmailAddressAndDates($emailAddress, $dateGreaterThanOrEqual, $dateLessThanOrEqual) { 
    $customersResults = \Stripe\Customer::all(['created' => ['gte' => $dateGreaterThanOrEqual, 'lte' => $dateLessThanOrEqual]]); 
    $customers = $customersResults->data; 
    $filteredResults = []; 
    foreach ($customers as $customer) { 
     if ($emailAddress === $customer->email) { 
      $filteredResults[] = $customer; 
     } 
    } 
    return $filteredResults; 
} 

Sie könnten wahrscheinlich dann benutzen Sie einfach das erste Element in dem resultierenden Array (vor allem, da das Array wahrscheinlich nur 1 Punkt enthalten wird).

+0

wenn Sie es wissen Das Datum, an dem Sie auch die Kundennummer –

+1

@MartijnScheffer speichern und verwenden können. Ich verwende ClickFunnels und ich maile dem neuen Käufer einen Link, um die Details seines Abonnements zu verwalten. ClickFunnels stellt die CustomerID nicht bereit. Außerdem würde ich es vorziehen, keine Datenbank nur für 1 oder 2 Spalten von Informationen zu erstellen und zu verwalten. Also, obwohl ich wünsche, dass Stripe dies gehandhabt hat, habe ich keinen anderen Weg gefunden als meinen Hack hier. – Ryan

21

Ich tat dies mit der folgenden API-Anfrage. Dies war in Stripe-Dokumenten nicht verfügbar. Ich habe dies erhalten, indem ich ihre Suche im Dashboard-Bereich mithilfe der Browser-Entwicklerwerkzeuge aufspürte.

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", 
    } 

WarnungDieses verwendet eine nicht dokumentierte API, die auf dem Armaturenbrett spezifisch ist. Auch wenn es heute funktionieren könnte, gibt es keine Garantie dafür, dass es auch in Zukunft funktionieren wird.

+0

Ich denke, es lohnt sich, diese Antwort https://stackoverflow.com/questions/26767150/stripe-is-it-possible-to-search-a-customer-by-their-email#41743023 zu suchen, weil es nicht verwendet Ein Hack – Greeso

+1

Arbeitet aus Python lib 'Anfragen' ohne' Content-Type'. –

7

Sie können nicht direkt per E-Mail suchen.

Sie können jedoch ein wenig hacken, um alle Benutzer aufzulisten, und kümmern sich um Ihre E-Mail.

Hier ist mein Code (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); 
} 
+1

Perfekt, und vielen Dank :). Es sieht so aus, als ob dies deine einzige Antwort auf SO ist, und ich denke, es ist die beste Antwort auf diese Frage. – Greeso

+0

Ich hasse wirklich endlose Schleifen mit Break-Anweisungen ... aber es hat funktioniert. –

+0

danke @ Greeso! – Julien

0

Hier ist die Async- Await Way Diese Methode für alle Third Party Hits mit NodeJS Besonders

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 verwendet werden können Npm zum Erstellen von HTTP-Anfragen ... sehr cool und tot einfach

Verwandte Themen