支付和广告调试

This commit is contained in:
2026-09-15 22:11:05 +08:00
parent 3a79d6a10c
commit 97c9588e5d
12 changed files with 328 additions and 198 deletions
+37 -54
View File
@@ -26,14 +26,11 @@ import (
var payTypeCacheGroup singleflight.Group
// GainPayTypeReq 按金额查询支付通道(账单中心 /api/recharge/payType
type GainPayTypeReq struct {
Time string `json:"time" bson:"time"` // 时间戳,最大长度50,必填
Sign string `json:"sign" bson:"sign"` // 签名,最大长度100,必填
MercID string `json:"mercId" bson:"mercId"` // 商户ID,最大长度50,必填
Money []string `json:"money" bson:"money"` // 金额数组,必填
Mode string `json:"mode,omitempty"` // 支付模式,兼容商户版本迭代,传sdk表示支持sdk模式,可选
Payload string `json:"payload,omitempty"` // 备用参数:1-不匹配赔付渠道 2-空单 3-兑换划转,可选
Money []string // 金额数组(元),必填
DevType string // 设备类型 android/ios,非android按ios处理
DistrictCode string // 用户渠道码,支付中心据此绑定可用支付渠道
}
type AllPayType struct {
@@ -59,7 +56,7 @@ func (in *GainPayTypeReq) GetPayTypeFromCache() (bc []AllPayType, err error) {
// 金额排序
sort.Strings(in.Money)
redisKey := fmt.Sprintf("paycenter-channels:%s", strings.Join(in.Money, "-"))
redisKey := fmt.Sprintf("paycenter-channels:%s:%s:%s", billDevType(in.DevType), in.DistrictCode, strings.Join(in.Money, "-"))
value, err, _ := payTypeCacheGroup.Do(redisKey, func() (interface{}, error) {
str, cacheErr := appg.Redis.Get(redisKey)
if cacheErr != nil {
@@ -114,47 +111,46 @@ func decodeCachedPayTypes(raw string) ([]AllPayType, error) {
return nil, fmt.Errorf("json decode: %v; msgpack decode: %v", jsonErr, msgpackErr)
}
// GetPayType 从支付中心获取充值金额对应的充值方式
// GetPayType 从账单中心获取充值金额对应的充值方式
func (in *GainPayTypeReq) GetPayType() ([]AllPayType, error) {
res := GainPayTypeResp{}
code, err := httputil.DefaultClientPostJsonWithResp(&res, in.GetURL(), nil, in.GetBody())
moneys := make([]int64, 0, len(in.Money))
for _, m := range in.Money {
moneys = append(moneys, YuanToFen(m))
}
rchgTypes, err := GetPayTypeByDistrict(context.Background(), moneys, in.DevType, 0, 0, in.DistrictCode)
if err != nil {
log.Error(fmt.Sprintf("param:%+v,get pay type in bill center failed err:%v", in, err))
return nil, errors.New(fmt.Sprintf("bill GetPayType requset fail \nerror:%+v\n\ndata:%+v;", err, in))
return nil, err
}
if code != http.StatusOK {
log.Error(fmt.Sprintf("code:%v,get pay type response status exception", code))
return nil, errors.New(fmt.Sprintf("bill GetPayType response status exception;\nstatus %+v;", code))
payTypes := make([]AllPayType, 0, len(rchgTypes))
for _, r := range rchgTypes {
payTypes = append(payTypes, r.ToAllPayType())
}
if res.Code != 200 {
log.Error(fmt.Sprintf("bill GetPayType be rejected;\n param:%+v, err:%+v:", in, res))
return nil, errors.New("bill GetPayType be rejected")
}
bytes, err := json.Marshal(res.Msg)
if err != nil {
log.Error(fmt.Sprintf("bill payUrl urlDecode fail error:%+v;", err))
return nil, errors.New("getPayType json Marshal error")
}
var payTypes []AllPayType
if err = json.Unmarshal(bytes, &payTypes); err != nil {
log.Error(fmt.Sprintf("bill payUrl urlDecode fail error:%+v;", err))
return nil, errors.New("bill payUrl urlDecode fail error")
}
log.Debug("bill GetPayType success", log.Any("payTypeCount", len(payTypes)))
return payTypes, nil
}
// GetBody 获取请求body
func (in *GainPayTypeReq) GetBody() []byte {
in.MercID = appg.Conf.PayCenter.MercID
in.Time = Generate13DigitString()
in.Sign = in.GenerateSign()
data, err := json.Marshal(in)
if err != nil {
log.Info(fmt.Sprintf("bill GetBody json.Marshal is fail error:%+v/data:%+v", err, in))
return nil
// ToAllPayType 转换为按金额分组的支付类型列表
func (r RchgType) ToAllPayType() AllPayType {
res := AllPayType{
Money: fmt.Sprintf("%d.%02d", r.Money/100, r.Money%100),
Types: make([]mercPayTypeInfo, 0),
}
return data
enabled := []struct {
ok bool
t string
}{
{r.Alipay, Alipay},
{r.Wechat, Wechat},
{r.Union, "union"},
{r.QuickUnion, "quickUnion"},
{r.USDT, "usdt"},
{r.DaiChong, "daichong"},
}
for _, e := range enabled {
if e.ok {
res.Types = append(res.Types, mercPayTypeInfo{Name: e.t, Type: e.t})
}
}
return res
}
func Generate13DigitString() string {
@@ -169,19 +165,6 @@ func generateMD5(text string) string {
return hex.EncodeToString(hash[:])
}
// GenerateSign 生成加密
func (in *GainPayTypeReq) GenerateSign() string {
// 默认签名方式1: md5(value+value)
signStr := in.MercID + strings.Join(in.Money, "") + appg.Conf.PayCenter.MercSecret
sign := generateMD5(signStr)
return sign
}
// GetURL 获取请求地址
func (in *GainPayTypeReq) GetURL() string {
return appg.Conf.PayCenter.ApiUrl + "/api/shark/getPayType"
}
type Recharge struct {
Time string `json:"time" bson:"time"` // 时间戳,最大长度50,必填
Sign string `json:"sign" bson:"sign"` // 签名,最大长度100,必填