Go语言使用阿里云实现短信发送/验证服务(gin框架)


go语言使用阿里云实现短信发送/验证服务(gin框架)

官方示例

短信批量发送结果查询 CodeSample

该项目为通过 SendSms 发送短信并查询发送的结 CodeSample,生成的代码可以通过安装各语言的包来进行测试。

先决条件

  • 在您开始之前,您需要注册阿里云帐户并获取您的 凭证

使用的 API

  • SendBatchSms 批量发送短信,可以参考:文档
  • QuerySendDetails 查询短信的发送情况,可以参考:文档

输入参数

<phoneNumbers>: 接收短信的手机号码,多个用英文逗号隔开
<signNameJson>: 短信签名名称,eg: "阿里云"
<templateCode>: 短信模板CODE
<templateParamJson>: 短信模板变量对应的实际值,eg:{"code":"1234"}

返回示例

QuerySendDetails:

{
	"TotalCount":1,
	"Message":"OK",
	"RequestId":"819BE656-D2E0-4858-8B21-B2E477085AAF",
	"SmsSendDetailDTOs":{
		"SmsSendDetailDTO":{
			"SendDate":"2019-01-08 16:44:10",
			"OutId":123,
			"SendStatus":3,
			"ReceiveDate":"2019-01-08 16:44:13",
			"ErrCode":"DELIVERED",
			"TemplateCode":"SMS_122310183",
			"Content":"【阿里云】验证码为:123,您正在登录,若非本人操作,请勿泄露",
			"PhoneNum":15298356881
		}
	},
	"Code":"OK"
}

本人测试代码如下:

用户信息结构体:
type UserInfo struct {
	Uid              int64
	Account          string
	Password         string
	Phone            string
	Email            string
	VerificationCode string
}
短信发送部分代码:
// GetSMSverification 通过短信发送验证码
func GetSMSVerification(c *gin.Context) {
	data := Models.UserInfo{}
	err := c.BindJSON(&data)
	if err != nil {
		Utils.HandleErr(c, err, "获取数据失败")
		return
	}

	user := &Models.UserInfo{Phone: data.Phone}
	isExist := &data
	isExist.QueryPhone(user.Phone)
	//发送验证码
	request := Models.ALiYunCommunicationRequest{}
	randcode := Utils.GenerateRandNum(6)
    //需获取AliYun的短信服务签名和短信模板
	req := request.SetParamsValue(data.Phone, signName, randcode, TemplateParam)
	err = req.SendReq()
	Utils.HandleErr(c, err, "发送失败")

	c.JSON(http.StatusOK, gin.H{
		"verification": randcode,
		"result":       "发送成功",
	})

	//记录本地验证码
	user.VerificationCode = randcode

	//给定过期时间
	timer := time.NewTimer(60 * time.Second)
	select {
	case <-timer.C:
		user.VerificationCode = "expired"
	}
	timer.Stop()
}
短信验证部分代码:
// LoginbySMS  通过SMS用户登录
func LoginbySMS(c *gin.Context) {
	data := Models.UserInfo{}
	err := c.BindJSON(&data)
	if err != nil {
		Utils.HandleErr(c, err, "获取数据失败")
		return
	}
	if len(data.VerificationCode) == 0 {
		c.JSON(http.StatusBadRequest, gin.H{
			"verification": nil,
			"result":       "获取数据失败",
		})
	}

	user := &Models.UserInfo{VerificationCode: data.VerificationCode} //填入的验证码
	isExist := &data
	isExist.QueryPhone(data.Phone)

	if len(data.VerificationCode) == 0 {
		c.JSON(http.StatusBadRequest, gin.H{
			"verification": user.VerificationCode,
			"result":       "验证码输入错误",
		})
	}
	if user.VerificationCode == "expired" {
		c.JSON(http.StatusBadRequest, gin.H{
			"verification": user.VerificationCode,
			"result":       "验证码过期",
		})
	}

	//填入的验证码与数据库的验证码进行比较
	if user.VerificationCode == data.VerificationCode {
		SetCookie(c, data.Uid)
	} else {
		c.JSON(http.StatusBadRequest, gin.H{
			"verificationCode": user.VerificationCode,
			"result":           "验证码错误",
		})
	}
}

结论:

因为短信签名需要完整的网站和App才能申请成功,不能看到实际短信情况,但在postman测试是成功返回,待网站建设完好后,再展示短信结果。。。


文章作者: hypo
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hypo !
评论