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アプリケーション
SpreeCommerce: Ruby on Railsで作られたオープンソースのECパッケージです。 (Omise Spree Demo)
ror_ecommerce: Ruby on Rails4で作られたECに必要な機能が搭載されているECプラットフォームです。