[RUBY] Erstellen Sie eine EC-Site mit Streifen! (Konto-Erstellung)

Kleine Werbung

https://www.code-sell.net/ Wir haben einen Service erstellt, mit dem Sie Codes verkaufen können! Wenn Sie Code haben, den Sie nicht benötigen, verwenden Sie ihn bitte. Ich verwende übrigens den in diesem Artikel beschriebenen Streifen.

zunaechst

https://qiita.com/UTOG/items/6a00135a5114a70727c3 Es ist eine Fortsetzung von.

Das letzte Mal habe ich eine Kauffunktion gemacht. Dieses Mal werde ich ein Streifenkonto erstellen (Standard und Benutzerdefiniert). Ich sagte jedoch, dass ich dies beim letzten Mal über die neue Registrierungsfunktion von devise tun würde, aber wenn dies der Fall ist, wird der Artikel zu lang (normalerweise mühsam ...) und ich werde keine ungewöhnlichen Einstellungen vornehmen, sodass ich davon ausgehen werde, dass devise installiert ist.

Informationen zur Installation des Geräts finden Sie im folgenden Artikel. Es ist keine Twitter-Authentifizierung oder E-Mail-Authentifizierungsfunktion erforderlich. [* Rails *] Verwendung von Devise (Rails6-Version)

Beim Erstellen eines Standardkontos Referenzartikel

Standard Sowohl das Formular als auch das Dashboard sind von dem Typ, der durch Streifen vorbereitet wird. Einzelheiten finden Sie im vorherigen Artikel, aber wenn Sie die Funktionen kurz vorstellen

verdienen

Es ist sehr einfach zu implementieren, Sie müssen kein Formular oder Übermittlungssystem erstellen, und wenn etwas schief geht, liegt es in Ihrer Verantwortung.

Fehler

Das Design des Formulars und des Dashboards kann jedoch nicht geändert werden, und das Gefühl "Ich verwende Streifen!" Kommt sehr häufig heraus. Es besteht das Gefühl, dass ein Dienst nicht vollständig ist.

Beginnen Sie mit dem Erstellen

gemfile


gem 'omniauth-stripe-connect'

Vergiss das Bündel nicht

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

Fügen Sie Ihrem Benutzermodell den Zugriffscode, den publizierbaren Schlüssel und die UID hinzu. Insbesondere ist uid eine wichtige Spalte, die das Stripe-Konto und die App verbindet. Stellen Sie als Nächstes den Rückruf ein.

devise.rb


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

Legen Sie als Nächstes die Methode stripe_connect fest, die nach der Registrierung aufgerufen werden soll.

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

Setzen Sie stripe_url im Helfer. Wenn ich es direkt in Ansichten schreibe, funktioniert es nicht.

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

Dies ist der Link zur Registrierung. Bitte mach es wo immer du willst. Ich empfehle, es um den Profilbearbeitungsbildschirm zu legen.

slim:edit.html.slim


  = link_to "zu registrieren", stripe_url

Wenn Sie in erb schreiben

erb:edit.html.erb


  <%= link_to "zu registrieren", stripe_url %>

das ist alles. So einfach ist das! Da Sie das Formular- und Übermittlungssystem jedoch nicht selbst erstellen müssen, können Sie das Design nicht ändern.

custom Das Formular, das Übermittlungssystem und das Dashboard sind alle selbst erstellt. Ich habe das Gefühl, nur API zu verwenden Ich möchte, dass Sie den vorherigen Artikel für die gleichen Details sehen.

verdienen

Mit einem einzigen Service können Sie Formulare und Dashboards ändern, ohne Streifen zu spüren

Fehler

Es ist schwer zu implementieren, Sie müssen alle Formulare und Dashboards erstellen. Es liegt in Ihrer Verantwortung, wenn etwas schief geht

Beginnen Sie mit dem Erstellen

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

Fügen Sie Ihrem Benutzermodell den Zugriffscode, den publizierbaren Schlüssel und die UID hinzu. Insbesondere ist uid eine wichtige Spalte, die das Stripe-Konto und die App verbindet.

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: 'Ich habe es gespeichert.'
    rescue Stripe::CardError => e
      flash[:alert] = "Ein Fehler ist aufgetreten.{e.message}"
      render :top
  
    # Invalid parameters were supplied to Stripe's API
    rescue Stripe::InvalidRequestError => e
      flash[:alert] = "Ein Fehler ist aufgetreten (InvalidRequestError)#{e.message}"
      render :top
  
    # Authentication with Stripe's API failed(maybe you changed API keys recently)
    rescue Stripe::AuthenticationError => e
      flash[:alert] = "Ein Fehler ist aufgetreten (AuthenticationError)#{e.message}"
      render :top
  
    # Network communication with Stripe failed
    rescue Stripe::APIConnectionError => e
      flash[:alert] = "Ein Fehler ist aufgetreten (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] = "Ein Fehler ist aufgetreten (StripeError)#{e.message}"
      render :top
  
    #Wenn ein anderer Fehler als streifenbezogen auftritt
    rescue => e
      flash[:alert] = "Ein Fehler ist aufgetreten#{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: 'es hat sich geändert.'
    rescue Stripe::CardError => e
      flash[:alert] = "Ein Fehler ist aufgetreten.{e.message}"
      render :top

    # Invalid parameters were supplied to Stripe's API
    rescue Stripe::InvalidRequestError => e
      flash[:alert] = "Ein Fehler ist aufgetreten (InvalidRequestError)#{e.message}"
      render :top

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

    # Network communication with Stripe failed
    rescue Stripe::APIConnectionError => e
      flash[:alert] = "Ein Fehler ist aufgetreten (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] = "Ein Fehler ist aufgetreten (StripeError)#{e.message}"
      render :top

    #Wenn ein anderer Fehler als streifenbezogen auftritt
    rescue => e
      flash[:alert] = "Ein Fehler ist aufgetreten#{e.message}"
      render :top
    end
