14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WebPayAdvent Calendar 2013

Day 22

FlaskからWebPayを導入する

Last updated at Posted at 2013-12-22

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

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?