Advertisement
  1. Code
  2. Web Development

Cómo construir un cuadro de suscripción con Stamplay

Scroll to top
Read Time: 21 min
Sponsored Content

This sponsored post features a product relevant to our readers while meeting our editorial guidelines for being objective and educational.

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Las cajas de suscripción son un negocio cada vez más popular en estos días. Puedes encontrarlos para todo, desde productos para el cuidado personal hasta refrigerios saludables, juegos para niños e incluso helados. En este tutorial, te mostraré cómo crear rápidamente una aplicación web para probar si puedes encontrar los primeros 1,000 clientes para tu idea de cuadro de suscripción.

Nuestra aplicación está inspirada en el servicio de suscripción de cóctel Shaken e incluye las siguientes características:

  • Los usuarios pueden registrarse a través de Facebook.
  • Activar pagos recurrentes a través de Stripe.
  • Pausar y reactivar las suscripciones.
  • Enviar correos electrónicos transaccionales
  • Agregar usuarios a una lista de MailChimp.

Este tutorial te mostrará cómo configurar un back-end con todas las características y cómo construir el front-end de AngularJS que se conecta a él.

La base de código completa del front-end se puede encontrar en GitHub.

Cupón: Stamplay ha proporcionado a los lectores de Tuts+ un cupón exclusivo para ofrecer 6 meses gratis del plan plus (valor de $600). El código de cupón es CODETUTSPLUS y vence el 10 de octubre. Regístrate ahora gratuitamente para canjearlo.

1. Stamplay: La API Lego para desarrolladores

Stamplay es una plataforma de desarrollo basada en la web que ofrece a los desarrolladores una manera increíblemente rápida de crear aplicaciones completamente integradas. Stamplay maneja el problema de hablar con muchas API diferentes por lo que no es necesario.

Stamplay se construye alrededor del concepto de componentes; componentes son los pilares de nuestra aplicación. Podemos ver las diferentes herramientas a nuestra disposición en tareas > componentes.

Components available in StamplayComponents available in StamplayComponents available in Stamplay

Una vez que hayas iniciado sesión, serás recibido con este tablero de instrumentos simple y elegante. Crearemos una aplicación aquí. Llámalo como quieras, pero recuerda que este nombre es el que usaremos para identificar nuestra aplicación. Esto también se usará como la URL de nuestra aplicación cuando está alojada.

En nuestro caso, estamos utilizando "tutsplus", y nuestra aplicación se alojará en https://tutsplus.stamplayapp.com.

Ahora comencemos a configurar el back-end.

1.1 Configurando el Back End: Integrando el Registro de Facebook

Esta aplicación contará con un inicio de sesión de Facebook. Podremos interactuar con la API de Facebook y gestionar el inicio de sesión y el registro, todo ello sin una sola línea de código. Como queremos que nuestros usuarios se registren en Facebook, tendremos que dirigirnos a la página de Desarrolladores de Facebook y crear una nueva aplicación para desarrolladores.

Add a New App on FacebookAdd a New App on FacebookAdd a New App on Facebook

Selecciona el sitio web, y una vez que hayas creado tu aplicación, podremos obtener dos cosas que necesitamos de Facebook para integrar con Stamplay:

  • ID de aplicación
  • Secreto de la aplicación

Estas dos cosas se pueden encontrar en Configuración > Básico.

Dashboard showing App ID and App SecretDashboard showing App ID and App SecretDashboard showing App ID and App Secret

Ahora que tenemos nuestra ID de la aplicación y el secreto de la aplicación, podemos conectarlas a Stamplay.

Vuelve a Stamplay y selecciona Usuarios en el menú principal y luego Autenticación. Agrega Facebook como el servicio de suscripción, copia y pega el ID de la aplicación y el secreto de la aplicación, haz clic en Guardar.

¡Ahora puedes registrar usuarios a través de Facebook!

User authenticationUser authenticationUser authentication

Ahora que hemos conectado nuestras credenciales de Facebook, Stamplay proporciona una URL de API conveniente para gestionar el inicio de sesión con Facebook. Vayamos allí ahora y veamos nuestro inicio de sesión de Facebook en acción.

Ve a https://tutsplus.stamplayapp.com/auth/v1/facebook/connect.

¡Y listo! Tienes tu nombre de usuario de Facebook en funcionamiento.

1.2 Configurando el Back End: Administrando Datos con Objetos

No todo se puede manejar con componentes, por lo que Stamplay nos proporciona una manera fácil de manejar datos personalizados. Piensa en esto como la interfaz de base de datos de fondo para tu aplicación.

