@ -1,3 +1,9 @@ | |||||
# sms | # sms | ||||
短信发送方法 | |||||
短信发送方法 | |||||
## SendByWo() | |||||
发送联通融合通信短信 | |||||
## SendByTencent() | |||||
使用腾讯云发送短信 |
@ -0,0 +1,84 @@ | |||||
package sms | |||||
import ( | |||||
"bytes" | |||||
"crypto/md5" | |||||
"encoding/hex" | |||||
"io/ioutil" | |||||
"net/http" | |||||
"strings" | |||||
"github.com/json-iterator/go" | |||||
) | |||||
var json = jsoniter.ConfigCompatibleWithStandardLibrary | |||||
//密码加密 | |||||
func Md5Str(str ...string) string { | |||||
var build strings.Builder | |||||
if len(str) > 0 { | |||||
for _, v := range str { | |||||
build.WriteString(v) | |||||
} | |||||
} else { | |||||
return "" | |||||
} | |||||
h := md5.New() | |||||
h.Write([]byte(build.String())) // 需要加密的字符串 | |||||
cipher2Str := h.Sum(nil) | |||||
sMd5 := hex.EncodeToString(cipher2Str) // 输出加密结果 | |||||
return sMd5 | |||||
} | |||||
/* | |||||
* 连接多个字符串 | |||||
*/ | |||||
func StringJoin(s ...string) string { | |||||
var build strings.Builder | |||||
if len(s) > 0 { | |||||
for _, v := range s { | |||||
build.WriteString(v) | |||||
} | |||||
} | |||||
return build.String() | |||||
} | |||||
/** | |||||
* post 请求 | |||||
*/ | |||||
func PostJsonData(url string, param interface{}, header ...map[string]string) ([]byte, error) { | |||||
httpClient := &http.Client{} | |||||
params, err := json.Marshal(param) | |||||
if err != nil { | |||||
return []byte(""), err | |||||
} | |||||
req, err := http.NewRequest("POST", url, bytes.NewBuffer(params)) | |||||
if err != nil { | |||||
return []byte(""), err | |||||
} | |||||
req.Header.Set("Content-Type", "application/json") | |||||
if len(header) > 0 { | |||||
for _, item := range header { | |||||
for k, v := range item { | |||||
req.Header[k] = []string{v} | |||||
} | |||||
} | |||||
} | |||||
resp, err := httpClient.Do(req) | |||||
if err != nil { | |||||
return []byte(""), err | |||||
} | |||||
defer resp.Body.Close() | |||||
body, err := ioutil.ReadAll(resp.Body) | |||||
if err != nil { | |||||
return []byte(""), err | |||||
} | |||||
return body, nil | |||||
} |
@ -0,0 +1,29 @@ | |||||
package sms | |||||
import ( | |||||
// jsonorg "encoding/json" | |||||
"testing" | |||||
"time" | |||||
// "github.com/json-iterator/go" | |||||
) | |||||
func Test_PostJsonData(t *testing.T) { | |||||
t.Log(time.Now().UnixNano()) | |||||
// data := map[string]string{"11": "22", "33": "44", "55": "66"} | |||||
var d []byte | |||||
var err error | |||||
org := `{"11":"22","33":"44","55":"66"} ` | |||||
var org_old map[string]string | |||||
for i := 0; i < 10000000; i++ { | |||||
err = json.Unmarshal([]byte(org), &org_old) | |||||
} | |||||
t.Log(org_old) | |||||
t.Log(string(d), err) | |||||
t.Log(time.Now().UnixNano()) | |||||
} |
@ -0,0 +1,9 @@ | |||||
module git.tetele.net/tgo/sms | |||||
go 1.16 | |||||
require ( | |||||
github.com/json-iterator/go v1.1.12 | |||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.365 | |||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.365 | |||||
) |
@ -0,0 +1,19 @@ | |||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | |||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | |||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | |||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= | |||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= | |||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | |||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= | |||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | |||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | |||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | |||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | |||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= | |||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | |||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.365 h1:WBjY/1zAWHINPh8UB90HY/cMkbfUTtnb/H4TDqGwI/Q= | |||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.365/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= | |||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.365 h1:akX9xDCzYK75pQLrbZIxb/MTPoBF0QVJDARNtWaLzs8= | |||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.365/go.mod h1:R8lU5rztxefamuYaDWz/SfIF8p0givTsfV9FcSm58YU= |
@ -0,0 +1,50 @@ | |||||
package sms | |||||
import ( | |||||
"log" | |||||
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" | |||||
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" | |||||
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" | |||||
sms "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms/v20210111" | |||||
) | |||||
/** | |||||
* 使用腾讯云发送短信 | |||||
* @secretId 腾讯云密钥id | |||||
* @secretKey 腾讯云密钥key | |||||
* @signname 签名 | |||||
* @templateId 模板id | |||||
* @params 参数值 | |||||
*/ | |||||
func SendByTencent(secretId, secretKey, smsAppId string, signname string, mobiles []string, templateId string, params []string) (*string, []*sms.SendStatus, error) { | |||||
credential := common.NewCredential( | |||||
secretId, | |||||
secretKey, | |||||
) | |||||
cpf := profile.NewClientProfile() | |||||
cpf.HttpProfile.Endpoint = "sms.tencentcloudapi.com" | |||||
client, _ := sms.NewClient(credential, "ap-guangzhou", cpf) | |||||
request := sms.NewSendSmsRequest() | |||||
request.PhoneNumberSet = common.StringPtrs(mobiles) //[]string{"18607552321"} | |||||
request.SmsSdkAppId = common.StringPtr(smsAppId) | |||||
request.SignName = common.StringPtr(signname) | |||||
request.TemplateId = common.StringPtr(templateId) | |||||
request.TemplateParamSet = common.StringPtrs(params) //[]string{"param1", "param2"} | |||||
response, err := client.SendSms(request) | |||||
if _, ok := err.(*errors.TencentCloudSDKError); ok { | |||||
log.Println("An API error has returned: ", err) | |||||
return nil, nil, err | |||||
} | |||||
if err != nil { | |||||
log.Println(err) | |||||
return nil, nil, err | |||||
} | |||||
return response.Response.RequestId, response.Response.SendStatusSet, nil | |||||
} |
@ -0,0 +1,49 @@ | |||||
package sms | |||||
import ( | |||||
"log" | |||||
"strings" | |||||
// "github.com/json-iterator/go" | |||||
) | |||||
/** | |||||
* 发送联通融合通信短信 | |||||
* @cpcode 商户编号 | |||||
* @key accessKey | |||||
* @excode 扩展码 | |||||
* @mobiles 手机号,多个用逗号隔开 | |||||
* @templetId 模板id | |||||
* @msg 模板中变量的值,如果包含多个参数,以半角英文逗号分隔 | |||||
*/ | |||||
func SendByWo(cpcode, key, excode, mobiles, templetid, msg string) (map[string]interface{}, error) { | |||||
sign_str := StringJoin(cpcode, msg, mobiles, excode, templetid, key) | |||||
sign := strings.ToLower(Md5Str(sign_str)) | |||||
url := "http://rcsapi.wo.cn:8000/umcinterface/sendtempletmsg" | |||||
data := map[string]string{ | |||||
"cpcode": cpcode, | |||||
"msg": msg, | |||||
"mobiles": mobiles, | |||||
"excode": excode, | |||||
"templetid": templetid, | |||||
"sign": sign, | |||||
} | |||||
reply, err := PostJsonData(url, data) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
var reply_data map[string]interface{} | |||||
err = json.Unmarshal(reply, &reply_data) | |||||
if err != nil { | |||||
log.Println(string(reply), err) | |||||
return nil, err | |||||
} | |||||
return reply_data, err | |||||
} |
@ -0,0 +1,18 @@ | |||||
package sms | |||||
import ( | |||||
"testing" | |||||
) | |||||
func Test_SendByWo(t *testing.T) { | |||||
cpcode := "AACDUZ" | |||||
key := "c1a4245d51ad7315e7c1bb5d80eb98b0" | |||||
excode := "750058" | |||||
msg := "345678" | |||||
mobiles := "18607565510" | |||||
templetId := "290901" | |||||
ret, err := SendByWo(cpcode, key, excode, mobiles, templetId, msg) | |||||
t.Log(ret) | |||||
t.Log(err) | |||||
} |