Web

決済API(PAY.JPの例)

投稿日:2021年12月14日 更新日:

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に、支払いのfromを記述し、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を設定しておく必要があります。

-Web

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Flask(Python)

WebアプリケーションをPythonを使って手軽に開発できるマイクロフレームワークがFlaskです。Webアプリケーション開発と言えばPHPがありますが、Flaskの最大の特徴は、プログラミング言語の …

GCPでのWebサービスの作り方(Python、Flask、MYSQL、Mail、Apache) 2/2

以下からの続きとなります。GCPでのWebサービスの作り方(Python、Flask、MYSQL、Mail、Apache) 1/2 – DXインテリジェンス (itresourcetech.net) …

Webシステム

ネットワークを使ったシステムは、クライアント/サーバ型システムが基本です。クライアント/サーバ型システムとは、ユーザが操作するクライアントと、データを管理し、処理を実行するサーバとの間をネットワークで …

Zoom REST API

リモート会議を開催するとき、アプリケーションのZoomを使われてる人も多いと思います。Zoomには、Pythonによってプログラミング可能なWeb-APIであるREST APIが用意されています。この …

スクレイピング

インターネットにあるWebサイトのHTMLデータの中から、必要なデータを自動的に取得することをスクレイピングといいます。Googleなどの検索エンジンがインデックスを作成するために、自動でWebサイト …