Los pedidos se rastrearán con un objeto llamado orders. Tiene las siguientes cinco propiedades:

  • active (boolean) // para rastrear si la suscripción está activa o no
  • address (plain_object) // información de la dirección del usuario
  • plan (string) // el plan al que el usuario se suscribió
  • stripesubscription (string) // el ID de suscripción generado por Stripe
  • usuario (user_id) // el _id único de nuestro usuario
Orders pageOrders pageOrders page

Stamplay expone instantáneamente las API RESTful tan pronto como crea el objeto. El punto final se verá así: https://APPID.stamplayapp.com/api/cobject/v1/orders.

1.3 Configurar Stirpe

Tendremos que facturar a nuestros clientes periódicamente, ¡y afortunadamente esto es fácil de hacer con Stripe! Su procesamiento de pago recurrente se implementa dentro del concepto de Plan. Los planes de franja son objetos que representan el costo y el ciclo de facturación de sus suscripciones.

Para configurarlo, deberás crear tu plan en la consola Stripe > Planes:

Create new plan popupCreate new plan popupCreate new plan popup

Una vez hecho esto, regresa a Stamplay y conecta el componente Stripe en Tarea > Componentes. Selecciona el módulo Stripe y haz clic en el botón Conectar.

Ahora la cuenta de Stripe se vinculará a la aplicación Stamplay, que puede realizar solicitudes de API en nuestro nombre.

Después de una conexión exitosa con Stripe, terminarás en una vista como esta.

Stripe account info and settingsStripe account info and settingsStripe account info and settings

1.4 Configurando MailChimp

Para configurar MailChimp, el proceso es bastante similar; simplemente conecta tu cuenta de MailChimp como lo hacías anteriormente con Stripe, y verás una página como esta:

Mailchimp connection pageMailchimp connection pageMailchimp connection page

2. Agregar automatización con tareas

Esta es la parte del lado del servidor de nuestra aplicación, ¡donde ocurre la mayor parte de la magia! Envía un mensaje de "Bienvenida" por correo electrónico cuando un usuario se registra en Facebook.

  • Envía un mensaje de "Bienvenida" por correo electrónico cuando un usuario se registra en Facebook
  • Agrega usuarios a una lista de MailChimp cuando se registren.

Estas dos cosas normalmente requerirían una buena porción de código, pero no con Stamplay...

2.1 Correo electrónico de bienvenida

Un asistente te guiará a través de la configuración de la tarea. En Tareas > Administrar, crea una nueva tarea y configúrala de la manera que desees. Así es como hemos configurado la tarea de correo electrónico de bienvenida:

New Task windowNew Task windowNew Task window

Luego puedes configurar la acción aprovechando las variables que salen del desencadenador (en este caso, el usuario). Así es como configuramos el nuestro:

Welcome email configurationWelcome email configurationWelcome email configuration

2.2 Enviar los usuarios a una lista de MailChimp

Enviar los correos electrónicos de los usuarios a tu lista de correo en MailChimp es sencillo.

New task window for MailChimp signupNew task window for MailChimp signupNew task window for MailChimp signup

En Tareas > Administrar, crea una nueva tarea y configúrala de la manera que desees. Así es como hemos configurado la tarea de suscripción de MailChimp.

MailChimp task configurationMailChimp task configurationMailChimp task configuration

3. El Front End

Para comenzar a trabajar en nuestra interfaz, necesitaremos usar la herramienta Stamplay CLI.

3.1 Instalar la CLI de Stamplay

Esta herramienta nos dará la posibilidad de trabajar con nuestras aplicaciones Stamplay. Nos permite:

  • Implementar aplicaciones
  • Iniciar un servidor local para el desarrollo
  • Inicializar un proyecto Stamplay
  • Restaurar a versiones anteriores
  • Descargar la última versión
1
$ npm install -g stamplay-cli

Vamos a crear una nueva carpeta e inicializar nuestra aplicación Stamplay a esa carpeta.

1
$ mkdir tutsplus && cd tutsplus
2
$ stamplay init

Se te pedirá que ingreses tu ID de aplicación (nombre de tu aplicación) y tu clave de acceso. En este caso, son tutsplus y 4****0 respectivamente.

Esto creará un archivo stamplay.json en la raíz de tu aplicación para que al implementarlo, Stamplay sepa tus credenciales.

1
{
2
  "appId": "tutsplus",
3
  "apiKey": "4e****0",
4
  "public": "./",
5
  "ignore": [
6
    "stamplay.json",
7
    "**/.*",
8
    "**/node_modules/**"
9
  ]
10
}

3.2 Construyendo el Front End

