游客发表
我上周半夜被线上告警吵醒,阿里用户注册验证码发不出去,短信排查半天发现是教程AccessKey的签名算法写错了。这活儿看着简单,阿里坑却不少。短信今天直接讲怎么把短信发出去,教程从零到通。阿里
你得先有个阿里云账号,短信这步省不了。教程登录控制台,阿里搜索“短信服务”,短信没开通就按提示开通。教程接着在“快速学习”里看下文档,阿里但别指望文档能救命——它写得像天书,短信关键参数藏在示例代码里。教程
第一步,申请签名和模板。签名是“【你的公司名】”这种,模板是“您的验证码是${ code},5分钟内有效”。这里有个坑:签名和模板都要审核,一般2小时到一天。我试过周五下午提交,结果下周一才通过,急得直跺脚。所以提前申请,别等上线前才搞。
第二步,搞AccessKey。在右上角头像下“AccessKey管理”里创建,记得只给短信权限,别用主账号的。我见过有人把主账号Key写进前端代码,结果被刷了几千块短信费。子账号权限设成“AliyunDysmsFullAccess”就够了。
第三步,写代码。官方SDK支持Java、Python、Node.js等,直接pip或npm装。核心就三步:初始化客户端、构造请求、发出去。以Python为例:
from aliyunsdkcore.client import AcsClient from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest client = AcsClient('你的AccessKeyId', '你的AccessKeySecret', 'cn-hangzhou') request = SendSmsRequest.SendSmsRequest() request.set_PhoneNumbers('13800138000') request.set_SignName('你的签名') request.set_TemplateCode('SMS_123456789') request.set_TemplateParam('{ "code":"1234"}') response = client.do_action_with_exception(request) print(response.decode('utf-8')) 这段代码能跑通的前提是签名和模板都审核过了。返回的JSON里有个“Code”字段,如果是“OK”就成功,其他都是错误码。
但光能发成功不算完。你注意看,短信内容里的“${ code}”必须和TemplateParam里的键完全对应,少个字母就报“TEMPLATE_PARAM_ILLEGAL”。我那次半夜告警就是模板参数写成了“{ code:1234}”,冒号写错了——JSON里键必须双引号。
发完短信,你得验证状态。异步的,发送接口只代表提交成功,真正送达要看“QuerySendDetails”接口。我习惯轮询:发送后等2秒查一次,查不到再等5秒。别傻等,超过10秒还没结果,大概率是手机号有问题或运营商拦截。
最后说个真实案例。有次活动促销,我们一次性发了5万条,结果半小时后一堆用户投诉收不到。查日志发现是同一时间并发太高,触发阿里云限流。解决办法是加“短信批量发送”接口,或者把请求分散到每秒100条以内。而且,短信内容里带“优惠”、“免费”这类词容易被运营商过滤,审核模板时就得避开。
总结就一句话:签名模板提前审,Key权限给最小,参数格式别写错,发送频率控住。剩下就是调通了,真不难。要是你卡在哪一步,直接看返回的ErrorCode,阿里云文档里每个错误码都有解释——虽然排版烂,但内容全。
友情链接