Il existe de nombreux articles sur les méthodes de paiement Payjp, mais je les écrirai car il n'y avait pas de méthode de paramétrage default_card. D'autres ont écrit sur la tokenisation, je vais donc omettre la description de javascript.
ruby 2.6.5 Rails 6.0.3.3
Veuillez compenser le manque d'explication ici.
référence: https://pay.jp/docs/api/#customer-%E9%A1%A7%E5%AE%A2 https://pay.jp/docs/customer
Dans mon cas, j'ai enregistré les colonnes suivantes dans le modèle de carte.
id | user_id | card_token | customer_token |
---|---|---|---|
integer | tok_~ | cus_~ |
Card_token (tok_ ~) est requis pour créer un client. Transmettez le jeton reçu par javascript au contrôleur et écrivez ce qui suit.
cards_controller.rb
def create
# card_Vérifiez si le jeton est correct
if params[:card_token] == nil
redirect_to new_user_card_path
return
end
#Client utilisateur_Si le jeton existe
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
#L'utilisateur est le client_Si le jeton n'existe pas
customer = Payjp::Customer.create(
description: "test",
card: params[:card_token],)
end
#Enregistrer dans la table à cartes
card = Card.new(
user_id: current_user.id,
card_token: params[:card_token],
customer_token: customer.id)
end
Définissez le tableau @ cards
et mettez les informations de la carte en fonction de customer_token
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
Créez un formulaire qui permet à l'utilisateur de sélectionner une carte et de recevoir l'index sélectionné par l'argument «i».
Vous pouvez afficher les informations de la carte avec la description suivante dans each_with_index pour @ cards
dans la vue.
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]}An#{+ card.data[i][:exp_month]}Lune" %>
<% end %>
<%= f.submit "Passer à la suivante" %>
<% end %>
J'utilise radio_button dans form_with de select.html.erb et reçois la valeur de # {i} dans params [: selected].
Assignez à [: default_card] de @ customer
et complétez avec @ 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
Il peut y avoir une description plus simple, mais elle peut être mise en œuvre avec cela. Après cela, veuillez organiser chacun d'eux.