Para comenzar a ejecutar con un buen diseño, comenzamos con una de las muchas y geniales plantillas HTML5 gratuitas con tecnología de Templated.co. El que usamos se llama Retrospect.

Vamos a descargarlo y descomprimirlo en nuestra carpeta de proyectos. Luego instalemos algunas bibliotecas adicionales aquí usando Bower. Ejecuta el siguiente comando y estaremos listos para continuar:

1
$ bower install angular angular-ui-router angular-stamplay stamplay-sdk angular-route --save

Para usar Stamplay con Angular, necesitaremos:

  • Cargar el SDK de Stamplay
  • Configurar la aplicación Stamplay
  • Cargar Angular
  • Cargar el enrutador angular UI
  • Cargar la biblioteca Angular-Stamplay (solo un contenedor de servicios para el SDK)

Aquí están las líneas necesarias para hacer todo eso. Los agregaremos debajo de la etiqueta </footer> de tu archivo index.html:

1
<html>
2
    <head>  ...  </head>
3
	<body class="landing">
4
	...
5
6
	<footer id="footer">
7
		<div class="inner">
8
			….
9
		</div>
10
	</footer>
11
	<!-- Scripts -->
12
	<script src="assets/js/jquery.min.js"></script>
13
<script src="assets/js/skel.min.js"></script>
14
	<script src="assets/js/util.js"></script>			
15
	<script src="assets/js/main.js"></script>
16
17
      <script src="/bower_components/stamplay-sdk/dist/stamplay.min.js"></script>
18
<script type="text/javascript">
19
      		Stamplay.init('subscribeboxdemo');
20
      </script>
21
      <script src="/bower_components/angular/angular.min.js"></script>
22
      <script src="/bower_components/angular-route/angular-route.min.js"></script>
23
      <script src="/bower_components/angular-ui-router/release/angular-ui-router.js"></script>      
24
      <script src="/bower_components/angular-stamplay/angular-stamplay.js"></script>
25
      
26
	</body>
27
</html>

Asegúrate de haber escrito tu propia AppId en la función Stamplay.init. Ahora podemos iniciar nuestro servidor local para asegurarnos de que todo se carga correctamente. Ejecuta lo siguiente:

1
stamplay start

Verás que tu aplicación está lista para ir a http://localhost:8080.

3.3 La aplicación angular

Crearemos algunos archivos para tu aplicación angular:

List of files and folders for Angular appList of files and folders for Angular appList of files and folders for Angular app

Los dos archivos de servicios utilizarán las bibliotecas Stamplay SDK y de etapas angulares para ayudar a nuestra aplicación a interactuar con nuestros datos Stamplay.

El más importante es userService.js. Tiene algunas funciones y nos ayuda a captar datos o crear datos. Para obtener una visión más detallada de lo que Stamplay SDK es capaz de hacer, asegúrate de revisar la documentación.

UserService.js aprovecha el Stamplay JS SDK para proporcionar a nuestra aplicación Angular las siguientes funcionalidades:

  • login
  • logout
  • isLogged
  • saveAddress
  • getUserModel
  • createCard
  • subscribe
  • unsubscribe

/assets/js/services/userService.js

1
/*global angular, Stripe, console*/
2
'use strict';
3
4
angular
5
  .module('tutsplus.service')
6
  .factory('userService', ['$q', '$stamplay',
7
    function ($q, $stamplay) {
8
var user = $stamplay.User().Model;
9
    return {
10
	  login: function () {
11
		return user.login('facebook');
12
	  },
13
	  logout: function () {
14
	  	return user.logout();
15
	  },
16
	  isLogged: function () {
17
		return user.isLogged();
18
	  },
19
	  saveAddress: function (address, city, zipcode) {
20
		// Save user’s address information 

21
	},
22
	getUserModel: function () {
23
	// Get User informations

24
},
25
	createCard: function (cardObj) {
26
		// Collect Credit card information and store it via Stripe

27
	},
28
	subscribe: function (planId) {
29
		// Subscribe user

30
	},
31
	unsubscribe: function (planId) {
32
		// Cancel user subscription

33
	}
34
     };
35
   }]);

Nuestra aplicación tendrá tres páginas:

  • home.html, la página de inicio principal donde el usuario podrá suscribirse
  • subscriptions.html, donde los usuarios pueden ver los cuadros disponibles para una suscripción
  • profile.html, donde los usuarios pueden editar su información y cancelar una suscripción

Estas páginas están administradas por tres controladores (como lo sugieren las mejores prácticas), que son homeCtrl.js, subscriptionCtrl.js y profileCtrl.js.

Las plantillas de página y los controladores están unidos por la aplicación angular principal.

