player_charge.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package player
  2. import (
  3. actorRemote "f1-game/internal/actor_remote"
  4. cherryApp "f1-game/internal/cherry_app"
  5. "f1-game/internal/code"
  6. "f1-game/internal/component/sdk"
  7. sdkFacade "f1-game/internal/component/sdk/define/facade"
  8. sdkKey "f1-game/internal/component/sdk/define/key"
  9. "f1-game/internal/constant"
  10. "f1-game/internal/data"
  11. "f1-game/internal/enum"
  12. nameLocal "f1-game/internal/name/local"
  13. nameRemote "f1-game/internal/name/remote"
  14. "f1-game/internal/pb"
  15. "f1-game/internal/sessions"
  16. "f1-game/nodes/game/internal/db"
  17. gameFacade "f1-game/nodes/game/internal/facade"
  18. ao "f1-game/nodes/game/player/asset/origin"
  19. "f1-game/nodes/game/player/charge"
  20. cstring "github.com/cherry-game/cherry/extend/string"
  21. ctime "github.com/cherry-game/cherry/extend/time"
  22. cproto "github.com/cherry-game/cherry/net/proto"
  23. )
  24. func (p *actorPlayer) initCharge() {
  25. p.Local().Register(nameLocal.Player_ChargeCreate, p.chargeCreate)
  26. p.Local().Register(nameLocal.Player_ChargeCardReward, p.chargeCardReward)
  27. p.Remote().Register(nameRemote.Player_ChargeDeliver, p.chargeDeliver)
  28. }
  29. // chargeCreate 充值项订单创建
  30. func (p *actorPlayer) chargeCreate(session *cproto.Session, req *pb.ChargeCreate) {
  31. chargeRow, found := data.Charge.GetByID(req.ChargeID)
  32. if !found || chargeRow.Amount < 1 {
  33. p.ResponseCode(session, code.PayChargeIDError)
  34. return
  35. }
  36. pid := sessions.GetPID(session)
  37. sdkRow := data.SDK.Get(pid)
  38. if sdkRow == nil {
  39. p.ResponseCode(session, code.PIDError)
  40. return
  41. }
  42. sdkInvoke, err := sdk.GetInvoke(sdkRow.SdkID)
  43. if err != nil {
  44. p.ResponseCode(session, code.PIDError)
  45. return
  46. }
  47. // 根据chargeID,检查充值项
  48. errCode := charge.Service().OnCheck(p.playerID, req.ChargeID, chargeRow.ChargeType, req.ChargeParams)
  49. if code.IsFail(errCode) {
  50. p.ResponseCode(session, errCode)
  51. return
  52. }
  53. // 通过order actor 创建订单,返回订单id
  54. orderID, errCode := p.createPayOrder(session, req, chargeRow)
  55. if code.IsFail(errCode) {
  56. p.ResponseCode(session, errCode)
  57. return
  58. }
  59. // 构建订单签名
  60. input := sdkFacade.ParamsMap{}
  61. input.Put(sdkKey.GameNodeID, cherryApp.NodeID())
  62. input.Put(sdkKey.PID, sessions.GetPID(session))
  63. input.Put(sdkKey.OpenID, sessions.GetOpenID(session))
  64. input.Put(sdkKey.UID, session.Uid)
  65. input.Put(sdkKey.PlayerID, sessions.GetPlayerID(session))
  66. input.Put(sdkKey.OrderID, orderID)
  67. params, errCode := sdkInvoke.OrderSign(sdkRow, chargeRow, input)
  68. if code.IsFail(errCode) {
  69. p.ResponseCode(session, errCode)
  70. return
  71. }
  72. rsp := &pb.ChargeCreateResponse{
  73. ChargeID: req.ChargeID,
  74. OrderID: orderID,
  75. Params: params,
  76. }
  77. p.Response(session, rsp)
  78. }
  79. func (p *actorPlayer) createPayOrder(session *cproto.Session, req *pb.ChargeCreate, chargeRow *data.ChargeRow) (int64, int32) {
  80. playerTable := p.PlayerTable()
  81. createOrder := &pb.CreateOrder{
  82. PID: playerTable.PID,
  83. UID: playerTable.UID,
  84. GameNodeID: playerTable.NodeID,
  85. PlayerID: playerTable.PlayerID,
  86. ChargeID: chargeRow.ID,
  87. Amount: chargeRow.Amount,
  88. ClientOS: 0, // 需要在玩家登录的时候带入到session里,然后直接读取
  89. Ip: session.Ip,
  90. Extra: map[string]string{
  91. constant.ChargeKeyType: cstring.ToString(chargeRow.ChargeType),
  92. constant.ChargeKeyParams: cstring.ToString(req.ChargeParams),
  93. constant.ChargeKeyGameNodeID: cstring.ToString(playerTable.NodeID),
  94. },
  95. }
  96. // 调用order actor 创建订单ID信息,下发给客户端
  97. return actorRemote.GameOrder.Create(createOrder)
  98. }
  99. // 每日周月卡奖励领取
  100. func (p *actorPlayer) chargeCardReward(session *cproto.Session, req *pb.I32) {
  101. cardID := req.Value
  102. if cardID < 1 {
  103. p.ResponseCode(session, code.IllegalArgument)
  104. return
  105. }
  106. row, ok := data.ShopCard.GetByID(cardID)
  107. if !ok {
  108. p.ResponseCode(session, code.ConfigNotFound_ShopCard)
  109. return
  110. }
  111. chargeTable := db.GetChargeTable(p.playerID)
  112. card, ok := chargeTable.Cards.Get(cardID)
  113. if !ok {
  114. p.ResponseCode(session, code.IllegalArgument)
  115. return
  116. }
  117. if card.ExpireTime < ctime.Now().ToMillisecond() {
  118. p.ResponseCode(session, code.VipCardExpired)
  119. return
  120. }
  121. if card.IsReceive {
  122. p.ResponseCode(session, code.VipCardAlreadyReceived)
  123. return
  124. }
  125. // 先保存,再发放奖励
  126. card.IsReceive = true
  127. chargeTable.Save2Queue()
  128. gameFacade.Asset.Adds(p.playerID, row.DayRewards, ao.None, true)
  129. p.ResponseCode(session, code.OK)
  130. p.Debug("[chargeCardReward] receive success. playerID = %d, cardID = %d", p.playerID, cardID)
  131. }
  132. // chargeDeliver 充值项订单发货 {server-id}.player.orderDeliver
  133. func (p *actorPlayer) chargeDeliver(req *pb.OrderDeliver) int32 {
  134. chargeRow, found := data.Charge.GetByID(req.ChargeID)
  135. if !found {
  136. return code.PayChargeIDError
  137. }
  138. if req.Extra == nil {
  139. return code.PayChargeParamsError
  140. }
  141. chargeType, ok := req.GetExtraI32(constant.ChargeKeyType)
  142. if !ok || chargeRow.ChargeType != chargeType {
  143. return code.PayChargeTypeError
  144. }
  145. chargeParams, ok := req.GetExtraI32(constant.ChargeKeyParams)
  146. if !ok {
  147. return code.PayChargeParamsError
  148. }
  149. errCode := charge.Service().OnDeliver(p.playerID, req.ChargeID, chargeType, chargeParams)
  150. if code.IsFail(errCode) {
  151. p.Warn("[chargeDeliver] OnDeliver fail. req = %v, errCode = %d", req, errCode)
  152. }
  153. // 统一逻辑,加充值积分
  154. if chargeRow.ChargePoints > 0 {
  155. gameFacade.Asset.Add(p.playerID, enum.ItemIDChargePoint, int64(chargeRow.ChargePoints), ao.None, true)
  156. }
  157. return code.OK
  158. }