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.Builderfor 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)// 转为GBKgbk := 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加密之后的密码字符串:26dad7f364507df18f3841cc9c4ff94dmd5Ctx := 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接口urluserid := 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梦网云短信对接相关推荐

  1. java阿里云短信对接

    技术栈: Spring boot 2.x 阿里云短信sdk java版本1.8 注意事项: 本文内的"**.**"需要自己替换为自己的路径. 常量内的"**"需 ...

  2. 国际版阿里云短信对接

    首先贴一下阿里云国际版登陆网址 https://account.alibabacloud.com/login/login.htm?spm=a212t0.3047821.0.0.166a1b05yDAp ...

  3. Prometheus和Grafana告警服务创建与对接腾讯云短信告警平台(prometheus_alert)

    前言 在一个监控系统中,如果说数据链路是她的骨架,那么告警通知服务就是他的灵魂!所有的监控服务都是为了能够及时通知出来,减少人工查询状态,及时发现问题,避免不必要的大规模故障,为企业政府省钱,和保证安 ...

  4. java对接阿里云短信服务详解(验证码,推广短信,通知短信)

    前言 小前提: - java:springboot框架,maven版本管理. - 阿里云:有账号,已经进行实名认证. java对接阿里云短信服务详解(验证码,推广短信,通知短信) 前言 1. 登录阿里 ...

  5. 在内部局域网(无外网)使用阿里云短信

    项目从阿里云迁移到政府外网,由于项目之前已使用阿里云短信通信,但是在政务云并无短信服务,若需继续使用阿里云短信,则需要做一些相关处理,其实很只需要做下代理即可, 应用服务器本身无法连接外网且外网无法连 ...

  6. thinkphp5如何对接使用阿里云短信

    目前阿里云短信sdk有两个版本,一个老版本一个新版本就是openAPI,这篇文章讲的就是老版本的对接 首先我们下载官方完整包的SDK:https://help.aliyun.com/document_ ...

  7. 对接阿里云短信服务(附视频教程)

    阿里云短信服务文档使用指引: https://help.aliyun.com/document_detail/59210.html B站视频教程链接: https://www.bilibili.com ...

  8. 关于华为云短信接口对接问题

    华为云---消息&短信 对接API 问题 对接API 华为云基础示例 https://support.huaweicloud.com/devg-msgsms/sms_04_0002.html ...

  9. 阿里云短信服务与微信小程序对接进行注册

    一.首先需要阿里云官网开通短信服务,然后记录下以下关键字段[accessKeyId],[accessKeySecret],[短信签名],[模板CODE] 二.进入官方开发指南下载SDKDemo 做好以 ...

最新文章

  1. 告别痛苦,快乐学习Pandas!开源教程《Joyful-Pandas》发布
  2. 谈C/C++指针精髓
  3. 计算机组装与维护时dm是指,《计算机组装与维护》试题答案
  4. [MySQL] InnoDB三大特性之 - 插入缓冲
  5. 史上最全排序算法总结 | 原力计划
  6. CMake编译protobuf
  7. string 常用函数
  8. redis分布式锁的 5个坑
  9. Python学习总结(1)——编程准备和基本语法
  10. idea代码格式化详细总结(快捷键、格式化规则、格式化模板)
  11. 统计学中p值计算公式_统计学中的P值如何计算?
  12. JAVA:实现求Median中位数算法(附完整源码)
  13. python画图皮卡丘_用python画一只可爱的皮卡丘
  14. Win7系统不能调整屏幕亮度
  15. 软件测试基础知识 - 单元测试、集成测试、系统测试、回归测试、验收测试这几步中最重要的是哪一步
  16. 计算机系统里绘图基本操作,计算机的基本操作
  17. Origin Pro2017 不等间距图
  18. 政府信息化需求开启 OA办公系统平台化时代
  19. nginx 404 not found错误查找
  20. AD绘制第一块STM32最小系统板 (二)AD16修改原理图图纸大小

热门文章

  1. 什么是SCA(软件成分分析)
  2. 【支付】中国的支付清算体系是怎么玩的
  3. Mybatis 出现The error may involve defaultParameterMap
  4. Qt开发Svg Editor分享
  5. 【ML】机器学习数据集:sklearn中分类数据集介绍
  6. 互联网行业人才缺口到底有多大?
  7. 百词斩2018校招笔试题
  8. 【Python】Python之禅
  9. RK3568平台开发系列讲解(安卓篇)理解Android系统的编译
  10. 次轮综述:9支球队两连胜 日韩出线状态低迷