Aquí está la base de nuestra app.js:

1
/*global angular*/
2
'use strict';
3
angular.module('tutsplus', ['tutsplus.service', 'ngRoute', 'ui.router', 'ngStamplay']);
4
5
angular
6
  .module('tutsplus')
7
  .config(function ($stateProvider, $urlRouterProvider) {
8
    $urlRouterProvider.otherwise('/');
9
	$stateProvider
10
		.state('home', {
11
			url: '/',
12
			templateUrl: '/pages/home.html',
13
			controller: 'homeCtrl',
14
			controllerAs: 'home'
15
		})
16
		.state('subscriptions', {
17
		url: '/subscriptions',
18
			templateUrl: '/pages/subscriptions.html',
19
			controller: 'subscriptionCtrl',
20
			controllerAs: 'sub'
21
		})
22
		.state('profile', {
23
			url: '/profile',
24
			templateUrl: '/pages/profile.html',
25
			controller: 'profileCtrl',
26
			controllerAs: 'profile'
27
		});
28
})
29
/* 

30
 * Save logged user, if present, in the rootScope

31
 */
32
.run(['$rootScope', 'userService',
33
	function ($rootScope, userService) {
34
		userService.getUserModel()
35
			.then(function (userResp) {
36
				$rootScope.user = userResp;
37
			});
38
	}
39
]);

Ahora solo tenemos que cargar nuestros nuevos archivos en index.html debajo de las bibliotecas que agregamos anteriormente.

/index.html

1
   ...head of the index.html file..
2
  <script src="/bower_components/angular/angular.min.js"></script>
3
  <script src="/bower_components/angular-route/angular-route.min.js"></script>
4
  <script src="/bower_components/angular-ui-router/release/angular-ui-router.js"></script>
5
  <script src="/bower_components/angular-stamplay/angular-stamplay.js"></script>
6
7
  <script src="/assets/js/services/main.js"></script>
8
  <script src="/assets/js/services/userService.js"></script>
9
  <script src="/assets/js/modules/app.js"></script>
10
11
  <script src="/assets/js/controllers/homeCtrl.js"></script>
12
  <script src="/assets/js/controllers/subscriptionCtrl.js"></script>
13
  <script src="/assets/js/controllers/profileCtrl.js"></script>
14
</body>
15
</html>

3.4 Autenticación de usuario

Conectamos nuestra aplicación de Facebook anteriormente, ¡y ahora tenemos que brindarles a nuestros usuarios una manera de usarla! Toda la autenticación es manejada por Stamplay. No necesitamos codificar nada; solo tenemos que vincular a nuestros usuarios con la ruta de autenticación que Stamplay nos ha proporcionado.

El proceso de autenticación se ve así:

  • Enlace a los usuarios a su URL de autenticación.
  • La autenticación ocurre en Facebook.
  • Facebook envía a un usuario a nuestra aplicación con un token.
  • Stamplay maneja el almacenamiento de ese token y nuestro usuario está autenticado.

Solo necesitamos configurar manualmente el primero de esos pasos. Vamos a aplicar nuestra app angular con ng-app y ng-controller a index.html y agregar algunas directivas angulares para conectar la página de inicio con nuestro homeCtrl.js. También vamos a eliminar todo entre el <nav> y el <footer> de la plantilla original y reemplazarlo con un elemento de etiqueta  <div ui-view></div>.

Este elemento mostrará dinámicamente el contenido de la página actual.

/index.html

1
   ...head of the index.html file..
2
<body class="landing" ng-app="tutsplus">
3
<!-- Header -->
4
<header id="header" class="alt">
5
    <h1><a href="index.html">Stamplay Shaken</a></h1>
6
	 <a href="#nav">Menu</a> 
7
</header>
8
<!-- Nav -->
9
<nav id="nav" ng-controller="homeCtrl as home">
10
	<ul class="links">
11
		<li><a ui-sref="home">Home</a></li>
12
		<li><a ng-show="home.isLogged" ui-sref="profile">My Profile</a></li>
13
		<li><a ui-sref="subscriptions">New Subscription</a></li>
14
		<li><a ng-show="home.isLogged" href ng-click="home.logout()">Logout</a></li>
15
</ul>
16
</nav>
17
18
<div ui-view></div>
19
20
<footer>
21
   ...end of the index.html file..

Cuando se inicia la aplicación, el enrutador verificará la URL y cargará la vista adecuada. Dentro de la primera <sección> de home.html, podemos detectar fácilmente todas las directivas de angular que se emparejaron con las funciones de homeCtrl.js.

/pages/home.html

1
<section id="banner">
2
    <i class="icon fa-glass"></i>
