Edited at
WebPayDay 22

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まで!)