Es gibt viele Artikel über Payjp-Zahlungsmethoden, aber ich werde sie schreiben, da es keine Einstellungsmethode für default_card gab. Andere haben über Tokenisierung geschrieben, daher werde ich die Beschreibung von Javascript weglassen.
ruby 2.6.5 Rails 6.0.3.3
Bitte machen Sie den Mangel an Erklärung hier wieder gut.
Referenz: https://pay.jp/docs/api/#customer-%E9%A1%A7%E5%AE%A2 https://pay.jp/docs/customer
In meinem Fall habe ich die folgenden Spalten im Kartenmodell gespeichert.
id | user_id | card_token | customer_token |
---|---|---|---|
integer | tok_~ | cus_~ |
Card_token (tok_ ~) ist erforderlich, um einen Kunden zu erstellen. Übergeben Sie das von Javascript empfangene Token an den Controller und schreiben Sie Folgendes.
cards_controller.rb
def create
# card_Überprüfen Sie, ob das Token korrekt ist
if params[:card_token] == nil
redirect_to new_user_card_path
return
end
#Benutzer Kunde_Wenn ein Token vorhanden ist
if Card.find_by(user_id: current_user.id)
card = current_user.card
customer = Payjp::Customer.retrieve(card[0][:customer_token])
customer.cards.create(
card: params[:card_token]
)
else
#Benutzer ist Kunde_Wenn kein Token vorhanden ist
customer = Payjp::Customer.create(
description: "test",
card: params[:card_token],)
end
#In Kartentisch speichern
card = Card.new(
user_id: current_user.id,
card_token: params[:card_token],
customer_token: customer.id)
end
Definieren Sie das Array "@ Karten" und geben Sie die Karteninformationen basierend auf customer_token ein
ruby:card.controller.rb
cards = Card.where(user_id: current_user.id)
@cards = []
cards.each do |card|
@customer = Payjp::Customer.retrieve(card.customer_token)
@cards << @customer.cards
end
Erstellen Sie ein Formular, mit dem der Benutzer eine Karte auswählen und den mit dem Argument "i" ausgewählten Index erhalten kann.
Sie können die Karteninformationen mit der folgenden Beschreibung in jedem_mit_Index für @ Karten
in der Ansicht anzeigen.
ruby:select.html.erb
<%= form_with url: set_default_card_path, method: :post, local: true do |f| %>
<% @cards.each_with_index do |card, i| %>
<%=f.radio_button :selected, :"#{i}" ,id: "check_card", checked: (card.data[i] [:id] == @customer[:default_card]) %>
<%= "**** **** **** #{ + card.data[i][:last4]}" %>
<%= "#{card.data[i][:exp_year]}Jahr#{+ card.data[i][:exp_month]}Mond" %>
<% end %>
<%= f.submit "Fahren Sie mit dem nächsten fort" %>
<% end %>
Ich verwende radio_button in form_with von select.html.erb und erhalte den Wert von # {i} in params [: selected].
Weisen Sie [: default_card] von @ customer
zu und vervollständigen Sie mit @ customer.save.
cards_controller
def set_default_card
cards = Card.where(user_id: current_user.id)
@cards = []
cards.each do |card|
@customer = Payjp::Customer.retrieve(card.customer_token)
@cards << @customer.cards
end
@customer = Payjp::Customer.retrieve(card.customer_token)
index = params[:selected].to_i
@customer[:default_card] = @cards[0].data[index][:id]
@customer.save
end
Es mag eine einfachere Beschreibung geben, aber sie kann damit implementiert werden. Danach vereinbaren Sie bitte jeden einzelnen.