Tự tạo server gửi SMS free online với Node.js + Express

7
Dịch vụ dạy kèm gia sư lập trình

Bạn đã từng thử gửi code gửi tin nhắn sms online miễn phí từ một dịch vụ web chưa? Ngày trước, hồi mà các dịch vụ OTT chưa phổ biến như bây giờ, mình cũng thi thoảng sử dụng dịch vụ gửi tin nhắn miễn phí mỗi khi hết “xiền”.

Giờ SMS không còn là phương tiện liên lạc chính như xưa, nhưng nó vẫn có một chỗ đứng vứng chắc trong thời buổi hiện đại ngày nay. SMS được dùng để xác thực tài khoản, dùng làm một lớp bảo mật tài khoản ngân hàng, email, Facebook…

Có rất nhiều ứng dụng thực tế vẫn sử dụng SMS như một phương tiện liên lạc, quảng bá cho dịch vụ của họ. Nếu bạn có ý tưởng, mọi điều không thể đều có thể.

Hôm nay, mình sẽ hướng dẫn các bạn tự xây dựng một server để gửi SMS API online, công cụ chính là Node.js và Express.

Chúng ta bắt đầu nhé gửi sms bằng Nodejs nhé!

gửi sms api miễn phí với Node.js

Yêu cầu chuẩn bị

Để thực hiện bài viết, bạn cần chuẩn bị trước những yêu cầu sau:

  • Một tài khoản Nexmo.
  • js đã được cài đặt trong máy tính (Xem hướng dẫn cài đặt Node.js)
  • ngrok: công cụ để có thể truy cập code trên máy tính của bạn từ bên ngoài internet.
  • Cuối cùng là Nexmo CLI: $ npm install -g nexmo-cli

Sau khi môi trường phát triển đã sẵn sàng thì chúng ta tiến hành viết code thôi.

Sử dụng SMS API để gửi SMS online

Nexmo là dịch vụ cung cấp rất nhiều API hay ho như: SMS API, Voice API, Facebook Message API… Ở bài viết này, để gửi tin nhắn SMS thì tất nhiên chúng ta sẽ sử dụng SMS API.

#Cài đặt dependencies cần thiết

Đầu tiên, chúng ta cần phải cài đặt thư viện mã Nexmo cung cấp bằng NPM. Cách cài đặt Nexmo cũng như bao thư viện khác thôi.

$ npm install nexmo

Sau đó, tạo một file index.js

$touch index.js

Chúng ta cần khởi tạo thư viện Nexmo mà chúng ta vừa cài trước đó. Trong file index.js, bạn thêm đoạn code sau:

const Nexmo = require('nexmo')

const nexmo = new Nexmo({
  apiKey: NEXMO_API_KEY,
  apiSecret: NEXMO_API_SECRET
})
Lưu ý: Bạn cần phải thay thế apiKey và apiSecret của bạn. Để lấy 2 loại key này, Bạn có thể thấy trong trang “Getting Started” trong Nexmo Dashboard

#Gửi tin nhắn SMS bằng SMS API

Thư viện Nexmo có API để gửi tin nhắn SMS, đó là: nexmo.message.sendSms

API này 4 tham số: số điện thoại from, số điện tới, nội dung tin nhắn và cấu hình tin nhắn.

Dữ liệu trả về của API là một mảng các tin nhắn đã được gửi kèm trạng thái (gửi thành công hay lỗi). Mỗi phần tử trong mảng trả về sẽ là một block tin nhắn 160 ký tự. Tức là:

  • Nếu bạn gửi tin nhắn với nội dung ngắn, nhỏ hơn 160 ký tự thì mảng trả về chỉ có 1 phần tử.
  • Còn nếu tin nhắn dài, phải chia thành nhiều block 160 ký tự thì mảng trả về sẽ tương ứng từng ấy phần tử.
let text = "Hello from Nexmo";

nexmo.message.sendSms("Nexmo", "TO_NUMBER", text, {
  type: "unicode"
}, (err, responseData) => {
  if (err) {
    console.log(err);
  } else {
    if (responseData.messages[0]['status'] === "0") {
      console.log("Message sent successfully.");
    } else {
      console.log(`Message failed with error: ${responseData.messages[0]['error-text']}`);
    }
  }
})

Nếu nhà mạnh hỗ trợ alphanumeric sender ID, thì trường from có thể text, thay vì số điện thoại. Ở Việt Nam thì hầu hết các nhà mạng đều hỗ trợ, bạn để ý thi thoảng có các tin nhắn quảng cáo từ ngân hàng mà chỉ hiển thị tên ngân hàng mà không hiển thị số người gửi không?

Phần tiếp theo, mình sẽ chỉnh sửa lại chút và  tạo rest API để dùng khi gửi tin nhắn từ ứng dụng.

Và đây là toàn bộ mã nguồn file index.js

const express = require('express')
const app = express()

// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

app.post("/sendsms", function(req, res) {
    let fromPhone = req.body.fromPhone;
    let toPhone = req.body.toPhone;
    let content = req.body.content;
    sendSMS(fromPhone, toPhone, content, function(responseData){
        console.log(responseData);
    });
})

/**
 * Author: VNTALKING.COM
 * send SMS use Nexmo SMS Api.
 * @param {*} fromPhone the phone number which send sms
 * @param {*} toPhone the phone number which receive sms
 * @param {*} content the body of message sms
 * @param {*} callback after send sms
 */
function sendSMS(fromPhone, toPhone, content, callback){
    nexmo.message.sendSms(fromPhone, toPhone, content, {
        type: "unicode"
      }, (err, responseData) => {
        if (err) {
          console.log(err);
        } else {
          if (responseData.messages[0]['status'] === "0") {
            callback("Message sent successfully.")
          } else {
            callback(`Message failed with error: ${responseData.messages[0]['error-text']}`);
          }
        }
      })
}

Bạn chạy thử server bằng lệnh: $ node index.js

Giờ bạn có thể sử dụng Postman để tạo thử một POST request tới server của bạn và hưởng thụ thành quả.

Hy vọng qua cách sử dụng SMS API bạn có thể lập trình gửi tin nhắn sms free nhanh chóng!

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trước5 kiến thức cần học để trở thành full stack developer
Bài tiếp theo[Dự đoán] 3 xu hướng phát triển ứng dụng mobile HOT nhất 2023
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

7
Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Mới nhất Cũ nhất Nhiều voted nhất
Thông báo
Xuan Canh
Guest
Xuan Canh

Chào bạn. Mình có 1 thắc mắc là trên Nexmo có tính phí gửi tin nhắn mà. Phí gửi tới số điện thoại ở VN là 0.05Euro/message.
https://dashboard.nexmo.com/pricing

Duy Do
Guest
Duy Do

Chạy node index.js báo lỗi: Message failed with error: Non White-listed Destination – rejected
Làm sao để sửa vậy admin

Duy Do
Guest
Duy Do

Cái hình dưới câu : “Còn nếu tin nhắn dài, phải chia thành nhiều block 160 ký tự thì mảng trả về sẽ tương ứng từng ấy phần tử.” thì để trong đâu vậy ad