Могу ли я проверить, есть ли у клиента Stripe определенная карта, прежде чем добавить новую?
Я сохранил идентификаторы клиентов полосы в моей базе данных для последующих платежей. У клиента будет несколько карт, и я хотел бы проверить / проверить новые карты клиентов с их существующими картами.
Предположим, что одни и те же данные карты могут храниться несколько раз как несколько карт.
Я хочу проверить с помощью токена Stripe, существует ли недавно введенная карта или нет. Он будет использовать его, если он уже там, если нет, то создаст новую карту.
4 ответа
К сожалению, работая сегодня над 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
отпечаток карты, хранящейся с полосой, всегда уникален
Если вы хотите делать меньше звонков для чередования, рекомендуется хранить отпечатки пальцев всех карточек локально и использовать их для проверки уникальности. Хранение отпечатков пальцев на локальных картах безопасно и однозначно идентифицирует карту.
Для людей, читающих это в 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
Надеюсь, это поможет кому-то!
Отпечаток карты полезен только для соответствия номеру карты. Вы также должны убедиться, что срок годности также не изменился. Если у клиента тот же номер карты, но обновленный срок действия
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
Похоже, вы кэшируете данные карты локально, чтобы иметь возможность отобразить их клиенту.
Если это правильно, 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 обрабатывает дубликаты для вас, и вам не нужно ничего делать.
fingerprint
is the way to check duplicate card. you can check fingerprint
in card object or token object.
please follow this: stripe api checking for existing card