package player import ( actorRemote "f1-game/internal/actor_remote" cherryApp "f1-game/internal/cherry_app" "f1-game/internal/code" "f1-game/internal/component/sdk" sdkFacade "f1-game/internal/component/sdk/define/facade" sdkKey "f1-game/internal/component/sdk/define/key" "f1-game/internal/constant" "f1-game/internal/data" nameLocal "f1-game/internal/name/local" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/nodes/game/player/charge" cstring "github.com/cherry-game/cherry/extend/string" cproto "github.com/cherry-game/cherry/net/proto" ) func (p *actorPlayer) initCharge() { p.Local().Register(nameLocal.Player_ChargeCreate, p.chargeCreate) p.Remote().Register(nameRemote.Player_ChargeDeliver, p.chargeDeliver) } // chargeCreate 充值项订单创建 func (p *actorPlayer) chargeCreate(session *cproto.Session, req *pb.ChargeCreate) { chargeRow, found := data.Charge.GetByID(req.ChargeID) if !found || chargeRow.Amount < 1 { p.ResponseCode(session, code.PayChargeIDError) return } pid := sessions.GetPID(session) sdkRow := data.SDK.Get(pid) if sdkRow == nil { p.ResponseCode(session, code.PIDError) return } sdkInvoke, err := sdk.GetInvoke(sdkRow.SdkID) if err != nil { p.ResponseCode(session, code.PIDError) return } // 根据chargeID,检查充值项 errCode := charge.Service().OnCheck(p.playerID, req.ChargeID, req.ChargeType, req.ChargeParams) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 通过pay节点创建订单,返回订单id orderID, errCode := p.createPayOrder(session, req, chargeRow) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 构建订单签名 input := sdkFacade.ParamsMap{} input.Put(sdkKey.GameNodeID, cherryApp.NodeID()) input.Put(sdkKey.PID, sessions.GetPID(session)) input.Put(sdkKey.OpenID, sessions.GetOpenID(session)) input.Put(sdkKey.UID, session.Uid) input.Put(sdkKey.PlayerID, sessions.GetPlayerID(session)) input.Put(sdkKey.OrderID, orderID) params, errCode := sdkInvoke.OrderSign(sdkRow, chargeRow, input) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } rsp := &pb.ChargeCreateResponse{ ChargeID: req.ChargeID, OrderID: orderID, Params: params, } p.Response(session, rsp) } func (p *actorPlayer) createPayOrder(session *cproto.Session, req *pb.ChargeCreate, chargeRow *data.ChargeRow) (int64, int32) { playerTable := p.PlayerTable() createOrder := &pb.CreateOrder{ PID: playerTable.PID, UID: playerTable.UID, GameNodeID: playerTable.NodeID, PlayerID: playerTable.PlayerID, ChargeID: chargeRow.ID, Amount: chargeRow.Amount, ClientOS: 0, // 需要在玩家登录的时候带入到session里,然后直接读取 Ip: session.Ip, Extra: map[string]string{ constant.ChargeKeyType: cstring.ToString(req.ChargeType), constant.ChargeKeyParams: cstring.ToString(req.ChargeParams), }, } // 调用pay node创建订单ID信息,下发给客户端 return actorRemote.PayOrder.Create(createOrder) } // chargeDeliver 充值项订单发货 {server-id}.player.orderDeliver func (p *actorPlayer) chargeDeliver(req *pb.OrderDeliver) int32 { _, found := data.Charge.GetByID(req.ChargeID) if !found { return code.PayChargeIDError } if req.Extra == nil { return code.PayChargeParamsError } chargeType, ok := req.GetExtraI32(constant.ChargeKeyType) if !ok { return code.PayChargeTypeError } chargeParams, ok := req.GetExtraI32(constant.ChargeKeyParams) if !ok { return code.PayChargeParamsError } errCode := charge.Service().OnDeliver(p.playerID, req.ChargeID, chargeType, chargeParams) if code.IsFail(errCode) { p.Warn("[chargeDeliver] OnDeliver fail. req = %v, errCode = %d", req, errCode) } return code.OK }