2014-11-05 5 views
27

Zastanawiam się, czy możliwe było przeszukanie klienta tylko za pomocą jego adresu e-mail podczas korzystania z interfejsu API Stripe.Pasek, czy możliwe jest wyszukanie klienta za pomocą wiadomości e-mail?

documentation tylko wskazuje poszukiwania przez:

created, 
ending_before, 
limit, 
starting_after 

ale nie email.

Chciałbym uniknąć konieczności wymieniania wszystkich moich klientów, aby znaleźć te, które mają te same adresy email.

+0

Maksymalny limit wynosi 100, więc jeśli masz więcej niż 100 klientów, wyszukiwanie przez e-mail nie gwarantuje znalezienia klienta przez e-mail. – Greeso

+1

Podobno można wyszukiwać przez e-mail teraz, ale Stripe nadal głupio pozwala wielu klientom z tym samym e-mailem, więc musimy obsługiwać duplikaty w wynikach: https://stackoverflow.com/a/40482496/470749 – Ryan

Odpowiedz

2

Pasek pozwala teraz filtrować klientów przez e-mail.

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

Jest to ważne, aby zapewnić, że nie tworzyć duplikatów klientów. Ponieważ nie można umieścić klienta w Stripe i przechowywać identyfikatora klienta Stripe w systemie w ramach pojedynczej transakcji, trzeba zbudować w niektórych sejfach, które sprawdzają, czy dany klient istnieje przed utworzeniem nowego. Wyszukiwanie klientów za pomocą poczty e-mail jest ważne w tym względzie.

16

Należy pobrać i zapisać identyfikator klienta Stripe wraz z pozostałymi danymi klienta w bazie danych. Następnie możesz wyszukać adres e-mail w bazie danych i retrieve the customer record from Stripe, korzystając z identyfikatora klienta Stripe.

1

Interfejs API pasków nie obsługuje żadnej funkcji wyszukiwania przez e-mail. Mają to wyszukiwanie w swoim pulpicie nawigacyjnym, ale nie są udostępniane żadnym API; z koncepcji architektonicznej wynika, że ​​nie ma możliwości lub planu z paskiem, aby uwzględnić to w API; każdy obiekt w ich API może być odtworzony tylko przez ten konkretny id obiektu podany przez pasek podczas jego tworzenia. Być może utrzymują go jako możliwość zaangażowania deweloperów aplikacji zewnętrznych !!

więc oczywistym rozwiązaniem jest przechowywanie klientów w swojej własnej bazy danych, które mają być przeszukiwania w przyszłości - jak Simeon Visser powiedział above

btw, dla obejścia, jeśli już używany API paskiem dużo i istnieje wiele danych klientów, które trzeba teraz przeszukiwać - jedynym sposobem jest przejście przez bazę danych do własnego celu; Oczywiście, musisz use pagination shortcut przejrzeć całą listę, aby to zrobić.

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

Ponieważ określono, że

Dokumentacja wskazuje tylko aby szukać według stworzonego, ending_before, limit i starting_after, ale nie "e-mail".

Masz rację, nie możesz wyszukiwać za pomocą e-maili.

Jeśli nadal chcesz to zrobić, zamiast tego możesz uzyskać listę wszystkich klientów i przefiltrować odpowiedź, korzystając z numeru email.

Dla przykładu, w ruby można to zrobić w następujący sposób:

customers = Stripe::Customer.all 

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

PS: Stripe może mieć wielu klientów związane z jednego adresu e-mail.

4

Jestem naprawdę rozczarowany, że Stripe nie pozwala na odzyskanie klienta przez jej adres e-mail (i pozwala wielu klientom z tym samym adresem e-mail).

Oto hack/obejście, którego używam w PHP.

Jeśli możesz oszacować datę utworzenia klienta, prawdopodobnie możesz zawęzić listę klientów, a następnie sprawdzić, czy pasuje do adresu e-mail.

/** 
* 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; 
} 

Prawdopodobnie wystarczy użyć pierwszego elementu w wynikowej tablicy (zwłaszcza, że ​​tablica będzie prawdopodobnie zawierała tylko 1 element).

+0

jeśli wiesz data może równie dobrze przechowywać i używać customerID –

+1

@MartijnScheffer Używam ClickFunnels, a ja wysyłam mailem do nowego kupującego link do zarządzania szczegółami jej subskrypcji. ClickFunnels nie ujawnia identyfikatora klienta. Poza tym wolałbym nie tworzyć bazy danych i zarządzać nią tylko dla 1 lub 2 kolumn informacji. Tak więc, chociaż chciałbym, żebyśmy to zrobili, nie znalazłem tutaj innego sposobu niż mój hack. – Ryan

21

Zrobiłem to za pomocą następującego żądania API. Nie było to dostępne w listach docs.I dostałem to, wyszukując ich wyszukiwanie w obszarze pulpitu przy użyciu Narzędzi dla programistów przeglądarki.

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

Warningta wykorzystuje nieudokumentowane API, który jest właściwy do deski rozdzielczej. Choć może to zadziałać dzisiaj, nie ma gwarancji, że będzie nadal działać w przyszłości.

+0

Myślę, że warto spojrzeć na tę odpowiedź https://stackoverflow.com/questions/26767150/stripe-is-it-possible-to-search-a-customer-by-their-email#41743023, ponieważ ona nie używa hack – Greeso

+1

Działa z Python lib 'Żądania' bez' Content-Type'. –

7

Nie można bezpośrednio wyszukiwać przez e-mail.

Możesz jednak zhakować trochę, aby wyświetlić listę wszystkich użytkowników i dbać o e-mail.

Tu jest mój kodu (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

Idealne, i wielkie dzięki :). Wygląda na to, że jest to twoja jedyna odpowiedź na SO i myślę, że jest to najlepsza odpowiedź na to pytanie. – Greeso

+0

Naprawdę nienawidzę nieskończonych pętli z instrukcjami break ... ale zadziałało. –

+0

dzięki @Greeso! – Julien

0

Oto Async- Oczekujcie Droga ta metoda może być stosowany do wszystkich trzeciej Odsłon z Nodejs Szczególnie

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 jest NPM do tworzenia żądań http ... bardzo fajne i martwe proste

Powiązane problemy