2014-11-05 2 views
27

Мне было интересно, можно ли искать клиента только по их адресу электронной почты при использовании Stripe API.Stripe, можно ли искать клиента по электронной почте?

documentation указывает только поиск по:

created, 
ending_before, 
limit, 
starting_after 

но не email.

Я бы хотел, чтобы не перечислить всех моих клиентов, чтобы найти, какие из них имеют одинаковые адреса электронной почты.

+0

Кроме того, предел max равен 100, поэтому, если у вас более 100 клиентов, то поиск по электронной почте не гарантирует результат поиска клиента по электронной почте. – Greeso

+1

Предположительно вы можете искать по электронной почте сейчас, но Stripe все еще тупо позволяет нескольким клиентам с тем же адресом электронной почты, поэтому нам нужно обрабатывать дубликаты в результатах: https://stackoverflow.com/a/40482496/470749 – Ryan

ответ

2

Полоса теперь позволяет фильтровать клиентов по электронной почте.

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 в своей системе внутри одной транзакции, вам нужно создать некоторые отказоустойчивые сейфы, которые проверяют, существует ли конкретный клиент, прежде чем создавать новый. Поиск клиентов по электронной почте является важным в этом отношении.

16

Вам необходимо получить и сохранить идентификатор клиента Stripe вместе с другими сведениями о клиенте в вашей базе данных. Затем вы можете найти адрес электронной почты в своей базе данных и retrieve the customer record from Stripe с помощью идентификатора клиента Stripe.

1

Stripe API не поддерживает функцию поиска по электронной почте. У них есть этот поиск в панели инструментов, но он не был выпущен для API; из архитектурной концепции кажется, что нет возможности или плана из полосы, чтобы включить это в API; каждый объект в их API извлекается только этим конкретным идентификатором объектов, заданным полосой при его создании. Может быть, они сохранили это как возможность участия сторонних разработчиков приложений!

Таким образом, очевидным решением является сохранение клиентов в своей собственной базе данных, которые вы хотите, чтобы быть доступными для поиска в будущем, - как Simeon Visser сказал above

Кстати, для решения проблемы, если вы уже использовали нашивки API много, и есть много данных о клиентах, которые вам теперь нужно искать - единственный способ - пройти через 'List all customers' functionality of API & создать базу данных для своей собственной цели; конечно, вы должны use pagination shortcut перебирать весь список для этого.

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

Поскольку вы указали, что

документация указывают только для поиска по созданной, ending_before, предел и starting_after, но не "электронная почта".

Вы правы, вы не можете искать по электронной почте.

Если вы все еще хотите это сделать, то вместо этого вы можете получить список всех клиентов и фильтровать ответ, который вы используете, используя email.

Для примера, в ruby вы можете сделать это следующим образом:

customers = Stripe::Customer.all 

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

PS: нашивки может иметь несколько клиентов, связанных с адресами электронной почты.

4

Я действительно разочарован тем, что Stripe не позволяет получить клиента по ее адресу электронной почты (и позволяет нескольким клиентам с тем же адресом электронной почты).

Вот хак/обходной путь, который я использую в PHP.

Если вы можете оценить дату создания клиента, вы можете, возможно, сократить список клиентов вниз, а затем проверить каждый, чтобы узнать, соответствует ли он адресу электронной почты.

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

Вы могли бы затем просто использовать первый элемент в результирующем массиве (особенно, так как массив, вероятно, содержат только один пункт).

+0

, если вы знаете дата u может также хранить и использовать customerID –

+1

@MartijnScheffer Я использую ClickFunnels, и я отправляю по электронной почте новому покупателю ссылку для управления деталями ее подписки. ClickFunnels не предоставляет идентификатор CustomerID. Кроме того, я бы предпочел не создавать и управлять базой данных только для 1 или 2 столбцов информации. Поэтому, хотя я хочу, чтобы Stripe справилась с этим, я не нашел другого способа, кроме моего взлома. – Ryan

21

Я сделал это, используя следующий запрос API. Это не было доступно в stripe docs.I получил это путем отслеживания их поиска в области панели управления с помощью инструментов разработчика браузера.

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, специфичный к приборной панели. Хотя сегодня это может работать, нет гарантии, что он будет продолжать работать в будущем.

+0

Я думаю, что стоит посмотреть на этот ответ https://stackoverflow.com/questions/26767150/stripe-is-it-possible-to-search-a-customer-by-their-email#41743023, потому что он не использует hack – Greeso

+1

Работает из Python lib 'Requests' без' Content-Type'. –

7

Невозможно выполнить прямой поиск по электронной почте.

Однако вы можете немного взломать список всех пользователей и следить за своим письмом.

Вот мой код (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

Отлично, и спасибо большое :). Похоже, это ваш единственный ответ на SO, и я думаю, что это лучший ответ на этот вопрос. – Greeso

+0

Я действительно ненавижу бесконечные циклы с заявлениями о перерывах ... но это сработало. –

+0

спасибо @ Greeso! – Julien

0

здесь является Async- Await Way Этот метод может быть использован для всех Третьей партии Хиты с 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 является NPM для создания http-запросов ... очень круто и мертво просто

Смежные вопросы