[RUBY] Créez un site EC en utilisant des rayures! (Création de compte)

Petite publicité

https://www.code-sell.net/ Nous avons créé un service qui vous permet de vendre des codes! Si vous avez du code dont vous n'avez pas besoin, veuillez l'utiliser. En passant, j'utilise la bande décrite dans cet article.

en premier

https://qiita.com/UTOG/items/6a00135a5114a70727c3 C'est une continuation de.

La dernière fois que j'ai fait une fonction d'achat. Cette fois, je vais créer un compte Stripe (standard et personnalisé). Cependant, j'ai dit que je le ferais à partir de la nouvelle fonction d'enregistrement de l'appareil la dernière fois, mais si tel est le cas, l'article sera trop long (généralement gênant ...) et je ne ferai aucun réglage inhabituel, donc je suppose que l'appareil est installé.

Reportez-vous à l'article ci-dessous pour savoir comment installer l'appareil. Aucune fonction d'authentification Twitter ou d'authentification de courrier électronique n'est requise. [* Rails *] Comment utiliser l'appareil (version rails6)

Lors de la création d'un compte standard Article de référence

Standard Le formulaire et le tableau de bord sont du type préparé par bande. Pour plus de détails, veuillez consulter l'article précédent, mais si vous présentez brièvement les fonctionnalités

mérite

C'est très facile à mettre en œuvre, vous n'avez pas besoin de créer un formulaire ou un système de soumission, et si quelque chose ne va pas, c'est votre responsabilité.

Démérite

Cependant, la conception du formulaire et du tableau de bord ne peut pas être modifiée, et le sentiment de "J'utilise stripe!" Ressort beaucoup. On a le sentiment qu'un service n'est pas complet.

Commencer à créer

gemfile


gem 'omniauth-stripe-connect'

N'oubliez pas le bundle

rails g migration AddStripeAccountToUsers access_code:string publishable_key:string uid:string

Ajoutez access_code, publishable_key et uid à votre modèle utilisateur. En particulier, uid est une colonne importante qui relie le compte Stripe et l'application. Ensuite, définissez le rappel.

devise.rb


Devise.setup do |config|
・ ・ ・
  config.omniauth :stripe_connect,
    ENV["CLIENT_ID"],
    ENV["SECRET_KEY"],
    scode: 'read_write',
    stripe_landing: 'login'
・ ・ ・
end

Ensuite, définissez la méthode stripe_connect à appeler après l'enregistrement.

omniauth_callbacks_controller.rb


def stripe_connect
  auth_data = request.env["omniauth.auth"]
  @user = current_user
  if @user.persisted?
    @user.access_code = auth_data.credentials.token
    @user.publishable_key = auth_data.info.stripe_publishable_key
    @user.uid = auth_data.uid
    @user.save

    sign_in_and_redirect @user, event: :authentication
    flash[:notice] = 'Stripe Account Created And Connected' if is_navigational_format?
   else
     session["devise.stripe_connect_data"] = request.env["omniauth.auth"]
     redirect_to root_path
   end
end

Définissez stripe_url dans helper. Si je l'écris directement dans les vues, cela ne fonctionne pas.

application_helper.rb


module ApplicationHelper
  def stripe_url
   "https://connect.stripe.com/oauth/authorize?response_type=code&client_id=#{ENV["CLIENT_ID"]}&scope=read_write"
  end    
end

Ceci est le lien pour vous inscrire. Veuillez le faire où vous le souhaitez. Je recommande de le placer dans l'écran de modification du profil.

slim:edit.html.slim


  = link_to "enregistrer", stripe_url

Si vous écrivez en erb

erb:edit.html.erb


  <%= link_to "enregistrer", stripe_url %>

c'est tout. C'est si facile! Cependant, comme vous n'avez pas à créer vous-même le formulaire et le système de soumission, vous ne pouvez pas modifier la conception.

custom Le formulaire, le système de soumission et le tableau de bord sont tous conçus par vous-même. Sentiment de n'utiliser que l'API J'aimerais que vous voyiez l'article précédent pour les mêmes détails.

mérite

Vous pouvez modifier les formulaires et les tableaux de bord sans ressentir de rayures, avec un seul service

Démérite

C'est difficile à mettre en œuvre, vous devez créer tous les formulaires et tableaux de bord, c'est votre responsabilité en cas de problème

Commencer à créer

rails g migration AddStripeAccountToUsers access_code:string publishable_key:string uid:string

Ajoutez access_code, publishable_key et uid à votre modèle utilisateur. En particulier, uid est une colonne importante qui relie le compte Stripe et l'application.

rails g controller accounts

accounts_controller.rb


