2014-05-16 17 views
10

Wie ich Stripe-Kundennummer in meiner DB für spätere Zahlungen gespeichert habe. hier wird der Kunde mehrere Karten haben, wo ich Kundenkarte mit vorhandenen Karten von diesen bestimmten Kunden überprüfen/validieren möchte.Kann ich überprüfen, ob eine Karte bereits vorhanden ist, bevor Sie eine neue erstellen?

Angenommen, die gleichen Kartendetails werden mehrmals als mehrere Karten gespeichert.

In diesem Prozess möchte ich überprüfen mit Token, ob diese Karte bereits existierte oder nicht. wird es verwenden Wenn bereits dort, Wenn nicht, wird neue Karte erstellen.

Antwort

7

Es klingt, als würden Sie die Kartendaten lokal zwischenspeichern, um sie dem Kunden anzeigen zu können.

Wenn dies korrekt ist, stellt Stripe für jede Karte/jeden Token einen Fingerabdruck zur Verfügung, den Sie in den Kartensätzen speichern können (falls Sie es nicht bereits sind). Jeder Fingerabdruck ist einzigartig für eine Karte. Bevor Sie zusätzliche Karten für einen Kunden speichern, können Sie die Karten des Benutzers einfach per Fingerabdruck suchen.

Als einfaches Beispiel, ein User has_many :cards unter der Annahme:

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

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

Wenn Sie nicht die Kartendaten lokal zwischenspeichern, Streifen behandelt Duplikate für Sie und Sie brauchen nichts zu tun.

+3

Hier, ich erstelle nur die Karte mit neuen Token für den jeweiligen Kunden. Als nächstes wird der Fingerabdruck für diese Karte erhalten und überprüft mit diesem Fingerabdruck, um die Karten von diesem Kunden zu löschen. Wenn schon gefunden, wird diese Karte gelöscht. Wenn keine Duplikate gefunden werden, behalten Sie diese Karte wie gewohnt.So dass wir hier nicht mehrere Karten mit den gleichen Kartendetails wie doppelte Karten für bestimmten Kunden erhalten. –

+2

Ab sofort Streifen erstellen doppelte Karten als Wenn ich die gleichen Karten Details mehrmals eingeben wird es mehrere Karten mit denselben Details für diesen bestimmten Kunden erstellen. Also habe ich wie oben gemacht. Bitte lassen Sie mich Ihre Kommentare wissen, wenn ich etwas falsch mache. –

+1

@colinm leider stripe derzeit keine Behandlung von Duplikaten –

18

Leider habe ich heute bei der Arbeit an Stripe festgestellt, dass es die Speicherung von doppelten Karten erlaubt. Um dies zu vermeiden, habe ich folgende Schritte:

#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 

Fingerabdruck einer Karte mit Streifen gespeichert ist immer einzigartig

Wenn Sie wollen weniger Anrufe Streifen machen, empfiehlt es sich, dass Sie die Fingerabdrücke speichern aller Karten lokal und verwenden Sie sie für die Überprüfung der Einzigartigkeit. Fingerabdrücke von Karten lokal zu speichern ist sicher und identifiziert eine Karte eindeutig.

+0

Speichern Sie card_id's in Ihrem db? – Batman

+5

Diese Antwort ist nur teilweise vollständig. Der Kartenfingerabdruck ist nur für die Zuordnung der ** Kartennummer ** nützlich. Sie müssen auch sicherstellen, dass das Ablaufdatum nicht geändert wurde. Wenn ein Kunde die gleiche Kartennummer, aber ein aktualisiertes Ablaufdatum hat, erstellt diese Antwort keine neue Karte. –

11

Für Menschen, dies im Jahr 2016 lesen: immer noch korrekt ist Sahil Dhankhar Antwort, obwohl Stripe have apparently changed their API syntax:

customer.cards 

ist jetzt:

customer.sources 

So würde korrekte Syntax jetzt sein:

#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 

Hoffe, das hilft jemandem!

0

Die Karte Fingerabdruck ist nur nützlich für passend zur Kartennummer. Sie müssen auch überprüfen, um stellen Sie sicher, das Ablaufdatum hat sich auch nicht geändert. Wenn ein Kunde die gleiche Kartennummer, aber ein aktuelles Ablaufdatum hat

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 want this card to be used for further transactions 
    customer.default_card = default_card.id 
    # save the customer 
    customer.save 
Verwandte Themen