Rails製SolidusとStripeでカード決済対応のオンラインストアをつくる

Rails製ECオープンソース「Solidus」

まず初めに、私が言及するまでもないと思いますが、RailsのECオープンソースとして有名なものに「Spree」というものがあり、Solidusは、そのSpreeの後継になります。

ソースにはいまだにSpreeと命名されている部分がたくさんあり、プロジェクト名が変わっただけなんだな。と、いうことが分かります。カスタマイズの方法もSpreeからの変更は特になく(自分がさわった限りでは)、ネット上のSpreeの情報も参考にできます。

Solidusのインストール

インストールですが、Rails5.0系が出たことにより、Solidus自体も2.0へとバージョンアップしました。最新バージョンは2.1となっています(2016.12.28現在)。

以前のバージョン(v1.4)を使用する場合は、Rails4.2系を使用します。

周辺環境

ちなみに自分がSolidusをインストールした環境は以下のとおりです。

  • Ruby: 2.3.0
  • Rails: 5.0.0.1
  • Solidus: 2.0

DBはPostgreSQLを使用しています。
MySQLでもよかったのですが、インストールの際に、Gemの依存関係で色々とエラーが出たので、めんどくさくなってPostgreSQLにしました。

いざ、インストール!

と、言いつつ、githubなどに書かれているマニュアルに沿ってやればオールオッケーだと思うので省きますので、下記を参照してください。てへぺろ。

https://github.com/solidusio/solidus

solidus_i18nで日本語化

Gemに「solidus_i18n」を追加します。詳細は以下のリンクを参考に。

https://github.com/solidusio-contrib/solidus_i18n

gem 'solidus_i18n', github: 'solidusio-contrib/solidus_i18n', branch: 'master'

bundle install後、”config/initializers/spree.rb“内にある、Spree::Frontend::Configureのlocale設定部分を日本語に変更します。

config.locale = 'ja'

また、Spree::Backend::ConfigureについてもFrontend同様日本語に変更します。これでSolidusは日本語化されます。

しかしながら、完全に日本語化されるという訳ではないので、自分好みにカスタマイズしたい場合は、config/locale/ja.ymlを追加しましょう。もちろんこのままでも特段問題はありませんので、これでsolidusの基本的な設定は終了です。

stripeを使ってクレジットカード決済を導入する

Spree後継Solidusでクレジットカード決済を導入

Stripeとは、アメリカで産まれたオンライン決済サービスです。他にPayPalなどのその他のオンライン決済サービスはありますが、Stripeはとにかくシンプル、そして無料(もちろん決済手数料は取られる)で使えます。

オンライン決済の新しい標準 – Stripe(ストライプ)

Gemのインストール

まずは、solidus_gatewayというGemをインストールします。

gem 'solidus_gateway'
gem 'activemerchant', '~>1.61'

Activemerchantは、Gemfileに書かなくても依存関係で自動的にインストールされますが、v1.61以上が必要なため、指定しておきます。

Activemerchantの日本円計算にはバグがある

上述のバージョンを指定した理由ですが、Activemerchantは日本円で使用すると、米ドルやユーロのような補助通貨(セントなど)がある前提で計算されてしまうようです。その結果、¥1,000が¥10.00となり、決済金額がおかしくなってしまいます。

バージョン1.61で、補助通貨なしの通貨が分類された(多分)ようです。しかしそれでも¥10.00と100分の1で計算されてしまっています(この辺だいぶハマりました)

Activemerchant::Billing::Gatewayのコードをオーバーライドすることで対処

自分のしょぼいコード読解力を持って考え抜いた結果、Activemerchant::Billing::Gatewayクラスのlocalized_amountメソッド内のunless文をif文に変えるとよさげな感じがします。

Github – active_merchant/lib/active_merchant/billing/gateway.rb

したがって、config/initializers/active_merchant/gateway_decorator.rbを作成し、以下のコードで上書きしました。

ActiveMerchant::Billing::Gateway.class_eval do
 def localized_amount(money,currency)
  amount = amount(money)

  # 元コード
  # return amount unless non_fractional_currency?(currency)

  # unlessをifに変更する
  return amount if non_fractional_currency?(currency)

  if self.money_format == :cents
   sprintf("%.0f", amount.to_f / 100)
  else
   amount.split('.').first
  end
 end
end

これでテストしてみると、100分の1になることなく計算されるようになりました。

Stripeのアカウント作成

前出のストライプのサイトからアカウントを登録します。まどろっこしい審査などは一切ないので簡単に誰でも登録できます。
登録できたら、設定画面のAPIメニューから「Secret Key」と「Public Key」のそれぞれをコピーします。

stripeのAPIキーをコピペ

SolidusのAdmin画面で支払い方法を追加する

SolidusのAdmin画面からログインし、サイドメニューバーからSettings>Payments画面へ。
右上の支払い方法を追加するをクリックします。名称は適当に自分が識別しやすいようにつけてください。

Gemのsolidus_gatewayがちゃんとインストールされていると、ProviderにSpree::Gateway::Stripeが選べるようになっています。選択すると、Secret KeyPublishable Keyの入力ボックスが表示されるようになるので、Stripeの設定画面からコピーしたものをそれぞれ貼り付けます。

これでStripeを使っての決済が可能になります。

補足

Viewをカスタマイズ

デフォルトのテンプレートをそのまま使うのも問題ないのですか、やはり何か味気ないです。より個性的で、よりブラウジングしやすいオンラインストアにするために独自のデザインでカスタマイズしたい。

Solidusでは、Defaceを使用したViewのカスタマイズを推奨しています。別のエントリーにまとめてあるので、参考いただければと思います。

【参考】 DefaceでSolidusのデザインをカスタマイズ

ストアに新着情報などのお知らせ機能を組み込む

ストアに新着情報や更新情報などを表示させたい場合は、Solidusにブログ投稿機能を組み込むGemを活用しましょう。

【参考】 「solidus-blogging」を使ってブログ機能を搭載する

SSL使用下で発生するエラー

ECサイトですから、SSLは必須だと思いますが、SSLを使っていると、Admin画面でSetting>Storeに飛ぼうとするとエラーで表示されないという現象が起こりました。

このエラーは、config/initializers/spree.rbに、

Spree::Api::Config.configure do |config|
 config.use_static_preferences!
 config.requires_authentication = true
end

を追加することで、解決することができました。

ちなみにSSLは、無料のLet’s Encryptで全然事足りるんではと個人的には思っています。

【参考】 SSLが無料で使えるCertbot(Let’s Encrypt)をNginxに投入した

(Visited 3,215 times, 1 visits today)

“Rails製SolidusとStripeでカード決済対応のオンラインストアをつくる” への2件の返信

コメントは受け付けていません。