引き続き、「作ればわかる! Google App Engine for Java プログラミング」本にてPythonを修行中。
急遽、PayPalAPIの使い方について知る必要が出てきたので、アバター旅行記に追加してみる。
ただし、sandboxでの実装とし、PayPalの本番環境では試しておらず。
参考書を探したところ、オライリーにPayPal + Google App Engine for Python の組み合わせで作るものがあったため、そちらを購入。
O'REILLY - PayPal APIs: Up and Running, 2nd Edition
オライリー本のコードはGitHubでも公開されているので、そちらも参考に。
GitHub - ptwobrussell / PayPal-APIs-Up-and-Running
■Google App Engineで悩んだところ
.parse_qs()を使うためにimportするモジュール
サンプルソースでは、paypal/products.py内で .parse_qs()を使うためにimport cgiとしている。
ただ、いろいろと調べてみるとPython2.7ならば、import urlparseを使うのが良いらしい。(上記本のp13の注意書きにも記載あり)
SSLまわり
fetch()のvalidate_certificateをTrueにして使う。(上記のGitHubコードでもTrueになっていた)
参考(英文のみ):Google Developers - Google App - Engine The fetch Function
また、購入画面からhttpsを使うようにするため、app.yamlへ以下を追加。ただし、開発サーバではhttpsは利用できず、httpになる模様。
- url: /paypal/.* script: payment_handlers.app secure: always
参考:Google Developers - Google App Engine - Python Application Configuration - Secure URLs
URLのエンコード
PayPal API をたたくところはサンプルソースほぼそのままの予定だったが、商品名をUnicodeの日本語で入れるとエラーとなってしまった。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
下記のページに原因と対応が書かれていたので、それを参考に。ありがとうございました。
Pythonで遊ぶよ - urllib.urlencode に unicode を渡すとエラー
リダイレクト
以下のようなリダイレクトをするコードを書いたところ、エラーとなった。
self.redirect(self.request.host_url + u'/cancel/')
InvalidResponseError: header values must be str, got 'unicode' (u'http://localhost:8080/cancel/') for 'Location'
そこで、以下のようなソースコードを書き、str化することができた。
参考:renderPaz - App Engine: Switched to Python 2.7 + HRD
self.redirect(str(self.request.host_url + u'/cancel/'))
ただ、そもそも、URLについてはUnicode化する必要がないかと考え、最終的には以下のようにした。
self.redirect(self.request.host_url + '/paypal/cancel/')
■PayPalについて
技術資料
日本語版でまとまっている。pdfが嫌な場合は下のリファレンスを見る。
英語版はこちら。
実装例(Python以外も含む)
X.commerceにあるサンプル。GAEを利用したもの。GitHubにも公開。
- X.commerce - Using PayPal's Adaptive Payments and Google App Engine to Build an Online Market with Python, Part 2
- Using PayPal's Adaptive Payments and Google App Engine to Build an Online Market with Python, Part 3
- X.commerce - Build an eTicketing System with PayPal, Python, and Google App Engine
- PHP + ExpressCheckout。各APIの説明もあり、わかりやすくまとまっている。GitHubにも公開。
- hrendohの日記 - PayPal APIの使い方 - SandboxのアカウントでCheckout Expressを試してみた
- hrendohの日記 - PayPalの使い方 その2 - Express Checkout APIによる課金システムの実装 解説
PHPを使ったもの。ExpressCheckoutとDirectPaymentを使っている。
どこを見れば、APIのバージョンがわかるか?
Paypalのトップなどに記載されているソースの「
」に記載されているバージョンを追えばいいとのこと。参考:X.commerce - Latest PayPal API Version For API Calls
バージョンの変更履歴は以下から見れる。(ただし、上記のソースコード中のバージョンよりは古いものが記載されている)
PayPal - About Previous Versions of the API
以下のページにはversion.txtへのリンクあり。また、他のページもPayPalにもとても詳しく、参考になりました。
PayPalFan - PayPal NVP API
ランディングページをわかりやすくする
LandingPageオプションを利用する。ちなみに、ExpressCheckoutの流れも画面付きでわかりやすい。
参考:cmonos - PayPal をもっとわかりやすくする方法
■追加した内容
■足りない内容
セッションまわりについては何もしていないので、あくまでsandbox向け。
■Google App Engine のリソース消費量
■ソース
GitHubのchap5へと追加。