I am using a NMI for payment Integration. I have created NMI API for adding custom subscription using this
documentations
I am using webhooks API endpoint to get those information and status of payment and subscriptions. where I am getting add and delete information of the subscription but I am not getting recurring auto payments information. I have subscribed daily bases so the recurring charges will be auto payments from the credit cards an I will get the Information using the NMI webhook API.I am not getting those recurring auto payments details. I am storing those information in my MongoDb. I don't know how to get the recurring auto payments details like payments success or declined or other status.
Note: I have already added daily recurring charges so I can get those payments responses but still I am not getting any auto payments. I am using NMI test
account
What I have tried:
My Webhook API :
router.post("/nmi", async (req, res) => {
try {
const signingKey = "MY SIGNING KEY";
const webhookBody = JSON.stringify(req.body);
const sigHeader = req.headers["webhook-signature"];
if (!sigHeader || sigHeader.length < 1) {
throw new Error("Invalid webhook - signature header missing");
}
const sigMatches = sigHeader.match(/t=(.*),s=(.*)/);
if (!sigMatches || sigMatches.length !== 3) {
throw new Error("Unrecognized webhook signature format");
}
const nonce = sigMatches[1];
const signature = sigMatches[2];
if (!webhookIsVerified(webhookBody, signingKey, nonce, signature)) {
throw new Error(
"Invalid webhook - invalid signature, cannot verify sender"
);
}
console.log("Webhook is verified");
const webhook = req.body;
if (webhook.event_type === "recurring.subscription.add") {
parsedWebhook.event_body.subscription_id})
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging added",
amount: webhook.event_body.plan.amount,
});
console.log("req.body is here : ", req.body);
await payment.save();
} else if (webhook.event_type === "recurring.subscription.update") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging subscription update",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "recurring.subscription.delete") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging subscription delete",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.auth.failure") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction auth failure",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.auth.success") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction auth success",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.auth.unknown") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction auth unknown",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.capture.success") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction capture success",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.capture.failure") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction capture failure",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.capture.unknown") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction capture unknown",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.credit.success") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction credit success",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.sale.success") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction sale success",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.void.success") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction void success",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.validate.success") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction validate success",
amount: webhook.event_body.plan.amount,
});
await payment.save();
} else if (webhook.event_type === "transaction.validate.failure") {
const payment = await AutoRecPayments.create({
nmisubscriptionId: webhook.event_body.subscription_id,
email: webhook.event_body.billing_address.email,
description: "Recurring charging transaction validate failure",
amount: webhook.event_body.plan.amount,
});
await payment.save();
}
res.status(200).send("Webhook processed successfully");
} catch (error) {
console.error("Error handling webhook:", error);
res.status(500).send("Error processing webhook");
}
});
here is custom subscription API :
router.post("/custom-add-subscription", async (req, res) => {
try {
const {
security_key,
recurring,
plan_payments,
plan_amount,
dayFrequency,
ccnumber,
ccexp,
first_name,
last_name,
address,
email,
} = req.body;
let postData = {
security_key: "MY SIGNING KEY",
recurring: "add_subscription",
plan_payments,
plan_amount,
day_frequency: dayFrequency ? dayFrequency : 30,
ccnumber,
ccexp,
first_name: first_name,
last_name: last_name,
address1: address,
email,
};
postData = querystring.stringify(postData);
var config = {
method: "post",
url: "https://secure.nmi.com/api/transact.php",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
data: postData,
};
axios(config)
.then(async (response) => {
const parsedResponse = querystring.parse(response.data);
console.log("ek ek krne", parsedResponse);
if (parsedResponse.response_code == 100) {
sendResponse(res, "Custom subscription added successfully.");
} else {
sendResponse(res, parsedResponse.responsetext, 403);
}
})
.catch(function (error) {
sendResponse(res, error, 500);
});
} catch (error) {
sendResponse(res, "Something went wrong!", 500);
}
});