Skip to content

Instantly share code, notes, and snippets.

@johnotu
Created December 7, 2018 17:49
Show Gist options
  • Save johnotu/f80219abed4490e9cabfa0ad9b5f1063 to your computer and use it in GitHub Desktop.
Save johnotu/f80219abed4490e9cabfa0ad9b5f1063 to your computer and use it in GitHub Desktop.
Payment for Messenger - Handle Bot Messages
/**
* Handle messages received by bot server
*
*/
'use strict';
// Assume you have these functions defined and exported in your project folder
const sendTextMessage = require('../actions/sendTextMsg');
const sendButtonMsg = require('../actions/sendButtonMsg');
const sendReceiptMessage = require('../actions/sendReceiptMsg');
const botApi = require('../utils/botApi');
const receivedMessage = (event, storeName, user, pageObj) => {
const senderID = event.sender.id;
const recipientID = event.recipient.id;
const timeOfMessage = event.timestamp;
const message = event.message;
console.log('Received message for user %d and page %d at %d with message:', senderID, recipientID, timeOfMessage);
const messageId = message.mid;
const quickReply = message.quick_reply;
if (quickReply) {
// Quick reply received
const payload = quickReply.payload;
console.log('Quick reply for message %s with payload %s', messageId, payload);
if (payload.split('***')[0] === 'orderQty') {
// Prepare order data for sending to db
const orderInfo = payload.split('***');
const qty = orderInfo[1]; const productId = orderInfo[2]; const productName = orderInfo[3]; const productPrice = orderInfo[4]; const productImage = orderInfo[5]; const productDesc = orderInfo[6];
const orderedProducts = [{
product_id: productId,
product_qty: qty,
product_name: productName,
product_price: productPrice,
product_image: productImage,
product_description: productDesc
}];
const orderOwner = {
'name': user.name,
'address': user.address,
'phone_number': user.phone_number,
'receipt_address': {
'street_1': user.address,
'city': user.city,
'postal_code': user.postal_code,
'state': user.state,
'country': user.country_code
}
};
const orderTotal = orderedProducts.reduce((total, product) => {
return total + (parseInt(product.product_price) * parseInt(product.product_qty));
}, 0);
const orderNumber = botApi.getOrderNumber();
const orderData = {
'order_number': orderNumber,
'order_items': orderedProducts,
'order_total': orderTotal,
'order_owner': orderOwner,
'order_status': 'Pending'
};
botApi.postOrder(storeName, orderData, (err, resp, body) => {
if (!err && resp.statusCode === 200) {
const submittedOrder = JSON.parse(body).order;
const msg = `Thank you ${user.first_name}, your order #${submittedOrder.orderNumber} has been received. Please find your invoice attached below.`;
sendTextMessage({
recipientId: senderID,
messageText: msg,
page_token: pageObj.page_token,
callback: () => {
// Send user a receipt
sendReceiptMessage(senderID, submittedOrder, pageObj.page_token, () => {
// Send payment options to user
const buttonMsg = {
attachment: {
type: 'template',
payload: {
template_type: 'button',
text: 'How would you like to pay for your order?',
buttons: [{
type: 'postback',
payload: `pay_mobilemoney_${submittedOrder.order_number}_${submittedOrder.order_total}_${submittedOrder.order_owner.phone_number}`,
title: 'Mobile Money (Ghana)'
},
{
type: 'web_url',
url: `${process.env.SERVER_URL}payment?store_name=${storeName}&user_id=${senderID}&mm_number=${submittedOrder.order_owner.phone_number}&page_name=${pageObj.page_name}&page_id=${pageObj.page_id}&order_number=${submittedOrder.order_number}&order_total=${submittedOrder.order_total}&order_id=${submittedOrder.order._id}`,
title: 'Card',
webview_height_ratio: 'compact',
messenger_extensions: true
},
{
type: 'postback',
payload: `pay_cashondelivery_${submittedOrder.order_number}_${submittedOrder.order_total}_${submittedOrder.order_owner.phone_number}`,
title: 'Cash on delivery'
}]
}
}
};
sendButtonMsg(senderID, buttonMsg, pageObj.page_token);
});
}
});
} else {
// You should handle errors here
}
});
}
}
};
module.exports = receivedMessage;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment