Могу ли я проверить, есть ли у пользователя Stripe уже определенная карта перед добавлением нового?

Я сохранил идентификатор идентификатора полосы в моем db для последующих платежей. У клиента будет несколько карт, и я бы хотел проверить/подтвердить новые карты клиентов с их существующими картами.

Предположим, что одни и те же данные карты могут храниться несколько раз, как несколько карт.

Я хочу проверить с помощью маркера Stripe, существует ли новая карта или нет. Он будет использовать его, если он уже есть, если он не создаст новую карту.

Ответ 1

К сожалению, во время работы над Stripe сегодня я заметил, что он позволяет хранить дубликаты карт. Чтобы этого избежать, я сделал следующие шаги:

#fetch the customer 
customer = Stripe::Customer.retrieve(stripe_customer_token)
#Retrieve the card fingerprint using the stripe_card_token  
card_fingerprint = Stripe::Token.retrieve(stripe_card_token).try(:card).try(:fingerprint) 
# check whether a card with that fingerprint already exists
default_card = customer.cards.all.data.select{|card| card.fingerprint ==  card_fingerprint}.last if card_fingerprint 
#create new card if do not already exists
default_card = customer.cards.create({:card => stripe_card_token}) unless default_card 
#set the default card of the customer to be this card, as this is the last card provided by User and probably he want this card to be used for further transactions
customer.default_card = default_card.id 
# save the customer
customer.save 

отпечаток карты, хранящейся с полосой, всегда уникален

Если вы хотите сделать меньше звонков на полосу, рекомендуется хранить отпечатки пальцев всех карточек локально и использовать их для проверки уникальности. Хранение отпечатков пальцев локально безопасно и однозначно идентифицирует карту.

Ответ 2

Для людей, читающих это в 2016 году: ответ Sahil Dhankhar по-прежнему верен, хотя Stripe, по-видимому, изменили свой синтаксис API:

customer.cards

теперь:

customer.sources

Итак, правильный синтаксис теперь будет:

#fetch the customer 
customer = Stripe::Customer.retrieve(stripe_customer_token)
#Retrieve the card fingerprint using the stripe_card_token  
card_fingerprint = Stripe::Token.retrieve(stripe_card_token).try(:card).try(:fingerprint) 
# check whether a card with that fingerprint already exists
default_card = customer.sources.all.data.select{|card| card.fingerprint ==  card_fingerprint}.last if card_fingerprint 
#create new card if do not already exists
default_card = customer.sources.create({:card => stripe_card_token}) unless default_card 
#set the default card of the customer to be this card, as this is the last card provided by User and probably he want this card to be used for further transactions
customer.default_card = default_card.id 
# save the customer
customer.save 

Надеюсь, это поможет кому-то!

Ответ 3

Похоже, вы локализуете данные карты локально, чтобы отображать их для клиента.

Если это правильно, Stripe предоставляет отпечаток пальца для каждой карты/токена, который вы можете начать хранить в записях карты (если вы еще этого не сделали). Каждый отпечаток уникален для карты, поэтому, прежде чем хранить дополнительные карты для клиента, вы можете просто искать карточки пользователя по отпечаткам пальцев.

В качестве простого примера предположим, что User has_many :cards:

token = Stripe::Token.retrieve("tok_a1b2c3d4")

unless current_user.cards.find_by(fingerprint: token.card.fingerprint)
  current_user.cards.create( ... # data from token )
end

Если вы не кэшируете данные карты локально, Stripe обрабатывает дубликаты для вас, и вам не нужно ничего делать.

Ответ 4

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

customer = Stripe::Customer.retrieve(customer_stripe_id)

# Retrieve the card fingerprint using the stripe_card_token
newcard = Stripe::Token.retrieve(source_token)
card_fingerprint = newcard.try(:card).try(:fingerprint)
card_exp_month = newcard.try(:card).try(:exp_month)
card_exp_year = newcard.try(:card).try(:exp_year)

# Check whether a card with that fingerprint already exists
default_card = customer.sources.all(:object => "card").data.select{|card| ((card.fingerprint==card_fingerprint)and(card.exp_month==card_exp_month)and(card.exp_year==card_exp_year))}.last
default_card = customer.sources.create(source: source_token) if !default_card

# Set the default card of the customer to be this card, as this is the last card provided by User and probably he wants this card to be used for further transactions
customer.default_card = default_card.id

# Save the customer
customer.save