3
	<h3 ng-show="home.isLogged">Welcome {{ home.user.instance.displayName }}</h3>
4
	<h2>The best cocktails you've ever made</h2>
5
	<p>Premium ingredients and recipes, delivered to your door each month.</p>
6
	<ul class="actions">
7
		<li><a class="button big special" 
8
		ng-show="!home.isLogged"
9
		ng-click="home.signUp()">
10
		Become a member
11
		</a></li>
12
		<li><a class="button big special"
13
		ng-show="home.isLogged"
14
		ui-sref="subscriptions">
15
		New subscription
16
		</a></li><br>
17
		<li><a class="button big special" 
18
		ng-show="home.isLogged"
19
		ui-sref="profile">
20
		View your subscriptions
21
		</a></li>			
22
	</ul>
23
</section>

/assets/js/controllers/homeCtrl.js

1
/*global angular*/
2
'use strict';
3
4
angular
5
    .module('tutsplus')
6
	.controller('homeCtrl', ['$rootScope', 'userService',
7
		function ($rootScope, userService) {
8
			var homeModel = this;
9
			homeModel.isLogged = userService.isLogged();
10
11
			$rootScope.$watch('user', function (newVal) {
12
				homeModel.user = newVal;
13
				homeModel.isLogged = userService.isLogged();
14
			}, true);
15
16
			homeModel.signUp = function () {
17
				userService.login();
18
			};
19
20
			homeModel.logout = function () {
21
				userService.logout();
22
			};
23
		}
24
	]);

Ahora, si un usuario hace clic en el botón "Conviértase en miembro", se le pedirá que inicie sesión con su cuenta de Facebook. Tuvimos que hacer deploy porque la autenticación no funcionará desde localhost:8080. Facebook quiere devolver a un usuario a un dominio completo calificado.

En este punto, despliega tu aplicación nuevamente usando:

1
$ stamplay deploy

Después de que un usuario inicie sesión con éxito, queremos que puedan suscribirse a uno de nuestros planes.

3.5 Creando Clientes Stripe

Los clientes son el otro componente principal de las suscripciones. En un sentido amplio, un cliente es solo una forma genérica de asociar a tus propios usuarios con tu cuenta Stripe. Normalmente, querrás asociar algunos metadatos, como una dirección de correo electrónico, con un cliente. Los objetos del cliente también pueden almacenar una tarjeta de crédito, que es cómo se les facturará más adelante.

Crear un nuevo cliente a través de la API es fácil, ya que el Stamplay JS SDK ya proporciona todo el soporte requerido. Nuestra aplicación asocia un cliente de Stripe a nuestros propios usuarios justo después del registro o inicio de sesión; esto se gestiona a través de userService.js en la función getUserModel.

/assets/js/services/userService.js

1
.. head of userService.js ...
2
getUserModel: function () {
3
  var def = $q.defer();
4
  user.currentUser()
5
  .then(function () {
6
    //create a stripe customer if doesn't exist

7
if (user.isLogged()) {
8
		if (!user.get('stripeCustomerId')) {
9
			$stamplay.Stripe().createCustomer(user.get('id'))
10
			.then(function (sResponse) {
11
				var saveUser = $stamplay.User().Model;
12
				user.set('stripeCustomerId', sResponse.customer_id);
13
				user.set('subscriptions', sResponse.subscriptions);
14
			saveUser.set('stripeCustomerId', user.get('stripeCustomerId'));
15
				saveUser.set('subscriptions', user.get('subscriptions'));
16
				saveUser.set('_id', user.get('_id'));
17
				saveUser.save()
18
				.then(function () {											def.resolve(user);
19
});
20
			})
21
	} else {
22
			def.resolve(user);
23
			}
24
		} else {
25
			def.resolve(user)
26
		}
27
	})
28
	.catch(function (err) {
29
		def.reject(err);
30
	});
31
return def.promise;},
32
.. tail of userService.js ...

El código anterior verifica si el usuario está conectado o no, y si ya tienen una propiedad stripeCustomerId. Si no, crea un cliente Stripe con $stamplay.Stripe().createCustomer(user.get('id')) y almacenas el stripeCustomerId como una propiedad adicional del usuario registrado.

Este control se activa cada vez que la aplicación se inicia con el módulo Angular app.js.

/assets/js/modules/app.js

1
.run(['$rootScope', 'userService',
2
function ($rootScope, userService) {
3
    	userService.getUserModel()
4
		.then(function (userResp) {
5
			$rootScope.user = userResp;
6
		});
7
	}
8
])

3.6 Suscripción a un plan

