短信发送方法
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.3 KiB

package sms
import (
"encoding/hex"
"errors"
"log"
"net/url"
"time"
"git.tetele.net/tgo/helper"
"github.com/tjfoc/gmsm/sm3"
)
/**
* 企业信息服务平台--一信通短信,健帆用
* @spCode 企业编号
* @appKey 登录的用户名
* @secretKey 接口业务--接口申请里的秘钥
* @templateId 短信模板id
* @mobiles 手机号,多个用逗号隔开
* @content 短信内容
*/
func SendByUms(spCode, appKey, secretKey, mobiles, templateId, content string) (bool, []byte, error) {
if spCode == "" || appKey == "" || secretKey == "" || mobiles == "" || templateId == "" || content == "" {
return false, []byte(""), errors.New("参数不全")
}
api := "https://api.ums86.com/api/sms/send"
timestamp := helper.ToStr(time.Now().UnixNano() / 1e6)
num_rand := helper.GetRandomNumber(7)
serialNumber := timestamp + num_rand
// 短信请求字段
body_data := map[string]string{
"userNumber": mobiles,
"templateId": templateId,
"messageContent": content,
"serialNumber": serialNumber,
}
// 请求头封装
six_rand := helper.GetRandomString(6)
request_id := timestamp + six_rand
headers := map[string]string{
"x-sp-code": spCode,
"x-app-key": appKey,
"x-request-id": request_id,
"X-Forwarded-For": "120.78.230.86",
}
// 签名
sign := UmsSetSign(body_data, headers, secretKey)
headers["x-sign"] = sign
reply, err := PostJsonData(api, body_data, headers)
if err != nil {
log.Println("post err", err)
return false, reply, err
}
var reply_data map[string]interface{}
err = json.Unmarshal(reply, &reply_data)
if err != nil {
log.Println(string(reply), err)
return false, reply, err
}
if helper.ToStr(reply_data["code"]) != "0" {
return false, reply, errors.New("短信发送失败," + helper.ToStr(reply_data["msg"]))
}
return true, reply, nil
}
// ums验签
func UmsSetSign(data, header map[string]string, secretKey string) string {
str := helper.HttpBuildQuery(data)
// url encode
str = url.QueryEscape(str)
str = header["x-sp-code"] + header["x-app-key"] + secretKey + str + header["x-request-id"]
log.Println("加密前数据: ", str)
// ms3加密
hash := sm3.New()
hash.Write([]byte(str))
sign_byte := hash.Sum(nil)
sign := hex.EncodeToString(sign_byte)
log.Println("加密后数据: ", sign)
return sign
}