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.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梦网云短信对接相关推荐
- java阿里云短信对接
技术栈: Spring boot 2.x 阿里云短信sdk java版本1.8 注意事项: 本文内的"**.**"需要自己替换为自己的路径. 常量内的"**"需 ...
- 国际版阿里云短信对接
首先贴一下阿里云国际版登陆网址 https://account.alibabacloud.com/login/login.htm?spm=a212t0.3047821.0.0.166a1b05yDAp ...
- Prometheus和Grafana告警服务创建与对接腾讯云短信告警平台(prometheus_alert)
前言 在一个监控系统中,如果说数据链路是她的骨架,那么告警通知服务就是他的灵魂!所有的监控服务都是为了能够及时通知出来,减少人工查询状态,及时发现问题,避免不必要的大规模故障,为企业政府省钱,和保证安 ...
- java对接阿里云短信服务详解(验证码,推广短信,通知短信)
前言 小前提: - java:springboot框架,maven版本管理. - 阿里云:有账号,已经进行实名认证. java对接阿里云短信服务详解(验证码,推广短信,通知短信) 前言 1. 登录阿里 ...
- 在内部局域网(无外网)使用阿里云短信
项目从阿里云迁移到政府外网,由于项目之前已使用阿里云短信通信,但是在政务云并无短信服务,若需继续使用阿里云短信,则需要做一些相关处理,其实很只需要做下代理即可, 应用服务器本身无法连接外网且外网无法连 ...
- thinkphp5如何对接使用阿里云短信
目前阿里云短信sdk有两个版本,一个老版本一个新版本就是openAPI,这篇文章讲的就是老版本的对接 首先我们下载官方完整包的SDK:https://help.aliyun.com/document_ ...
- 对接阿里云短信服务(附视频教程)
阿里云短信服务文档使用指引: https://help.aliyun.com/document_detail/59210.html B站视频教程链接: https://www.bilibili.com ...
- 关于华为云短信接口对接问题
华为云---消息&短信 对接API 问题 对接API 华为云基础示例 https://support.huaweicloud.com/devg-msgsms/sms_04_0002.html ...
- 阿里云短信服务与微信小程序对接进行注册
一.首先需要阿里云官网开通短信服务,然后记录下以下关键字段[accessKeyId],[accessKeySecret],[短信签名],[模板CODE] 二.进入官方开发指南下载SDKDemo 做好以 ...
最新文章
- 告别痛苦,快乐学习Pandas!开源教程《Joyful-Pandas》发布
- 谈C/C++指针精髓
- 计算机组装与维护时dm是指,《计算机组装与维护》试题答案
- [MySQL] InnoDB三大特性之 - 插入缓冲
- 史上最全排序算法总结 | 原力计划
- CMake编译protobuf
- string 常用函数
- redis分布式锁的 5个坑
- Python学习总结(1)——编程准备和基本语法
- idea代码格式化详细总结(快捷键、格式化规则、格式化模板)
- 统计学中p值计算公式_统计学中的P值如何计算?
- JAVA:实现求Median中位数算法(附完整源码)
- python画图皮卡丘_用python画一只可爱的皮卡丘
- Win7系统不能调整屏幕亮度
- 软件测试基础知识 - 单元测试、集成测试、系统测试、回归测试、验收测试这几步中最重要的是哪一步
- 计算机系统里绘图基本操作,计算机的基本操作
- Origin Pro2017 不等间距图
- 政府信息化需求开启 OA办公系统平台化时代
- nginx 404 not found错误查找
- AD绘制第一块STM32最小系统板 (二)AD16修改原理图图纸大小