EX-決済API と Ruby 🍣 時々 Rails

EX-Omise JapanのLead Developerです。

Omise、Pay.jp、Stripeから自分にあった決済代行サービスの選び方

Omiseで働いているとユーザーからよくある質問が2点あります。

・「他社と比較して何が違うのか?」
・「Omiseはどのような場合にフィットするのか?」

まずひとつめの質問の回答は、料金体系と提供しているサービスの種類が各社異なるという点であり、コスト(API・カードブランド・手数料)に対してフォーカスして比較することができます。

これを、3つのセグメント(API・カードブランド・手数料)で見ていきましょう。

API

まずAPIですが、Stripeが先駆者としてオンライン決済の機能に止まらず、マーケットプレイス(店子)機能、その他にECがらみのバックオフィス系の機能まで多くの機能を提供しています。

OmiseとPay.jpについては、基礎的なオンライン決済の機能を提供しています。
Stripeのような高度なサービスはないため一見では見劣りしてしまいがちですが、基本的に必要となるオンライン決済の機能は提供しており、スリムな点では学習コストが低いためStripeより使い始めやすいかもしれません。

例えていうと、Rubyコミッターになりたい人がいきなりCRubyを始めるよりmrubyのほうがスリムで学習コストが低めに思えるような感じでしょうか。。。

Omise Pay.jp Stripe
顧客 ✔️ ✔️ ✔️
チャージバック ✔️ ✔️ ✔️
仮売上 ✔️ ✔️ ✔️
本売上 ✔️ ✔️ ✔️
定期課金 ✔️ ✔️ ✔️
プラン - ✔️ ✔️
レシピエント ✔️ - ✔️
検索 ✔️ - -
送金 ✔️ ✔️ ✔️
イベント ✔️ ✔️ ✔️
クーポン - - ✔️
割引 - - ✔️
その他EC向けの機能 - - ✔️

※ 上記テーブルではコアになるAPIだけを掲載しています。API比較表はこちら。

カードブランド

各社で日本向けにサポートしているカードブランドの一覧です。
対応カードブランドだけでみると Pay.jp > Omise > Stripe の順になります。

日本国内では、VISA > MasterCard > JCB の順で利用者数が多いので、最低でもこの3ブランドは対応したほうがユーザーに優しいかと思います。
※ 全ての数字で見ると VISA > MasterCard > AmericanExpress の順かと思います。

Omise Pay.jp Stripe
VISA ✔️ ✔️ ✔️
MasterCard ✔️ ✔️ ✔️
JCB ✔️ ✔️ -
AmericanExpress ✔️ ✔️ ✔️
Diners Club ✔️ ✔️ -
DISCOVER - ✔️ -

手数料

次に決済代行サービスのコスト面についてです。
各社とも薄利ですが、不正対策やセキュアなサービスを提供をしています。

Omise Pay.jp(ベーシック/プロ/Seed/NPO) Stripe
VISA 2.95% 3.0%/2.59%/2.59%/1.5% 3.6%
MasterCard 2.95% 3.0%/2.59%/2.59%/1.5% 3.6%
JCB 3.6% 3.6%/3.3%/3.3%/- -
AmericanExpress 3.6% 3.6%/3.3%/3.3%/- 3.6%
Diners Club 3.6% 3.6%/3.3%/3.3%/- -
DISCOVER - 3.6%/3.3%/3.3%/- -
初期費用 ¥0 ¥0 ¥0
月額費 ¥0 ¥0/¥10,000(税込)/¥0/¥0 ¥0
チャージバック手数料 ¥0 ?(※1) ¥1,500 または ¥0
送金手数料 ¥260 /回(VISA/MasterCardのみ) ¥0(※2) ¥0(※3)
消費税 有(※4) ?(※1) ?(※1)

※1:情報がみつかりませんでしたので、どなたか教えてください。。
※2:指定入金サイクル
※3:週一回まで、売上の振込が無料
※4:ご請求の際は決済手数料に別途消費税が加算されます

Omiseがどのような場合にフィットするか?

まず、「Omiseがどのような場合にフィットするか?」の答えですが、新規事業(スタートアップ)のプロダクトにフィットします。 その他には、WooCommerceで気軽に低コストで独自ECを始める場合にフィットすると言えます。

また、私の考えでは各社とも根本的には同じターゲットに向いているため、特にスタートアップは導入障壁の低さで必然的にフィットするようになっています。

最高のパートナーの見つけ方

決済代行はあなたのビジネスのパートナーです。だからこそパートナー選びに妥協をしてはいけません。 もしあなたが新規事業を始めるのであれば、各社に連絡を取り、サポートの質や相性、テスト導入での動きを確認し納得いくパートナーを選択するべきです。

