Python Ver. Présentation de WebPay avec un peu de code

Avis de mise à jour

Cet article est basé sur la version 1 de webpay-python (fraîchement préparée). Après cela, nous avons effectué une mise à jour majeure de la version.

La plupart du contenu peut être utilisé tel quel, mais certains noms de méthodes ont été modifiés. Pour les dernières informations, reportez-vous à la documentation de l'API Python sur le site Web officiel de WebPay.

De plus, le référentiel sur github a cessé de se mettre à jour conformément à la mise à jour majeure de la version. Pour plus d'informations sur la bibliothèque, voir Documents de la bibliothèque.


Le calendrier de l'Avent WebPay est également entré dans la seconde moitié du jeu. Nous travaillons dur pour encourager le nombre de stocks de tout le monde qui augmente progressivement.

Aujourd'hui, c'est la série "Présentation de WebPay avec un peu de code".

Jusqu'à présent, les versions Ruby et PHP sont apparues. C'est la version Python qui l'accompagne. De plus, j'ai essayé d'utiliser Google App Engine comme environnement pour l'exécuter.

De nos jours, de nombreux PaaS sont encombrés dans le monde et il existe de nombreux environnements de programmation pratiques, donc je pense que certaines personnes ont oublié GAE, mais GAE est un PaaS établi depuis longtemps. N'oubliez pas GAE de temps en temps.

webpay-python

La bibliothèque officielle Python de WebPay (webpay-python) a été publiée!

** Célébration ** Sortie

Maintenant, utilisons cette bibliothèque Python pour introduire WebPay sur GAE à une vitesse explosive.

webpay meets GAE

Commençons tout de suite à programmer. Une caractéristique majeure de GAE est qu'un SDK pour le développement local est fourni et que l'environnement GAE peut être reproduit localement. Cependant, alors que l'environnement est prédéfini, les bibliothèques et les versions fournies par GAE sont limitées, vous ne pouvez donc pas charger et utiliser librement les bibliothèques. Les versions principales sont prises en charge s'il s'agit d'un cadre de base, mais bien sûr, la bibliothèque de passerelle de paiement, etc.

Les programmeurs d'aujourd'hui pensent que le monde qui consiste à réinventer les roues et à ne pas pouvoir utiliser la bibliothèque librement est un monde intolérable. Je ne peux pas le supporter non plus.

Par conséquent, je vais expliquer les points lors de l'utilisation d'une bibliothèque externe avec GAE, veuillez donc vous y référer.

Cette fois, nous utiliserons webapp2 intégré à GAE et webpay-python comme bibliothèque externe.

Installer le SDK

Si vous avez un Mac Merverics à portée de main Téléchargez GoogleAppEngineLauncher-1.8.8.dmg à partir du GAE SDK et appliquez le fichier ouvert (GoogleAppEngineLauncher.app). Placez-le simplement dans un dossier et vous êtes prêt à partir. Lorsque vous démarrez GoogleAppEngineLauncher.app, il installera le script python pour l'environnement de développement local de GAE dans / usr / local / bin.

Utiliser WebPay depuis Python

Préparez un répertoire adapté à votre projet. Préparez-y app.yaml et appengine_config.py. Je pense qu'il a la structure de répertoires suivante.

webpay-sample
├── app.yaml
└── appengine_config.py

Le contenu de app.yaml

app.yaml


application: webpay-sample
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /.*
  script: main.app

Définissons python27 sur runtime comme ceci. GAE passe également à l'ère du 2.7. Pour l'application, spécifiez l'application_id créé dans le [Dashboard] de GAE (https://appengine.google.com/). Si vous souhaitez l'essayer localement, vous n'avez pas besoin de créer une application sur le tableau de bord GAE. Les paramètres Threadsafe peuvent ne pas être familiers à ceux qui utilisaient GAE dans le passé, mais depuis que python27 est devenu disponible, ils ont été explicitement spécifiés. (Je n'expliquerai pas en détail car cela s'écarte du sujet principal, mais si vous définissez threadsafe: true, vous ne pourrez pas renvoyer les données au client en utilisant la sortie standard avec impression, etc.)

Vient ensuite ʻ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 est un fichier spécial utilisé pour les paramètres couramment utilisés dans le projet et pour définir le chemin de la bibliothèque. Cette fois, nous allons enregistrer la bibliothèque externe sous lib, donc ajoutez le répertoire lib au chemin de la bibliothèque.

Enfin, créez la partie principale du programme. Cette fois, j'ai spécifié script: main.app dans ʻapp.yaml, donc créons-le avec le nom de fichier main.py. De plus, préparez deux fichiers, ʻindex.html et successed.html, comme modèles à lire par main.py.

webpay-sample
├── app.yaml
├── lib
├── main.py
├── index.html
├── succeeded.html
└── appengine_config.py

Jetons un œil à chaque fichier.

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-Accès à WebPay à l'aide de la bibliothèque python
      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:
      #Si la carte est rejetée
      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:
      #Lorsque le paramètre spécifié dans la demande n'est pas valide
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write("InvalidRequestException")
    except webpay.errors.AuthenticationError, e:
      #Si l'authentification échoue
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write("AuthenticationException")
      pass
    except webpay.errors.ApiConnectionError, e:
      #Lorsqu'une erreur de connexion à l'API se produit
      self.response.headers['Content-Type'] = 'text/plain'
      self.response.out.write("APIConnectionException")
      pass
    except webpay.errors.WebpayError, e:
      #Si une erreur se produit sur le serveur WebPay
      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 est une application webapp2 qui implémente les méthodes get et post dans la classe MainPage.

