这是用go语言实现的,但说实话,其实没啥影响,不管什么语言都是这个套路,所以无论你是学什么语言或者是用什么语言的都好,看看总不亏。
22年7.14下午14:38,我完成了第一版项目使用的阿里云短信包功能需求
但是呢!因为项目负责人和需求方对接问题,具体的短信模板并没有对接好,某种程度上可以说是只是我自己运行成功,发送短信成功,而暂时没有实际投入项目中(鬼知道一星期能不能对接好),所以这篇文档就是我的总结文档,会放在平台给大家作为借鉴学习。
准备阶段纯属废话,可以直接跳过
看了下时间,实际开始做,还不是真的做,只是要我先跑通测试的api。时间是7.12中午,其实是下午,毕竟中午要去吃饭睡觉了。
然后是7.12晚上,开日会,豪哥说把accessKey放在服务器相关的那个文档里边了。所以从这一刻开始我可以真正的测试了。为什么说是真正的测试呢?
因为12日中午到晚上这段时间,我需要跑通阿里云测试短信,这个签名,其实就只能是验证码
https://dysms.console.aliyun.com/quickstart
能做的就如图所示,太少了。
我在我的阿里云主账号去申请一个accessKey
把阿里云给的短信代码下载或者复制粘贴后导入个包和依赖
ok,改代码为如下:(任何代码还是每一行都要看,看不懂可以过)
package main
import (
openapi "github.com/alibabacloud-go/darabonba-openapi/client"
dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
util "github.com/alibabacloud-go/tea-utils/service"
"github.com/alibabacloud-go/tea/tea"
"os"
)
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
// 我多加的
// 因为accessKeyId *string,传的是地址,所以有了如下四行
aki := "申请的accessKeyID"
aks := "申请的accessKeySecret"
accessKeyId = &aki
accessKeySecret = &aks
// 我多加的
config := &openapi.Config{
// 您的 AccessKey ID
AccessKeyId: accessKeyId,
// 您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// 访问的域名dysmsapi.aliyuncs.com
config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
_result = &dysmsapi20170525.Client{}
_result, _err = dysmsapi20170525.NewClient(config)
return _result, _err
}
func _main(args []*string) (_err error) {
client, _err := CreateClient(tea.String("accessKeyId"), tea.String("accessKeySecret"))
if _err != nil {
return _err
}
// 准备测试阶段,格式基本就是下边的,除了电话号码改改,code六位可以改改,别的动不了
sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
SignName: tea.String("阿里云短信测试"),
TemplateCode: tea.String("SMS_154950909"),
PhoneNumbers: tea.String("电话号码,拿自己的测试"),
TemplateParam: tea.String("{\"code\":\"3456\"}"),
}
runtime := &util.RuntimeOptions{}
tryErr := func() (_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
// 复制代码运行请自行打印 API 的返回值
_, _err = client.SendSmsWithOptions(sendSmsRequest, runtime)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var error = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
error = _t
} else {
error.Message = tea.String(tryErr.Error())
}
// 如有需要,请打印 error
util.AssertAsString(error.Message)
}
return _err
}
func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}
然后,嗯,运行它,然后你会发现失败(没有发送到你手机上)。然后就去线上:OpeanAPI调用,发现是因为余额为0,(那是当然的,因为咱们压根没买短信包,怎么可能有余额)
总结,测个der,还是得先买。
嗯,到了这一步,咱们买了短信包:购买地址,欸,这就代表咱有余额了嘿嘿。
并且拿到了四个东西。就可以真正的测试了
四个东西
先来个分离测试
和上边代码一样
填入accessKey
填入短信签名和短信模板,
ok,改代码为如下:(任何代码还是每一行都要看,看不懂可以过)
package main
import (
openapi "github.com/alibabacloud-go/darabonba-openapi/client"
dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
util "github.com/alibabacloud-go/tea-utils/service"
"github.com/alibabacloud-go/tea/tea"
"os"
)
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
// 我多加的
// 因为accessKeyId *string,穿的是地址,所以有了如下四步
aki := "申请的accessKeyID"
aks := "申请的accessKeySecret"
accessKeyId = &aki
accessKeySecret = &aks
// 我多加的
config := &openapi.Config{
// 您的 AccessKey ID
AccessKeyId: accessKeyId,
// 您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// 访问的域名dysmsapi.aliyuncs.com
config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
_result = &dysmsapi20170525.Client{}
_result, _err = dysmsapi20170525.NewClient(config)
return _result, _err
}
func _main(args []*string) (_err error) {
client, _err := CreateClient(tea.String("accessKeyId"), tea.String("accessKeySecret"))
if _err != nil {
return _err
}
// 准备测试阶段,格式基本就是下边的,除了电话号码改改,code六位可以改改,别的动不了
sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
SignName: tea.String("阿里云短信测试"),
TemplateCode: tea.String("SMS_154950909"),
PhoneNumbers: tea.String("电话号码,拿自己的测试"),
TemplateParam: tea.String("{\"code\":\"98765\"}"),
}
runtime := &util.RuntimeOptions{}
tryErr := func() (_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
// 复制代码运行请自行打印 API 的返回值
_, _err = client.SendSmsWithOptions(sendSmsRequest, runtime)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var error = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
error = _t
} else {
error.Message = tea.String(tryErr.Error())
}
// 如有需要,请打印 error
util.AssertAsString(error.Message)
}
return _err
}
func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}
然后,嗯,运行它,你会发现欸,成了
到了这一步说明我们就要真的往项目实际需求走了。
还不能大意,因为这是短信需求最重要,也是最重要的一步(虽然整体难度不大)
那么先说需求背景-我们的这个项目就是给场所负责人发送提醒短信(如果有红码或者黄码或者未按时做核酸人员的话)
因为这是政府项目不便于向大家展示代码,我就尽可能把逻辑思路,注意点说清楚。
思路-业务逻辑
先在utils工具类包下新建一个short_message.go(或者AliSms.go)
引入阿里云代码
import (
openapi "github.com/alibabacloud-go/darabonba-openapi/client"
dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
util "github.com/alibabacloud-go/tea-utils/service"
"github.com/alibabacloud-go/tea/tea"
"os"
)
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
// 我多加的
// 因为accessKeyId *string,穿的是地址,所以有了如下四步
aki := "申请的accessKeyID"
aks := "申请的accessKeySecret"
accessKeyId = &aki
accessKeySecret = &aks
// 我多加的
config := &openapi.Config{
// 您的 AccessKey ID
AccessKeyId: accessKeyId,
// 您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// 访问的域名dysmsapi.aliyuncs.com
config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
_result = &dysmsapi20170525.Client{}
_result, _err = dysmsapi20170525.NewClient(config)
return _result, _err
}
func _main(args []*string) (_err error) {
client, _err := CreateClient(tea.String("accessKeyId"), tea.String("accessKeySecret"))
if _err != nil {
return _err
}
//
phone := 拿到电话号码变量
m := make(map[string]interface{})
m["参数1"] = 参数1
m["参数2"] = 参数2
m["参数3"] = 参数3
mjson, _ := json.Marshal(m)
mString := string(mjson) // 把map型切片改为string
sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
SignName: tea.String("阿里云短信测试"),
TemplateCode: tea.String("SMS_154950909"),
PhoneNumbers: tea.String(phone),
TemplateParam: tea.String(mstring),
}
runtime := &util.RuntimeOptions{}
tryErr := func() (_e error) {
defer func() {
if r := tea.Recover(recover()); r != nil {
_e = r
}
}()
// 复制代码运行请自行打印 API 的返回值
_, _err = client.SendSmsWithOptions(sendSmsRequest, runtime)
if _err != nil {
return _err
}
return nil
}()
if tryErr != nil {
var error = &tea.SDKError{}
if _t, ok := tryErr.(*tea.SDKError); ok {
error = _t
} else {
error.Message = tea.String(tryErr.Error())
}
// 如有需要,请打印 error
util.AssertAsString(error.Message)
}
return _err
}
_mian改一个首字母大写的名字。例如AliSms(为了在别的包可见)
填入需要的签名和模板,以及这里实际需求的变量,例如电话号码变量。多个模板参数变量
注意这个mstring怎么来的,其他就好说
根据实际需求嵌入到查的函数代码里
在定时任务中调用这个查的函数代码就可以了
(如果写的比较模糊,见谅见谅,有什么问题可以私信。)
这个使用比较多的是什么快递通知,以及注册验证码啥的。但是别的也可以用上,例如咱这个。