[RAILS] Créer un client Payjp et paramétrer default_card

introduction

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.

Environnement de développement

ruby 2.6.5 Rails 6.0.3.3

référence

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

Modèle de carte

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_~

Créer un client

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

Acquisition d'informations client

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 %>

Comment définir default_card

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

Au cas où

finalement

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.

Recommended Posts

Créer un client Payjp et paramétrer default_card
4. Création d'un manifeste et exécution d'un module Web
Créer un référentiel local