簡體   English   中英

如何解決 Nexmo Vonage SDK 中的“系統:錯誤:無效令牌”在同一帳戶中更改為新應用程序

[英]How to resolve 'system:error:invalid-token' In Nexmo Vonage SDK changing to a new app in the same account

我在服務器上使用"@vonage/server-sdk": "2.10.7-beta-2" package 在 Vonage 中創建用戶。 為了創建用戶,我使用了這個 API

const Vonage = require('@vonage/server-sdk');

const v = new Vonage({
 apiKey: config.voipConfig.key,
 apiSecret: config.voipConfig.secret,
 applicationId: config.voipConfig.appId,
 privateKey: config.voipConfig.privateKeyPath
};

v.users.create({
 "name": payload.username,
 "display_name": payload.displayName
}, (error: any, result: any) => {
});

一切正常。 但是當我在 vonage 帳戶中創建一個新應用程序並使用新配置時,它開始拋出以下錯誤

{
      description: 'You did not provide a valid token. Please provide a valid token.',
      code: 'system:error:invalid-token'
    }

我已經檢查了很多次細節,不知道出了什么問題。 新憑據來自全新帳戶。

任何幫助將非常感激。

看起來您正在使用 Vonage Conversations API創建用戶。 在良好的實踐中,我們通常使用dotenv來存儲我們的.env變量

npm install dotenv

// .env
API_KEY=
API_SECRET=
APPLICATION_ID=
APPLICATION_PRIVATE_KEY_PATH=
TO_NUMBER=<YOUR CELL NUMBER>
VIRTUAL_NUMBER=<VONAGE VIRTUAL NUMBER>
NGROK_URL=https://<URL>.ngrok.io

用於測試目的。 您可以使用下面的代碼段撥打電話嗎? 這將測試您的憑據。

確保將private.key存儲在與.envoutbound-call.js相同的目錄中

// outbound-call.js 
require("dotenv").config();
const API_KEY = process.env.API_KEY;
const API_SECRET = process.env.API_SECRET;
const APPLICATION_ID = process.env.APPLICATION_ID;
const APPLICATION_PRIVATE_KEY_PATH = process.env.APPLICATION_PRIVATE_KEY_PATH;
const TO_NUMBER = process.env.TO_NUMBER;
const VIRTUAL_NUMBER = process.env.VIRTUAL_NUMBER;
if (!API_KEY || !API_SECRET) {
  console.log("🔥 API_KEY or API_SECRET missing");
  process.exit(1);
}
if (!APPLICATION_ID || !APPLICATION_PRIVATE_KEY_PATH) {
  console.log("🔥 APPLICATION_ID or APPLICATION_PRIVATE_KEY_PATH missing");
  process.exit(1);
}
if (!TO_NUMBER || !VIRTUAL_NUMBER) {
  console.log("🔥 TO_NUMBER or VIRTUAL_NUMBER missing");
  process.exit(1);
}
const Vonage = require("@vonage/server-sdk");
const vonage = new Vonage({
  apiKey: API_KEY,
  apiSecret: API_SECRET,
  applicationId: APPLICATION_ID,
  privateKey: APPLICATION_PRIVATE_KEY_PATH,
});

vonage.calls.create({
  to: [
    {
      type: "phone",
      number: process.env.TO_NUMBER,
    },
  ],
  from: {
    type: "phone",
    number: process.env.VIRTUAL_NUMBER,
  },
  ncco: [
    {
      action: "talk",
      text: "This is a text to speech call from Vonage",
    },
  ],
});

您可能需要在 Vonage 應用中啟用語音功能。 不用擔心 webhook,因為您只是打了一個呼出電話。

使用對話 API 時,我通常會這樣做:

  1. 創建對話
  2. 創建用戶
  3. 創建會員

並將其放入/webhooks/answer

//server.js
require('dotenv').config();
let express = require('express');
let cookieParser = require('cookie-parser');
let logger = require('morgan');
let app = express();
let port = 5001;
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static('public'));

const NGROK_URL = process.env.NGROK_URL;

const Vonage = require('@vonage/server-sdk');
const vonage = new Vonage({
  apiKey: process.env.API_KEY,
  apiSecret: process.env.API_SECRET,
  applicationId: process.env.APPLICATION_ID,
  privateKey: process.env.APPLICATION_PRIVATE_KEY_PATH
});

app.post('/webhooks/answer', async (req, res) => {
  console.log('🚚  answer', req.body);
  let result = req.body;

  const createCallConversationPromise = (ConvName, ConvDisplayName) => new Promise((resolve, reject) => {
    vonage.conversations.create({
        "name": ConvName,
        "display_name": ConvDisplayName,
    }, (error, result) => error ? reject(error) : resolve(result));
  });

  const createCallUserPromise = (Name, DisplayName) => new Promise((resolve, reject) => {
    vonage.users.create({
        name: Name,
        display_name: DisplayName,
    }, (error, result) => error ? reject(error) : resolve(result));
  });

  const createCallMemberPromise = (ConvId, UserId) => {
    vonage.conversations.members.create(ConvId, {
      "action": "join", 
      "user_id": UserId, 
      "channel": {
        "type": "app"
      } 
    }, (error, result) => {
      if(error) {
        console.log('\n🔥 Error Creating Member', error);
      }
      else {
        console.log('\n✅ Created Member with ConvId', ConvId, 'and UserId',UserId)
        console.log(result);
    }
    })
  };

  try {
    let ConvName = result.from + result.to + result.conversation_uuid;
    console.log('n✅ ConvName', ConvName);
    let ConvDisplayName = result.from + result.to + result.conversation_uuid;
    const conversation = await createCallConversationPromise(ConvName, ConvDisplayName);
    process.env.CONVERSATION_ID = conversation.id;
    console.log('\n✅ CONVERSATION_ID', process.env.CONVERSATION_ID);

    let Name = result.from + result.conversation_uuid;
    let DisplayName = result.from;
    const callUser = await createCallUserPromise(Name, DisplayName);
    console.log('\n✅ UserId', callUser.id)

    let ConvId = conversation.id;
    let UserId = callUser.id;
    const memberUser = await createCallMemberPromise(ConvId, UserId);

    let ncco = [
      {
          action: "talk",
          text: "<speak><lang xml:lang='en-GB'>Welcome to Vonage Development inbound call testing</lang></speak>",
          voiceName: "Emma"
      },
    ];
    res.json(ncco);
  
  } catch (error) {
    console.log("🔥 Error", error);
    let ncco = [
      {
          "action": "talk",
          "text": "<speak><lang xml:lang='en-GB'>Error on Process Answer</lang></speak>",
          "voiceName": "Emma"
      }
    ];
    res.json(ncco);
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM