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をお試しください。