go 使用阿里云发送验证码

1. 注册阿里云账号,搜索短信服务进入,有"快速学习与测试"向导,跟着步骤做,得到模板code,并添加要绑定的测试号码.

2. 添加accessKeyId,accessKeySecret.

或者进入accessKey上面一项的访问控制,创建RAM用户赋予指定权限,使用RAM用户的AccessKey.

3. 在go项目中,执行命令,拉取阿里云的go sdk.

 go get github.com/aliyun/alibaba-cloud-sdk-go

4. 生成验证码

// RandomNumber 生成长度为 length 随机数字字符串
func RandomNumber(length int) string {
	table := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
	codeNum := make([]int, length)
	//Reader是一个全局、共享的密码用强随机数生成器。
	//从rand.Reader读取length位写入到bytes,n为实际写入字节数
	bytes := make([]byte, length)
	n, err := io.ReadAtLeast(rand.Reader, bytes, length)
	if n != length {
		panic(err)
	}
	sb := strings.Builder{}
	for i := 0; i < len(bytes); i++ {
		codeNum[i] = int(bytes[i])
		codeNum[i] = table[codeNum[i]%len(table)]
		sb.WriteString(strconv.Itoa(codeNum[i]))
	}
	return sb.String()
}

5. 发送短信

//phone 手机号码 code 生成的验证码
func SendMsg(phone string, code string) {
	// 配置 AccessKey
	accessKeyId := ""           //accessKeyId
	accessKeySecret := "" //accessKeySecret

	// 创建 SDK 客户端
	client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", accessKeyId, accessKeySecret)
	if err != nil {
		fmt.Println("创建客户端失败:", err)
		return
	}

	// 创建请求
	request := dysmsapi.CreateSendSmsRequest()
	request.Scheme = "https" // 使用 HTTPS 协议

	// 设置请求参数
	request.SignName = ""            //短信签名
	request.TemplateCode = "" //模板ID
	request.PhoneNumbers = phone //电话号码
	request.TemplateParam = "{code:" + code + "}" // 模板参数,根据模板内容填写

	// 发送短信
	response, err := client.SendSms(request)
	if err != nil {
		fmt.Println("发送短信失败:", err)
		return
	}
	// 打印响应
	fmt.Println("发送短信成功:", response)
}

执行发送短信,如果response里返回msg"只能向已回复授权信息的手机号发送",这是测试号码没有授权的原因,见1,添加测试号码绑定.

发送短信后可以到控制台查看发送记录,如果失败原因是

签名黑名单(364)

运营商根据签名投诉情况进行拦截, 建议使用其他签名进行发送

,报签名黑名单(364),是部分运营商网关未报备导致的,运营商会对短信签名做实名报备,可以向阿里云提一个工单,会反馈运营商通道侧加急报备操作,1-3天就可以正常发送短信了.