代码之家  ›  专栏  ›  技术社区  ›  pomoworko.com

如何在Node.js中使用Axios解决PayPal Webhook 401未经授权的错误?

  •  0
  • pomoworko.com  · 技术社区  · 1 年前

    我正在使用Axios将PayPal webhook集成到我的Node.js应用程序中,但在触发webhook时遇到了401未经授权的错误。以下是我收到的错误:

    Error data: {
      name: 'UNAUTHORIZED',
      message: 'Authorization failed due to insufficient permissions.',
      debug_id: 'b02145e0fae22',
      details: [
        {
          issue: 'PERMISSION_DENIED',
          description: 'You do not have permission to access or perform operations on this resource.'
        }
      ]
    }
    Error status: 401
    Error headers: Object [AxiosHeaders] {
      // headers omitted for brevity
    }
    

    以下是我处理webhook事件的服务器端代码的简化版本。这个片段的重点是验证webhook签名和处理事件。

    require('dotenv').config();
    const express = require('express');
    const axios = require('axios');
    
    const paypalRouter = express.Router();
    
    paypalRouter.post("/subscriptions/webhook", async (req, res) => {
      console.log("Received headers:", req.headers);
      const verification = {
        auth_algo: req.headers['paypal-auth-algo'], 
        cert_url: req.headers['paypal-cert-url'], 
        transmission_id: req.headers['paypal-transmission-id'],
        transmission_sig: req.headers['paypal-transmission-sig'],
        transmission_time: req.headers['paypal-transmission-time'], 
        webhook_id: process.env.WEBHOOK_ID,
        webhook_event: req.body,
      };
    
      const params = new URLSearchParams();
      params.append("grant_type", "client_credentials");
      const authResponse = await axios.post("https://api-m.sandbox.paypal.com/v1/oauth2/token", params, {
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        },
        auth: {
          username: process.env.PAYPAL_CLIENT_ID,
          password: process.env.PAYPAL_SECRET,
        },
      });
    
      const access_token = authResponse.data.access_token;
      const verifyResponse = await axios.post("https://api-m.sandbox.paypal.com/v1/notifications/verify-webhook-signature", verification, {
        headers: {
          'Content-Type': 'application/json',
          Authorization: `Bearer ${access_token}`
        },
      });
    
      if (verifyResponse.data.verification_status === "SUCCESS") {
        console.log("Webhook verified");
        // more code 
     } else {
        console.error("Webhook verification failed:", verifyResponse.data);
        return res.status(401).send('Webhook signature verification failed');
      }
    });
    
    module.exports = paypalRouter;
    

    我需要帮助的是:

    1. 理解为什么尽管身份验证和权限设置看似正确,但401错误仍会发生。

    2. 如何确保我与PayPal的webhook验证步骤正确实施。

    我已经尝试查看PayPal的官方文档,并确保所有权限和API凭据都得到了正确配置。错误仍然存在,我不确定如何进一步调试。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Edwin Macharia    1 年前

    当你缺少一个HEADERS时,通常会发生这种情况。要解决这个问题,你需要从POSTMAN到达同一个端点,并将所有HEADERS传递到你的节点代码上。