La première méthode get crée un chemin de modèle avec path = os.path.join (os.path.dirname (__ file __), 'index.html') ʻet self.response.out. Je rende html avec write (template.render (path, template_values)) `. Attribuez la clé publique utilisée dans CheckoutHelper comme variable de modèle.

      charge = webpay.charges.create(
        amount=amount,
        currency="jpy",
        card=token
      )

La deuxième méthode post utilise la méthode webpay.charges.create () ci-dessus pour effectuer le processus de facturation. Puisque le jeton créé par CheckoutHelper est envoyé par le client, un code comme token = self.request.POST.get ('webpay-token') Obtient la valeur POSTed dans.

Enfin, vérifions le contenu des modèles de ʻindex.htmlet desuccessed.html. Dans ʻindex.html, quand il s'agit du calendrier de l'avent de Ruby et PHP De même, nous utilisons une bibliothèque Javascript appelée Checkout Helper qui affiche une boîte de dialogue pour saisir un numéro de carte.

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" />Je paierai le yen.<br />

<!--L'envoi d'informations de carte de crédit à votre propre serveur crée une obligation de les gérer correctement.
En utilisant JavaScript pour générer un jeton de paiement Web, vous n'avez pas à traiter directement les informations de carte de crédit.
     webpay-Une entrée avec le jeton de nom est automatiquement ajoutée.-->
      <script src="https://checkout.webpay.jp/v1/" class="webpay-button"
              data-text="Entrez les informations de la carte et payez"
              data-key="{{ public_key }}"></script>
    </form>
  </body>
</html>

reused.html est un modèle simple qui affiche simplement les résultats.

succeeded.html


<html>
  <head>
    <meta charset="utf-8">
    <title>WebPay PHP sample</title>
  </head>
  <body>
    <h1>Merci pour votre paiement</h1>
    <ul>
      <li>Le montant d'argent à payer: {{charge.amount}}</li>
      <li>Nom de la carte: {{charge.card.name}}</li>
      <li>numéro de carte: ****-****-****-{{charge.card.last4}}</li>
    </ul>
  </body>
</html>

C'est la fin de la programmation.

Maintenant, installons enfin la bibliothèque.

La bibliothèque python est généralement gérée par pip ou easy_install. Cependant, c'est le cas dans l'environnement Python normal et non dans l'environnement GAE. Cette fois, mettons webpay-python et ses bibliothèques dépendantes dans le répertoire lib créé en premier.

Tout d'abord, git clone la bibliothèque. (Vous pouvez préparer la bibliothèque par une autre méthode, telle que zip ou egg.)

mkdir tmp && cd tmp
git clone [email protected]:webpay/webpay-python.git
git clone https://github.com/kennethreitz/requests.git

Construisez la bibliothèque une fois le clonage terminé. Après la construction, déplacez les fichiers construits dans le répertoire lib comme indiqué ci-dessous.

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/

En fin de compte, je pense que la structure des répertoires est la suivante.

webpay-sample
├── app.yaml
├── lib
    ├── webpay
    └── requests
├── tmp
├── main.py
├── index.html
├── succeeded.html
└── appengine_config.py

Exécutons-le dans un environnement de développement local. Exécutez la commande suivante dans le répertoire webpay-sample.

dev_appserver.py .

Accédons à http: // localhost: 8080 /.

comment c'est? At-il été affiché?

S'il semble bon, déployez-le sur Google App Engine.

appcfg.py update .

Une fois déployé

https://webpay-sample.appspot.com/

Je pense que vous pouvez voir une page comme celle-ci. Par rapport aux articles sur ruby et php, le montant est un peu plus important, mais vous pouvez constater que vous pouvez introduire WebPay en utilisant la bibliothèque officielle même avec GAE, qui est un PaaS typique qui est facile et que tout le monde peut utiliser. N'est-ce pas?

en conclusion

Vous avez pu exécuter WebPay même avec le GAE nostalgique qui a lancé l'ère du cloud.

Recommended Posts

Python Ver. Présentation de WebPay avec un peu de code
Essayez de créer un environnement python avec Visual Studio Code et WSL
J'étais accro à la création d'un environnement Python venv avec VS Code
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
Comment lire un fichier CSV avec Python 2/3
Envoyer un message à LINE avec Python (LINE Notify)
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Décidez d'une mission de laboratoire avec Python (fiction)
Étapes pour créer un bot Twitter avec Python
Essayez de créer un groupe de dièdre avec Python
Je veux écrire dans un fichier avec Python
Zubu amateur veut démarrer Python
Créer un environnement d'exécution python avec VS Code
Réécrire le code Python2 en Python3 (2to3)
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Comment convertir / restaurer une chaîne avec [] en python
Mémo connecté à HiveServer2 d'EMR avec python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Faisons un outil de veille de commande avec python
Obtenez des données financières avec python (puis un peu de bricolage)
Je veux travailler avec un robot en python.
De l'achat d'un ordinateur à l'exécution d'un programme sur python
Comment créer un package Python à l'aide de VS Code
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
Remarques sur l'accélération du code Python avec Numba
Écrire du code dans UnitTest une application Web Python
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Je veux faire fonctionner un ordinateur quantique avec Python
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Utilisez tkinter pour déplacer le code de sortie en tant que "A et prétendant être B" en python
Obtenez le code du pays avec python
Python avec VSCode (Windows 10)
Connectez-vous à BigQuery avec Python
Une route vers Python intermédiaire
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Déboguer Python avec VS Code
Faites une loterie avec Python
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
Créer un répertoire avec python
Un peu coincé dans le chainer
Convertir le code python 3.x en python 2.x
Documenter le code Python avec Doxygen
Configurer un environnement de développement Python avec Visual Studio Code
Comment convertir un tableau en dictionnaire avec Python [Application]
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
Une collection de techniques professionnelles compétitives à résoudre avec Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython