<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Leonardo Alonso</title>
    <description>The latest articles on DEV Community by Leonardo Alonso (@leonardoalonso).</description>
    <link>https://dev.to/leonardoalonso</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F237209%2F79485536-fd24-41f2-ba9f-ec1bbebcf2ee.jpg</url>
      <title>DEV Community: Leonardo Alonso</title>
      <link>https://dev.to/leonardoalonso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonardoalonso"/>
    <language>en</language>
    <item>
      <title>¿Existe el Desarrollador Senior o Junior?</title>
      <dc:creator>Leonardo Alonso</dc:creator>
      <pubDate>Mon, 21 Jun 2021 23:10:07 +0000</pubDate>
      <link>https://dev.to/leonardoalonso/existe-el-desarrollador-senior-o-junior-2l7k</link>
      <guid>https://dev.to/leonardoalonso/existe-el-desarrollador-senior-o-junior-2l7k</guid>
      <description>&lt;p&gt;En la industria del desarrollo de software existen múltiples perfiles principalmente basados en las tecnologías que se usan y el nivel de experiencia. Sin embardo después de 5 años de experiencia en la industria me parece que esos perfiles "Senior" o "Junior" no son tan simples de definir.&lt;/p&gt;

&lt;p&gt;Pero antes de empezar, quiero resaltar que esta es una opinión personal por lo que tal vez mucho no estén de acuerdo con lo que este en este post pero eso es bueno ya que fortalecerá la conversación, ahora si vamos a empezar.&lt;/p&gt;

&lt;p&gt;Imagen aquí&lt;/p&gt;

&lt;p&gt;En diversos artículos de otros blogs o en ofertas laborales suelen definir a los perfiles junior como profesionales con no mas de 2 años de experiencia y a los senior con mas de 5 o 6 años de experiencia. Pero es ahí donde, para mi, entra lo relativo del termino, es decir experiencia en una tecnología en especifico, o quizá experiencia en el campo laboral.&lt;/p&gt;

&lt;p&gt;Desde mi punto de vista un desarrollador senior(basado en los años de experiencia) siempre aporta muchas ideas a un equipo de trabajo, es decir, sabe como mejorar algunos procesos, conoce metodologías de desarrollo pero cuando un desarrollador con ese perfil se incorpora a un equipo de trabajo podría no estar familiarizado quizá con el stack tecnológico, por ejemplo un desarrollador web empieza a hacer desarrollo móvil, este desarrollador aportara mucho en ideas pero seguramente necesitara mentoría en algunas cosas que no conoce de la tecnología usada, entonces es un senior solo por la experiencia, o es un junior por que no conoce la tecnología al 100%.&lt;/p&gt;

&lt;p&gt;En este sentido, lo que yo creo es que si es un senior, por que esa experiencia lo llevara a entender mejor y mas rápido otras tecnologías, es decir aun que necesitara de mentoría, ese desarrollador será capaz de resolver muchas cosas por si mismo, y aportara al equipo con ideas y propuestas, lo que es algo que suele dificultarse un poco a los Junior.&lt;/p&gt;

&lt;p&gt;Por esta razón para mi el perfil de desarrollador senior y por ende el junior si existe, pero no será un desarrollador que conoce todas las tecnologías o muchas tecnologías si no uno que tendrá todo un set de habilidades blandas y tecnológicas que lo llevaran a tomar muchas mas y mejores decisiones de las que podría tomar un desarrollador junior.&lt;/p&gt;

</description>
      <category>devlive</category>
      <category>developers</category>
    </item>
    <item>
      <title>Que es un Cherry Pick</title>
      <dc:creator>Leonardo Alonso</dc:creator>
      <pubDate>Mon, 08 Feb 2021 23:58:10 +0000</pubDate>
      <link>https://dev.to/leonardoalonso/que-esun-cherry-pick-2eg4</link>
      <guid>https://dev.to/leonardoalonso/que-esun-cherry-pick-2eg4</guid>
      <description>&lt;p&gt;Como sabemos GIT es uno de los sistemas de control de versiones mas populares en la industria y dispone de muchas funciones como la creación de ramas, commits, merge, rebase etc.&lt;/p&gt;

&lt;p&gt;En este post vamos a analizar justo una de sus funciones llamada cherry pick la cual nos podría salvar de algún momento desagradable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supongamos el siguiente escenario:
&lt;/h2&gt;

&lt;p&gt;Estamos trabajando para una empresa que está desarrollando en una aplicación web X y tenemos lista la primer versión de nuestro proyecto y siguiendo el flujo normal de git hacemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init #inicializamos el repositorio
git add . #agregamos todos los archivos a nuestro repositorio
git commit -m "Version 1 de la aplicacion X"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recuerden esto es solo una suposición en un proyecto real probablemente no haremos el primer commit con la versión 1 completa.&lt;/p&gt;

