EC(電子商取引)などインターネットを使ったサービスが増える中、取引の決済処理を担う決済APIも多種多様になってきています。それら決済APIについて、解説します。
■ 決済APIとは何か
代表的な決済手段には、口座、クレジット、代引き、コンビニ決済などがあります。その中で、インターネットを使った決済手段として、主にクレジットが使われます。
決済APIとは、クレジットカードを使ってインターネットによる決済処理をプログラミングするための関数群です。
決済APIは、決済サービスをSaaS(Software as a Service)として提供するサービスベンダーが公開していています。たとえば、以下のようなAPIがあります。
・PAY.JP
国内ECプラットフォームの「BASE」が運営する決済サービス
・PayPal
米国の大手決済サービス
・Square
米国の決済サービスベンチャー
■ 「PAY.JP」決済APIの実例
「PAY.JP」では、開業する際の審査を依頼しなくても、メールアドレスなどでユーザ登録さえすれば、テスト環境を使って、決済APIを動かすことができるので非常に便利です。
(通常、開業届、商業登記、会社のHPなどを提出し、審査を受けてからでないと、決済APIを利用するためのAPIキーを払い出してくれません)
「PAY.JP」による決済システム構成は、以下にようになります。Webブラウザ、決済処理を動作させる自社のWebサーバ、「PAY.JP」サーバ、そして、その背後にあるオーソリサーバなどで構成されます。
・準備
①ユーザ登録する
②ログインする
払い出されたAPIキーを確認することができます。
APIキーは、テスト用の鍵ペア(秘密鍵、公開鍵)と本番用の鍵ペアがあります。
(審査完了しない限り本番用は使えません。)
③Webサーバ側に、決済APIをインストールする
pythonであれば次のようにインストールします。
pip install payjp
・決済処理(支払い)
決済APIを使って、支払い(売上)をする場合の手順を以下に示します。
①チェックアウト
HTMLに、支払いのformを記述し、CheckOut用のJavaScript(”https://checkout.pay.jp”)を記述します。
その際、以下の属性を指定します。
・data-key:APIキー(公開鍵)
・data-on-created:CheckOut完了(成功)時に呼ばれる関数名
・data-on-failed:CheckOut完了(失敗)時に呼ばれる関数名
画面の「カードで支払う」ボタンをクリックし、カード情報入力画面を表示します。
カード番号、セキュリティコード、有効月/年、名前を入力後、「カードで支払う」をクリックし、チェックアウト
を実施します。カードは、テストカードが使えます。
②Webサーバにトークン、金額、メールアドレスを送信
正常にチェックアウトが終了すると、自動的に”payjp-token”というinputタグの名称でトークン(文字列)が設定されます。
CheckOut完了(成功)時に呼ばれる関数には、カード情報が引き渡されます。この関数の中から、formをサブミットすることで、WebサーバにHTTP(S)リクエスト送信されます。
その際に、トークンの他、金額、メールアドレスをWebサーバに引き渡します。
以下に、HTML/JavaScriptの例を示します。
<html>
<head>
<meta charset="UTF-8">
<script>
// CheckOut完了(成功)時に呼ばれる関数
function onCreated(card) {
var card_json = JSON.stringify( card );
card_json = JSON.parse( card_json );
console.log(card_json.card.brand);
console.log(card_json.card.exp_month);
console.log(card_json.card.exp_year);
console.log(card_json.card.fingerprint);
console.log(card_json.card.id);
console.log(card_json.card.last4);
console.log(card_json.card.name);
// 送信
document.form_cond.submit();
}
// CheckOut完了(失敗)時に呼ばれる関数
function onFailed(status, error) {
error = "tokenを生成できません。もう一度、やり直してください";
alert(error);
}
</script>
</head>
<body>
<h3>支払い</h3>
<form action="/pay" method="POST" name="form_cond" >
email:<input type="text" name="email" value="user@test.test" >
<br>
金額:<input type="number" name="amount" value=100 >
<br>
<br>
<!--- カード情報入力画面を表示するボタンを表示するJavaScriptを指定する
・src:PAY.JPのCheckOut用javascriptのURL
・data-key:APIキー(公開鍵)
・data-on-created:CheckOut完了(成功)時に呼ばれる関数名
・data-on-failed:CheckOut完了(失敗)時に呼ばれる関数名
-->
<script type="text/javascript" src="https://checkout.pay.jp" class="payjp-button" data-key="pk_test_XXXXXXXXXXXXXXXXXXXXXXXX" data-on-created="onCreated" data-on-failed="onFailed"></script>
</form>
</body>
</html>
③Webサーバで、決済APIにより、取引(支払い)実施
Webサーバでは、ブラウザから引き渡されたトークン、金額、メールアドレスを使って、支払い(売上)を実施し
ます。
payjpをインポートし、APIキー(秘密鍵)を設定します。
その後、トークンとメールアドレスを指定し、顧客インスタンスを生成後、金額を指定した支払いを実行します。
正常であれば、結果を取得し、異常であれば各種例外が発生します。
次のようにログインして、取引の結果を確認することもできます。
Webサーバ側のFlask(Python)コードの例を以下に示します。
# -*- coding: utf-8 -*-
import re
import time
import requests
import datetime
from flask import render_template
from flask import request
from flask import Flask
from flask import abort
from flask import make_response
from gevent.pywsgi import WSGIServer
import json
# PAY.JP
import payjp
#Flaskアプリ
app = Flask(__name__)
# 支払い画面
@app.route('/', methods=['GET', 'POST'])
def index():
html = 'pay.html'
return make_response(render_template(html))
# 支払い処理
@app.route('/pay', methods=['GET', 'POST'])
def pay():
if request.method == 'POST':
# トークン
token = request.form['payjp-token']
# 金額
amount = int(request.form['amount'])
# メールアドレス
email = request.form['email']
else:
abort(400)
try:
# APIキー(秘密鍵)
payjp.api_key = 'sk_test_XXXXXXXXXXXXXXXXXXXXXXXX'
# 顧客インスタンス生成
customer = payjp.Customer.create(
email=email,
card=token
)
# 支払い実施
charge_info=payjp.Charge.create(
amount=amount,
currency='jpy',
customer=customer.id,
description='test'
)
# 結果
message = str(charge_info)
html = 'pay_result.html'
return make_response(render_template(html,message=message))
except payjp.error.CardError as e:
message = "Since it's a decline, payjp.error.CardError will be caught"
pass
except payjp.error.InvalidRequestError as e:
message = "Invalid parameters were supplied to Payjp's API"
pass
except payjp.error.AuthenticationError as e:
message = "Authentication with Payjp's API failed(maybe you changed API keys recently)"
pass
except payjp.error.APIConnectionError as e:
message = "Network communication with Payjp failed"
pass
except payjp.error.PayjpException as e:
message = "Display a very generic error to the user, and maybe send yourself an email"
pass
except Exception as e:
message = "Something else happened, completely unrelated to Payjp"
pass
html = 'pay_result.html'
return make_response(render_template(html,message=message))
if __name__ == '__main__':
app.debug = True
host='127.0.0.1'
port = 5000
host_port = (host, port)
server = WSGIServer(
host_port,
app
)
server.serve_forever()
■ まとめ
支払い以外にも、取り消しなどの取引も実施可能です。
また、取引など各種処理完了時の結果を、PAY.JPサーバからコールバック(WebHook機能)のようにして、受け取ることができます。
WebHook機能を使う場合、PAY.JPからコールバックしてもらう自社のWebサーバのURLを設定しておく必要があります。
ソフトウェア開発・システム開発業務/セキュリティ関連業務/ネットワーク関連業務/最新技術に関する業務など、「学習力×発想力×達成力×熱意」で技術開発の実現をサポート。お気軽にお問合せ下さい
I like the efforts you have put in this, regards for all the great content.