Dieser Artikel basiert auf Webpay-Python Version 1 (frisch hergestellt). Danach haben wir ein größeres Versions-Upgrade durchgeführt.
Der größte Teil des Inhalts kann unverändert verwendet werden, einige Methodennamen wurden jedoch geändert. Die neuesten Informationen finden Sie in der Python-API-Dokumentation auf der offiziellen WebPay-Website.
Darüber hinaus wurde das Repository auf github gemäß dem Hauptversions-Upgrade nicht mehr aktualisiert. Informationen zur Bibliothek finden Sie unter Bibliotheksdokumente.
Der WebPay-Adventskalender hat auch die zweite Hälfte des Spiels erreicht. Wir arbeiten hart daran, die Anzahl der Aktien aller zu fördern, die allmählich zunehmen.
Heute ist die Serie "Introducing WebPay mit einem kleinen Code".
Bisher sind die Versionen Ruby und PHP erschienen. Es ist die Python-Version, die mitgeliefert wird. Außerdem habe ich versucht, Google App Engine als Umgebung zum Ausführen zu verwenden.
Heutzutage sind viele PaaS auf der Welt überfüllt, und es gibt viele praktische Programmierumgebungen. Ich denke, einige Leute haben GAE vergessen, aber GAE ist ein seit langem etabliertes PaaS. Bitte denken Sie ab und zu an GAE.
webpay-python
Die offizielle Python-Bibliothek von WebPay (webpay-python) wurde veröffentlicht!
** Feier ** Veröffentlichung
Verwenden wir nun diese Python-Bibliothek, um WebPay auf GAE mit explosiver Geschwindigkeit einzuführen.
webpay meets GAE
Beginnen wir sofort mit der Programmierung. Ein Hauptmerkmal von GAE ist, dass ein SDK für die lokale Entwicklung bereitgestellt wird und die GAE-Umgebung lokal reproduziert werden kann. Während die Umgebung voreingestellt ist, sind die von GAE bereitgestellten Bibliotheken und Versionen begrenzt, sodass Sie die Bibliotheken nicht frei laden und verwenden können. Hauptversionen werden unterstützt, wenn es sich um ein Basisframework handelt, aber natürlich die Zahlungsgateway-Bibliothek usw. nicht enthalten sind.
Die heutigen Programmierer glauben, dass die Welt, in der Räder neu erfunden werden und die Bibliothek nicht frei genutzt werden kann, eine unerträgliche Welt ist. Ich kann es auch nicht aushalten.
Daher werde ich die Punkte bei der Verwendung einer externen Bibliothek mit GAE erläutern. Bitte beziehen Sie sich darauf.
Dieses Mal werden wir "webapp2", das in GAE und "webpay-python" integriert ist, als externe Bibliothek verwenden.
Wenn Sie einen Merverics Mac zur Hand haben
Laden Sie "GoogleAppEngineLauncher-1.8.8.dmg" von GAE SDK herunter und wenden Sie die geöffnete Datei (GoogleAppEngineLauncher.app) an. Legen Sie es einfach in einen Ordner und los geht's. Wenn Sie GoogleAppEngineLauncher.app starten, wird das Python-Skript für die lokale Entwicklungsumgebung von GAE in / usr / local / bin
installiert.
Bereiten Sie ein geeignetes Verzeichnis für Ihr Projekt vor. Bereiten Sie dort app.yaml und appengine_config.py vor. Ich denke, es hat die folgende Verzeichnisstruktur.
webpay-sample
├── app.yaml
└── appengine_config.py
Der Inhalt von app.yaml
app.yaml
application: webpay-sample
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
script: main.app
Stellen wir python27
so auf runtime
. GAE bewegt sich auch in die Ära von 2.7. Geben Sie für die Anwendung die Anwendungs-ID an, die im [Dashboard] von GAE (https://appengine.google.com/) erstellt wurde. Wenn Sie es lokal ausprobieren möchten, müssen Sie keine Anwendung im GAE-Dashboard erstellen. Threadsafe-Parameter sind denjenigen, die GAE in der Vergangenheit verwendet haben, möglicherweise nicht bekannt. Seit Python27 verfügbar ist, wurden sie jedoch explizit angegeben. (Ich werde es nicht im Detail erklären, da es vom Hauptthema abweicht. Wenn Sie jedoch "threadsafe: true" festlegen, können Sie keine Daten mithilfe der Standardausgabe mit Druck usw. an den Client zurückgeben.)
Als nächstes kommt appengine_config.py
.
appengine_config.py
import os
import sys
ROOTPATH = os.path.dirname(__file__)
LIBPATH = os.path.join(ROOTPATH, 'lib')
sys.path.append(LIBPATH)
appengine_config.py ist eine spezielle Datei, die für Einstellungen verwendet wird, die üblicherweise im Projekt verwendet werden, und zum Festlegen des Bibliothekspfads. Dieses Mal speichern wir die externe Bibliothek unter "lib". Fügen Sie also das Verzeichnis "lib" zum Bibliothekspfad hinzu.
Erstellen Sie abschließend den Hauptprogrammteil. Dieses Mal haben wir script: main.app
in app.yaml
angegeben, also erstellen wir es mit dem Dateinamen main.py
. Bereiten Sie außerdem zwei Dateien vor, "index.html" und "success.html", als Vorlagen, die von "main.py" gelesen werden sollen.
webpay-sample
├── app.yaml
├── lib
├── main.py
├── index.html
├── succeeded.html
└── appengine_config.py
Werfen wir einen Blick auf jede Datei.
main.py
# -*- coding: utf-8 -*-
import os
import webapp2
from google.appengine.ext.webapp import template
from webpay import WebPay
SECRET_KEY = 'test_secret_eHn4TTgsGguBcW764a2KA8Yd'
PUBLIC_KEY = 'test_public_19DdUs78k2lV8PO8ZCaYX3JT'
class MainPage(webapp2.RequestHandler):
def get(self):
template_values = {
'public_key': PUBLIC_KEY
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))
def post(self):
amount = self.request.POST.get('amount')
token = self.request.POST.get('webpay-token')
webpay = WebPay(SECRET_KEY)
try:
# webpay-Zugriff auf WebPay über die Python-Bibliothek
charge = webpay.charges.create(
amount=amount,
currency="jpy",
card=token
)
template_values = {
'charge': charge
}
path = os.path.join(os.path.dirname(__file__), 'succeeded.html')
self.response.out.write(template.render(path, template_values))
except webpay.errors.CardError, e:
#Wenn die Karte abgelehnt wird
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("CardException")
self.response.out.write("Status is: %d" % e.status)
self.response.out.write("Type is: %s" % e.type)
self.response.out.write("Code is: %s" % e.code)
self.response.out.write("Param is: %s" % e.param)
self.response.out.write("Message is: %s" % e)
except webpay.errors.InvalidRequestError, e:
#Wenn der in der Anforderung angegebene Parameter ungültig ist
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("InvalidRequestException")
except webpay.errors.AuthenticationError, e:
#Wenn die Authentifizierung fehlschlägt
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("AuthenticationException")
pass
except webpay.errors.ApiConnectionError, e:
#Wenn ein Verbindungsfehler zur API auftritt
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("APIConnectionException")
pass
except webpay.errors.WebpayError, e:
#Wenn auf dem WebPay-Server ein Fehler auftritt
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("APIException")
pass
except Exception, e:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write("Unexpected exception")
app = webapp2.WSGIApplication([('/', MainPage)],
debug=True)
main.py ist eine "webapp2" -App, die die Methoden "get" und "post" in der Klasse "MainPage" implementiert.
Die erste Methode "get" erstellt einen Vorlagenpfad mit "path = os.path.join (os.path.dirname (__ file __)," index.html ")" und "self.response.out". Ich rendere HTML mit write (template.render (path, template_values)) . Weisen Sie den in [CheckoutHelper](https://webpay.jp/docs/checkout) verwendeten
public_key` als Vorlagenvariable zu.
charge = webpay.charges.create(
amount=amount,
currency="jpy",
card=token
)
Die zweite "post" -Methode verwendet die oben gezeigte "webpay.charges.create ()", um die Abrechnung zu verarbeiten. Da das von CheckoutHelper erstellte Token vom Client gesendet wird, wird ein Code wie "token = self.request.POST.get (" webpay-token ")" gesendet Ruft den Wert POSTed in ab.
Lassen Sie uns abschließend den Inhalt der Vorlagen "index.html" und "success.html" überprüfen. In index.html
ist es die Zeit des Adventskalenders von Ruby und PHP. In ähnlicher Weise verwenden wir eine Javascript-Bibliothek namens Checkout Helper, die einen Dialog zur Eingabe einer Kartennummer anzeigt.
index.html
<html>
<head>
<meta charset="utf-8">
<title>WebPay Google App Engine Python sample</title>
</head>
<body>
<h1>WebPay Google App Engine Python sample</h1>
<form action="/" method="post">
<input type="number" name="amount" value="300" />Ich werde den Yen bezahlen.<br />
<!--Das Senden von Kreditkarteninformationen an Ihren eigenen Server führt zu einer Verpflichtung, diese ordnungsgemäß zu behandeln.
Durch die Verwendung von JavaScript zum Generieren eines Webpay-Tokens müssen Sie nicht direkt mit Kreditkarteninformationen umgehen.
webpay-Eine Eingabe mit dem Namenstoken wird automatisch hinzugefügt.-->
<script src="https://checkout.webpay.jp/v1/" class="webpay-button"
data-text="Karteninformationen eingeben und bezahlen"
data-key="{{ public_key }}"></script>
</form>
</body>
</html>
erfolgreich.html
ist eine einfache Vorlage, die nur die Ergebnisse anzeigt.
succeeded.html
<html>
<head>
<meta charset="utf-8">
<title>WebPay PHP sample</title>
</head>
<body>
<h1>Danke für deine Bezahlung</h1>
<ul>
<li>Der Geldbetrag für die Zahlung: {{charge.amount}}</li>
<li>Kartenname: {{charge.card.name}}</li>
<li>Kartennummer: ****-****-****-{{charge.card.last4}}</li>
</ul>
</body>
</html>
Dies ist das Ende der Programmierung.
Lassen Sie uns nun endlich die Bibliothek installieren.
Die Python-Bibliothek wird im Allgemeinen von pip oder easy_install verwaltet. Dies ist jedoch in der normalen Python-Umgebung und nicht in der GAE-Umgebung der Fall. Dieses Mal legen wir "webpay-python" und seine abhängigen Bibliotheken in das zuerst erstellte "lib" -Verzeichnis.
Zuerst "git clone" die Bibliothek. (Sie können die Bibliothek auch auf andere Weise zur Hand haben, z. B. mit Reißverschluss oder Ei.)
mkdir tmp && cd tmp
git clone [email protected]:webpay/webpay-python.git
git clone https://github.com/kennethreitz/requests.git
Erstellen Sie die Bibliothek, wenn der Klon abgeschlossen ist. Verschieben Sie die erstellten Dateien nach dem Erstellen wie unten gezeigt in das Verzeichnis "lib".
cd webpay-python
python setup.py build
cd ../requests
python setup.py build
cd ../../
mv tmp/webpay-python/build/lib/webpay lib/
mv tmp/requests/build/lib/requests lib/
Am Ende denke ich, dass die Verzeichnisstruktur wie folgt ist.
webpay-sample
├── app.yaml
├── lib
├── webpay
└── requests
├── tmp
├── main.py
├── index.html
├── succeeded.html
└── appengine_config.py
Lassen Sie es uns in einer lokalen Entwicklungsumgebung ausführen. Führen Sie den folgenden Befehl im Verzeichnis "webpay-sample" aus.
dev_appserver.py .
Greifen wir auf http: // localhost: 8080 / zu.
Wie ist das? Wurde es angezeigt?
Wenn es gut aussieht, stellen Sie es in Google App Engine bereit.
appcfg.py update .
Einmal bereitgestellt
https://webpay-sample.appspot.com/
Ich denke, Sie können eine Seite wie diese sehen. Im Vergleich zu den Artikeln über Ruby und PHP ist die Menge etwas größer, aber Sie können feststellen, dass Sie WebPay mithilfe der offiziellen Bibliothek auch mit GAE einführen können. Dies ist ein typisches PaaS, das einfach ist und von jedem verwendet werden kann. Ist es nicht?
Sie konnten WebPay sogar mit dem nostalgischen GAE ausführen, mit dem die Cloud-Ära begann.
Recommended Posts