|
|
@@ -0,0 +1,162 @@ |
|
|
|
package sms |
|
|
|
|
|
|
|
import ( |
|
|
|
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db" |
|
|
|
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/offical" |
|
|
|
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/offical/model" |
|
|
|
zhios_third_party_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/utils" |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
"github.com/syyongx/php2go" |
|
|
|
"github.com/tidwall/gjson" |
|
|
|
"strings" |
|
|
|
"time" |
|
|
|
"xorm.io/xorm" |
|
|
|
) |
|
|
|
|
|
|
|
//短信数量 |
|
|
|
func SmsNumGetSmsNum(engine *xorm.Engine, smsType, uid string) int { |
|
|
|
numData := offical.GetSmsNum(engine, smsType, uid) |
|
|
|
num := 0 |
|
|
|
if numData != nil { |
|
|
|
num = numData.Num |
|
|
|
} |
|
|
|
if num < 0 { |
|
|
|
num = 0 |
|
|
|
} |
|
|
|
return num |
|
|
|
} |
|
|
|
|
|
|
|
//发送短信 |
|
|
|
func SmsSend(engine *xorm.Engine, args map[string]string) error { |
|
|
|
num := SmsNumGetSmsNum(engine, args["sms_type"], args["uid"]) |
|
|
|
ex := strings.Split(args["mobile"], ",") |
|
|
|
if len(ex) == 0 { |
|
|
|
return errors.New("请输入手机号") |
|
|
|
} |
|
|
|
count := len(ex) |
|
|
|
contentLen := php2go.Ceil(float64(len(args["content"])) / 4 / 70) |
|
|
|
if args["type"] == "mob" { |
|
|
|
contentLen = 1 |
|
|
|
} |
|
|
|
if num < count*int(contentLen) { |
|
|
|
return errors.New("短信不足") |
|
|
|
} |
|
|
|
if args["type"] != "mob" { //联江短信数量 |
|
|
|
send, err := SmsApiSend(engine, "api.v1.accountNum", map[string]string{}) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
platformCount := gjson.Get(send, "data.smsNum").String() |
|
|
|
if zhios_third_party_utils.StrToInt(platformCount) < count*int(contentLen) { |
|
|
|
return errors.New("平台短信不足") |
|
|
|
} |
|
|
|
} |
|
|
|
where := make(map[string]string) |
|
|
|
param := []string{ |
|
|
|
"content", //短信内容 |
|
|
|
"mobile", //号码多个以英文”,”号分割,最大 2000 个 |
|
|
|
"code", //扩展号 0-9 数字,超过 8 位自动截取前 8 位 |
|
|
|
"ext", //自定义信息,状态报告时返回,可以为空 |
|
|
|
} |
|
|
|
for _, v := range param { |
|
|
|
if args[v] != "" { |
|
|
|
where[v] = args[v] |
|
|
|
} |
|
|
|
} |
|
|
|
send := "" |
|
|
|
var err error |
|
|
|
if args["type"] == "mob" { //mob |
|
|
|
where = map[string]string{ |
|
|
|
"appkey": args["smsmsg_key"], |
|
|
|
"zone": args["zone"], |
|
|
|
"phone": args["phone"], |
|
|
|
"templateCode": args["templateCode"], |
|
|
|
} |
|
|
|
send, err = SmsMobApiSend(where) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
status := gjson.Get(send, "status").Int() |
|
|
|
msg := gjson.Get(send, "error").String() |
|
|
|
if status == 471 { |
|
|
|
return errors.New("发送的ip不在白名单中") |
|
|
|
} |
|
|
|
if status == 406 { |
|
|
|
return errors.New("appkey不存在") |
|
|
|
} |
|
|
|
if status != 200 { |
|
|
|
return errors.New(msg) |
|
|
|
} |
|
|
|
} else { |
|
|
|
send, err = SmsApiSend(engine, "api.v1.sms", where) |
|
|
|
if err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
success := gjson.Get(send, "success").Int() |
|
|
|
if success == 0 { |
|
|
|
return errors.New("发送失败") |
|
|
|
} |
|
|
|
} |
|
|
|
//存入记录 |
|
|
|
ext := map[string]interface{}{ |
|
|
|
"send": send, |
|
|
|
"post": where, |
|
|
|
} |
|
|
|
var record = model.SmsRecord{ |
|
|
|
OrdId: "", |
|
|
|
Uid: zhios_third_party_utils.StrToInt(args["uid"]), |
|
|
|
Amount: zhios_third_party_utils.IntToStr(count * int(contentLen)), |
|
|
|
CostPrice: "", |
|
|
|
Balance: zhios_third_party_utils.IntToStr(num - count*int(contentLen)), |
|
|
|
PayWay: 0, |
|
|
|
State: 1, |
|
|
|
Memo: "发送短信", |
|
|
|
CreateAt: time.Now(), |
|
|
|
UpdateAt: time.Now(), |
|
|
|
TradeNo: "", |
|
|
|
Type: 1, |
|
|
|
OrdType: "buy", |
|
|
|
SubUid: zhios_third_party_utils.StrToInt(args["sub_uid"]), |
|
|
|
Fee: "", |
|
|
|
Ext: zhios_third_party_utils.SerializeStr(ext), |
|
|
|
SmsType: args["sms_type"], |
|
|
|
} |
|
|
|
engine.InsertOne(&record) |
|
|
|
sql := `UPDATE sms_num_list set num=num-%d WHERE uid=%s and type=%s;` |
|
|
|
sql = fmt.Sprintf(sql, count*int(contentLen), args["uid"], args["sms_type"]) |
|
|
|
db.QueryNativeString(engine, sql) |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func SmsApiSend(engine *xorm.Engine, method string, args map[string]string) (string, error) { |
|
|
|
smsmsgKey := offical.SysCfgByKey(engine, "smsmsg_key") |
|
|
|
smsmsgAccount := offical.SysCfgByKey(engine, "smsmsg_account") |
|
|
|
smsWebHost := offical.SysCfgByKey(engine, "sms_web_host") |
|
|
|
salesSmsmsgKey := offical.SysCfgByKey(engine, "sales_smsmsg_key") |
|
|
|
salesSmsmsgAccount := offical.SysCfgByKey(engine, "sales_smsmsg_account") |
|
|
|
|
|
|
|
if args["sms_type"] == "yingxiao" { |
|
|
|
smsmsgKey = salesSmsmsgKey |
|
|
|
smsmsgAccount = salesSmsmsgAccount |
|
|
|
} |
|
|
|
thisUrl := smsWebHost |
|
|
|
if thisUrl == "" { |
|
|
|
thisUrl = "http://api.ljioe.cn/" |
|
|
|
} |
|
|
|
thisUrl += strings.ReplaceAll(method, ".", "/") |
|
|
|
args["timestamp"] = zhios_third_party_utils.Int64ToStr(time.Now().Unix()) |
|
|
|
args["account"] = smsmsgAccount |
|
|
|
args["key"] = php2go.Md5(smsmsgKey + php2go.Md5(args["timestamp"])) |
|
|
|
post, err := zhios_third_party_utils.CurlPost(thisUrl, zhios_third_party_utils.SerializeStr(args), nil) |
|
|
|
fmt.Println(string(post)) |
|
|
|
fmt.Println(err) |
|
|
|
return string(post), err |
|
|
|
} |
|
|
|
func SmsMobApiSend(args map[string]string) (string, error) { |
|
|
|
thisUrl := "https://webapi.sms.mob.com/sms/sendmsg" |
|
|
|
post, err := zhios_third_party_utils.CurlPost(thisUrl, zhios_third_party_utils.SerializeStr(args), nil) |
|
|
|
fmt.Println(string(post)) |
|
|
|
fmt.Println(err) |
|
|
|
return string(post), err |
|
|
|
} |