forked from fbsamples/whatsapp-business-jaspers-market
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
111 lines (92 loc) · 2.84 KB
/
app.js
File metadata and controls
111 lines (92 loc) · 2.84 KB
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
/**
* Copyright 2021-present, Facebook, Inc. All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
"use strict";
const crypto = require('crypto');
const { urlencoded, json } = require('body-parser');
require('dotenv').config();
const express = require('express');
const config = require('./services/config');
const Conversation = require('./services/conversation');
const Message = require('./services/message');
const app = express();
// Parse application/x-www-form-urlencoded
app.use(
urlencoded({
extended: true
})
);
// Parse application/json. Verify that callback came from Facebook
app.use(json({ verify: verifyRequestSignature }));
// Handle webhook verification handshake
app.get("/webhook", function (req, res) {
if (
req.query["hub.mode"] != "subscribe" ||
req.query["hub.verify_token"] != config.verifyToken
) {
res.sendStatus(403);
return;
}
res.send(req.query["hub.challenge"]);
});
// Handle incoming messages
app.post('/webhook', (req, res) => {
console.log(req.body);
if (req.body.object === "whatsapp_business_account") {
req.body.entry.forEach(entry => {
entry.changes.forEach(change => {
const value = change.value;
if (value) {
const senderPhoneNumberId = value.metadata.phone_number_id;
if (value.statuses) {
value.statuses.forEach(status => {
// Handle message status updates
Conversation.handleStatus(senderPhoneNumberId, status);
});
}
if (value.messages) {
value.messages.forEach(rawMessage => {
// Respond to message
Conversation.handleMessage(senderPhoneNumberId, rawMessage);
});
}
}
});
});
}
res.status(200).send('EVENT_RECEIVED');
});
// Default route for health check
app.get('/', (req, res) => {
res.json({
message: 'Jasper\'s Market Server is running',
endpoints: [
'POST /webhook - WhatsApp webhook endpoint'
]
});
});
// Check if all environment variables are set
config.checkEnvVariables();
// Verify that the callback came from Facebook.
function verifyRequestSignature(req, res, buf) {
let signature = req.headers["x-hub-signature-256"];
if (!signature) {
console.warn(`Couldn't find "x-hub-signature-256" in headers.`);
} else {
let elements = signature.split("=");
let signatureHash = elements[1];
let expectedHash = crypto
.createHmac("sha256", config.appSecret)
.update(buf)
.digest("hex");
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
}
}
var listener = app.listen(config.port, () => {
console.log(`The app is listening on port ${listener.address().port}`);
});