说明
这是用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,还是得先买。
二、真正的测试开始
嗯,到了这一步,咱们买了短信包:购买地址,欸,这就代表咱有余额了嘿嘿。
并且拿到了四个东西。就可以真正的测试了
四个东西
先来个分离测试
1、验证码测试操作步骤:
和上边代码一样
-
填入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) } }
-
然后,嗯,运行它,你会发现欸,成了
2、实际需求短信测试。
到了这一步说明我们就要真的往项目实际需求走了。
还不能大意,因为这是短信需求最重要,也是最重要的一步(虽然整体难度不大)
那么先说需求背景-我们的这个项目就是给场所负责人发送提醒短信(如果有红码或者黄码或者未按时做核酸人员的话)
因为这是政府项目不便于向大家展示代码,我就尽可能把逻辑思路,注意点说清楚。
思路-业务逻辑
-
先在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怎么来的,其他就好说
-
根据实际需求嵌入到查的函数代码里
-
在定时任务中调用这个查的函数代码就可以了
(如果写的比较模糊,见谅见谅,有什么问题可以私信。)
这个使用比较多的是什么快递通知,以及注册验证码啥的。但是别的也可以用上,例如咱这个。