短信验证码,作为用户注册、登录、找回密码、支付确认等环节的安全基石,几乎是每个网站、App和小程序的标配功能。然而,对于广大充满创意和激情的个人开发者来说,接入短信验证码服务当前成了一道难以逾越的“高墙”。

1、资质认证难: 当前运营商政策收紧,要求企业必须提供企业营业执照等资质完成认证和签名实名报备。许多个人开发者在第一步就被卡住。

2、签名模板审: 即使找到服务商,签名申请和模板审核流程需花费一定时间,对于追求敏捷开发的个人项目来说不够高效。

3、老用户危机: 部分早期接入的老用户,也可能因政策变化或资质问题,面临短信发送失败率高的风险,直接影响用户体验和业务运行。

下面给大家分享一个如何通过【阿里云-短信认证】产品实现个人开发者接入短信验证码,实现个人 App/小程序/应用的用户登录、认证的实践过程。

一、为什么选短信认证

二、接入步骤

1、准备工作

注册阿里云账号,完成实名认证,前往【号码认证服务】,开通服务。

短信认证服务仅可使用API对接,还需要创建AccessKey 用于调用API。

2、发送验证码

通过API指定目标手机号、选择签名、选择模板、并为模板中的每个变量提供具体值,以触发验证码短信的发送。

API参考:https://help.aliyun.com/zh/pnvs/developer-reference/api-dypnsapi-2017-05-25-sendsmsverifycode?spm=a2c4g.11186623.0.0.77632dbaJ0LCqX

3、核验验证码

通过API核验手机号和验证码是否成功通过校验,包括手机号是否和验证码匹配、验证码是否在有效期内等。

API参考:https://help.aliyun.com/zh/pnvs/developer-reference/api-dypnsapi-2017-05-25-checksmsverifycode?spm=a2c4g.11186623.0.0.77631ddch5UiVI

三、代码示例

发送验证码示例

# -*- 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:不能。短信认证服务仅支持验证码、通知类短信,不支持营销推广。

Q:预置签名“阿里云”可以改成自己的吗?

A:不可以。个人开发者暂不支持自定义签名,需使用平台预置签名。

Q:验证码有效期能自定义吗?

A:可以。通过 `ExpireTime` 参数设置(单位:秒),默认 300 秒(5 分钟)。

产品详情页:https://www.aliyun.com/product/cloudcomm/dypns?spm=5176.30386390.J_luIH9o9zuvnZshGf1rpsR.4.ca766682JSX5tsc

产品文档:https://help.aliyun.com/zh/pnvs/user-guide/sms-authentication-service?spm=a2c4g.11186623.help-menu-75010.d_2_0.153a5fb4KsJe0X&scm=20140722.H_2787128._.OR_help-T_cn~zh-V_1

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