-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
180 lines (152 loc) · 6.05 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var Moip = require('@pocesar/moip2').Moip;
var _ = require('lodash');
var moment = require('moment');
var moip = new Moip('F4YBYJD1FABW192WO6CWREYNOQDMEYJ3', 'EF41KLNBVFACXAFZ5ST421Z878CZSTCAZFDRDOUN', false);
app.set('port', (process.env.PORT || 3000));
app.use(express.static(__dirname + '/public'));
app.use('/build', express.static(__dirname + '/build'));
app.use(bodyParser.json()); // get information from html forms
app.use(bodyParser.urlencoded({ extended: true }));
var server = app.listen(app.get('port'), function () {
console.log('The app is listening on port ', app.get('port'));
});
var io = require('socket.io').listen(server);
app.get('/', function (req, res) {
res.render('index.html');
});
// API para criar um pedido
app.post('/create_order', function (req, res) {
// Gerando identificadores únicos
var uniqueIdPedido = _.uniqueId('identificador_proprop_moip_pedido_');
var uniqueIdCliente = _.uniqueId('identificador_proprop_moip_cliente_');
var user = req.body.user;
var product = req.body.product;
// Retornar erro se usuário não tiver preenchido nenhum dado
if (!user) {
res.send({ errors: { errors: [{ description: 'Insira seus dados' }] } });
}
// Formatar a dada te nascimento no formato YYYY-MM-DD
var birthDate = user.birthDate && moment(user.birthDate).format('YYYY-MM-DD');
// Criando o objeto com os dados de telefone
var phoneObject = {
countryCode: '55',
areaCode: user.phone && user.phone.areaCode,
number: user.phone && user.phone.number
};
// Criando um objeto com os dados de endereço de entrega
var shippingAddressObject = {
city: user.shippingAddress && user.shippingAddress.city,
complement: user.shippingAddress && user.shippingAddress.complement,
country: 'BRA',
district: user.shippingAddress && user.shippingAddress.district,
state: user.shippingAddress && user.shippingAddress.state,
street: user.shippingAddress && user.shippingAddress.street,
streetNumber: user.shippingAddress && user.shippingAddress.streetNumber,
zipCode: user.shippingAddress && user.shippingAddress.zipCode
};
// Criando um objeto com os dados de documento pessoal
var taxDocumentObject = {
number: user.cpf,
type: 'CPF'
};
// Criando o objeto PEDIDO que vai ser enviado como payload para a API
var orderObject = {
amount: {
currency: 'BRL',
subtotals: {
addition: Math.round(user.addition * 100) || 0,
discount: Math.round(user.discount * 100) || 0
}
},
customer: {
birthDate: birthDate,
email: user.email,
fullname: user.name,
ownId: uniqueIdCliente,
// usando _.pickBy nos objetos para remover atributos `undefined` ou `null`
// pois a API dá erro e não retorna mensagem de erro quando enviamos atributos assim
phone: _.pickBy(phoneObject),
taxDocument: _.pickBy(taxDocumentObject),
shippingAddress: _.pickBy(shippingAddressObject)
},
items: [{
detail: '',
price: Math.round(product.price * 100),
product: product.name,
quantity: 1
}],
ownId: uniqueIdPedido
};
// Chamando a API para criar o pedido
return moip.createOrder(orderObject)
.then(function (order) {
res.send({ order: order, success: true });
}).catch(function (err) {
res.send({ errors: err })
}).catch(console.error.bind(console));
});
// API para criar um pagamento
app.post('/create_payment', function (req, res) {
var holder = req.body.holder;
var phone = req.body.holder && req.body.holder.phone;
// Se usuário não tiver preenchido nenhum dado de holder, retornar erro
if (!holder) {
res.send({ errors: { errors: [{ description: 'Preencha todos os dados obrigatórios' }] } });
}
// Formatar a dada te nascimento no formato YYYY-MM-DD
var birthDate = holder && holder.birthDate && moment(holder.birthDate).format('YYYY-MM-DD');
// Criando o objeto com os dados de telefone
var phoneObject = {
countryCode: '55',
areaCode: phone && phone.areaCode,
number: phone && phone.number
};
// Criando um objeto com os dados de documento pessoal
var taxDocumentObject = {
type: 'CPF',
number: holder.cpf
};
// Criando objeto com dados do holder do cartão
var holderObject = {
fullname: holder.fullname,
birthdate: birthDate,
// usando _.pickBy nos objetos para remover atributos `undefined` ou `null`
// pois a API dá erro e não retorna mensagem de erro quando enviamos atributos assim
taxDocument: _.pickBy(taxDocumentObject),
phone: _.pickBy(phoneObject)
};
// Chamando a API para criar o pagamento
return moip.createPayment({
installmentCount: 1,
statementDescriptor: "Lucas Garcia",
fundingInstrument: {
method: "CREDIT_CARD",
creditCard: {
hash: req.body.hash,
store: true,
holder: _.pickBy(holderObject)
}
}
}, req.body.orderID)
.then(function (payment) {
res.send({ payment: payment, success: true });
}).catch(function (err) {
res.send({ errors: err });
}).catch(console.error.bind(console));
});
// API para receber webhooks
app.post('/webhooks', function (req, res) {
const event = req.body.event;
const resource = req.body.resource;
// Ao receber um webhook o servidor transmite o conteúdo do webhook para o client através de websocket (socket.io)
io.sockets.emit('webhook', {
event: event,
paymentID: resource.payment.id,
paymentStatus: resource.payment.status,
events: resource.payment.events
});
res.send({ success: true });
});