class AccountsController < ApplicationController
    before_action :authenticate_user!
    def new
    end

    def create
      user = current_user
      data = Stripe::Account.create(
        type: "custom",
        country: "JP",
        email: user.email,
        requested_capabilities: ['card_payments', 'transfers'],
        business_type: 'individual',
        individual: {
            first_name_kana: params[:first_name_kana],
            first_name_kanji: params[:first_name_kanji],
            last_name_kana: params[:last_name_kana],
            last_name_kanji: params[:last_name_kanji],
            gender: params[:gender],
            email: user.email,
            dob: {
                day: params[:"day(3i)"].to_i,
                month: params[:"day(2i)"].to_i,
                year: params[:"day(1i)"].to_i,
            },
            address_kanji: {
                country: "JP",
                postal_code: params[:postal_code],
                state: params[:state],
                city: params[:city],
                town: params[:town],
                line1: params[:line1],
                line2: params[:line2],
            },
            address_kana: {
                line1: params[:line1],
            },
        },
        tos_acceptance: {
            date: Time.now.to_i,
            ip: request.remote_ip,
        },
        external_account: {
          object: "bank_account",
          country: "JP",
          currency: 'jpy',
          account_holder_name: params[:account_holder_name],
          account_holder_type: 'individual',
          routing_number: params[:routing_number],
          account_number: params[:account_number],
        },
      )
      user.update(uid: data.id)
      redirect_to "/accounts/top", notice: 'Je l'ai sauvé.'
    rescue Stripe::CardError => e
      flash[:alert] = "Une erreur est survenue.{e.message}"
      render :top
  
    # Invalid parameters were supplied to Stripe's API
    rescue Stripe::InvalidRequestError => e
      flash[:alert] = "Une erreur s'est produite (InvalidRequestError)#{e.message}"
      render :top
  
    # Authentication with Stripe's API failed(maybe you changed API keys recently)
    rescue Stripe::AuthenticationError => e
      flash[:alert] = "Une erreur s'est produite (AuthenticationError)#{e.message}"
      render :top
  
    # Network communication with Stripe failed
    rescue Stripe::APIConnectionError => e
      flash[:alert] = "Une erreur s'est produite (APIConnectionError)#{e.message}"
      render :top
  
    # Display a very generic error to the user, and maybe send yourself an email
    rescue Stripe::StripeError => e
      flash[:alert] = "Une erreur s'est produite (StripeError)#{e.message}"
      render :top
  
    #Lorsqu'une erreur se produit autre que celle liée à la bande
    rescue => e
      flash[:alert] = "Une erreur est survenue#{e.message}"
      render :top
    end

    def update
        user = current_user
        data = Stripe::Account.update(
            current_user.stripe_user_id,
            email: user.email,
            requested_capabilities: ['card_payments', 'transfers'],
            business_type: 'individual',
            individual: {
                first_name_kana: params[:first_name_kana],
                first_name_kanji: params[:first_name_kanji],
                last_name_kana: params[:last_name_kana],
                last_name_kanji: params[:last_name_kanji],
                gender: params[:gender],
                email: user.email,
                dob: {
                    day: params[:"day(3i)"].to_i,
                    month: params[:"day(2i)"].to_i,
                    year: params[:"day(1i)"].to_i,
                },
                address_kanji: {
                    country: "JP",
                    postal_code: params[:postal_code],
                    state: params[:state],
                    city: params[:city],
                    town: params[:town],
                    line1: params[:line1],
                    line2: params[:line2],
                },
                address_kana: {
                    line1: params[:line1],
                },
            },
          external_account: {
            object: "bank_account",
            country: "JP",
            currency: 'jpy',
            account_holder_name: params[:account_holder_name],
            account_holder_type: 'individual',
            routing_number: params[:routing_number],
            account_number: params[:account_number],
          },
        )
        redirect_to "/accounts/top", notice: 'ça a changé.'
    rescue Stripe::CardError => e
      flash[:alert] = "Une erreur est survenue.{e.message}"
      render :top

    # Invalid parameters were supplied to Stripe's API
    rescue Stripe::InvalidRequestError => e
      flash[:alert] = "Une erreur s'est produite (InvalidRequestError)#{e.message}"
      render :top

    # Authentication with Stripe's API failed(maybe you changed API keys recently)
    rescue Stripe::AuthenticationError => e
      flash[:alert] = "Une erreur s'est produite (AuthenticationError)#{e.message}"
      render :top

    # Network communication with Stripe failed
    rescue Stripe::APIConnectionError => e
      flash[:alert] = "Une erreur s'est produite (APIConnectionError)#{e.message}"
      render :top

    # Display a very generic error to the user, and maybe send yourself an email
    rescue Stripe::StripeError => e
      flash[:alert] = "Une erreur s'est produite (StripeError)#{e.message}"
      render :top

    #Lorsqu'une erreur se produit autre que liée à la bande
    rescue => e
      flash[:alert] = "Une erreur est survenue#{e.message}"
      render :top
    end
