| @ -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) | |||||
| } | |||||