配置权限

短信服务需要当前阿里云账号为企业认证

1. 创建RAM用户

  1. 使用阿里云的主账号,进入https://ram.console.aliyun.com/users/create创建RAM用户
  2. 然后登录这个RAM用户,进入https://ram.console.aliyun.com/profile/access-keys网址,创建AccessKey
  3. 进入短信服务的控制台:https://dysms.console.aliyun.com/domestic/text/qualification,以此完成:
    • 资质管理(验证)
    • 签名管理
    • 模板管理

2. 配置测试用户

在没有审核通过前,只能够给测试用户发送短信,进入网页https://dysms.console.aliyun.com/quickstart,即可配置测试用户

在这里插入图片描述

示例代码

首先安装依赖:

pip install alibabacloud_dysmsapi20170525
import os
import random
import json
from alibabacloud_dysmsapi20170525.client import Client as DysmsapiClient
from alibabacloud_dysmsapi20170525 import models as dysmsapi_models
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
from dotenv import load_dotenv

load_dotenv() # 本地新建一个.env的文件,把下面的配置写进去


class SmsService:
    """阿里云短信服务类"""

    def __init__(self):
        self.access_key_id = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
        self.access_key_secret = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
        self.sign_name = "我的签名"  # 控制台审核通过的签名
        self.template_code = "SMS_xxxx"  # 控制台审核通过的模板CODE
        self.endpoint = "dysmsapi.aliyuncs.com"

        # 初始化客户端
        self._client = self._create_client()

    def _create_client(self):
        """创建短信客户端"""
        config = open_api_models.Config(
            access_key_id=self.access_key_id,
            access_key_secret=self.access_key_secret
        )
        config.endpoint = self.endpoint
        return DysmsapiClient(config)

    def send_verify_code(self, phone_number: str, code: str = None) -> dict:
        """
        发送验证码短信

        Args:
            phone_number: 接收手机号
            code: 验证码,如果不传则自动生成

        Returns:
            发送结果字典
        """
        # 如果没有传入验证码,自动生成
        if code is None:
            code = ''.join([str(random.randint(0, 9)) for _ in range(6)])  # 生成随机验证码

        # 构建模板参数
        template_param = json.dumps({"code": code})

        # 构建请求
        request = dysmsapi_models.SendSmsRequest(
            phone_numbers=phone_number,
            sign_name=self.sign_name,
            template_code=self.template_code,
            template_param=template_param
        )

        try:
            # 发送短信
            response = self._client.send_sms_with_options(request, util_models.RuntimeOptions())
            body = response.body

            # 解析响应
            result = {
                "success": body.code == "OK",
                "code": body.code,
                "message": body.message,
                "request_id": body.request_id,
                "biz_id": body.biz_id,
                "verify_code": code if body.code == "OK" else None
            }

            return result

        except Exception as e:
            return {
                "success": False,
                "code": "Error",
                "message": str(e),
                "verify_code": None
            }


# ========== 使用示例 ==========
if __name__ == "__main__":
    # 创建服务实例
    sms = SmsService()
    result = sms.send_verify_code("xxxxxx")

直接运行即可发送短信

更多推荐