Ahora, finalmente, debemos cobrar a nuestro usuario cuando compran un plan. La plantilla subscriptions.html, vinculada al controlador subscriptionCtrl.js, muestra a nuestros usuarios los planes de suscripción que pueden elegir.

Join Your Spirit WayJoin Your Spirit WayJoin Your Spirit Way

Cuando el usuario selecciona una de las suscripciones, se mostrará el formulario de pago, lo que permite al usuario finalizar su compra. La página de suscripción muestra los artículos en la parte superior y contiene dos secciones más (las secciones de pago y agradecimiento), ambas ocultas.

/pages/subscription.html

1
<!-- articles section starts -->
2
<section id="three" class="wrapper style3 special">
3
  <div class="inner">
4
    <header class="major narrow    ">
5
	<h2>Join your spirit way</h2>
6
	</header>
7
	  <article class="feature left">
8
	  <span class="image"><img src="images/gin.jpg" alt=""/></span>
9
	    <div class="content">
10
		<h3>God save the queen</h3>
11
		<p>Discover a new gin cocktail each month.</p>
12
		<ul class="actions">
13
		  <li ng-show="sub.isLogged"><a href class="button special" ng-click="sub.openSubscribe('tplanOne')">Subscribe</a>
14
		  </li>
15
		</ul>					
16
           </div>
17
         </article>
18
<article class="feature right">
19
		<!-- second article here -->
20
	</article>
21
22
</section>
23
24
<section id="payment-form" class="wrapper style2 special" ng-show="sub.showPayment">
25
  <div class="inner">
26
  <header class="major narrow">
27
    <h2>Payment information</h2>
28
  </header>
29
  <form>
30
    <div class="container 50%">
31
	<div class="row uniform 50%">
32
	<div class="12u$">
33
		<h3>Personal data</h3>
34
</div>
35
	<div class="6u 12u$(xsmall)">
36
	  <input name="firstname" placeholder="First name" type="text" value="{{sub.user.get('name').givenName}}"/>
37
	</div>
38
	<div class="6u$ 12u$(xsmall)">
39
	  <input name="familyname" placeholder="Family Name" type="text" value="{{sub.user.get('name').familyName}}"/>
40
	</div>
41
	<div class="12u$">
42
	 <input name="email" placeholder="Email" type="text" value="{{sub.user.get('email')}}"/>
43
	</div>		
44
	<div class="12u$">
45
	<h3>Card info</h3>
46
	</div>
47
	<div class="12u">
48
	  <input name="cardnumber" placeholder="Card number" type="text"
49
value="{{sub.card.number}}"/>
50
	</div>
51
	<div class="4u">
52
	  <input name="expiremonth" placeholder="Expire month" type="text" value="{{sub.card.expM}}"/>
53
	</div>						
54
<div class="4u">
55
	  <input name="expireyear" placeholder="Expire year" type="text"
56
value="{{sub.card.expY}}"/>
57
	</div>						
58
	<div class="4u">
59
  	  <input name="cvc" placeholder="CVC" type="text" value="{{sub.card.cvc}}"/>
60
	</div>
61
	<div class="12u$">
62
	  <h3>Subscription</h3>
63
	</div>
64
	<div class="12u">
65
 	  <select ng-model="sub.selectedPlanId">
66
	    <option value="tplanOne">God save the queen</option>
67
	    <option value="tplanTwo">From kentucky with love</option>
68
	    <option value="tplanThree">The rum diary</option>
69
	  </select>
70
	</div>
71
	<div class="12u$">
72
 	  <h3>Delivery details</h3>
73
	</div>
74
	<div class="12u">
75
	  <input name="address" placeholder="Address" type="text" ng-model="sub.address.address" />
76
	</div>
77
	<div class="6u">
78
  <input name="city" placeholder="City" type="text" ng-model="sub.address.city"/>
79
	</div>						
80
	<div class="6u">
81
	  <input name="zipcode" placeholder="Post Code" type="text" ng-model="sub.address.zipcode"/>
82
	</div>
83
	<div class="12u$" style="text-align:left">
84
	  <input name="defaultadress" type="checkbox" ng-model="sub.saveAddress">
85
	  <label ng-click="sub.saveAddress = !sub.saveAddress">Save as default address</label>
86
	</div>											    </div>
87
</div>
88
89
<ul class="actions">
90
 <li><input type="submit" class="special" value="Confirm subscription" ng-click="sub.subscribe($event)"/></li>
91
</ul>
92
</form>
93
</div>
94
</section>
95
...

Para pasar la información relacionada con la suscripción seleccionada, usaremos una función llamada openSubscribe('planName') de subscriptionCtrl.js.

