-
Notifications
You must be signed in to change notification settings - Fork 14
/
index.js
158 lines (120 loc) · 5.08 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
var firebase = require('firebase-admin');
var bodyParser = require('body-parser');
var paypal = require('paypal-rest-sdk');
var express = require('express');
var app = express();
// Initialize the app with a service account, granting admin privileges
var serviceAccount = require("path/to/serviceAccountKey.json");
paypal.configure({
'mode': 'sandbox', //sandbox or live
'client_id': 'REPLACE WITH PAYPAL APP CLIENT_ID',
'client_secret': 'REPLACE WITH PAYPAL APP SECRET'
});
firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: "https://<DATABASE_NAME>.firebaseio.com"
});
// configure body parser
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var port = process.env.PORT || 5000; // set our port
// START THE SERVER
// =============================================================================
app.listen(port);
console.log('Magic happens on port ' + port);
// get an instance of the express Router
var router = express.Router();
// REGISTER OUR ROUTES -------------------------------
// all of our routes will be prefixed with /api
app.use('/api', router);
//verify mobile payment (accessed at POST http://localhost:8080/api/verify_mobile_payment)
router.route('/verify_mobile_payment')
.post(function(req, res) {
//get POST parameters
var payment_id = req.body.payment_id;
var amout_client = req.body.amount;
var currency_client = req.body.currency;
var uid = req.body.uid;
paypal.payment.get(payment_id, function (error, payment) {
if (error) {
res.json({"msg": error , "state": error.status});
return ;
}
var payment_state = payment.state;
var transaction_server = payment.transactions[0];
var amount_server = transaction_server.amount.total;
var currency_server = transaction_server.amount.currency;
var slale_state_server = transaction_server.related_resources[0].sale.state;
if(payment_state !== "approved" ){
res.json( { "msg" : "Payment has not been verified. " , "status" : 200 } );
return ;
}
if(amount_server !== amout_client){
res.json( { "msg" : "Payment amount doesn't matched. " , "state" : 200 } );
return ;
}
if(currency_server !== currency_client){
res.json( { "msg" : "Payment currency doesn't matched. " , "state" : 200 } );
return ;
}
if(slale_state_server !== "completed"){
res.json( { "msg" : "Sale not completed. " , "state" : 200 } );
return ;
}
// insert payment in db
var new_payment_key = insertPayment( payment.id , uid , payment.create_time , payment.state , amount_server , currency_server );
// insert sale in db
insertItemSales(new_payment_key , payment.transactions[0] , payment.state);
res.json( { "msg" : "Sale completed. " , "state" : 200 , "payment":payment } );
return ;
});
});
// get firebase products
router.route("/products").get(function(req,res){
var jsonStr = '{"products":[]}';
var obj = JSON.parse(jsonStr);
// Attach an asynchronous callback to read the data at our products reference
firebase.database().ref("/products").on("value", function(snapshot) {
snapshot.forEach(function(data) {
var response = data.val();
response.sku = data.key;
obj['products'].push(response);
});
obj.status = 200;
jsonStr = JSON.stringify(obj);
res.json(obj);
}, function (errorObject) {
res.json({"msg":errorObject.message , "status":errorObject.code});
});
});
// insert payment in firebase.
function insertPayment(paymentID , uid , c_time , p_state , amount_server , currency_server) {
var new_payment_key = firebase.database().ref("/").child("payments").push().key;
firebase.database().ref('payments/'+new_payment_key).set({
user_id : uid ,
paypal_payment_id: paymentID ,
create_time : c_time,
payment_state : p_state,
amount : amount_server,
currency : currency_server
});
return new_payment_key;
}
// insert success sale in db
function insertItemSales(paymentID, transaction, state){
var item_list = transaction.item_list;
var items = item_list.items;
items.forEach(function(item){
var quantity = item.quantity;
var price = item.price;
var sku = item.sku;
var new_sale_key = firebase.database().ref("/").child("sales").push().key;
firebase.database().ref('sales/'+new_sale_key).set({
firebase_payment_id : paymentID ,
quantity: quantity ,
price : price,
payment_state : state,
product_id : sku
});
});
}