&lt;p&gt;Muy bien continuemos...&lt;/p&gt;

&lt;p&gt;Ya que tenemos lista esta primer versión nos empezamos a trabajar en los primeros fixes y cambios a la aplicación por lo que empezamos con la creación de ramas por feature o por fix haciendo algo como esto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch nuevo-feature
git checkout nuevo-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro de este branch se nos pide modificar el color de header de nuestra aplicación y modificar las opciones del menú.&lt;/p&gt;

&lt;p&gt;Empezamos cambiando el color del header y hacemos nuestro commit&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add header.js
git add esitlos.css
git commit -m "Cambio de color en el header"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y continuamos cambiando ahora las opciones del menú y eso lo vamos a hacer en varios commits, entonces hacemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add menu.js
git commit -m "Cambio de la opcion 1 del menu"
git add menu_responsivo.js
git commit -m "Cambio de la opcion 1 del menu responsivo"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Llegamos al lunes y temprano en una junta nuestro jefe nos dice que necesita que el nuevo color del header lo necesitamos ya en producción y hay que pasarlo a la rama main (recuerden que siguiendo el estándar de github master no se usa más como rama principal) y entonces entramos en pánico por que aun que ese cambio ya está listo el resto de cambios en la rama aun no están listos y ahora que hacemos...&lt;/p&gt;

&lt;p&gt;Bueno el cherry pick está ahí para salvarnos la vida ya que esta característica de git nos va a permitir traernos commits de un branch a otro sin tener que hacer un merge o un rebase.&lt;/p&gt;

&lt;p&gt;¿Y bueno esto como se hace?&lt;/p&gt;

&lt;p&gt;Primero en nuestro branch nuevo-feature vamos a hacer un git log para ver todos nuestros commits.&lt;/p&gt;

&lt;p&gt;Deberíamos ver algo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit a4d05f9ad128329095074f14255bf24a28c300f7 (HEAD -&amp;gt; nuevo-feature)
Author: Leonardo Alonso &amp;lt;usuario@empresa.com&amp;gt;
Date:   xxxxxxxxxxxxxxxxx
    Cambio de color en el header
commit 12ceg453529095074f14255bf24a2832443dfg3 (HEAD -&amp;gt; nuevo-feature)
Author: Leonardo Alonso &amp;lt;usuario@empresa.com&amp;gt;
Date:   xxxxxxxxxxxxxxxxxxx
    Cambio de la opcion 1 del menu
commit 2343425324ef23432423asd14255bf24a28c553f (HEAD -&amp;gt; nuevo-feature)
Author: Leonardo Alonso &amp;lt;usuario@empresa.com&amp;gt;
Date:   xxxxxxxxxxxxxxxxxxxx
    Cambio de la opcion 1 del menu responsivo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entonces solo queremos el cambio del color del header no todos los demás así que nos copiamos el hash de ese commit y nos cambiamos de rama a main&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya con el hash del commit que necesitamos vamos a hacer&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git cherry-pick a4d05f9ad128329095074f14255bf24a28c300f7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cabe mencionar que aquí estamos usando el hash completo sin embargo si usáramos más opciones en nuestro comando git log seguramente el hash seria más corto pero eso lo veremos en otro post.&lt;/p&gt;

&lt;p&gt;Continuando, una vez que corremos el comando cherrypick lo que va a pasar es que a nuestra historia del branch main se le sumara el commit que elegimos de esa forma no necesitamos hacer un merge de todo el branch.&lt;/p&gt;

&lt;p&gt;¿Está muy bien no? Bueno pues aún con lo practico que esto parece resulta ser que cherry-pick es una mala práctica y debe ser usada únicamente cuando en verdad no vemos otra opción ya que seguramente cuando hagamos el merge de todas las ramas con fixes y nuevos features nos vamos a tomar con muchos conflictos que habrá que resolver.&lt;/p&gt;

&lt;p&gt;Pues bueno ahora tienen a su disposición una herramienta más de git que deberán utilizar con mucha responsabilidad.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--skp17B3H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/31vm7r8u63wrtjbz8rhh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--skp17B3H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/31vm7r8u63wrtjbz8rhh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
    </item>
    <item>
      <title>Meses sin Intereses en Stripe con Python y React parte 4</title>
      <dc:creator>Leonardo Alonso</dc:creator>
      <pubDate>Thu, 03 Dec 2020 00:33:13 +0000</pubDate>
      <link>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-y-react-parte-4-3dld</link>
      <guid>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-y-react-parte-4-3dld</guid>
      <description>&lt;p&gt;En nuestro post anterior al fin terminamos nuestro formulario de pago del lado de React JS, en este post daremos inicio a la creación de nuestra pequeña api para aceptar los pagos utilizando flask.&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalando los paquetes
&lt;/h1&gt;

&lt;p&gt;Antes de realizar cualquier instalación vamos a activar nuestro entorno virtual.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;source env/bin/activate&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora si para instalar flask solo debemos de hacer: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install flask&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Y para instalar la librería de stripe hacemos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install stripe&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Creando nuestra api
&lt;/h1&gt;

&lt;p&gt;Esta será una api pequeña por lo que solo necesitaremos un archivo al que llamaremos api.py&lt;/p&gt;

&lt;p&gt;Para validar que flask esta correctamente instalado vamos a escribir lo siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import flask

app = flask.Flask(__name__)
app.config["DEBUG"] = True


@app.route('/', methods=["GET"])
def home():
    return "&amp;lt;h1&amp;gt; Flask API &amp;lt;/h1&amp;gt;"

app.run()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora hacemos &lt;code&gt;python api.py&lt;/code&gt; lo cual iniciara el servidor de DEBUG de flask con el que podremos acceder a nuestro localhost en el puerto 5000 el cual es el puerto por defecto para flask, este puede ser cambiado dentro de los parámetros de la función &lt;code&gt;run()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Entonces si accedemos a 127.0.0.1:5000 veremos el mensaje que hemos colocado dentro de la función &lt;code&gt;home&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aDU2eCUP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gc5hli5ifxfkne70d575.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aDU2eCUP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gc5hli5ifxfkne70d575.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora, recordando un poco nuestra aplicacion de React esta apuntando a la siguiente ruta &lt;code&gt;api/acept_payment&lt;/code&gt;, por lo que procederemos a crearla.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.route('/api/acept_payment', methods=['POST'])
def acept_payment():
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora vamos a iniciar nuestro proyecto de React y a reiniciar nuestro servidor de flask, al hacer la peticion tal cual la tenemos ahora en nuestra aplicación nos toparemos con un error relacionado a CORS, sobre este tema vamos a hablar mas en otro post de momento para solucionarlo haremos la siguiente modificación.&lt;/p&gt;

&lt;p&gt;Vamos a instalar la libreria &lt;code&gt;flask-cors&lt;/code&gt; haciendo &lt;code&gt;pip install flask-cors&lt;/code&gt; y escribimos lo siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
app.config["DEBUG"] = True
CORS(app)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vale en principio pensaríamos que esto va a funcionar pero si hacemos la petición al backend nos vamos a topar con el siguiente error:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2nM8QIUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5zhz3kutabf3znhqg57b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2nM8QIUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5zhz3kutabf3znhqg57b.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y esto que significa? 😕 Bueno pues resulta que no podemos hacer peticiones a un servidor sin https.&lt;/p&gt;

&lt;p&gt;Vale y eso como lo solucionamos? pues de inicio nos podemos crear un certificado autofirmado y esto lo vamos a hacer de la siguiente manera&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Completamos toda la información que nos solicita y listo ya solo nos queda agregarlo a nuestro proyecto en python&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app.run(ssl_context=('cert.pem', 'key.pem'))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora desde el navegador debemos entrar a nuestro localhost en el puesto 5000 o el que hayan configurado para el servidor de prueba de flask y darle permiso para que utilice nuestro certificado autofirmado.&lt;/p&gt;

&lt;p&gt;Esta solución no debe ir NUNCA en producción, para producción o nos compramos los certificados o usamos letsencript o lo que sea pero jamás un autofirmado.&lt;/p&gt;

&lt;p&gt;Ok, ahora si nuestra petición ha de funcionar como esperamos&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hvfi5W99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pd39h67n3ifusy7mfzxv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hvfi5W99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pd39h67n3ifusy7mfzxv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muy bien ya podemos modificar nuestra api para aceptar el objeto json que enviamos desde react.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.route('/api/acept_payment', methods=['POST'])
def acept_payment():
    data = request.get_json()
    print(data)
    return {'ff':'ff'}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con la función get_json() de request obtenemos todo lo que se envié por método POST en formato json y de momento regresamos un diccionario de prueba.&lt;/p&gt;

&lt;p&gt;Con esto estamos listos ahora si para aceptar nuestro pago con Stripe, así que vamos a modificar nuestra api&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, request, jsonify
from flask_cors import CORS

import stripe

stripe.api_key = 'secret'

app = Flask(__name__)
app.config["DEBUG"] = True
CORS(app)


@app.route('/', methods=['GET'])
def home():
    return "&amp;lt;h1&amp;gt; Flask API &amp;lt;/h1&amp;gt;"

@app.route('/api/acept_payment', methods=['POST'])
def acept_payment():
    data = request.get_json()
    payment = stripe.PaymentIntent.create(
        amount=2000,
        currency='mxn',
        payment_method=data['payment_method'],
        payment_method_types=["card"],
        off_session=True,
        confirm=True
    )
    print(payment)
    return payment

app.run(ssl_context=('cert.pem', 'key.pem'))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto estamos haciendo uso de el api de stripe y mas en especifico de su api de &lt;code&gt;paymentIntents&lt;/code&gt; entre los parámetros que estamos enviando esta el monto a cobrar, el tipo de cambio, el tipo de método de pago.&lt;/p&gt;

&lt;p&gt;Mas en especifico el parámetro &lt;code&gt;off_session&lt;/code&gt; significa que no estamos enviando un id para &lt;code&gt;customer&lt;/code&gt; y &lt;code&gt;confirm&lt;/code&gt; significa que queremos confirmar el pago, ahora para que &lt;code&gt;confirm&lt;/code&gt; sea True &lt;code&gt;off_session&lt;/code&gt; también debe ser True.&lt;/p&gt;

&lt;p&gt;No hay que olvidar poner nuestro propia clave secreta en esta linea.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;stripe.api_key = 'secret'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;de lo contrario nada de esto va a funcionar.&lt;/p&gt;

&lt;p&gt;Con esto ya estamos aceptando pagos con stripe solo queda ver si el pago realmente se realizo y eso lo podemos ver desde el dashboard de stripe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7RS8EoKc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2tga91h088zpcgickwf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7RS8EoKc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2tga91h088zpcgickwf6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aquí vemos nuestro pago confirmado pero... en el monto le pusimos que queríamos cobrar 2000 y el cargo que tenemos es solo por 20. Bueno esto se debe a que stripe toma el monto dos ceros antes, pero la solución para eso es que el valor que queremos cobrar los multipliquemos por 100 y listo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@app.route('/api/acept_payment', methods=['POST'])
def acept_payment():
    data = request.get_json()
    amount = 2000
    payment = stripe.PaymentIntent.create(
        amount=amount*100,
        currency='mxn',
        payment_method=data['payment_method'],
        payment_method_types=["card"],
        off_session=True,
        confirm=True
    )
    print(payment)
    return payment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7WLt6ttx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f1ht3jb97n6yxlmk02jm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7WLt6ttx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f1ht3jb97n6yxlmk02jm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora si todo esta bien y con eso vamos a concluir este POST que fue un poco mas largo que los anteriores pero con el propósito de mostrar las posibles complicaciones a las que nos vamos a enfrentar cuando trabajemos proyectos de este tipo, si aun así quedan dudas pueden usar los comentarios y tratare de responder a cada uno de ellos. Por ultimo les dejo los repositorios de cada proyecto y nos vemos en el siguiente post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/leonardoAlonso/StripeForm"&gt;https://github.com/leonardoAlonso/StripeForm&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/leonardoAlonso/stripe-flask-api"&gt;https://github.com/leonardoAlonso/stripe-flask-api&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Happy Codding
&lt;/h1&gt;

</description>
      <category>python</category>
      <category>flask</category>
      <category>stripe</category>
      <category>react</category>
    </item>
    <item>
      <title>Meses sin Intereses en Stripe con Python y React parte 3</title>
      <dc:creator>Leonardo Alonso</dc:creator>
      <pubDate>Sun, 22 Nov 2020 23:11:03 +0000</pubDate>
      <link>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-y-react-parte-3-34a4</link>
      <guid>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-y-react-parte-3-34a4</guid>
      <description>&lt;p&gt;En nuestro post anterior iniciamos la creación de nuestro formulario de pago, en esta sección terminaremos de preparar el formulario para poder aceptar los pagos.&lt;/p&gt;

&lt;h1&gt;
  
  
  El evento submit
&lt;/h1&gt;

&lt;p&gt;Por ahora tenemos un formulario donde validamos cada cambio en el formulario en el evento onChange pero como dijimos es un formulario por lo que necesitamos &lt;code&gt;subir&lt;/code&gt; ese cambio es decir un evento onSubmit y así es como lo escribiremos.&lt;/p&gt;

&lt;p&gt;Nos situamos dentro del componente &lt;code&gt;CheckoutForm.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import CardSection from './CardSection'
import { CardElement, useStripe, useElements } from '@stripe/react-stripe-js';

