Fix baishun wallet payload and callback log sizing

This commit is contained in:
hy001 2026-04-16 17:27:49 +08:00
parent 39e70ad0a3
commit 46ddaca893
5 changed files with 126 additions and 85 deletions

View File

@ -41,13 +41,18 @@ type GoldReceiptCommand struct {
SysOrigin string `json:"sysOrigin"` SysOrigin string `json:"sysOrigin"`
EventID string `json:"eventId"` EventID string `json:"eventId"`
Remark string `json:"remark,omitempty"` Remark string `json:"remark,omitempty"`
Amount int64 `json:"amount"` Amount PennyAmountPayload `json:"amount"`
CloseDelayAsset bool `json:"closeDelayAsset"` CloseDelayAsset bool `json:"closeDelayAsset"`
OpUserType string `json:"opUserType"` OpUserType string `json:"opUserType"`
CustomizeOrigin string `json:"customizeOrigin,omitempty"` CustomizeOrigin string `json:"customizeOrigin,omitempty"`
CustomizeOriginDesc string `json:"customizeOriginDesc,omitempty"` CustomizeOriginDesc string `json:"customizeOriginDesc,omitempty"`
} }
type PennyAmountPayload struct {
PennyAmount int64 `json:"pennyAmount,string"`
DollarAmount int64 `json:"dollarAmount"`
}
type TestGoldReceiptCommand struct { type TestGoldReceiptCommand struct {
ReceiptType string `json:"receiptType"` ReceiptType string `json:"receiptType"`
UserID int64 `json:"userId"` UserID int64 `json:"userId"`
@ -299,12 +304,19 @@ func (c *Client) ChangeGoldBalance(ctx context.Context, cmd GoldReceiptCommand)
EventID: cmd.EventID, EventID: cmd.EventID,
SysOrigin: cmd.SysOrigin, SysOrigin: cmd.SysOrigin,
Remark: cmd.Remark, Remark: cmd.Remark,
Amount: cmd.Amount, Amount: cmd.Amount.DollarAmount,
CloseDelayAsset: cmd.CloseDelayAsset, CloseDelayAsset: cmd.CloseDelayAsset,
} }
return c.postJSON(ctx, c.cfg.JavaWalletBaseURL+"/wallet/gold/client/balance/change/test", testCmd, nil, nil) return c.postJSON(ctx, c.cfg.JavaWalletBaseURL+"/wallet/gold/client/balance/change/test", testCmd, nil, nil)
} }
func NewPennyAmountPayloadFromDollar(amount int64) PennyAmountPayload {
return PennyAmountPayload{
PennyAmount: amount * 100,
DollarAmount: amount,
}
}
func shouldFallbackToGoldTestEndpoint(err error) bool { func shouldFallbackToGoldTestEndpoint(err error) bool {
if err == nil { if err == nil {
return false return false

View File

@ -132,7 +132,7 @@ type BaishunCallbackLog struct {
RequestJSON string `gorm:"column:request_json;type:longtext"` RequestJSON string `gorm:"column:request_json;type:longtext"`
ResponseJSON string `gorm:"column:response_json;type:longtext"` ResponseJSON string `gorm:"column:response_json;type:longtext"`
BizCode string `gorm:"column:biz_code;size:32"` BizCode string `gorm:"column:biz_code;size:32"`
BizMessage string `gorm:"column:biz_message;size:255"` BizMessage string `gorm:"column:biz_message;type:text"`
Status string `gorm:"column:status;size:32"` Status string `gorm:"column:status;size:32"`
CreateTime time.Time `gorm:"column:create_time;index:idx_baishun_log_type_time,priority:2"` CreateTime time.Time `gorm:"column:create_time;index:idx_baishun_log_type_time,priority:2"`
UpdateTime time.Time `gorm:"column:update_time"` UpdateTime time.Time `gorm:"column:update_time"`

View File

@ -43,7 +43,7 @@ func (r *Repository) Ping(ctx context.Context) error {
} }
func (r *Repository) AutoMigrate() error { func (r *Repository) AutoMigrate() error {
return r.DB.AutoMigrate( if err := r.DB.AutoMigrate(
&model.InviteCampaignConfig{}, &model.InviteCampaignConfig{},
&model.InviteCampaignRewardRule{}, &model.InviteCampaignRewardRule{},
&model.InviteCampaignRelation{}, &model.InviteCampaignRelation{},
@ -58,5 +58,10 @@ func (r *Repository) AutoMigrate() error {
&model.BaishunOrderIdempotency{}, &model.BaishunOrderIdempotency{},
&model.BaishunCallbackLog{}, &model.BaishunCallbackLog{},
&model.BaishunRoomState{}, &model.BaishunRoomState{},
) ); err != nil {
return err
}
// Keep callback error details queryable even when downstream returns a long body.
return r.DB.Exec("ALTER TABLE baishun_callback_log MODIFY COLUMN biz_message TEXT NULL").Error
} }

View File

@ -48,6 +48,7 @@ const (
baishunCodeSignatureError = 1010 baishunCodeSignatureError = 1010
baishunCodeRepeatUnknown = 1011 baishunCodeRepeatUnknown = 1011
baishunCodeServerError = 1999 baishunCodeServerError = 1999
legacyBizMessageRuneLimit = 255
) )
type BaishunService struct { type BaishunService struct {
@ -789,7 +790,7 @@ func (s *BaishunService) HandleChangeBalance(ctx context.Context, req BaishunCha
SysOrigin: session.SysOrigin, SysOrigin: session.SysOrigin,
EventID: walletEventID, EventID: walletEventID,
Remark: defaultIfBlank(req.DiffMsg, req.MsgType), Remark: defaultIfBlank(req.DiffMsg, req.MsgType),
Amount: abs64(req.CurrencyDiff), Amount: integration.NewPennyAmountPayloadFromDollar(abs64(req.CurrencyDiff)),
CloseDelayAsset: false, CloseDelayAsset: false,
OpUserType: "APP", OpUserType: "APP",
CustomizeOrigin: fmt.Sprintf("BAISHUN_GAME_%d", req.GameID), CustomizeOrigin: fmt.Sprintf("BAISHUN_GAME_%d", req.GameID),
@ -1204,7 +1205,11 @@ func (s *BaishunService) saveCallbackLog(ctx context.Context, requestType, reque
parsed := parseInt64Default(userID) parsed := parseInt64Default(userID)
logRecord.UserID = &parsed logRecord.UserID = &parsed
} }
err = s.repo.DB.WithContext(ctx).Create(&logRecord).Error
if err != nil && isBizMessageTooLongError(err) {
logRecord.BizMessage = truncateRunes(logRecord.BizMessage, legacyBizMessageRuneLimit)
_ = s.repo.DB.WithContext(ctx).Create(&logRecord).Error _ = s.repo.DB.WithContext(ctx).Create(&logRecord).Error
}
} }
func (s *BaishunService) failStandard(code int, message string) baishunStandardResponse { func (s *BaishunService) failStandard(code int, message string) baishunStandardResponse {
@ -1357,6 +1362,25 @@ func abs64(value int64) int64 {
return value return value
} }
func isBizMessageTooLongError(err error) bool {
if err == nil {
return false
}
message := strings.ToLower(err.Error())
return strings.Contains(message, "data too long") && strings.Contains(message, "biz_message")
}
func truncateRunes(value string, limit int) string {
if limit <= 0 || value == "" {
return ""
}
runes := []rune(value)
if len(runes) <= limit {
return value
}
return string(runes[:limit])
}
func parseInt64Default(value string) int64 { func parseInt64Default(value string) int64 {
parsed, _ := strconv.ParseInt(strings.TrimSpace(value), 10, 64) parsed, _ := strconv.ParseInt(strings.TrimSpace(value), 10, 64)
return parsed return parsed

View File

@ -114,7 +114,7 @@ CREATE TABLE IF NOT EXISTS baishun_callback_log (
request_json LONGTEXT DEFAULT NULL, request_json LONGTEXT DEFAULT NULL,
response_json LONGTEXT DEFAULT NULL, response_json LONGTEXT DEFAULT NULL,
biz_code VARCHAR(32) DEFAULT NULL, biz_code VARCHAR(32) DEFAULT NULL,
biz_message VARCHAR(255) DEFAULT NULL, biz_message TEXT DEFAULT NULL,
status VARCHAR(32) NOT NULL DEFAULT 'SUCCESS', status VARCHAR(32) NOT NULL DEFAULT 'SUCCESS',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,