FlaskからWebPayを導入する


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

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

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

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

### 動作について
@hmskが[書いている内容][8]を追いながら実装してみます。
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を通しているからです。

```Python: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][7]を利用できるので、Viewを継承することが可能です。layout.htmlをベースとして、index.html, purchased.htmlを作成します。


```html:layout.html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>WebPay flask sample</title>
  </head>
<body>
  {% block body %}{% endblock %}
</body>
</html>
```
```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 %}
```

```html: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](http://localhost:8000)にアクセスすれば、課金処理ができることがわかるでしょう。

```
cd webpay-flask-sample
python app.py
```

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

- [少しのコードでWebPayを導入する][8]
- [WebPayのCheckoutHelperを使いこなす][9]

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

[1]: https://github.com/webpay/webpay-python
[2]: https://pypi.python.org/pypi/tox
[3]: https://pypi.python.org/pypi/pytest
[4]: https://pypi.python.org/pypi/flake8
[5]: https://pypi.python.org/pypi/requests
[6]: https://pypi.python.org/pypi/Flask
[7]: https://pypi.python.org/pypi/Jinja2
[8]: http://qiita.com/hmsk/items/744f9a7e37638340a992
[9]: http://qiita.com/hmsk/items/0c6eddabcbc3be3e4388
[10]: https://github.com/aircastle/webpay-flask-sample
[11]: https://github.com/webpay/webpay-python/issues?page=1&state=open