LoginSignup
4
7

More than 5 years have passed since last update.

SquareのEコマースAPIを使う流れ

Posted at

SquareのEコマースAPIを使うと、自社でカード番号を保有したり、各カード会社と契約することなくクレジットカード決済が開始できます。昨今のセキュリティインシデントではカード番号や有効期限の流出など問題になっています。そうした問題もSquareを使うことで解決できます。なぜかと言えば、Eコマース提供事業者側ではカード番号を保有しないで済むからです。

カード番号を保有しないでどうやって決済を行うかと言うと、クレジットカード情報をSquareに登録してCard Nonceと呼ぶIDを受け取ります。実際の決済はこのCard Nonceを使って行うのです。Card Nonceは一度利用すると再利用できませんので安全です。

カード番号を安全に登録してもらうための仕組みとして、Squareではiframeを使ったHTMLフォームの埋め込みを推奨しています。Square Connect API DocumentationにあるHTMLを作成し、アプリケーションIDを開発者ポータルで取得できるものに置き換えます。そうすると、以下のようなフォームが表示されます。ローカルでの開発では http://localhost のようにHTTPが使えますが、本番環境ではHTTPSを使ってください。

このフォームでクレジットカード番号を登録すると、Card Nonceが取得できます。このCard Nonceを使って決済処理を行います。

サンプルとして次のようになります。サンプルはRubyで書いています。また、ライブラリとしてSquare Connectを用いています。拠点情報の取得については以前の記事を参考にしてください。CARD_NONCEをそれぞれ置き換えてください。

require 'square_connect'
require 'securerandom'

access_token = 'YOUR_SANDBOX_ACCESS_TOKEN'

// locationに拠点情報が入っていることとします

transactions_api = SquareConnect::TransactionsApi.new

request_body = {
  :card_nonce => 'CARD_NONCE',

  :amount_money => {
    :amount => 1000,
    :currency => 'JPY'
  },

  :idempotency_key => SecureRandom.uuid
}

begin
  resp = transactions_api.charge(location.id, request_body)
rescue SquareConnect::ApiError => e
  raise "Error encountered while charging card: #{e.message}"
end

puts resp

この処理を実行すると以下のようなオブジェクトが返ってきます。

{:transaction=>{
  :id=>"a671c349-b345-56ad-4c12-6cdcc01e3083", 
  :location_id=>"CBASEJqRSQmT1vVfMXar4RcrtCcgAQ",
  :created_at=>"2017-07-15T04:41:00Z",
  :tenders=>[{
    :id=>"89fba027-776a-58a1-6949-5672e402c888",
    :location_id=>"CBASEJqRSQmT1vVfMXar4RcrtCcgAQ",
    :transaction_id=>"a671c349-b345-56ad-4c12-6cdcc01e3083",
    :created_at=>"2017-07-15T04:41:00Z",
    :note=>"Online Transaction",
    :amount_money=>{
      :amount=>1000,
      :currency=>"JPY"
    },
    :type=>"CARD",
    :card_details=>{
      :status=>"CAPTURED",
      :card=>{
        :card_brand=>"VISA",
        :last_4=>"5858"
      },
      :entry_method=>"KEYED"
    }
  }],
  :product=>"EXTERNAL_API"
}}

もう一度同じCard Nonceで実行するとエラーになります。

{
  "errors":[{
    "category":"INVALID_REQUEST_ERROR",
    "code":"CARD_TOKEN_USED",
    "detail":"Card nonce already used; please request new nonce."
  }]
}

また、決済が日本円(JPY)以外で指定してもエラーになります。通貨単位は注意してください。

{
  "errors":[{
    "category":"INVALID_REQUEST_ERROR",
    "code":"INVALID_VALUE",
    "detail":"This business can only process payments in JPY but amount was provided in USD.",
    "field":"amount_money.currency"
  }]
}

セキュアにクレジットカード決済を行ってもらうためにはクレジットカード番号を保有しないのが一番です。iframeであればユーザ体験としても違和感なく扱ってもらえるでしょう(購入完了後、別途決済サービスにいって決済を行ってもらう方式は忘れられがちです)。

ぜひSquareのEコマースAPIをお試しください。

Embedding the Square Payment Form

Transaction API

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7