Ruby on RailsでのStripe実装 後編 - 決済処理


こんにちは、イノベーションLABのM.Mです。
今回はQubeで導入したクレジット決済機能のStripeについて記事にしていきたいと思います。
後編では、Stripeを使用したクレジットカードと銀行振込での決済処理について解説します。


前編 - アカウント作成 はこちらです⇩
blog.css-net.co.jp


StripeConnectついて

StripeConnectとは

StripeConnectとは、Connectアカウントと呼ばれる子アカウントを作成し、子アカウントの支払いの管理や、手数料の回収、資金の分配などを行うことができるサービスです。

上図では子アカウントにのみ顧客を紐づけていますが、親アカウントに直接顧客を紐づけることも可能です。

Connectアカウントについて

Connectアカウントには下記の3種類があります。

  • Standardアカウント

ユーザ自身がStripeのフォーム上でアカウントを作成したり、ダッシュボードで支払いを管理することができます。
組み込みが簡単ですが、カスタマイズ性は低いです。

  • Expressアカウント

子アカウントの設定等、全てではありませんがカスタマイズできます。
組み込みやすさはStandardとCustomの中間程度になります。

  • Customアカウント

子アカウントの登録や設定などがアカウント所有者(売り手)にはほぼ見えない状態で、全てをカスタマイズできます。
そのためカスタマイズ性は高いですが、他2つと比較すると組み込みが大変になります。

Qubeでは「Standard」アカウントを利用しているので、ここからは「Standard」アカウントでの組み込みについてご紹介します。

Stripeを利用するための設定

①Gemfileに下記を追加して「bundle install」を実行します。

  # Stripeアカウント作成
  gem "stripe"


②開発者画面のAPIキーのタブを選択し、公開キーとシークレットキーを確認します。
※検証用の場合は画面上の「テスト環境」というスイッチをオンにしてください。



本番用のキーは「pk_live」、テスト用のキーは「pk_test」から始まります。

③config/initializers配下にstripe.rbというファイルを作成し、そこにシークレットキーを設定します。
※シークレットキーを「secret_key」としています

  # Stripeシークレットキー設定
  Stripe.api_key = secret_key


④application.html.slimのhead部分にStripe.jsを読み込むための設定を追加します。

  / Stripeサーバ通信用
  script src="https://js.stripe.com/v3/"

子アカウント(売り手)の登録方法

Stripeアカウント登録画面へのURLを作成し、リダイレクトさせるアクションを作成します。

  def create_stripe_account
    # Stripeアカウント作成
    account = Stripe::Account.create(
       type: "standard"
    )
    # アカウントリンク作成
    url = Stripe::AccountLink.create(
       account: account.id,
       refresh_url: public_root_url,
       return_url: complete_url,
       type: "account_onboarding"
    )
    redirect_to url.url
  end
  • refresh_url:アカウントリンクの有効期限が切れているなどの理由で無効な場合に、ユーザーがリダイレクトされるURL
  • return_url:リンクされたフローを終了・完了するときに、ユーザーがリダイレクトされるURL


登録したいタイミングでこのアクションを呼び出すと、こちらの画面に遷移します。

ここから前編の「Stripeアカウント登録」でご紹介した項目を登録していきます。
※子アカウントも支払いを受ける場合は、企業情報や個人情報、身分証明書等の情報が必要になります。

顧客(買い手)のカード情報登録

StripeConnectを利用した場合、子アカウントに対しての支払いは、そのアカウントに紐づく顧客でなければ行えません。
したがって、下図の場合、顧客Aは「子アカウント2」に支払うことができません。

顧客Aが「子アカウント2」に支払いたい場合は、「子アカウント2」の方にも顧客Aを紐づける必要があります。


Qubeでは親アカウントにカード情報を登録し、それを子アカウントに複製することで、一つのカード情報で全ての子アカウントで支払いを行えるような仕組みにしています。
今回はその場合の登録処理をご紹介します。

親アカウントへの登録

カード情報の親アカウントへの登録については、こちらを参考にしました。
zenn.dev

