Flask/Checkout

この記事では、Python のFlaskフレームワークとPAY.JPのチェックアウト機能を用いて、簡単な支払い処理を実装するサンプルについて説明します。ソースコードはpayjp-example/flask at master · payjp/payjp-exampleにて公開されています。

インストール

まず、Flask と PAY.JP の Python ライブラリをインストールします。

pip install Flask payjp

アプリケーション

支払い処理を行うアプリケーション部分を実装します。app.py というファイルを作成し、PAY.JP の設定を記述します。

import os
from flask import Flask, render_template, request
import payjp

SECRET_KEY = os.environ['SECRET_KEY']
PUBLIC_KEY = os.environ['PUBLIC_KEY']

payjp.api_key = SECRET_KEY

app = Flask(__name__)

環境変数 SECRET_KEYPUBLIC_KEY から、各自の秘密鍵と公開鍵を読み込み、PAY.JP ライブラリの API キーにセットしています。特に秘密鍵は、支払い処理を含むさまざまな処理を行う重要なキーなので、慎重に扱ってください。

次に、支払いフォーム画面を表示するメソッドを定義します。

@app.route('/')
def index():
    return render_template('index.html', public_key=PUBLIC_KEY)


@app.route('/pay', methods=['POST'])
def pay():
    amount = 1000
    customer = payjp.Customer.create(
        email='example@pay.jp',
        card=request.form['payjp-token']
    )

    payjp.Charge.create(
        amount=amount,
        currency='jpy',
        customer=customer.id,
        description='flask example charge'
    )
    return render_template('pay.html', amount=amount)

index() では、公開鍵を引数に index.html を生成しています。

pay() では、トークン ID からカードを所有する顧客を作成し、作成した顧客 ID を指定して1,000円の支払い処理を行っています。トークン ID は後述するチェックアウトフォームから送信されます。

最後に amount を引数に pay.html を生成し、支払い完了画面を表示しています。

テンプレート

画面を表示するテンプレート部分を実装します。まず、共通レイアウトを構成するテンプレートを ./templates/layout.html に配置します。内容は以下の通りです。

<!DOCTYPE html>
<html>
<head>
  <title>PAY.JP Flask Example</title>
</head>
<body>
  {% block content %}{% endblock %}
</body>
</html>

次に、支払いフォーム画面を ./templates/index.html に作成します。支払いフォームは、script タグ一行でデザインされた決済フォームを生成するチェックアウトを使用しています。

{% extends "layout.html" %}
{% block content %}
  <form action="/pay" method="post">
    <article>
      <label>1000円のお支払い</label>
    </article>

    <script type="text/javascript"
      src="https://checkout.pay.jp"
      class="payjp-button"
      data-key="{{ public_key }}">
    </script>
  </form>
{% endblock %}

{{ public_key }} という変数には、アプリケーションの index() でテンプレートを表示するときに、引数として各自の公開鍵が設定されます。

最後に、支払い後の完了画面を ./templates/pay.html に作成します。

{% extends "layout.html" %}
{% block content %}
  <p>{{ amount }}円のお支払いが完了しました。</p>
{% endblock %}

{{ amount }} には、アプリケーションの pay() で支払った金額をセットして表示しています。

これで、支払いを行うサンプルアプリケーションが完成しました。

起動する

作成したアプリケーションを起動してみましょう。環境変数 PUBLIC_KEYSECRET_KEY には、各自のキーを設定してください。

PUBLIC_KEY=YOUR_PUBLICK_KEY SECRET_KEY=YOUR_SECRET_KEY python app.py

http://localhost:5000 を開くと、作成した支払いフォーム画面が表示されます。以下の情報を入力し、支払い処理を試してみましょう。

項目
カード番号 4242424242424242
有効期限 12/20
CVC 123
カード名義 PAY TARO

参考情報