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.