[ad_1]
我正在使用 NMI 进行支付集成。 我已经创建了 NMI API,用于使用此添加自定义订阅 文档
我正在使用 webhooks API 端点来获取这些信息以及付款和订阅的状态。 我在其中获取订阅的添加和删除信息,但没有获取定期自动付款信息。 我已订阅每日基础,因此经常性费用将通过信用卡自动付款,我将使用 NMI webhook API 获取信息。我没有获得这些经常性自动付款详细信息。 我将这些信息存储在我的 MongoDb 中。 我不知道如何获取定期自动付款详细信息,例如付款成功或拒绝或其他状态。
笔记:我已经添加了每日经常性费用,以便我可以获得这些付款响应,但我仍然没有收到任何自动付款。 我正在使用 NMI 测试 帐户
我尝试过的:
我的 Webhook API:
JavaScript
router.post("/nmi", async (req, res) => { try { const signingKey = "MY SIGNING KEY"; const webhookBody = JSON.stringify(req.body); // Assuming body is JSON 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" ); } // Webhook is now verified to have been sent by you, continue processing console.log("Webhook is verified"); const webhook = req.body; // Assuming JSON payload 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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, }); //Save payment details of the user in payment collection 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"); } });
这是自定义订阅API:
JavaScript
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) { // Handle successful subscription creation sendResponse(res, "Custom subscription added successfully."); } else { // Handle subscription creation failure sendResponse(res, parsedResponse.responsetext, 403); } }) .catch(function (error) { sendResponse(res, error, 500); }); } catch (error) { sendResponse(res, "Something went wrong!", 500); } });
解决方案1
由于您的问题是 NMI 系统特有的,因此您应该使用他们的帮助论坛。
[ad_2]
コメント