Omise、Pay.jp、Stripeの3社は、いずれもRESTベースに構成されたAPIを提供しているため、実装にかかるコストがほぼ同じと言えます。 つまり言い換えると3社間での実装の入れ替えはそこまでコストがかかりません。

また、どこかが第2のWebpayになることもあるかもしれませんし、心のそこから信頼できるパートナーを選ぶにはPersonal Relationshipが重要です。

OmiseにもPay.jpにもStripeにも素晴らしき方々が多いので、実際にお会いになるのが得策です。

OmiseのテストカードのGem作りました

Omiseのテストカードをウェブサイトから調べる手間を省く方法としてGem(omise_test_cards)を公開しました。

f:id:akinrt:20170310170758p:plain

omise_test_cards のインストール

gem install omise_test_cards

Pryでちょっと動かしてみる

cards = OmiseTestCards.test_cards

cards.successful_charge.code
# => "successful_charge"

cards.successful_charge.description
# => "these credit card numbers can be used in test mode"

cards.successful_charge.cards
# => <Hashie::Array [#<Hashie::Mash brand="Visa" number="4242424242424242">, #<Hashie::Mash brand="Visa" number="4111111111111111">, #<Hashie::Mash brand="MasterCard" number="5555555555554444">, #<Hashie::Mash brand="MasterCard" number="5454545454545454">, #<Hashie::Mash brand="JCB" number="3530111333300000">, #<Hashie::Mash brand="JCB" number="3566111111111113">]>

cards.successful_charge.cards.first.brand
# => Visa

cards.successful_charge.cards.first.number
# => 4242424242424242

ちなみに、Omiseのテストカードは10種類のステータス別のカードがあります。

cards = OmiseTestCards.test_cards

cards.successful_charge
cards.invalid_security_code
cards.fail_3ds_card_enrollment
cards.fail_3ds_card_validation
cards.insufficient_fund
cards.stolen_or_lost_card
cards.failed_processing
cards.payment_rejected
cards.failed_fraud_check
cards.invalid_account_number

このうちの cards.successful_charge に含まれるカードのいずれも、正常にテストでChargeができるカードになります。 それ以外のカードは、利用できないステータスなので、charge.paid? でChargeに失敗して入れば、 charge.failure_code を見て、エラー処理を入れてあげるといいでしょう!

Omise RubyライブラリはOmiseErrorをraiseするので、こんな感じでテストするといいですね。

require "omise"
require "omise_test_cards"

Omise.api_key = "SET_YOUR_TEST_SECRET_KEY"
Omise.vault_key = "SET_YOUR_TEST_PUBLIC_KEY"

# get sampla card
sample_card = OmiseTestCards.test_cards.successful_charge.cards.first

begin
  # create token
  token = Omise::Token.create(card: {
    name: "TARO OMISE",
    number: sample_card.number,
    expiration_month: 3,
    expiration_year: 2019,
    city: "Tokyo",
    postal_code: "1510051",
    security_code: 123
  })

  # Charge 100000 JPY
  charge = Omise::Charge.create({
    amount: 100_000,
    currency: "jpy",
    card: token.id
  })

  if charge.paid
    # handle success
    puts "thanks"
  else
    # handle failure
    raise charge.failure_code
  end
rescue OmiseError => e
  # handle OmiseError raised by omise library
  raise e.message
end

リンク

github.com

omise_test_cards | RubyGems.org | your community gem host

決済APIでカードの有効期限切れの対応ってどうするの?

PryとOmiseのRubyライブラリを使って、有効期限が切れるカードを持っているCustomerを検索する方法を書いておきます。

# pryを実行
pry

# omiseライブラリを読込
require "omise"

# APIキーを設定
Omise.api_key = "秘密鍵(シークレットキー)"

# 試しにdescriptionを更新するCustomerを取得
customer_id = "cust_test_xxxxx"
customer = Omise::Customer.retrieve(customer_id)

# デフォルトカードの有効期限を取得
expiration_month = customer.default_card.expiration_month
expiration_year = customer.default_card.expiration_year
expiration = "#{expiration_month}/#{expiration_year}"

# customerのdescriptionへデフォルトカードの有効期限を入れる
customer.update({description: expiration})

# 3/2019のデフォルトカードを持っているCustomerを検索
search_result = Omise::Search.execute(scope: "customer", query: expiration)
search_result.data.each do |customer|
  # ここで有効期限が切れそうなcustomerへ何かをする処理をいれる。
end

Customerへカードを紐づけるChargeをしている人には重宝するかもしれません。 Customerは Omise::Customer.list で一覧を取得することもできるので、これを使っていっきにdescriptionをアップデートしてもいいかもです。