个人开发者如何接入短信验证码服务

本文详细介绍个人开发者如何通过阿里云「短信认证」服务,在无需企业营业执照的情况下,快速接入短信验证码功能。涵盖开通流程、API 调用方法、预置资源使用及安全建议,适用于 Web、App、H5 等多端场景。

一、个人开发者接入阿里云短信验证码服务

说明

适用场景:个人开发者在无企业资质情况下,需为 Web 应用、App 或小程序实现用户注册、登录、密码找回等环节的短信验证码功能。

阿里云「短信认证」服务支持个人实名认证用户直接调用 API 发送和校验短信验证码,无需申请资质、签名和模板。系统提供预置签名与标准验证码模板,简化接入流程,适用于敏捷开发和个人项目。

了解短信认证服务与短信验证码的区别:

image.png

二、接入步骤

前提条件

  1. 拥有阿里云账号,且已完成个人实名认证

  2. 已在号码认证服务控制台开通 短信认证 功能。

    image

  3. 已创建用于API调用的AccessKey IDAccessKey Secret(推荐使用 RAM 用户的 AccessKey)。请参见:创建AccessKey

服务特点

  • 免资质:无需企业营业执照、无需申请签名或模板。

  • 预置资源:平台提供多个可选的系统签名和标准验证码模板。

  • 多端兼容:支持 App、Web、H5、小程序等所有平台调用。

  • 失败不计费:发送失败不产生费用。

接入流程

image

操作步骤详情可见:短信认证服务新手指引

三、代码示例

Python代码为例,更多语言及参数说明请参考:SendSmsVerifyCodeCheckSmsVerifyCode

发送验证码

# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import sys

from typing import List

from alibabacloud_dypnsapi20170525.client import Client as Dypnsapi20170525Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dypnsapi20170525 import models as dypnsapi_20170525_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


def create_client(
    access_key_id: str,
    access_key_secret: str,
) -> Dypnsapi20170525Client:
    """
    使用AK&SK初始化账号Client
    @param access_key_id:
    @param access_key_secret:
    @return: Client
    @throws Exception
    """
    config = open_api_models.Config(
        # 必填,您的 AccessKey ID,
        access_key_id=access_key_id,
        # 必填,您的 AccessKey Secret,
        access_key_secret=access_key_secret
    )
    # 访问的域名,请参考 https://api.aliyun.com/product/Dypnsapi
    config.endpoint = f'dypnsapi.aliyuncs.com'
    return Dypnsapi20170525Client(config)


def main(
    args: List[str],
) -> None:
    # 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考。
    # 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
    client = create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
    send_sms_verify_code_request = dypnsapi_20170525_models.SendSmsVerifyCodeRequest(
        phone_number='your_value',
        sign_name='your_value',
        template_code='your_value',
        scheme_name='your_value',
        template_param='your_value',
        country_code='your_value',
        sms_up_extend_code='your_value',
        out_id='your_value',
        interval=1,
        valid_time=1,
        return_verify_code=False,
        code_type=1,
        duplicate_check=False,
        early_warn=False
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        client.send_sms_verify_code_with_options(send_sms_verify_code_request, runtime)
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


async def main_async(
    args: List[str],
) -> None:
    # 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    client = create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
    send_sms_verify_code_request = dypnsapi_20170525_models.SendSmsVerifyCodeRequest(
        phone_number='your_value',
        sign_name='your_value',
        template_code='your_value',
        scheme_name='your_value',
        template_param='your_value',
        country_code='your_value',
        sms_up_extend_code='your_value',
        out_id='your_value',
        interval=1,
        valid_time=1,
        return_verify_code=False,
        code_type=1,
        duplicate_check=False,
        early_warn=False
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        await client.send_sms_verify_code_with_options_async(send_sms_verify_code_request, runtime)
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


if __name__ == '__main__':
    main(sys.argv[1:])

核验验证码

import os
import sys

from alibabacloud_dypnsapi20170525.client import Client as Dypnsapi20170525Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dypnsapi20170525 import models as dypnsapi_20170525_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


def create_client(
    access_key_id,
    access_key_secret,
):
    config = open_api_models.Config(
        # 必填,您的 AccessKey ID,
        access_key_id=access_key_id,
        # 必填,您的 AccessKey Secret,
        access_key_secret=access_key_secret
    )
    # 访问的域名
    config.endpoint = f'dypnsapi.aliyuncs.com'
    return Dypnsapi20170525Client(config)


def main(
    args,
):
    client = create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
    check_sms_verify_code_request = dypnsapi_20170525_models.CheckSmsVerifyCodeRequest(
        case_auth_policy=0,
        country_code='cn',
        out_id='your_out_id',
        phone_number='your_phone_number',
        verify_code='your_verify_code'
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        resp = client.check_sms_verify_code_with_options(check_sms_verify_code_request, runtime)
        print(resp)
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


async def main_async(
    args,
):
    client = create_client(os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'], os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'])
    check_sms_verify_code_request = dypnsapi_20170525_models.CheckSmsVerifyCodeRequest(
        case_auth_policy=0,
        country_code='cn',
        out_id='your_out_id',
        phone_number='your_phone_number',
        verify_code='your_verify_code'
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        resp = await client.check_sms_verify_code_with_options_async(check_sms_verify_code_request, runtime)
        print(resp)
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


if __name__ == '__main__':
    main(sys.argv[1:])

四、常见问题

Q:是否支持自定义验证码内容?

A:支持。可通过 Code 参数传入自定义 4–6 位数字验证码。但不建议自行生成,推荐由系统生成以保证随机性和安全性。

Q:能否用于海外手机号?

A:当前短信认证服务仅支持中国大陆手机号码(国家码 86)。

Q:如何查看发送记录和统计?

A:登录号码认证服务控制台,可查看指定时间段内的发送量、回填量、回填率等数据。