You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue中调用Rails封装的Twilio服务实现手机号校验

功能实现步骤

后端Rails侧调整

1. 完善Twilio服务类

你现有代码只实现了发送短信的逻辑,需要新增手机号校验方法,可直接调用Twilio官方Lookup API完成有效性校验,同时修复原有环境变量的非法命名问题:

# service/twilio.rb
class TwilioService
  # 新增手机号有效性校验方法
  def validate_number(number)
    account_sid = ENV['TWILIO_ACCOUNT_SID']
    auth_token = ENV['TWILIO_AUTH_TOKEN']
    @client = Twilio::REST::Client.new(account_sid, auth_token)
    begin
      # 调用Lookup API校验号码格式、是否真实存在
      response = @client.lookups.v1.phone_numbers(number).fetch
      { valid: true, formatted_number: response.phone_number, error: nil }
    rescue Twilio::REST::RestError => e
      { valid: false, error: e.message }
    end
  end

  # 原有发短信方法,修复ENV变量名(TWILIO+NUMBER为非法命名,建议改为TWILIO_FROM_NUMBER)
  def send_sms(number, message)
    account_sid = ENV['TWILIO_ACCOUNT_SID']
    auth_token = ENV['TWILIO_AUTH_TOKEN']
    @client = Twilio::REST::Client.new(account_sid, auth_token)
    @client.messages.create(
      body: message,
      from: ENV['TWILIO_FROM_NUMBER'],
      to: number
    )
  end
end

2. 新增校验接口

先配置路由,config/routes.rb中添加:

post '/api/verify_phone', to: 'phones#verify'

新增对应控制器处理请求:

# app/controllers/phones_controller.rb
class PhonesController < ApplicationController
  # 生产环境建议保留csrf校验,请求头携带X-CSRF-Token即可,这里仅作示例简化
  skip_before_action :verify_authenticity_token
  def verify
    result = TwilioService.new.validate_number(params[:phone_number])
    render json: result
  end
end

前端Vue侧调整

补全点击事件、错误提示逻辑,同时修复原有v-for的语法错误:

<template>
<div>
  <!-- 错误提示区域 -->
  <p v-if="errorMsg" style="color: red;">{{ errorMsg }}</p>
  <ul>
    <li v-for="number in phoneNumbers" :key="number">
      {{ number }}
      <a @click.prevent="verifyNumber(number)" href="javascript:;">
        verify number
      </a>
    </li>
  </ul>
</div>
</template>

<script>
export default {
  data() {
    return {
      phoneNumbers: [], // 替换为你的原有号码数组
      errorMsg: ''
    }
  },
  methods: {
    async verifyNumber(number) {
      this.errorMsg = ''
      try {
        const res = await fetch('/api/verify_phone', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({ phone_number: number })
        })
        const result = await res.json()
        if (result.valid) {
          // 校验通过,此处编写后续业务逻辑
          alert('手机号校验通过')
        } else {
          this.errorMsg = `校验失败:${result.error}`
        }
      } catch (e) {
        this.errorMsg = '网络异常,请稍后重试'
      }
    }
  }
}
</script>

补充说明

  • 如果需要校验手机号归属权而非仅格式有效性,建议改用Twilio验证码发送+回填校验的流程,准确率更高
  • 生产环境不要关闭CSRF校验,可在Vue请求头中携带页面meta标签内的CSRF Token即可

内容的提问来源于stack exchange,提问作者waqar ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:07