const CheckoutForm = () =&amp;gt; {
    const stripe = useStripe();
    const elements = useElements();

    const handleSubmit = async (ev) =&amp;gt; {
      ev.preventDefault();

      if (!stripe || !elements) {

        return;

      }

      const cardElement = elements.getElement(CardElement);

      const {error, paymentMethod} = await stripe.createPaymentMethod({
        type: 'card',
        card: cardElement,
      })

      if (error) {
        console.log(['error'], error);
      } else {
        console.log(['PaymentMethod'], paymentMethod);
      }

    }

    return (
        &amp;lt;div className="col-lg-12"&amp;gt;
            &amp;lt;form onSubmit={handleSubmit}&amp;gt;
                &amp;lt;h1&amp;gt;Formulario de Pago&amp;lt;/h1&amp;gt;
                &amp;lt;div className="form-group"&amp;gt;
                    &amp;lt;CardSection/&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;button className="btn btn-primary"&amp;gt;Donate&amp;lt;/button&amp;gt;
            &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

export default CheckoutForm;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo primero que estamos haciendo es importar los hooks &lt;code&gt;useStripe&lt;/code&gt; y &lt;code&gt;useElements&lt;/code&gt; de la librería de stripe. Ahora situándonos en el JSX agregamos el método o prop &lt;code&gt;onSubmit&lt;/code&gt; en el formulario.&lt;/p&gt;

&lt;p&gt;Ahora la parte mas importante es &lt;code&gt;const cardElement = elements.getElement(CardElement);&lt;/code&gt; ya que esta se encargara de buscar el &lt;code&gt;CardElement&lt;/code&gt; y con el creara el método de pago.&lt;/p&gt;

&lt;p&gt;Para este punto recuerden poner su api key de stripe.&lt;/p&gt;

&lt;p&gt;Ahora y para terminar este post tenemos que enviar el método de pago al servidor y esto lo vamos a hacer usando la función fetch de JS, esto se va a hacer dentro del &lt;code&gt;else&lt;/code&gt; de la función &lt;code&gt;handleSubmit&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; let response = fetch('http://localhost/api/acept_payment',
          {'payment_method': paymentMethod}).then((response) =&amp;gt; {
            console.log(response)
          }).catch((error) =&amp;gt; {
            console.log('[error]', error)
          });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y por ahora es todo, en el siguiente post vamos hacer nuestro backend con python y flask donde vamos por fin a aceptar el pago.&lt;/p&gt;

&lt;p&gt;Nuevamente les dejo el repo del proyecto de react para que puedan ver todos los cambios. &lt;a href="https://github.com/leonardoAlonso/StripeForm"&gt;https://github.com/leonardoAlonso/StripeForm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>react</category>
      <category>flask</category>
      <category>stripe</category>
    </item>
    <item>
      <title>Meses sin Intereses en Stripe con Python y React parte 2</title>
      <dc:creator>Leonardo Alonso</dc:creator>
      <pubDate>Sat, 14 Nov 2020 19:12:38 +0000</pubDate>
      <link>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-parte-2-48j0</link>
      <guid>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-parte-2-48j0</guid>
      <description>&lt;p&gt;En el post pasado iniciamos creando nuestra estructura de archivos y directorios para nuestro formulario de pago con stripe usando React y Flask.&lt;/p&gt;

&lt;p&gt;Ya con todo eso listo podemos iniciar a crear los componentes de React que necesitaremos para procesar los pagos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalando la librería de react para stripe
&lt;/h1&gt;

&lt;p&gt;Esto es muy simple lo único que debemos hacer es:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install --save @stripe/react-stripe-js @stripe/stripe-js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;y listo, ya se actualizo nuestro package.json y se instalo la librería.&lt;/p&gt;

&lt;h1&gt;
  
  
  Agregando Bootstrap (para que no se vea tan feo)
&lt;/h1&gt;

&lt;p&gt;Bootstrap es un framework de frontend con el propósito de estilizar nuestras aplicaciones o sitios web.&lt;/p&gt;

&lt;p&gt;Existen muchas maneras de agregarlo a un proyecto en React pero la más simple y la que vamos a utilizar es agregando el CDN a el index de nuestra aplicación.&lt;/p&gt;

&lt;p&gt;Pero no lo vamos a agregar al index.js si no que dentro de la carpeta public encontraremos un archivo de nombre index.html y es en este dónde agregaremos el CDN de (bootstrap)[&lt;a href="https://getbootstrap.com/docs/4.5/getting-started/introduction/"&gt;https://getbootstrap.com/docs/4.5/getting-started/introduction/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Al igual que cualquier archivo css este va dentro de un tag &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; y dentro del &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; de la pagina quedando algo como esto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oAnrpG-U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a99s31vgx9ihvgn7166w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oAnrpG-U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/a99s31vgx9ihvgn7166w.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Modificando la estructura de archivos
&lt;/h1&gt;

&lt;p&gt;Cuando creamos un nuevo proyecto de react usando &lt;code&gt;create-react-app&lt;/code&gt; este nos da una estructura de archivos inicial, para este caso vamos a modificar un poco esta estructura.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ir a la carpeta src&lt;/li&gt;
&lt;li&gt;Dejar únicamente el archivo index.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando eliminemos estos archivos y tratemos de iniciar el proyecto con &lt;code&gt;npm start&lt;/code&gt; seguramente tendremos varios errores y estos serán causados por las importaciones de archivos que ya no existen por lo que vamos a modificar ese archivo index.js de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react';
import ReactDOM from 'react-dom';
import App from './App'

ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementById('root'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Creando los componentes
&lt;/h1&gt;

&lt;p&gt;Ahora aun tendremos un error de importación por que para este punto aún no existe el componente &lt;code&gt;App&lt;/code&gt; por lo que vamos a crearlo al mismo nivel que index.js&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GKnUreve--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k6oznurhwoo4cl40aazw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GKnUreve--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/k6oznurhwoo4cl40aazw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para toda esta serie de tutoriales vamos a utilizar &lt;code&gt;functional componets&lt;/code&gt; que es la forma en la que React nos dice que deberíamos trabajar, si alguno de ustedes esta acostumbrado a utilizar &lt;code&gt;ClassComponents&lt;/code&gt; es muy fácil migrar de uno a otro.&lt;/p&gt;

&lt;p&gt;Ahora si el componente &lt;code&gt;App&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// App.js

import React from 'react'
import { Elements } from '@stripe/react-stripe-js'
import { loadStripe } from '@stripe/stripe-js'

const App = () =&amp;gt; {
    const stripePromice = loadStripe('stripe_public_key')

    return (
        &amp;lt;div className="container"&amp;gt;
            &amp;lt;div className="row"&amp;gt;
                &amp;lt;Elements stripe={stripePromice}&amp;gt;

                &amp;lt;/Elements&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

export default App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok.. todo se ve muy cool pero que estamos haciendo, bueno partiendo de la estructura fuente de un &lt;code&gt;functional component&lt;/code&gt; lo que estamos haciendo es importar &lt;code&gt;Elements&lt;/code&gt; de la librería de stripe la cual nos va a permitir utilizar los objetos &lt;code&gt;Element&lt;/code&gt; de stripe en cualquier componente heredado.&lt;/p&gt;

&lt;p&gt;Y la otra cosa que estamos haciendo es autenticandonos con nuestra clave publica de stripe esto con la función &lt;code&gt;loadStripe&lt;/code&gt; la cual cargara de forma asíncrona al script de &lt;code&gt;Stripe.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esa autenticación se la pasamos como prop el componente &lt;code&gt;Element&lt;/code&gt; y listo ya podemos utilizar stripe.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creando el CardElement
&lt;/h1&gt;

&lt;p&gt;Dentro de la carpeta src vamos a crear una nueva carpeta llamada &lt;code&gt;components&lt;/code&gt; y dentro de esta crearemos un archivo llamado &lt;code&gt;CheckoutForm.js&lt;/code&gt; y escribiremos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// CheckoutForm.js
import React from 'react'
import CardSection from './CardSection'

const CheckoutForm = () =&amp;gt; {
    return (
        &amp;lt;div className="col-lg-12"&amp;gt;
            &amp;lt;form&amp;gt;
                &amp;lt;h1&amp;gt;Formulario de Pago&amp;lt;/h1&amp;gt;
                &amp;lt;div className="form-group"&amp;gt;
                    &amp;lt;CardSection/&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;button className="btn btn-primary"&amp;gt;Pay&amp;lt;/button&amp;gt;
            &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

export default CheckoutForm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este componente nos va a servir para agregar todos los datos del formulario de pago que vallamos a necesitar, es decir nombre del cliente, email, etc... Todo lo que queremos saber del cliente y por supuesto los datos de su tarjeta para realizar el cobro.&lt;/p&gt;

&lt;p&gt;En este caso únicamente estaré pidiendo los datos de la tarjeta, pero desde este componente es donde se pedirá toda la información del cliente.&lt;/p&gt;

&lt;p&gt;Ahora en este punto no tenemos creado aun el componente &lt;code&gt;CardSection&lt;/code&gt; por lo que vamos a hacerlo.&lt;/p&gt;

&lt;p&gt;Dentro de la carpeta components vamos a crear un archivo llamado &lt;code&gt;CardSection.js&lt;/code&gt;, dentro de este archivo escribimos lo sigueinte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState } from 'react'
import { CardElement } from '@stripe/react-stripe-js'
import '../css/stripe_form.css'

const  CardSection = () =&amp;gt; {

    const [state, setState] = useState({
        'errorMessage': ''
    })

    const card_element_options = {
        style: {
            base: {
                color: "#32325d",
                fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
                fontSmoothing: "antialiased",
                fontSize: "16px",
                "::placeholder": {
                    color: "#aab7c4",
                },
            },
            invalid: {
                color: "#fa755a",
                iconColor: "#fa755a",
            },
        }
    }

    const handleOnChanage = (event) =&amp;gt; {
        setState({errorMessage: ''})
        if (event.error) {
            setState({error: true, errorMessage:event.error.message})
        }
    }

    return (
        &amp;lt;&amp;gt;
            &amp;lt;CardElement options={card_element_options} onChange={handleOnChanage}/&amp;gt;
            &amp;lt;div className="card-errors"&amp;gt;
            &amp;lt;p&amp;gt;{state.errorMessage}&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    )
}

export default CardSection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muy bien vamos a la explicación.&lt;/p&gt;

&lt;p&gt;En este componente estamos importando de stripe el componente &lt;code&gt;CardElement&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Stripe nos proporciona muchos &lt;code&gt;Elements&lt;/code&gt; para crear nuestro formulario de pago, pero el &lt;code&gt;CardElement&lt;/code&gt; es uno de los mas utilices desde mi punto de vista por que engloba todos los datos de la tarjeta que necesitamos en un solo input evitando tener que hacer muchos clics o lo que sea, de todos modos aquí les dejo el resto de los elemento que nos provee stripe. &lt;a href="https://stripe.com/docs/stripe-js"&gt;https://stripe.com/docs/stripe-js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora tambien estamos agregando algunas opciones de estilos por default al &lt;code&gt;CardElement&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;También estamos validando si existe algún error en los datos de la tarjeta haciendo uso del prop &lt;code&gt;onChange&lt;/code&gt; del componente &lt;code&gt;CardElement&lt;/code&gt;, para esta validación hacemos uso del hook de React &lt;code&gt;useState&lt;/code&gt; de tal forma que cuando hay un error en el objeto event del componente &lt;code&gt;CardElement&lt;/code&gt; actualizamos el &lt;code&gt;state&lt;/code&gt; y lo renderizamos en el tag &lt;/p&gt;


&lt;p&gt;Aquí les dejo la documentación de stripe en donde podremos ver todas las props que le podemos pasar a los elementos de stripe&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stripe.com/docs/js/elements_object/create_element?type=card#elements_create-options"&gt;https://stripe.com/docs/js/elements_object/create_element?type=card#elements_create-options&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este componente también agregamos algunos estilos por CSS, mismos que les dejare en el Repo del proyecto para no escribir todo el código aquí.&lt;/p&gt;

&lt;p&gt;Ya con todos los componentes listos solo nos queda importar el componente &lt;code&gt;CardForm&lt;/code&gt; dentro de &lt;code&gt;App&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;div className="container"&amp;gt;
            &amp;lt;div className="row"&amp;gt;
                &amp;lt;Elements stripe={stripePromice}&amp;gt;
                    {/* Load the checkout form */}
                    &amp;lt;CheckoutForm/&amp;gt;
                &amp;lt;/Elements&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y listo ya tenemos nuestro formulario.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fp8uesKL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lwghfqjiuoja8gutg4rj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fp8uesKL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lwghfqjiuoja8gutg4rj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aun no acepta pagos, pero esto lo iremos haciendo en los siguientes post.&lt;/p&gt;

&lt;p&gt;Les dejo el Repo del proyecto de React en donde podrán ver todo el código o clonarlo para verlo en uso en sus computadoras.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/leonardoAlonso/StripeForm"&gt;https://github.com/leonardoAlonso/StripeForm&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>react</category>
      <category>flask</category>
      <category>stripe</category>
    </item>
    <item>
      <title>Meses sin Intereses en Stripe con Python y React parte 1</title>
      <dc:creator>Leonardo Alonso</dc:creator>
      <pubDate>Mon, 09 Nov 2020 17:46:15 +0000</pubDate>
      <link>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-parte-1-1p63</link>
      <guid>https://dev.to/leonardoalonso/meses-sin-intereses-en-stripe-con-python-parte-1-1p63</guid>
      <description>&lt;p&gt;Hola comunidad Dev&lt;/p&gt;

&lt;p&gt;Mi nombre es Leonardo Alonso y soy desarrollador web desde poco mas de 3 años, y este es mi primer post dentro de Dev.to, mismo que se convertirá en el inicio de una serie de post/tutoriales de como integrar el procesador de pagos de Stripe y al mismo tiempo de como aceptar meses sin intereses dentro de tu sitio web usando Flask (Python) y React.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparando nuestro entorno
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Cuenta en stripe
&lt;/h2&gt;

&lt;p&gt;Primero que nada necesitaremos crearnos una cuenta en &lt;a href="http://stripe.com/" rel="noopener noreferrer"&gt;stripe&lt;/a&gt; (es gratis 😄 ) una vez tenemos nuestra cuenta y la misma está configurada tendremos acceso a nuestras claves API las cuales vamos a ocupar para comunicarnos con la API de stripe para procesar los pagos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcvaa5jscrf2bidgwld0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcvaa5jscrf2bidgwld0y.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Entorno virtual e instalación de librerías iniciales
&lt;/h2&gt;

&lt;p&gt;Para la integración estaremos usando Python 3.8 🐍 por lo que usaremos un entorno virtual para no mezclar librerías con otros proyectos que tengamos usando Python.&lt;/p&gt;

&lt;p&gt;Empezaremos creando un directorio propio para este proyecto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir stripe
cd stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya dentro de este directorio crearemos uno más al que llamaremos API el cual será la API que crearemos con Flask y donde realizaremos toda la lógica del procesamiento del pago con stripe&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir api
cd api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora si crearemos nuestro entorno virtual, cabe destacar que yo estoy utilizando ubuntu para este tutorial por lo que la instalación de &lt;code&gt;virtualenv&lt;/code&gt; será distinta dependiendo del sistema operativo que estemos usando por lo que aquí dejo una (guía)[&lt;a href="https://developer.mozilla.org/es/docs/Learn/Server-side/Django/development_environment" rel="noopener noreferrer"&gt;https://developer.mozilla.org/es/docs/Learn/Server-side/Django/development_environment&lt;/a&gt;] de como instalarlo, esta guía está enfocada en Django pero la instalación de virtualenv es la que nos interesa.&lt;/p&gt;

&lt;p&gt;Dependiendo de si solo tenemos una versión de Python instalada o varias es como crearemos el entorno virtual.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una sola versión de Python
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;virtualenv env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Multiples versiones de Python
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;virtualenv -p python_version env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En mi caso yo tengo múltiples versiones por lo que usare la segunda opción donde mi python 3.8 solo lo llamo como &lt;code&gt;python3&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;virtualenv -p python3 env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa3axkogoeczc3g4gbk62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa3axkogoeczc3g4gbk62.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora solo nos queda instalar Flask y la Liberia de stripe utilizando el manejador de paquetes de Python &lt;code&gt;pip&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Primero activamos nuestro entorno virtual, nuevamente depende del sistema operativo es como activaremos el entorno virtual aun que realmente solo cambia si estamos usando Windows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source env/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya con el entorno virtual activo instalaremos Flask haciendo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install Flask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;esto nos instalara todas las demás dependencias que necesita Flask para funcionar.&lt;/p&gt;

&lt;p&gt;Ya por último instalaremos la Librería de Stripe haciendo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  React
&lt;/h2&gt;

&lt;p&gt;React es uno de los múltiples Frameworks/Librerias de JS para el Frontend y también es uno de los más populares por lo que lo utilizaremos en esta serie para hacer nuestro formulario de pago.&lt;/p&gt;

&lt;p&gt;Para instalar React solo necesitamos tener instalado NodeJS y NPM ya con esto instalado, necesitaremos instalar de forma global &lt;code&gt;create-react-app&lt;/code&gt; el cual es el paquete recomendado por React para iniciar una aplicación&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g create-react-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya con &lt;code&gt;create-react-app&lt;/code&gt; solo tenemos que iniciar nuestra aplicación con&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app flask-stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Ya con todos estos pasos listos deberíamos tener una estructura de directorios parecida a esta&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fayhj0qhwvcnad6ln2a8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fayhj0qhwvcnad6ln2a8t.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora si estamos listos para iniciar a desarrollar nuestra aplicación.&lt;/p&gt;

&lt;p&gt;Espero esto sea de su utilidad, como lo mencione es la primera vez que escribo en un blog por lo que cualquier comentario para mejorar será bienvenido.&lt;/p&gt;

&lt;h1&gt;
  
  
  Happy Coding
&lt;/h1&gt;

</description>
      <category>python</category>
      <category>stripe</category>
      <category>flask</category>
      <category>react</category>
    </item>
  </channel>
</rss>
