@ -1,3 +1,9 @@ | |||
# 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) | |||
} |