end

Es ist keine Zeit, eins nach dem anderen zu erklären. Kurz gesagt, Stripe :: Account.create erstellt ein Stripe-Konto. Es gibt verschiedene Elemente (Name, Geschlecht, Adresse, Kontonummer usw.) und ich werde sie mit den Parametern eingeben, die in dem Formular gesendet werden, das ich jetzt erstellen werde. Stripe :: Account.update aktualisiert Ihr Konto. Der Mechanismus ist der gleiche

Als nächstes werden wir Ansichten erstellen.

slim:accounts/top.html.slim


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

Dies ist in neue Erstellungen und Aktualisierungen unterteilt, je nachdem, ob eine UID vorhanden ist oder nicht. Es scheint einen besseren Weg zu geben ...

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: "Name (Vorname / Kanji)"
  = f.text_field :last_name_kanji, placeholder: "Name (Nachname, Kanji)"
  = f.text_field :first_name_kana, placeholder: "Name (Name / Kana)"
  = f.text_field :last_name_kana, placeholder: "Name (Nachname, Kana)"
  = f.label :Geburtstag
  = f.date_select :day, class: "sign_field", include_blank: true, :start_year => 1900, :end_year => Date.today.year
  = f.label :Sex
  = f.select :gender, {"männlich": "male", "Weiblich": "female"}, include_blank: true
  = f.text_field :state, placeholder: "Präfekturen"
  = f.text_field :postal_code, placeholder: "Postleitzahl"
  = f.text_field :city, placeholder: "Stadt / Gemeinde / Stadt"
  = f.text_field :town, placeholder: "Chome"
  = f.text_field :line1, placeholder: "Adresse"
  = f.text_field :line2, placeholder: "Gebäude (optional)"
  = f.label :Name (Katakana)
  = f.text_field :account_holder_name, placeholder: "Yamada Taro"
  |Ordnen Sie in der Reihenfolge der Bankleitzahl, Filialcode
  br
  |Bitte geben Sie als 7-stellige Zeichenfolge ein
  = f.number_field :routing_number, placeholder: "1234567"
.sign_plase
  = f.label :Kontonummer
  = f.number_field :account_number
.actions
  = f.submit "sparen"

Schreiben Sie zum Schluss die Route.

routes.rb


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

Das sollte funktionieren ...

Am Ende

Immerhin ist ein benutzerdefiniertes Konto schwierig (; ∀;). Da das Standardkonto leicht zu implementieren und leicht zu verlieren ist, können Sie, wenn Sie es ausprobieren möchten, vorerst Standard ausprobieren (das habe ich auch getan). Trotzdem erinnere ich mich, dass ich große Probleme hatte, ein benutzerdefiniertes Konto zu erstellen. Es fiel mir schwer, nur für den Teil zur Erstellung eines benutzerdefinierten Kontos in diesem Artikel bezahlen zu wollen. Ich habe überhaupt keine Informationen. Nun, es ist in Ordnung, wenn dies jemandem hilft, der beim Erstellen eines Stripe-Kontos stolpert.

Außerdem mag oder kommentiere ich diese Serie überhaupt nicht. Wenn es Ihnen gefällt, bitte LGTM. Es wird motivierend sein.

Recommended Posts

Erstellen Sie eine EC-Site mit Streifen! (Konto-Erstellung)
Erstellen Sie eine EC-Site mit Rails5 ⑤ ~ Kundenmodell ~
Erstellen Sie eine EC-Site mit Rails 5 ⑩ ~ Erstellen Sie eine Bestellfunktion ~
Erstellen Sie eine EC-Site mit Rails5 Address ~ Adresse, Genre-Modell ~
Erstellen einer EC-Site mit Rails 5 ⑨ ~ Erstellen einer Warenkorbfunktion ~
Erstellen Sie eine EC-Site mit Rails5 ④ ~ Kopf- und Fußzeile ~
Erstellen Sie eine EC-Site mit Rails5 seed ~ Startdateneingabe ~
Erstellen Sie eine EC-Site mit Rails5 Boot ~ Bootstrap4-Einstellungen, Controller- / Aktionsdefinition ~
Erstellen Sie eine App-Katalogsite mit CLI für Microsoft 365 mit Docker
Erstellen Sie eine EC-Site mit Rails5 ③-Set Model-Assoziationen und anderen Dingen-
Machen wir eine Shopping-Site mit Streifen! (Kauf)
Erstellen einer EC-Site mit Rails5 ①-App-Konfiguration, verschiedene Edelsteinvorbereitungen, Modell- / Routing-Erstellung-
Bereitstellen von Laravel mit Docker auf EC2 unter AWS ① (EC2-Instanz erstellen)