Help us understand the problem. What is going on with this article?

FlaskからWebPayを導入する

More than 5 years have passed since last update.

webpay-pythonについて

12月02日にWebPayのPythonパッケージであるwebpay-pythonがリリースされました。webpay-pythonは、以下の点でモダンなPythonパッケージに仕上がっています。

  • toxによるPython複数バージョン(Python 2.6-3.3)対応
  • pytestによるデータドリブンテスト
  • flake8によるPEP8対応
  • requestsを利用したAPIアクセス

まだまだPython3に対応していないパッケージも多い中で、このパッケージは重要です。
自分でパッケージを修正しなくても Python3.3でWebPayを導入できます。

FlaskからWebPayを導入する

私はPythonのWebフレームワークの中でもFlaskが大好きなので、今回はFlaskにWebPayを導入します。
利用した環境は、MacOS10.9.1/Python3.3/Flask0.10.1です。

動作について

@hmsk書いている内容を追いながら実装してみます。
1. ‘/‘でから購入情報を入力して、'/purhcase'にpost
2. ‘/purchase'でWebPayを利用した課金処理と結果出力

ファイル構成について

Controllerはapp.py、Viewはtemplates配下に置きます。今回はModelはありません。

webpay-flask-sample
├── app.py
└── templates
    ├── index.html
    ├── layout.html
    └── purchased.html

実際のコードと実行

ざっくりとControllerを書くと以下のような感じになります。
“ # noqa”がついているのは、flake8を通しているからです。

app.py
import sys
from flask import Flask, render_template, request, url_for, redirect
from webpay import WebPay
from webpay.errors import InvalidRequestError

app = Flask(__name__)
app.config.from_object(__name__)
WEBPAY_PUB_KEY = 'test_public_19DdUs78k2lV8PO8ZCaYX3JT'
WEBPAY_PRI_KEY = 'test_secret_eHn4TTgsGguBcW764a2KA8Yd'
WEBDB_PRICE = 1554


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


@app.route('/purchase', methods=['POST'])
def purchase():
    webpay = WebPay(WEBPAY_PRI_KEY)
    try:
        charge = webpay.charges.create(
            amount=WEBDB_PRICE,
            currency='jpy',
            card=request.form.get('webpay-token'))
        return render_template('purchased.html', charge=charge)
    except InvalidRequestError:
        e = sys.exc_info()[1]  # noqa
        return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(debug=True)

次はViewです。flaskではデフォルトでjinja2を利用できるので、Viewを継承することが可能です。layout.htmlをベースとして、index.html, purchased.htmlを作成します。

layout.html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>WebPay flask sample</title>
  </head>
<body>
  {% block body %}{% endblock %}
</body>
</html>
index.html
{% extends "layout.html" %}
{% block body %}

<form action="/purchase" method="post">
  <script src="https://checkout.webpay.jp/v1/" class="webpay-button" data-key="{{ webpay_pubkey }}"></script>
</form>
{% endblock %}
purchased.html
{% extends "layout.html" %}
{% block body %}
<h3>想像購入しました</h3>
{% if charge.id %}
<p>配送に関するお問い合わせ時に、{{ charge.id }} をお知らせください。</p>
{% endif %}
<ul>
  <li><a href='http://www.amazon.co.jp/dp/4774158747/' target='_blank'>実際に購入する</a></li>
  <li><a href='/'>もう一度購入する</a></li>
</ul>
{% endblock %}

あとは、以下のコマンドからhttp://localhost:5000にアクセスすれば、課金処理ができることがわかるでしょう。

cd webpay-flask-sample
python app.py

JS部分について

JS部分には、CheckoutHelperを利用しています。こちらについては以下を参照してください。

終わりに

今回はwebpay-pythonをflaskに導入してみました。今回作成したコードはこちらにありますので簡単にwebpay-pythonを利用することができます。webpay-pythonはリリースされたばかりですが、Python3.3でも利用できるWebPay用パッケージです。是非利用してみてください。(webpay-pythonへの要望はIssuesまで!)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away