Active Merchant(アクティブ・マーチャント)

Active MerchantはRubyで作られた決済用ライブラリで、Shopifyが適用しています。 このオープンソースプロジェクトは、サポートする全てのペイメントゲイトウェイが一貫したインターフェースをユーザーに提供できるように開発されました。

github.com/Shopify/active_merchant

Omise Paymentでは現在「Active Merchant 1.50.0」バージョンをご利用いただけます。

現在、日本円対応のShopifyプラグインを開発中です。提供開始時期や仕様に関するご相談は、support@omise.coまでお願いいたします。

インストール

GitHubからインストール

GitHub上で最新のソースを確認することができます。:

git clone git://github.com/Shopify/active_merchant.git

RubyGems

RubyGems:

gem install activemerchant
gem install json

Bundlerを使われる方は以下のGemfileを追加するだけでOKです:

gem 'activemerchant'
gem 'json'

使用方法

本拡張機能を使った、クレジットカードでのお買い物、支払い情報登録、一部返金・全額返金の作成についてご説明します。

1. 導入手順

下記の導入手順は、PCIセキュリティ基準にもとづき推奨されているものです。PCI-DSSを準拠していない場合は、機密情報漏洩リスクを考慮し、自社サーバー上でクレジットカード情報の通信、処理、保管を行うことはおすすめできません。

Omise.jsを使った場合

STEP 1. ユーザー(クレジットカード保有者)が加盟店様のウェブサイト上でカード情報を入力します。 STEP 2. 入力されたカード情報はJavascript (Omise.js)でHTTPSを経由し、加盟店様のウェブサイトから直接Omiseのサーバーへ送られます。 STEP 3. 入力されたカード情報が card.security_code_checkのオーソリゼーションを通過したら、Omiseが認証済カード情報をトークン化して加盟店様のウェブサイトへ返送します。 STEP 4. トークン化されたカード情報がウェブサイトから加盟店様のご利用サーバーへ送信され、最終的に課金のcapture (売上処理)を実行します。

注意: STEP 3.で card.security_code_checkが「false」の場合、課金の認証が失敗したという意味になります。理由としては、入力されたCVV(セキュリティコード)が間違っている/カードの有効期限が切れている/カード番号が間違っている等が考えられます。 この場合、ユーザーに対してエラーメッセージを表示し再度カード情報の入力を求めなければなりません。

STEP 4.でOmiseは最終的な課金の確定を行います。オーソリゼーションが通っているにも関わらず、売上を処できない時は、支払い予定額がカードの利用残高を上回っている場合がございます。

2. コードについて

Omise APIキーの初期化

Omiseを使って決済を行うには、まずAPIキーを取得します。 APIキーの取得にはOmiseのアカウント登録が必要になります。

require 'json'
require 'active_merchant'

gateway = ActiveMerchant::Billing::OmiseGateway.new(
  public_key: "pkey_test_5033ct7tcw7l4rb3bjz",
  secret_key: "skey_test_5033ctmg92i4mhfq3ru"
)

secrets.ymlからAPIキーを取得したい場合は、rails initializer config/initializers/omise.rb で同様の操作が行えます。

GATEWAY = ActiveMerchant::Billing::OmiseGateway.new(
  public_key: "pkey_test_5033ct7tcw7l4rb3bjz",
  secret_key: Rails.application.secrets.omise_secret_key
)

Herokuを使用している場合、ENVコマンドを使い変数としてシークレットキーをセットできます。

GATEWAY = ActiveMerchant::Billing::OmiseGateway.new(
  public_key: "pkey_test_5033ct7tcw7l4rb3bjz",
  secret_key: ENV["omise_secret_key"]
)

トークンからチャージ(課金)を作る

新規課金を作成する時は、ブラウザ上に入力されたお客様のカード情報がOmise.jsを通してトークン化される必要がございます。

Omise.jsの例はこちらのリンクから確認できます。: github.com/omise/omise.js

#Example, token from an ajax post in a Rails app
token = params["token"] # tokn_test_50frulul1q6bn6qjcre

# Amount must be an Integer including in cents (Thai Baht Satangs)
amount = 10000  # => 100.00 THB

# Capture the full amount
charge = gateway.purchase(amount, nil, { token_id: token })

charge.message
# => "Success"

オーソリゼーションとホールド(与信枠確保)

課金に対するオーソリゼーションホールド(与信枠確保)を行います。 オーソリゼーションはオーソリとも呼ばれ、課金を行うカードの信用照会を行うことを意味します。このオーソリゼーションを通過した場合のみ、実際に課金のプロセスに進むことができるようになります。 ホールドの場合は、一定期間を過ぎると与信枠が解放されます。

# You got this token from Omise.js Javascript
token = "tokn_test_50fs5cznlz4vp72uhdu"

# Amount must be an Integer including in cents (Thai Baht Satangs)
amount = 10000  # => 100.00 THB

# Hold a charge without capture, by adding the option 'capture: false'
authorize = gateway.authorize(amount, nil, { token_id: token, capture: false })

# Now let's capture that charge, i.e. now that your product is ready.
charge_id = authorize.params["id"]
charge = gateway.capture(amount, charge_id)

charge.message
# => "Success"

カードをカスタマープロフィール内に保存する

お客様が次回からのお買い物に同じカードを利用する場合、カード番号などの情報の入力を省いていただけるように カード情報を顧客(customer)オブジェクトとして保存することができます。再度購入を行うユーザーにワンクリック支払い機能を提供できます。

トークンによる課金を行う代わりに、トークンをカスタマーに変換し、いつでも直接カスタマーに対して課金できます。

トークン作成のためにはOmise.jsを使用する必要があります。


# Example token from Omise.js
token = "tokn_test_50frulul1q6bn6qjcre"

# Create a customer from the token
customer = gateway.store(
  nil,
  {
    token_id: token,               # Required: Token
    email: "john.doe@gmail.com",   # Optional
    description: "Customer ID: 37" # Optional
  }
)

# Amount must be an Integer including in cents (Thai Baht Satangs)
amount = 10000  # => 100.00 THB

# You should store the customer ID in your database
# so that you can charge it anytime later.
customer_id = customer.params["id"]

# Let's charge this customer
charge = gateway.purchase(amount, nil, { customer_id: customer_id })

charge.message
# => "Success"

返金


# Capture 100 THB from the credit card (as previous example)
charge = gateway.purchase(amount, nil, { token_id: token })

# We need to use the charge ID for a refund
charge_id = charge.params["id"]

# Refund the full amount using charge_id
refund = gateway.refund(amount, charge_id)

refund.message
# => "Success"

返金機能を使うと、任意の金額を一部返金することも可能です。

refund = gateway.refund(amount/2.0, charge_id)

注意: Active Merchantの提供機能以外に必要な機能がある場合は、Omise APIをご利用ください。 omise-ruby

ActiveMerchantを使用したE-Commerceアプリケーション

  1. SpreeCommerce: Ruby on Railsで作られたオープンソースのECパッケージです。 (Omise Spree Demo)

  2. ror_ecommerce: Ruby on Rails4で作られたECに必要な機能が搭載されているECプラットフォームです。