Create rest api to stripe payment gateway in nodeJs and AngularJs/ionic
stripe
payment
gateway
nodeJs
AngularJs
ionic
- By Code solution
- Jan 20th, 2021
- 0 comments
- 1
Stripe Payment Gateway
Stripe is the best software platform for running an internet business. We handle billions of dollars every year for forward-thinking businesses around the world.
Create rest api in nodejs for stripe payment gateway and implement using angularjs and stripe npm module.
Project Structure :
nodeStripe // Project directory - node_modules // Npm Package - package-lock.json. // package-lock.json - package.json. // package.json - www // Forend Side code - server.js. // server.js file
Create a new directory, we can run the following command:
mkdir <project name>
then move into the newly created directory:
cd <project name>
then run this command :
npm init
and fill this information like that :
package name: (project name) version: (1.0.0) description: entry point: (index.js) server.js test command: git repository: keywords: author: license: (ISC)
After creating project install node package run command:
npm install --save express mongoose morgan body-parser method-override stripe
create the server.js file and add this code :
var express = require('express');
var morgan = require('morgan');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var stripe = require('stripe')('*******************************');
var app = express();
//allow cross origin requests
app.use(function(req, res, next) {
res.setHeader("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET");
res.header("Access-Control-Max-Age", "3600");
res.header("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
next();
});
// configuration
app.use(express.static(__dirname + '/www')); // set the static files location /public/img will be /img for users
app.use(morgan('dev'));
app.use(bodyParser.json({limit: '50mb'})); // log every request to the console
app.use(bodyParser.urlencoded({limit: '50mb','extended':'true'})); // parse application/x-www-form-urlencoded // parse application/json
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json
app.get('/', function (req, res) {
res.sendfile('./www/index.html')
})
app.post('/api/checkout', function(req, res) {
console.log(req.body);
var token = req.body.token;
var chargeAmount = req.body.amount;
var discription = req.body.discription;
let amount = chargeAmount;
stripe.customers.create({
email: req.body.email,
card: token
})
.then(customer =>
stripe.charges.create({
amount,
description: discription,
currency: "usd",
customer: customer.id
}))
.then(charge => {
res.json({"payment":charge, "order": "Done"});
})
.catch(err => {
console.log("Error:", err);
res.status(500).json({error: "Purchase Failed"});
});
});
app.listen(process.env.PORT || 3000, function(){console.log("App listening on port 3000");});
After Open index.html in www->index.html and modify code
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title></title>
<link rel="manifest" href="manifest.json">
<link href="lib/ionic/css/ionic.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<!-- ionic/angularjs js -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
<!-- cordova script (this will be a 404 during development) -->
<!-- <script src="cordova.js"></script> -->
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script src="lib/angular-stripe-checkout.js"></script>
<!-- your app's js -->
<script src="js/app.js"></script>
<script src="js/Services/APIServices.js"></script>
<script src="js/controllers/checkout.js"></script>
</head>
<body ng-app="NodeStripe" animation="slide-left-right-ios7" class="platform-android platform-ios platform-cordova platform-webview">
<ion-nav-view></ion-nav-view>
</body>
</html>
After open app.js in www->js->app.js and modify code
// Ionic Starter App
Stripe.setPublishableKey("****************************");
angular.module('NodeStripe', ['ionic', 'CheckOut.controllers', 'APIModule'])
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(false);
cordova.plugins.Keyboard.disableScroll(true);
}
if (window.StatusBar) {
StatusBar.styleDefault();
}
});
})
.directive('stripeForm', ['$window',
function($window) {
var directive = { restrict: 'A' };
directive.link = function(scope, element, attributes) {
var form = angular.element(element);
form.bind('submit', function() {
var button = form.find('button');
button.prop('disabled', true);
$window.Stripe.createToken(form[0], function() {
button.prop('disabled', false);
var args = arguments;
scope.$apply(function() {
scope.$eval(attributes.stripeForm).apply(scope, args);
});
});
});
};
return directive;
}
])
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('checkout', {
url: '/checkout',
cache: false,
templateUrl: 'templates/checkout.html',
controller: 'CheckOutCtrl'
})
// if none of the above states are matched, use this as the fallback
// $urlRouterProvider.otherwise('/welcome');
$urlRouterProvider.otherwise('/checkout');
});
After open checkout.html in www->Templates->checkout.html and modify code
<ion-view view-title="cart">
<ion-header-bar class="content">
<div class="h1 title">Checkout</div>
</ion-header-bar>
<ion-content scroll="true" class="content mainBody">
<form stripe:form="saveCustomer">
<br /><br />
<label class="item item-input ">
<i class="icon ion-ios-person placeholder-icon" style="font-size: 25px !important;"></i>
<input type="text" ng-model="sforms.name" placeholder="Account Holder Name">
</label>
<label class="item item-input no_background margin5 topDownText">
<i class="icon ion-card placeholder-icon" style="font-size: 25px !important;"></i>
<input type="tel" class="placeholderWhite inputform" data-stripe="number" ng-model="sforms.creditcard" placeholder="Credit Card">
</label>
<div class="row no_padding topDownText" style="padding:0px !important;">
<div class="col col-50 no_padding" style="padding:0px !important;">
<label class="item item-input no_background inputform" style="padding-left:0px !important;width: 100%;float: right;">
<select data-stripe="exp-month" ng-model="sforms.month" style="width:100% !important; color:rgb(0, 0, 0) !important; border:none !important; height:30px !important;background-color:transparent !important;">
<option value="">Month</option>
<option value="01">01</option>
<option value="02">02</option>
<option value="03">03</option>
<option value="04">04</option>
<option value="05">05</option>
<option value="06">06</option>
<option value="07">07</option>
<option value="08">08</option>
<option value="09">09</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
</select>
</label>
</div>
<div class="col col-50 no_padding" style="padding:0px !important;">
<label class="item item-input no_background inputform" style="padding-left:0px !important;">
<select data-stripe="exp-year" ng-model="sforms.year" style="width:98% !important; color:rgb(0, 0, 0) !important; border:none !important; height:30px !important;background-color:transparent !important;">
<option value="">Year</option>
<option ng-repeat ="n in range(2018,2030) track by $index" value="{{n}}">{{n}}</option>
</select>
</label>
</div>
</div>
<label class="item item-input no_background margin5 topDownText">
<i class="icon ion-ios-locked placeholder-icon" style="font-size: 25px !important;"></i>
<input type="tel" size="4" class="placeholderWhite inputform" data-stripe="cvc" ng-model="sforms.cvv" placeholder="CVV">
</label>
<button ng-click="checkvalid()" class="button button-block button-positive" style="width: 96%; margin-left: 2%;margin-top: 24px;border-radius: 3px !important;font-size: 20px;">
NEXT
</button>
</form>
</ion-content>
</ion-view>
After open checkout.js in www->js->controllers->checkout.js and modify code
angular.module('CheckOut.controllers', [])
.controller('CheckOutCtrl', function($scope, $ionicModal, $state, $ionicSlideBoxDelegate, $ionicPopup, $ionicLoading, APIService) {
$scope.remeber = true;
$scope.sforms={};
$scope.sforms.name = "CodeSolution";
$scope.sforms.month = "08";
$scope.sforms.creditcard = "4242424242424242";
$scope.sforms.year = "2018";
$scope.sforms.cvv ="123";
$scope.sforms.amount = "20000"; //usd 200
$scope.sforms.user_email = "info@codesolution.co.in";
console.log($scope.sforms);
var id = 1;
$scope.range = function(min, max, step){
step = step || 1;
var input = [];
for (var i = min; i <= max; i += step) input.push(i);
return input;
};
// $scope.range();
$scope.checkvalid = function(){
var Name = $scope.sforms.name;
var MOnth = $scope.sforms.month;
var Card = $scope.sforms.creditcard;
var Year = $scope.sforms.year;
var Cvv = $scope.sforms.cvv;
if(Name==""){
$scope.showAlert("Message", "Name is required");
return false;
}
if(Card==""){
$scope.showAlert("Message","Card Number is required");
return false;
}
if(MOnth==""){
$scope.showAlert("Message","Month is required");
return false;
}
if(Year==""){
$scope.showAlert("Message","Year is required");
return false;
}
if(Cvv==""){
$scope.showAlert("Message","Cvv is required");
return false;
}
$scope.saveCustomer = function(status, response){
console.log(response.id);
var TokenID = response.id;
if(TokenID==undefined || TokenID==null){
var alertPopup = $ionicPopup.alert({
title: '<h5 class="text-center">Enter a valid card number</h5>',
template: ''
});
alertPopup.then(function(res) {
console.log('');
});
return false;
}
$scope.sforms.token = TokenID;
$ionicLoading.show();
APIService.setData({
req_url: 'http://localhost:3000/api/checkout',
data: $scope.sforms
}).then(function(resp) {
$ionicLoading.hide();
console.log(resp.data);
if(resp.data.payment.status=="succeeded"){
var alertPopup = $ionicPopup.alert({
title: '<h5 class="text-center">'+resp.data.payment.outcome.seller_message+'</h5>',
template: ''
});
alertPopup.then(function(res) {
console.log(res);
});
}else{
var alertPopup = $ionicPopup.alert({
title: '<h5 class="text-center">Payment failed.</h5>',
template: ''
});
alertPopup.then(function(res) {
});
}
},function(resp) {
$ionicLoading.hide();
var alertPopup = $ionicPopup.alert({
title: '<h5 class="text-center">Something went wrong please try again later</h5>',
template: ''
});
alertPopup.then(function(res) {
console.log('');
});
});
};
}
$scope.remberUncheck = function(){
if($scope.remeber == false){
$scope.remeber = true;
}
}
})
After open APIServices.js in www->js->Services->APIServices.js and modify code
//Generic service for calling API
angular.module('APIModule', []).factory('APIService', ['$http', function($http) {
return {
getData: function(obj){
var xhr = $http({
url: obj.req_url,
method: 'GET',
data: obj.data,
headers: {'Content-Type': 'application/json'}
});
return xhr;
},
setData: function(obj){
var xhr = $http({
url: obj.req_url,
method: 'POST',
data: obj.data,
headers: {'Content-Type': 'application/json'}
});
return xhr;
},
removeData: function(obj){
var xhr = $http({
url: obj.req_url,
method: 'DELETE',
data: obj.data,
headers: {'Content-Type': 'application/json'}
});
return xhr;
},
updateData: function(obj){
var xhr = $http({
url: obj.req_url,
method: 'PUT',
data: obj.data,
headers: {'Content-Type': 'application/json'}
});
return xhr;
}
};
}]);
Thank you :)