Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
package fengniao
import (
"crypto/sha1"
"errors"
"fmt"
"net/http"
"91porn-server/common"
"91porn-server/common/httputil"
"91porn-server/common/log"
)
type requestBody struct {
MercId string `json:"mercId"`
Secret string `json:"secret"`
TemplateId string `json:"templateId"`
SmsCode string `json:"smsCode"`
Mobile string `json:"mobile"`
SignType string `json:"signType"` // 固定sha1
Sign string `json:"sign"` // 签名
}
type msg struct {
Status string `json:"status"`
TaskId string `json:"taskId"`
}
type responseBody struct {
Code int `json:"code"`
Msg msg `json:"msg"`
Err string `json:"err"`
}
type FengNiao struct {
Url string
MercId string
Secret string
Tmpl string
}
// Send 发送, 目前蜂鸟貌似只支持数字
func (f *FengNiao) Send(mobile string, code string) error {
data := fmt.Sprintf("mercId=%s&templateId=%s&smsCode=%s&mobile=%s&secret=%s", f.MercId, f.Tmpl, code, mobile, f.Secret)
sha := sha1.New()
if _, err := sha.Write([]byte(data)); err != nil {
log.Error("fengniao send error", log.Any("mobile", mobile), log.Any("templateId", f.Tmpl), log.E(err))
return err
}
args, _ := common.JSONStruct2Map(&requestBody{
MercId: f.MercId,
Secret: f.Secret,
TemplateId: f.Tmpl,
SmsCode: code,
SignType: "sha1",
Mobile: mobile,
Sign: fmt.Sprintf("%x", sha.Sum(nil)),
})
rp := responseBody{}
statusCode, err := httputil.DefaultClientPostJsonWithResp(&rp, f.Url, nil, args)
if err != nil {
log.Error("fengniao POSTJsonWithResp err", log.E(err))
return err
}
if statusCode != http.StatusOK {
log.Error("fengniao status code not 200")
return errors.New("fengniao statusCode not 200")
}
if rp.Code != 200 {
log.Error("fengniao code not 200", log.Any("errdesc", rp.Err))
return errors.New(rp.Err)
}
return nil
}
+61
View File
@@ -0,0 +1,61 @@
package sms
import (
"strings"
"91porn-server/common/sms/fengniao"
"91porn-server/common/ysphone"
)
type Provider = int
const (
FengNiao Provider = 1 //蜂鸟
YunPian Provider = 2 //云片
)
type FengNiaoConfig struct {
Url string `json:"url"`
ChinaMercId string `json:"chinaMercId"`
ChinaSecret string `json:"chinaSecret"`
ChinaTmplId string `json:"chinaTmplId"`
InterMercId string `json:"interMercId"`
InterSecret string `json:"interSecret"`
InterTmplId string `json:"interTmplId"`
}
type Config struct {
FengNiao FengNiaoConfig `json:"fengNiao"`
}
var cfg Config
func Init(c Config) {
cfg = c
}
func sendByFengNiao(mobile string, code string) error {
newMobile := ysphone.FormatPhoneNumber(mobile)
fn := fengniao.FengNiao{
Url: cfg.FengNiao.Url,
MercId: cfg.FengNiao.InterMercId,
Secret: cfg.FengNiao.InterSecret,
Tmpl: cfg.FengNiao.InterTmplId,
}
if strings.HasPrefix(newMobile, "+86") {
fn.MercId = cfg.FengNiao.ChinaMercId
fn.Secret = cfg.FengNiao.ChinaSecret
fn.Tmpl = cfg.FengNiao.ChinaTmplId
}
return (&fn).Send(newMobile, code)
}
// Send 发送短信
func Send(p Provider, mobile string, code string) error {
switch p {
case FengNiao:
return sendByFengNiao(mobile, code)
default:
return sendByFengNiao(mobile, code)
}
}