概述
Golang调用梦网云通讯平台API实现短信发送
调用通讯平台API地址
其中post数据中,各项参数说明见下表:
编码实现
定义入参结构
// SendSmsMoudle 短信发送请求参数
type SendSmsMoudle struct {
Userid string `json:"userid"`
Pwd string `json:"pwd"`
// 时间戳:采用24小时制格式MMDDHHMMSS,即月日时分秒,定长10位,月、日、时、分、秒每段不足2位时左补0,密码选择MD5加密方式时必填该参数,密码选择明文方式时则不用填写
Timestamp string `json:"timestamp"`
// 用户唯一标识:32位长度,由梦网提供,与userid及pwd一样用于鉴权,如提交参数中包含userid及pwd,则可以不用填写该参数
//Apikey string `json:"apikey"`
//短信接收的手机号,用英文逗号(,)分隔,最大1000个号码。一次提交的号码类型不受限制,但手机会做验证,若有不合法的手机号将会被退回。号码段类型分为:移动、联通、电信手机
// 注意:请不要使用中文的逗号
Mobile string `json:"mobile"`
//最大支持350个字,一个字母或一个汉字都视为一个字
Content string `json:"content"`
// 扩展号
// 长度由账号类型定4-6位,通道号总长度不能超过20位。如:10657****主通道号,3321绑定的扩展端口,主+扩展+子端口总长度不能超过20位。
Exno string `json:"exno"`
// 该条短信在您业务系统内的用户自定义流水编号,比如订单号或者短信发送记录的流水号。填写后发送状态返回值内将包含这个ID.最大可支持64位的字符串
Custid string `json:"custid"`
// 额外提供的最大64个长度的自定义扩展数据.填写后发送状态返回值内将会包含这部分数据
Exdata string `json:"exdata"`
//业务类型
SvrType string `json:"svrtype"`
}
注:当用账号及密码来进行鉴权时,时间戳为必填
定义公共方法
// GenerateSmsCode 生成验证码;length代表验证码的长度
func GenerateSmsCode(length int) string {
numberic := [10]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
// 根据时间戳获取随机数
// 初始化随机数的资源库, 如果不执行这行, 不管运行多少次都返回同样的值
rand.Seed(time.Now().Unix())
var sb strings.Builder
for i := 0; i < length; i++ {
fmt.Fprintf(&sb, "%d", numberic[rand.Intn(len(numberic))])
}
return sb.String()
}
/**
* 将数据打包在JSON格式
* @param pkg 数据
* @return 返回JSON格式的字符数组
*/
func PkgToJson(pkg interface{}) []byte {
if nil == pkg {
return nil
}
ret, err := json.Marshal(pkg)
if err != nil {
fmt.Println("error:", err)
return nil
}
return ret
}
/**
* 短连接发送http post 请求,并返回结果。
* @param url 请求的URL, data发送的数据, content_type数据格式
* @return http返回码, 内容,出错信息
*/
func HttpPostOnce(url string, data []byte, content_type string) (int, []byte, error) {
body := strings.NewReader(string(data[:]))
client := &http.Client{}
reqest, _ := http.NewRequest("POST", url, body)
reqest.Header.Set("Accept-Encoding", "gzip, deflate")
reqest.Header.Set("Content-Type", content_type)
reqest.Header.Set("Connection", "Close")
response, err := client.Do(reqest)
if err != nil {
return 0, nil, err
}
defer response.Body.Close()
resbody, _ := ioutil.ReadAll(response.Body)
//bodystr := string(body)
return response.StatusCode, resbody, err
}
/**
* 将UTF8串转为GBK并进行URLENCODE
* @return 返回URLENCODE的字符串
*/
func FormatContent(content string) string {
// 去掉两端的空格
content = strings.TrimSpace(content)
// 转为GBK
gbk := mahonia.NewEncoder("gbk").ConvertString(content)
v := url.Values{}
v.Set("aa", gbk)
str := v.Encode()
arr := strings.Split(str, "=")
return arr[1]
}
/**
* 将密码按格式加密
* @param userid 用户名,pwd 密码,strtime 时间串 如时间是2017-5-10 11:20:33, 则串的内容为0510112033
* @return 返回加密后的字符串
*/
func CryptPwd(userid string, pwd string, strtime string) string {
// 密码加密模式:账号:J10003, 密码:111111, 固定字符串:00000000
// 时间戳:0803192020
// MD5加密之前的对应字符串:J10003000000001111110803192020
// MD5加密之后的密码字符串:26dad7f364507df18f3841cc9c4ff94d
md5Ctx := md5.New()
md5Ctx.Write([]byte(userid + "00000000" + pwd + strtime))
encryptPwd := md5Ctx.Sum(nil)
pwdmd5 := hex.EncodeToString(encryptPwd[:])
return pwdmd5
}
/**
* 格式化输出赶时间,如时间是:2017-5-11 14:22:30 输出为:0511142230
* @return 返回时间串
*/
func FormatCurrentTime() string {
now := time.Now()
return now.Format("060102150405")[2:]
}
调用接口
func SendSmsCode(code, mobile string) error {
url := utils.SingleSend // api接口url
userid := viper.GetString("sms.userid") // 用户名
pwd := viper.GetString("sms.pwd") // 密码
strtime := FormatCurrentTime() // 时间戳
body := &SendSmsMoudle{
Userid: userid,
Pwd: pwd,
Mobile: mobile,
Timestamp: strtime,
Content: FormatContent("您的验证码是1234,在10分钟内输入有效。如非本人操作请忽略此短信。"),
}
data := PkgToJson(body)
fmt.Println(string(data))
once, bytes, err := HttpPostOnce(url, data, "application/json")
fmt.Println("status--------", once)
fmt.Println("bytes--------", string(bytes))
fmt.Println("err--------", err)
return nil
}
最后
以上就是温柔胡萝卜为你收集整理的Golang梦网云短信对接Golang调用梦网云通讯平台API实现短信发送的全部内容,希望文章能够帮你解决Golang梦网云短信对接Golang调用梦网云通讯平台API实现短信发送所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复