Могу ли я проверить, есть ли у пользователя 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
Ответ 5
fingerprint
- это способ проверить дубликат карты. Вы можете проверить fingerprint
в объекте карты или объекте токена. пожалуйста, следуйте этому: полоса API проверяет существующую карту