/assets/js/controllers/subscriptionCtrl.js

1
subModel.openSubscribe = function (planId) {
2
            subModel.showPayment = true;
3
            subModel.showThankyou = false;
4
            subModel.selectedPlanName = subModel.selectedPlanMap[planId];
5
            subModel.selectedPlanId = planId;
6
        //Scroll to payment

7
        $timeout(function () {
8
            $location.hash('payment-form');
9
            $anchorScroll();
10
        });
11
};

Esta función hace que el formulario de pago sea visible, y se mostrará junto con los datos del usuario y el plan seleccionado.

Este formulario recopila la información del usuario, la suscripción seleccionada y los valores de la tarjeta de crédito.

Para recopilar los valores de las tarjetas de crédito, necesitamos agregar el cliente de JavaScript de Stripe para obtener un token para la tarjeta, y luego usamos la función de Franja de Stamplay para finalizar el plan. En nuestro index.html, importemos la biblioteca Stripe.js e inicialicemos con nuestra clave de prueba.

/index.html

1
...
2
      <script src="/bower_components/angular/angular.min.js"></script>
3
      <script src="/bower_components/angular-route/angular-route.min.js"></script>
4
      <script src="/bower_components/angular-ui-router/release/angular-ui-router.js"></script>
5
      <script src="/bower_components/angular-stamplay/angular-stamplay.js"></script>
6
7
      <script type="text/javascript" src="https://js.stripe.com/v2/"></script>
8
      <script type="text/javascript">
9
          Stripe.setPublishableKey('pk_test_**********************0');
10
      </script>
11
12
      <script src="/assets/js/services/main.js"></script>
13
      <script src="/assets/js/services/userService.js"></script>
14
      <script src="/assets/js/modules/app.js"></script>
15
...

Finalmente, la suscripción puede ser procesada. Cuando se hace clic en Confirmar suscripción, nuestro subscriptionCtrl.js inicia el proceso de suscripción, aprovechando userService.js.

Payment InformationPayment InformationPayment Information

/assets/js/controllers/subscriptionCtrl.js

1
...
2
subModel.subscribe = function ($event) {
3
$($event.currentTarget).prop('disabled', 'disabled');
4
    if (subModel.saveAddress) {
5
	userService.saveAddress(subModel.address.address, subModel.address.city, subModel.address.zipcode);
6
	}
7
	userService.createCard({
8
	number: subModel.card.number,
9
		exp_month: subModel.card.expM,
10
		exp_year: subModel.card.expY,
11
		cvc: subModel.card.cvc
12
	})
13
	.then(function () {
14
		return userService.subscribe(subModel.selectedPlanId);
15
	})
16
	.then(function () {
17
		subModel.showPayment = false;
18
		subModel.showThankyou = true;
19
		$($event.currentTarget).removeProp('disabled');
20
	}).catch(function (err) {
21
		$($event.currentTarget).removeProp('disabled');	
22
	});
23
};
24

Antes de guardar la tarjeta de crédito, actualicemos al usuario con su información de dirección. Veremos más adelante por qué esto es útil en esta etapa.

Un usuario puede estar limitado a una sola tarjeta de crédito. Esta es la razón por la cual la función createCard verifica si el usuario ya tiene una con $stripe.getCreditCard(user.get('id')). Si no hay una tarjeta presente, procedemos a agregar la tarjeta.

Antes de vincular la tarjeta al usuario, debemos agregar la biblioteca de JavaScript del lado de la banda Stripe para convertir de manera segura los valores de la tarjeta de crédito a un token. Una vez que tenemos el token, podemos pasarlo a Stamplay JS SDK y unir la tarjeta al usuario $stamplay.Stripe().createCreditCard.

/assets/js/service/userService.js

1
...
2
createCard: function (cardObj) {
3
   var def = $q.defer();
4
   var $stripe = $stamplay.Stripe();
5
6
   $stripe.getCreditCard(user.get('id'))
7
        .then(function (response) {
8
            var nDef = $q.defer();
9
            if (response.card_id) {
10
                nDef.resolve();
11
            } else {
12
                Stripe.card.createToken(cardObj, function (err, response) {
13
                var token = response.id;
14
                $stamplay.Stripe().createCreditCard(user.get('id'), token)
15
                    .then(function (response) {
16
                        nDef.resolve(response);
17
                    })
18
                    .catch(function (err) {
19
                        nDef.reject(new Error(err));
20
                    });
21
                });
22
            }
23
           return nDef.promise;
24
            })
25
            .then(function () {
26
                def.resolve();
27
            })
28
            .catch(function (err) {
29
                console.log(err);
30
            });
31
            return def.promise;
32
   }
