Files
huangguo_server/common/rchgutil/bill.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

171 lines
5.3 KiB
Go

package rchgutil
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"time"
"91porn-server/app/appg"
"91porn-server/common/httputil"
"91porn-server/common/log"
)
type PayTypeParam struct {
Moneys []int64 `json:"moneys"`
DevType string `json:"devType"`
ProductType int `json:"productType"` //产品类型 0站群 1棋牌
UserLevel int `json:"userLevel"` //限定用户层级 (0默认无等级 1充值成功过的1等级)
PlatformID string `json:"platformID"` //平台
}
type RchgType struct {
Money int64 `json:"money"` //金额 单位 分
Alipay bool `json:"alipay"` //是否支持支付宝
Wechat bool `json:"wechat"` //是否支持微信
Union bool `json:"union"` //是否支持银联
DaiChong bool `json:"daichong"` //是否支持代充
USDT bool `json:"usdt"` //是否支持代充
QuickUnion bool `json:"quickUnion"` //是否支持快速银联
}
type StdMsg struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
Tip string `json:"tip"`
}
// GetPayType 从支付中心获取充值金额对应的充值方式
func GetPayType(ctx context.Context, moneys []int64, devType string, productType, userLevel int) ([]RchgType, error) {
var errlog string
p := PayTypeParam{
moneys,
devType,
productType,
userLevel,
"91PORN",
}
res := StdMsg{}
code, err := httputil.DefaultClientPostJsonWithResp(&res, p.GetURL(), nil, p.GetBody())
if err != nil {
errlog = fmt.Sprintf("bill GetPayType requset fail \nerror:%+v\n\ndata:%+v;", err, p)
log.ErrorX(ctx, "get pay type in bill center failed", log.Any("param", p), log.Any("url", p.GetURL()),
log.E(err))
return nil, errors.New(errlog)
}
if code != http.StatusOK {
errlog = fmt.Sprintf("bill GetPayType response status exception;\nstatus %+v;", code)
log.ErrorX(ctx, errlog, log.Any("code", code))
return nil, errors.New(errlog)
}
if res.Code != 200 {
errlog = fmt.Sprintf("bill GetPayType be rejected;\n err:%+v:", res)
log.ErrorX(ctx, errlog, log.Any("res", res))
return nil, errors.New(errlog)
}
bytes, err := json.Marshal(res.Data)
if err != nil {
errlog = fmt.Sprintf("bill payUrl urlDecode fail \nerror:%+v;", err)
log.Error(errlog)
return nil, errors.New(errlog)
}
var payTypes []RchgType
if err = json.Unmarshal(bytes, &payTypes); err != nil {
errlog = fmt.Sprintf("bill payUrl urlDecode fail \nerror:%+v;", err)
log.ErrorX(ctx, errlog, log.E(err))
return nil, errors.New(errlog)
}
log.InfoX(ctx, "bill GetPayType data", log.Any("res", res))
return payTypes, nil
}
// GetBody 获取请求body
func (this *PayTypeParam) GetBody() []byte {
data, err := json.Marshal(this)
if err != nil {
log.Info(fmt.Sprintf("bill GetBody json.Marshal is fail error:%+v/data:%+v", err, this))
return nil
}
return data
}
// GetURL 获取请求地址
func (*PayTypeParam) GetURL() string {
return appg.Conf.URL.TransactionUrl + "/api/recharge/payType"
}
var (
PayErrPostFailure = errors.New("recharge http post failure")
PayErrResponseCode = errors.New("recharge http code isn't 200")
PayErrBeRejected = errors.New("recharge has been rejected")
)
// GetBody 获取请求body
func (this *Rchg) ToPayNew(ctx context.Context) (res RchgMsg, err error) {
defer func() {
log.InfoX(ctx, "bill ToPayNew request info end 2", log.Any("transNo", this.TransNo), log.Any("res", res))
if err := recover(); err != nil {
log.ErrorX(ctx, "bill ToPayNew recover", log.Any("Rchg", this), log.Any("panic", err))
}
}()
this.fill()
param, err := json.Marshal(this)
if err != nil {
log.ErrorX(ctx, "bill ToPayNew json.Marshal failed,", log.Any("transNo", this.TransNo), log.E(err))
return
}
log.InfoX(ctx, "ToPayNew request info start", log.Any("transNo", this.TransNo), log.Any("param", string(param)))
startS := time.Now().UnixNano()
code, err := httputil.DefaultClientPostJsonWithResp(&res, this.GetURL(), nil, param)
log.InfoX(ctx, "ToPayNew POST resp ", log.Any("code", code), log.Any("transNo", this.TransNo),
log.Any("param", string(param)), log.Any("topay-bill-time cost", time.Now().UnixNano()-startS))
if err != nil {
log.ErrorX(ctx, "bill ToPayNew post failed", log.Any("transNo", this.TransNo), log.E(err))
err = PayErrPostFailure
return
}
if code != http.StatusOK {
log.ErrorX(ctx, "bill ToPayNew bad http statusCode", log.Any("transNo", this.TransNo), log.Any("statusCode", code))
err = PayErrResponseCode
return
}
if res.Err != "" {
log.ErrorX(ctx, "bill ToPayNew has been rejected", log.Any("transNo", this.TransNo), log.Any("res err", res.Err))
err = PayErrBeRejected
return
}
log.InfoX(ctx, "bill ToPayNew request info end", log.Any("transNo", this.TransNo), log.Any("res", res))
return
}
// GetURL 获取请求地址
func (this *Rchg) fill() {
this.PlatformID = "91PORN"
if this.ProductType == 0 {
this.TransNo = RChgIDAssemble(this.TransNo)
}
if this.ProductType == 1 {
this.TransNo = RChgWLIDAssemble(this.TransNo)
}
this.NotifyUrl = appg.Conf.URL.LocalWebUrl + RCHG_NOTIFY_URL + "bill"
this.PType = this.PayMethod
}
// GetURL 获取请求地址
func (*Rchg) GetURL() string {
return appg.Conf.URL.TransactionUrl + "/api/recharge/recharge"
}
// GetBody 获取请求body
func (this *RchgBack) Notify() (RchgBack, error) {
return *this, nil
}
// GetBody 获取请求body
func (this *RchgBack) Success() string {
return "success"
}