end

Il n'y a pas de temps pour expliquer un par un. Pour le dire horriblement brièvement, Stripe :: Account.create crée un compte Stripe. Il existe différents éléments (nom, sexe, adresse, numéro de compte, etc.) et je les saisirai avec les paramètres envoyés dans le formulaire que je vais faire maintenant. Stripe :: Account.update met à jour votre compte. Le mécanisme est le même

Ensuite, nous allons créer des vues.

slim:accounts/top.html.slim


- if current_user.uid
  = render "edit"
- else
  = render "new"

Ceci est divisé en nouvelle création et mise à jour selon qu'il y a ou non uid. Il semble y avoir un meilleur moyen ...

slim:_new.html.slim


= form_with url: accounts_path, local: true do |f|
  = render "form", f:f

slim:_edit.html.slim


= form_with url: update_accounts_path(current_user.uid), local: true, method: :patch  do |f|
   = render "form", f:f

slim:_form.html.slim


  = f.text_field :first_name_kanji, placeholder: "Nom (prénom / kanji)"
  = f.text_field :last_name_kanji, placeholder: "Nom (nom, kanji)"
  = f.text_field :first_name_kana, placeholder: "Nom (nom / kana)"
  = f.text_field :last_name_kana, placeholder: "Nom (nom de famille, kana)"
  = f.label :Anniversaire
  = f.date_select :day, class: "sign_field", include_blank: true, :start_year => 1900, :end_year => Date.today.year
  = f.label :sexe
  = f.select :gender, {"Masculin": "male", "Femelle": "female"}, include_blank: true
  = f.text_field :state, placeholder: "Préfectures"
  = f.text_field :postal_code, placeholder: "Code postal"
  = f.text_field :city, placeholder: "Ville / quartier / village"
  = f.text_field :town, placeholder: "Chome"
  = f.text_field :line1, placeholder: "adresse"
  = f.text_field :line2, placeholder: "Bâtiment (facultatif)"
  = f.label :Nom (Katakana)
  = f.text_field :account_holder_name, placeholder: "Yamada Taro"
  |Organiser dans l'ordre du code bancaire, du code de l'agence
  br
  |Veuillez saisir une chaîne de 7 caractères
  = f.number_field :routing_number, placeholder: "1234567"
.sign_plase
  = f.label :numéro de compte
  = f.number_field :account_number
.actions
  = f.submit "sauvegarder"

Enfin, écrivez l'itinéraire.

routes.rb


get "accounts/top"
resources :accounts, only: [:new, :create, :update, :edit]

Cela devrait fonctionner ...

À la fin

Après tout, le compte personnalisé est difficile (; ∀;). Étant donné que le compte standard est facile à implémenter et à perdre, si vous voulez l'essayer, vous pouvez essayer standard pour le moment (je l'ai fait aussi). Même ainsi, je me souviens avoir eu beaucoup de mal à créer un compte personnalisé. J'ai eu du mal à ne payer que pour la partie création de compte personnalisé de cet article. Je n'ai aucune information du tout. Eh bien, ce n'est pas grave si cela aide quelqu'un qui trébuche dans la création d'un compte Stripe.

De plus, je n'aime pas ou ne commente pas du tout cette série. Si vous l'aimez, s'il vous plaît LGTM. Ce sera motivant.

Recommended Posts

Créez un site EC en utilisant des rayures! (Création de compte)
Créer un site EC avec Rails5 ⑤ ~ Modèle client ~
Créer un site EC avec Rails 5 ⑩ ~ Créer une fonction de commande ~
Créer un site EC avec Rails5 ⑦ ~ Adresse, modèle de genre ~
Créer un site EC avec Rails 5 ⑨ ~ Créer une fonction de panier ~
Créer un site EC avec Rails5 ④ ~ En-tête et pied de page ~
Créez un site EC avec Rails5 ⑥ ~ entrée de données de départ ~
Créer un site EC avec Rails5 ② ~ Paramètres Bootstrap4, définition du contrôleur / action ~
Créer un site de catalogue d'applications à l'aide de l'interface de ligne de commande pour Microsoft 365 avec Docker
Créer un site EC avec Rails5 ③-Définir des associations de modèles et d'autres choses-
Faisons un site de shopping en utilisant Stripe! (Achat)
Création d'un site EC avec Rails5 ①-Configuration de l'application, préparation de divers gemmes, création de modèle / routage-
Déployer laravel à l'aide de docker sur EC2 sur AWS ① (Créer une instance EC2)