決済

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


ソフトウェア開発・システム開発業務/セキュリティ関連業務/ネットワーク関連業務/最新技術に関する業務など、「学習力×発想力×達成力×熱意」で技術開発の実現をサポート。お気軽にお問合せ下さい

-決済

執筆者:


  1. ufabet911 より:

    I like the efforts you have put in this, regards for all the great content.

comment

メールアドレスが公開されることはありません。

関連記事

あなたのクレジットカード番号は正しいか?

クレジットカード番号は、各種ブランド(VISA/MASTERCARD/JCB/AMEXなど)によって異なる番号が付与されます。クレジットカード番号には、チェックデジットが含まれていて、正当性を確認する …

決済って何?「オーソリ(オーソリゼーション)」入門

ネットワークを介したクレジットカードや銀行口座引き落としによる決済とは、「オーソリ」と呼ばれる一つの電文によって行われます。 ■ オーソリ オーソリとは、「承認」(Authorization)の略語で …

「カード決済」の仕組みを知る!

フィンテック(FinTech)とは、消費者がモノを買うという作業=決済を、ITを使って自動化することを言います。その中で、カードを使うカード決済は、ずっと昔からある決済手段であり、フィンテックの基本で …

POSレジのための決済メソッド入門

POSとは、「Point Of Sales(販売時点管理)」のことです。スーパーやコンビニなどの小売り業のPOSレジは、販売データを取得するための装置で、商品を販売するためのカード決済機能が備わってい …

Chinese (Simplified)Chinese (Traditional)EnglishFilipinoFrenchGermanHindiJapaneseKoreanMalayThaiVietnamese