Golang梦网云短信对接

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
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值