33

Para probar la implementación de Stripe, llenamos previamente la información de la tarjeta de crédito con los valores de prueba a continuación. Para obtener información sobre las pruebas en Stripe, consulta la documentación.

  • n.4242 4242 4242 4242
  • Fecha: 07/2020
  • cvc: 424

El flujo de suscripción continúa llamando a la función de suscripción userService.js. Esto completa el proceso al enviar la solicitud de suscripción a Stripe.

/assets/js/services/userService.js

1
...
2
 subscribe: function (planId) {
3
        var def = $q.defer();
4
        $stamplay.Stripe().createSubscription(user.get('id'), planId)
5
            .then(function () {
6
                return $stamplay.Stripe().getSubscriptions(user.get('id'));
7
            })
8
            .then(function (response) {
9
                user.set('subscriptions', response.data);
10
                var saveUser = $stamplay.User().Model;
11
                saveUser.set('subscriptions', user.get('subscriptions'));
12
                saveUser.set('id', user.get('id'));
13
                  saveUser.save()
14
                .then(function () {
15
                    def.resolve();
16
                });
17
            })
18
            .catch(function (err) {
19
                console.log(err);
20
                def.reject(err);
21
            });
22
23
            return def.promise;
24
        }

La función de suscripción es simple. Una vez que nos aseguramos de que el usuario exista y tenga una tarjeta de crédito, solo necesitamos llamar a $stamplay.Stripe().createSubscription.

El último paso es realizar un seguimiento de las suscripciones creando pedidos y recibiendo notificaciones para cada nueva suscripción que vendemos a través del sitio web. Regresemos a Stamplay y configuremos algunas tareas.

4. Agregar automatización final

Queremos vincular los datos de suscripción a un pedido y viceversa. Esto permitirá a nuestros usuarios desactivar su suscripción si así lo desean.

4.1 Cuando se presenta una nueva suscripción, crea una orden

On new subscription then create an instance of orderOn new subscription then create an instance of orderOn new subscription then create an instance of order

Cuando se ha enviado una suscripción, queremos crear una nueva instancia de un objeto de pedido. El pedido hará un seguimiento de la suscripciónId que acaba de crear Stripe, el ID de usuario, el plan y la dirección.

Cuando un usuario que inicia sesión desencadena una tarea, podemos usar cualquiera de sus propiedades para alimentar la acción que sigue. Es por eso que vinculamos la dirección a nuestros usuarios en subscriptionCtrl.js. Esto nos permite almacenarlos en el objeto de pedido incluso si los datos del desencadenante de suscripción no proporcionan esta información. Por lo tanto, puedes ver que la propiedad de dirección de la orden se completa con los datos obtenidos del usuario, ejemplo. {{user.address.city}}.

Create a new order when a user subscribes to a planCreate a new order when a user subscribes to a planCreate a new order when a user subscribes to a plan

4.2 Cuando se realiza un nuevo pedido, vincúlalo con la suscripción relacionada

Para tener una referencia del pedido también en la suscripción en Stripe, podemos actualizar el campo Metadata de la suscripción de la siguiente manera. Primero, selecciona el disparador apropiado y la acción del componente Objetos y Stirpe.

On create order add id to subscriptionOn create order add id to subscriptionOn create order add id to subscription
Configure triggerConfigure triggerConfigure trigger

Como guardamos nuestro pedido en el Id. de suscripción, ahora podemos editar las suscripciones de Stripe por Id.

Configure actionConfigure actionConfigure action

4.3 Cuando se realiza un nuevo pedido, notifica al usuario y al administrador de la aplicación con un correo electrónico

Confirmation email for plan subscriptionConfirmation email for plan subscriptionConfirmation email for plan subscription
Configure actionConfigure actionConfigure action

Conclusión

En este tutorial, revisamos cómo comenzar a crear una aplicación web utilizando Stamplay. Implementamos la funcionalidad de inicio de sesión con Facebook y autenticamos con éxito al usuario contra la base de datos en Stamplay. Creamos una API RESTful para administrar pedidos. Hemos podido conectar nuestra aplicación a las API's de MailChimp y Stripe y unirlas con algunas automatizaciones de back-end.

Cupón: Stamplay ha proporcionado a los lectores de Tuts + un cupón exclusivo para ofrecer 6 meses gratis del plan plus (valor de $ 600). El código de cupón es CODETUTSPLUS y vence el 10 de octubre. Regístrate ahora gratis para canjearlo.

Manage your tasksManage your tasksManage your tasks

El código del tutorial anterior está disponible en GitHub. Dinos lo que piensas a través de los comentarios a continuación.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.