印度包网
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.
 
 
 

189 lines
5.0 KiB

package values
import (
"bytes"
"encoding/json"
"encoding/xml"
"errors"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
"net/url"
"server/call"
"server/config"
"server/util"
"strconv"
"time"
"github.com/liangdas/mqant/log"
)
const (
SmsChannelAntgst = iota + 1
SmsChannelBuka
)
func APISmsReq(phone, code string) error {
switch call.GetConfigPlatform().SmsChannel {
case SmsChannelAntgst:
return AntgstRequest(phone, code)
case SmsChannelBuka:
return BukaRequest(phone, code)
default:
return errors.New("unknown channel")
}
}
type AntgstPhoneCodeReq struct {
Numbers string `json:"number"` // 手机号
Sms string `json:"sms"` // 正文内容
AuthSecret string `json:"authSecret"` // 秘钥
}
// AntgstResp 短信验证返回
type AntgstResp struct {
Result struct {
SmsID string `json:"smsId"`
Number string `json:"number"`
Code int `json:"code"`
Result string `json:"result"`
}
Msg string `json:"msg"`
Code int `json:"code"`
}
// RandomPhoneCode 随机6位验证码
func RandomPhoneCode() string {
return strconv.Itoa(rand.Intn(900000) + 100000)
}
func AntgstRequest(phone string, code string) error {
s := fmt.Sprintf(config.GetConfig().Web.OTP.AntgstModel, code)
// s = `"` + s + `"`
req := AntgstPhoneCodeReq{
Numbers: "0091" + phone, // 加上区号
// Sms: fmt.Sprintf(config.GetConfig().Web.OTP.AntgstModel, `"`+code+`"`),
Sms: s,
AuthSecret: config.GetConfig().Web.OTP.AntgstAccessKey + config.GetConfig().Web.OTP.AntgstAccessSecret,
}
resp := AntgstResp{}
err := util.HttpPost(config.GetConfig().Web.OTP.AntgstSmsReqURL, &req, &resp, nil)
if err != nil {
log.Error("err:%v", err)
return err
}
if resp.Code != 200 {
log.Error("req err:%v", resp)
return errors.New(resp.Msg)
}
return nil
}
// AliSmsResp ali短信验证返回
type AliSmsResp struct {
ReturnStatus string `xml:"returnstatus"`
Message string `xml:"message"`
}
func AliRequest(phone string, code string) error {
// t := int64(common.RedisExpirePhoneCode / (60 * time.Second))
s := fmt.Sprintf(config.GetConfig().Web.OTP.AliSmsModel, code)
u := url.Values{}
u.Set("userid", "1")
u.Set("account", config.GetConfig().Web.OTP.AliSmsAccount)
u.Set("password", config.GetConfig().Web.OTP.AliSmsPass)
u.Set("mobile", "91"+phone)
u.Set("content", s)
u.Set("checkcontent", "0")
url := config.GetConfig().Web.OTP.AliSmsReqURL + "&" + u.Encode()
log.Debug("AliRequest:%v", url)
req, err := http.NewRequest("POST", url, nil)
if err != nil {
log.Error("err:%v", err)
return err
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{
Timeout: 5 * time.Second,
}
log.Debug("req:%+v", req)
resp, err := client.Do(req)
if err != nil {
log.Error("http post call err:%v", err)
return err
}
ret := AliSmsResp{}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
log.Debug("response Body%v:", string(body))
if err := xml.Unmarshal(body, &ret); err != nil {
log.Error("unmarshal fail err:%v", err)
return err
}
if ret.ReturnStatus != "Success" {
log.Error("err:%v", ret.Message)
return errors.New(ret.Message)
}
return nil
}
// =====================================不卡短信
type BukaPhoneCodeReq struct {
AppID string `json:"appId"` // appId
Numbers string `json:"numbers"` // 手机号
Content string `json:"content"` // 正文内容
}
type BukaPhoneCodeResp struct {
Status string `json:"status"` // 0成功
Reason string `json:"reason"` // 失败原因
Success string `json:"success"` // 成功数
Fail string `json:"fail"` // 失败数
MsgID string `json:"msgId"` // 提交号码对应平台msgId
Number string `json:"number"` // 提交号码
}
func BukaRequest(phone string, code string) error {
s := fmt.Sprintf(config.GetConfig().Web.OTP.BukaModel, code)
req := BukaPhoneCodeReq{
AppID: config.GetConfig().Web.OTP.BukaAppID,
Numbers: phone, // 加上区号
Content: s,
}
url := config.GetConfig().Web.OTP.BukaUrl
reqStr, _ := json.Marshal(req)
log.Debug("Post to:%v,req:%v", url, string(reqStr))
request, err := http.NewRequest("POST", url, bytes.NewBuffer(reqStr))
if err != nil {
log.Error("err:%v", err)
return err
}
now := strconv.FormatInt(time.Now().Unix(), 10)
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
request.Header.Set("Api-Key", config.GetConfig().Web.OTP.BukaAPIKey)
request.Header.Set("Timestamp", now)
request.Header.Set("Sign", util.CalculateMD5(config.GetConfig().Web.OTP.BukaAPIKey+config.GetConfig().Web.OTP.BukaAPISecret+now))
client := &http.Client{
Timeout: 5 * time.Second,
}
log.Debug("request:%+v", request)
resp, err := client.Do(request)
if err != nil {
log.Error("http post call err:%v", err)
return err
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
log.Debug("response Body%v:", string(body))
ret := BukaPhoneCodeResp{}
if err := json.Unmarshal(body, &ret); err != nil {
log.Error("unmarshal fail err:%v", err)
return err
}
if ret.Status != "0" {
return fmt.Errorf("%v", ret.Reason)
}
return nil
}