「作ればわかる! Google App Engine for Java プログラミング」本をPythonで書いてみる (4) その2 Paypal追加

引き続き、「作ればわかる! 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が嫌な場合は下のリファレンスを見る。


英語版はこちら。

使い方とか

プログラムではないが、販売サイトの一連の流れが動画で説明されている。

返金などに困ったら参照。他にもPayPalタグでは参考になるところあり。

どこを見れば、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 をもっとわかりやすくする方法



■追加した内容

  • 旅行といえばお土産ということで、別ページでおみやげを買うことができるように
  • PayPal API は、Express Checkoutを使う (上記本でも、最初にExpress Checkoutが書かれている)
  • PayPalにログインしなくてもクレジットカード支払いをできるようにした
  • PayPalの画面に、購入明細も表示

■足りない内容

セッションまわりについては何もしていないので、あくまでsandbox向け。

Google App Engine のリソース消費量

お土産購入ページで数量を選択してから完了するまでのリソース消費量は、以下の通りでした。

■ソース

GitHubのchap5へと追加。