子アカウントへの複製

  # カードトークンを作成する
  card_token = Stripe::Token.create(
     { customer: "#{顧客のStripeアカウントID}" },
     stripe_account: "#{子アカウントのStripeアカウントID}"
  )
  # 子アカウントの顧客としてアカウントを登録する
  Stripe::Customer.create(
     { source: card_token.id,
       name: "#{顧客の名前}",
       email: "#{顧客のメールアドレス}",
       preferred_locales: ["ja"], },
       stripe_account: "#{子アカウントのStripeアカウントID}"
  )
  • 顧客のStripeアカウントIDは「cus_」から始まるIDになります。
  • 子アカウントのStripeアカウントIDは「acct_」から始まるIDになります。

決済処理

Stripeには、顧客が子アカウントに対して決済を行い、そこから指定の金額を親アカウントへ送金することができる「DirectCharge」という決済方法があります。
今回はその仕組みを利用し、顧客が子アカウントに対して利用料1,100円を支払い、そのうち100円を手数料として親アカウントに支払うことを想定した処理をご紹介します。

クレジットカード

  Stripe::PaymentIntent.create({
     amount: 1100,
     currency: "jpy",
     customer: "#{顧客のStripeアカウントID}",
     application_fee_amount: 100,
     description: "会議室利用料",
     payment_method_types: ["card"],
     confirm: true,
  },
  stripe_account: "#{子アカウントのStripeアカウントID}")
  • amount:支払額(50円以上)
  • currency:通貨
  • application_fee_amount:親アカウントに送金される額
  • description:説明(オブジェクトに付加される任意の文字列)
  • payment_mathod_types:支払い方法
  • confirm:PaymentIntentの作成と確認を同時に行う

銀行振込

  Stripe::PaymentIntent.create({
     amount: 1100,
     currency: "jpy",
     customer: "#{顧客のStripeアカウントID}",
     application_fee_amount: 100,
     description: "会議室利用料",
     payment_method_types: ["customer_balance"],
     payment_method_data: {
        type: "customer_balance",
     },
     payment_method_options: {
        customer_balance: {
           funding_type: "bank_transfer",
           bank_transfer: {
              type: "jp_bank_transfer",
           },
        },
     },
     confirm: true,
  },
  stripe_account: "#{子アカウントのStripeアカウントID}")
  • customer_balance:顧客残高の支払い方法オプションに関する詳細
  • funding_type:顧客残高に十分な資金がない場合に使用される資金調達方法のタイプ
  • bank_transfer:銀行振込タイプ

決済キャンセル

  Stripe::PaymentIntent.retrieve("#{Stripeの支払ID}", stripe_account: "#{子アカウントのStripeアカウントID}").cancel
  • Stripeの支払IDは「pi_」から始まるIDになります。

テスト手順

①「Ruby on RailsでのStripe実装 前編 - Stripeアカウントの作成 - シー・エス・エス イノベーションラボ(ブログ)」で紹介したテスト用の公開キーとシークレットキーを設定します。

②実際に作成した画面から決済を行います。
 クレジットカード決済のテストでは、カード情報として下記を入力してテストしてください。
 ・ カード番号:下記URLの「ブランド別のカード」のカード番号
        Test cards | Stripe のドキュメント
 ・ 有効期限:将来の有効な日付
 ・ その他の項目:任意の値

③下記手順でStripeダッシュボード上から結果を確認します。
 ・「テスト環境」の状態に切り替え、Connectから指定の子アカウントを選択します。

 ・「支払い」を選択します。

最後に

以上がRuby on RailsでStripeのStripeConnectを利用した場合の、子アカウント登録~テストまでの大まかな実装方法になります。
開発中は、Stripeのドキュメントや開発方法をまとめたサイト以外に、Stripeのヘルプサポートチャットにも大変お世話になりました。
9時から18時が日本語対応で、18時以降は英語対応になるようです。チャット以外にも電話やメールでのサポートもあるようなので、これらを活用するのも良いと思います。
今回ご紹介した機能はstripeのごく一部の機能ですが、少しでもお役に立てば幸いです。
お読みいただきありがとうございました。

参考