如何使用Firebase和Python向手机号码发送短信?
使用Firebase + Python 实现短信发送的实操方案
前置说明
Firebase 本身没有提供通用的自定义业务短信发送能力,你可以根据实际使用场景选择以下两种适配方案:
方案1:触发Firebase Auth 手机号验证短信
该方案仅适用于用户手机号归属验证场景,短信内容为Firebase固定验证模板,无法自定义内容。
操作步骤
- 首先安装Firebase Admin Python SDK:
pip install firebase-admin - 前往Firebase控制台「项目设置」-「服务账号」页面,下载服务账号密钥JSON文件
- 编写调用代码示例:
import firebase_admin from firebase_admin import credentials from firebase_admin import auth # 初始化Firebase服务 cred = credentials.Certificate("你下载的服务账号密钥文件路径.json") firebase_admin.initialize_app(cred) # 触发验证短信发送 phone_number = "+8613xxxxxxxxx" # 手机号必须携带对应国家/地区的国际区号 verify_link = auth.generate_sign_in_with_phone_number_link( phone_number, "https://你的项目验证完成后跳转地址" )
注意:该方案发送的短信模板由Firebase统一规定,仅可修改验证链接域名,无法调整短信正文内容
方案2:结合Firebase Cloud Functions 实现自定义短信发送
如果需要发送自定义内容的业务短信(比如通知、验证码、营销短信等),可以通过Firebase Cloud Functions对接第三方短信服务商的API实现,Python环境适配步骤如下:
操作步骤
- 进入Firebase控制台开通Cloud Functions服务,运行环境选择Python 3.10/3.11版本
- 在Cloud Functions的依赖配置文件
requirements.txt中添加你选用的短信服务商Python SDK依赖 - 编写云函数逻辑,支持HTTP触发、Firestore数据变动触发、定时触发等多种触发方式,示例代码如下(以国内腾讯云短信为例):
import tencentcloud.sms.v20210111.models as sms_models from tencentcloud.sms.v20210111.sms_client import SmsClient from tencentcloud.common.credential import Credential def send_sms(request): # 解析传入的请求参数 req_params = request.get_json() target_phone = req_params.get("phone") template_params = req_params.get("template_params") # 初始化短信客户端(密钥等敏感信息建议放在Cloud Functions的环境变量中,不要硬编码) sms_cred = Credential("你的第三方短信服务商SecretId", "你的第三方短信服务商SecretKey") sms_client = SmsClient(sms_cred, "服务商对应地区节点编码") # 构造短信发送请求 req = sms_models.SendSmsRequest() req.SmsSdkAppId = "你申请的短信应用ID" req.SignName = "你提前审核通过的短信签名" req.TemplateId = "你提前审核通过的短信模板ID" req.PhoneNumberSet = [target_phone] req.TemplateParamSet = template_params # 执行发送 resp = sms_client.SendSms(req) return {"status": "success", "response": resp.to_json_string()}
- 云函数部署完成后,你可以在本地Python项目中通过调用云函数的HTTP触发地址,即可实现自定义短信发送
通用注意事项
- 所有短信发送操作必须符合当地通信管理法规要求,短信签名和模板需要提前提交服务商审核通过后才可使用
- 所有涉及到的服务密钥、敏感配置不要写在客户端代码中,统一放在服务端/云侧的环境变量中存储
- 发送手机号必须携带国际区号,否则接口会直接报错
内容的提问来源于stack exchange,提问作者Rajesh Raskoti
相关产品推荐
相关产品推荐

