player_charge.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. nameLocal "f1-game/internal/name/local"
  12. nameRemote "f1-game/internal/name/remote"
  13. "f1-game/internal/pb"
  14. "f1-game/internal/sessions"
  15. "f1-game/nodes/game/player/charge"
  16. cstring "github.com/cherry-game/cherry/extend/string"
  17. cproto "github.com/cherry-game/cherry/net/proto"
  18. )
  19. func (p *actorPlayer) initCharge() {
  20. p.Local().Register(nameLocal.Player_ChargeCreate, p.chargeCreate)
  21. p.Remote().Register(nameRemote.Player_ChargeDeliver, p.chargeDeliver)
  22. }
  23. // chargeCreate 充值项订单创建
  24. func (p *actorPlayer) chargeCreate(session *cproto.Session, req *pb.ChargeCreate) {
  25. chargeRow, found := data.Charge.GetByID(req.ChargeID)
  26. if !found || chargeRow.Amount < 1 {
  27. p.ResponseCode(session, code.PayChargeIDError)
  28. return
  29. }
  30. pid := sessions.GetPID(session)
  31. sdkRow := data.SDK.Get(pid)
  32. if sdkRow == nil {
  33. p.ResponseCode(session, code.PIDError)
  34. return
  35. }
  36. sdkInvoke, err := sdk.GetInvoke(sdkRow.SdkID)
  37. if err != nil {
  38. p.ResponseCode(session, code.PIDError)
  39. return
  40. }
  41. // 根据chargeID,检查充值项
  42. errCode := charge.Service().OnCheck(p.playerID, req.ChargeID, req.ChargeType, req.ChargeParams)
  43. if code.IsFail(errCode) {
  44. p.ResponseCode(session, errCode)
  45. return
  46. }
  47. // 通过pay节点创建订单,返回订单id
  48. orderID, errCode := p.createPayOrder(session, req, chargeRow)
  49. if code.IsFail(errCode) {
  50. p.ResponseCode(session, errCode)
  51. return
  52. }
  53. // 构建订单签名
  54. input := sdkFacade.ParamsMap{}
  55. input.Put(sdkKey.GameNodeID, cherryApp.NodeID())
  56. input.Put(sdkKey.PID, sessions.GetPID(session))
  57. input.Put(sdkKey.OpenID, sessions.GetOpenID(session))
  58. input.Put(sdkKey.UID, session.Uid)
  59. input.Put(sdkKey.PlayerID, sessions.GetPlayerID(session))
  60. input.Put(sdkKey.OrderID, orderID)
  61. params, errCode := sdkInvoke.OrderSign(sdkRow, chargeRow, input)
  62. if code.IsFail(errCode) {
  63. p.ResponseCode(session, errCode)
  64. return
  65. }
  66. rsp := &pb.ChargeCreateResponse{
  67. ChargeID: req.ChargeID,
  68. OrderID: orderID,
  69. Params: params,
  70. }
  71. p.Response(session, rsp)
  72. }
  73. func (p *actorPlayer) createPayOrder(session *cproto.Session, req *pb.ChargeCreate, chargeRow *data.ChargeRow) (int64, int32) {
  74. playerTable := p.PlayerTable()
  75. createOrder := &pb.CreateOrder{
  76. PID: playerTable.PID,
  77. UID: playerTable.UID,
  78. GameNodeID: playerTable.NodeID,
  79. PlayerID: playerTable.PlayerID,
  80. ChargeID: chargeRow.ID,
  81. Amount: chargeRow.Amount,
  82. ClientOS: 0, // 需要在玩家登录的时候带入到session里,然后直接读取
  83. Ip: session.Ip,
  84. Extra: map[string]string{
  85. constant.ChargeKeyType: cstring.ToString(req.ChargeType),
  86. constant.ChargeKeyParams: cstring.ToString(req.ChargeParams),
  87. },
  88. }
  89. // 调用pay node创建订单ID信息,下发给客户端
  90. return actorRemote.PayOrder.Create(createOrder)
  91. }
  92. // chargeDeliver 充值项订单发货 {server-id}.player.orderDeliver
  93. func (p *actorPlayer) chargeDeliver(req *pb.OrderDeliver) int32 {
  94. _, found := data.Charge.GetByID(req.ChargeID)
  95. if !found {
  96. return code.PayChargeIDError
  97. }
  98. if req.Extra == nil {
  99. return code.PayChargeParamsError
  100. }
  101. chargeType, ok := req.GetExtraI32(constant.ChargeKeyType)
  102. if !ok {
  103. return code.PayChargeTypeError
  104. }
  105. chargeParams, ok := req.GetExtraI32(constant.ChargeKeyParams)
  106. if !ok {
  107. return code.PayChargeParamsError
  108. }
  109. errCode := charge.Service().OnDeliver(p.playerID, req.ChargeID, chargeType, chargeParams)
  110. if code.IsFail(errCode) {
  111. p.Warn("[chargeDeliver] OnDeliver fail. req = %v, errCode = %d", req, errCode)
  112. }
  113. return code.OK
  114. }