syntax = "proto3"; package hyapp.wallet.v1; option go_package = "hyapp.local/api/proto/wallet/v1;walletv1"; // DebitGiftRequest 是 room-service 送礼同步扣费的最小账务输入。 message DebitGiftRequest { string command_id = 1; string room_id = 2; int64 sender_user_id = 3; int64 target_user_id = 4; string gift_id = 5; int32 gift_count = 6; // price_version 为空时使用当前生效价格;非空时必须命中 active 价格版本。 string price_version = 7; string app_code = 8; // region_id 来自 room-service 房间 visible_region_id,用于校验礼物区域可用性和匹配房间贡献比例。 int64 region_id = 9; // target_is_host 由 gateway 根据 user-service active host profile 注入,客户端不能直接声明。 bool target_is_host = 10; // target_host_region_id 是主播身份所属区域,用于后续按主播区域匹配工资政策。 int64 target_host_region_id = 11; // target_agency_owner_user_id 是送礼时主播归属 Agency 的 owner,用于后续代理工资结算。 int64 target_agency_owner_user_id = 12; // sender_region_id 是送礼用户所属区域快照;不能用房间 visible_region_id 替代。 int64 sender_region_id = 13; // entitlement_id 非空表示本次送礼从用户背包 gift 权益扣库存,不扣 COIN。 string entitlement_id = 14; // charge_source 区分 coin/bag;为空按 coin 兼容旧客户端。 string charge_source = 15; } // DebitDirectGiftRequest 是私聊送礼的账务命令;gateway 负责用 user-service 补齐区域和主播身份。 message DebitDirectGiftRequest { string command_id = 1; int64 sender_user_id = 2; int64 target_user_id = 3; string gift_id = 4; int32 gift_count = 5; string price_version = 6; string app_code = 7; // region_id 使用 sender 当前 region_id;私聊没有房间可见区域,不能接收客户端自报区域。 int64 region_id = 8; int64 sender_region_id = 9; bool target_is_host = 10; int64 target_host_region_id = 11; int64 target_agency_owner_user_id = 12; string entitlement_id = 13; string charge_source = 14; } // DebitGiftResponse 返回扣费流水、服务端结算值和 sender COIN 账后余额。 message DebitGiftResponse { string billing_receipt_id = 1; string transaction_id = 2; int64 coin_spent = 3; // gift_point_added 是历史回执字段;GIFT_POINT 已下线,新送礼固定返回 0。 int64 gift_point_added = 4; int64 heat_value = 5; string price_version = 6; // balance_after 是 sender 被扣费资产 available_amount 账后余额。 int64 balance_after = 7; string charge_asset_type = 8; int64 charge_amount = 9; string gift_type_code = 10; // host_period_diamond_added 是本次送礼给主播周期钻石账户增加的钻石;非主播为 0。 int64 host_period_diamond_added = 11; // host_period_cycle_key 是 UTC 月周期,例如 2026-05;非主播为空。 string host_period_cycle_key = 12; // cp_relation_type 只在 CP 礼物、兄弟礼物、姐妹礼物上有值,用于 room outbox 驱动关系申请。 string cp_relation_type = 13; string gift_name = 14; string gift_icon_url = 15; string gift_animation_url = 16; repeated string gift_effect_types = 17; string entitlement_id = 18; string charge_source = 19; // gift_income_coin_amount 是本次给收礼人返还的 COIN;0 表示当前礼物类型/区域不返币。 int64 gift_income_coin_amount = 20; // gift_income_balance_after 是收礼人 COIN 账后余额;未返币时为 0。 int64 gift_income_balance_after = 21; // host_point_added 是命中 App 收益政策后给主播 POINT 钱包增加的积分;不参与房间热度/贡献榜。 int64 host_point_added = 22; // host_point_balance_after 是主播 POINT 入账后的可用余额;未命中 POINT 政策时为 0。 int64 host_point_balance_after = 23; // host_point_asset_type 当前固定为 POINT,显式返回避免客户端把收益积分当成 COIN。 string host_point_asset_type = 24; // host_point_policy_instance_code 是本次使用的策略实例快照。 string host_point_policy_instance_code = 25; string host_point_template_code = 26; string host_point_template_version = 27; } // DebitGiftTarget 是一笔批量送礼中的单个接收方账务快照。 message DebitGiftTarget { // command_id 是该目标的账务幂等键,由 room-service 从房间 command_id 派生。 string command_id = 1; int64 target_user_id = 2; bool target_is_host = 3; int64 target_host_region_id = 4; int64 target_agency_owner_user_id = 5; } // BatchDebitGiftRequest 在一个钱包事务内完成同一 sender 对多个 target 的送礼扣费。 message BatchDebitGiftRequest { string command_id = 1; string room_id = 2; int64 sender_user_id = 3; string gift_id = 4; int32 gift_count = 5; string price_version = 6; string app_code = 7; // region_id 来自 room-service 房间 visible_region_id,用于校验礼物区域可用性和匹配房间贡献比例。 int64 region_id = 8; int64 sender_region_id = 9; repeated DebitGiftTarget targets = 10; string entitlement_id = 11; string charge_source = 12; } // BatchDebitGiftReceipt 保留每个目标独立交易的回执,房间事件按它逐目标落事实。 message BatchDebitGiftReceipt { int64 target_user_id = 1; string command_id = 2; DebitGiftResponse billing = 3; } // BatchDebitGiftResponse 返回批量聚合值和逐目标账务回执。 message BatchDebitGiftResponse { DebitGiftResponse aggregate = 1; repeated BatchDebitGiftReceipt receipts = 2; } // DebitRobotGiftRequest 是机器人房间内部送礼扣费命令。 // 它只扣 ROBOT_COIN,不产生主播钻石、真实充值消费流水或普通礼物墙投影。 message DebitRobotGiftRequest { string command_id = 1; string room_id = 2; int64 sender_user_id = 3; int64 target_user_id = 4; string gift_id = 5; int32 gift_count = 6; string price_version = 7; string app_code = 8; int64 region_id = 9; int64 sender_region_id = 10; } // AssetBalance 是用户某类资产的余额投影。 message AssetBalance { string asset_type = 1; int64 available_amount = 2; int64 frozen_amount = 3; int64 version = 4; string app_code = 5; } // GetBalancesRequest 查询用户多资产余额;内部调用方负责鉴权和用户范围控制。 message GetBalancesRequest { string request_id = 1; int64 user_id = 2; repeated string asset_types = 3; string app_code = 4; } message GetBalancesResponse { repeated AssetBalance balances = 1; } message HostSalaryPolicyLevel { int32 level_no = 1; int64 required_diamonds = 2; int64 host_salary_usd_minor = 3; int64 host_coin_reward = 4; int64 agency_salary_usd_minor = 5; string status = 6; int32 sort_order = 7; } message HostSalaryPolicy { uint64 policy_id = 1; string name = 2; int64 region_id = 3; string status = 4; string settlement_mode = 5; string settlement_trigger_mode = 6; string gift_coin_to_diamond_ratio = 7; string residual_diamond_to_usd_rate = 8; int64 effective_from_ms = 9; int64 effective_to_ms = 10; repeated HostSalaryPolicyLevel levels = 11; } message GetActiveHostSalaryPolicyRequest { string request_id = 1; string app_code = 2; int64 region_id = 3; string settlement_mode = 4; string settlement_trigger_mode = 5; int64 now_ms = 6; } message GetActiveHostSalaryPolicyResponse { bool found = 1; HostSalaryPolicy policy = 2; } message HostSalaryProgress { int64 host_user_id = 1; string cycle_key = 2; int64 region_id = 3; int64 agency_owner_user_id = 4; int64 total_diamonds = 5; int64 gift_diamond_total = 6; int64 updated_at_ms = 7; } message GetHostSalaryProgressRequest { string request_id = 1; string app_code = 2; int64 host_user_id = 3; string cycle_key = 4; int64 now_ms = 5; } message GetHostSalaryProgressResponse { HostSalaryProgress progress = 1; } // TeamHostSalaryCycleStat 是一组 Agency 收款人名下主播在单个工资周期内的工资统计。 // estimated 口径是“预收入”:按当前累计钻石命中的政策档位工资 + 未达下一档剩余钻石按月底费率折美元, // 与已结算累计取大,保证已关闭周期回读时等于真实发放值。 message TeamHostSalaryCycleStat { string cycle_key = 1; int64 estimated_host_salary_usd_minor = 2; int64 settled_host_salary_usd_minor = 3; // active_host_count 统计该周期内累计钻石大于 0 的主播数。 int32 active_host_count = 4; int64 total_diamonds = 5; } message GetTeamHostSalaryStatsRequest { string request_id = 1; string app_code = 2; // agency_owner_user_ids 由调用方(gateway)从 user-service 组织树解析后传入;wallet 只按周期账户上的收款人快照聚合。 repeated int64 agency_owner_user_ids = 3; repeated string cycle_keys = 4; // now_ms 用于解析各区域当前生效的工资政策做档位估算。 int64 now_ms = 5; } message GetTeamHostSalaryStatsResponse { repeated TeamHostSalaryCycleStat stats = 1; int64 server_time_ms = 2; } // AdminCreditAssetRequest 是后台手动入账/调账的最小审计命令。 message AdminCreditAssetRequest { string command_id = 1; int64 target_user_id = 2; string asset_type = 3; int64 amount = 4; int64 operator_user_id = 5; string reason = 6; string evidence_ref = 7; string app_code = 8; string remark = 9; } message AdminCreditAssetResponse { string transaction_id = 1; AssetBalance balance = 2; } // AdminCreditCoinSellerStockRequest 是后台调整币商专用库存的账务命令。 message AdminCreditCoinSellerStockRequest { string command_id = 1; int64 seller_user_id = 2; string stock_type = 3; int64 coin_amount = 4; string paid_currency_code = 5; int64 paid_amount_micro = 6; string payment_ref = 7; string evidence_ref = 8; int64 operator_user_id = 9; string reason = 10; string app_code = 11; int64 seller_country_id = 12; int64 seller_region_id = 13; } message AdminCreditCoinSellerStockResponse { string transaction_id = 1; int64 seller_user_id = 2; string stock_type = 3; int64 coin_amount = 4; string paid_currency_code = 5; int64 paid_amount_micro = 6; bool counts_as_seller_recharge = 7; int64 balance_after = 8; int64 created_at_ms = 9; } // TransferCoinFromSellerRequest 是币商给玩家转普通金币的内部账务命令。 message TransferCoinFromSellerRequest { string command_id = 1; int64 seller_user_id = 2; int64 target_user_id = 3; int64 amount = 4; string reason = 5; string app_code = 6; // seller_region_id、target_region_id 和 target_country_id 由 gateway 从 user-service 查询,不接受客户端提交。 int64 seller_region_id = 7; int64 target_region_id = 8; int64 target_country_id = 9; } // TransferCoinFromSellerResponse 同时返回金币到账结果和本次转账对应的充值金额口径。 message TransferCoinFromSellerResponse { string transaction_id = 1; int64 seller_balance_after = 2; int64 target_balance_after = 3; int64 amount = 4; int64 recharge_usd_minor = 5; string recharge_currency_code = 6; int64 recharge_policy_id = 7; string recharge_policy_version = 8; int64 recharge_policy_coin_amount = 9; int64 recharge_policy_usd_minor_amount = 10; } // CoinSellerSalaryExchangeRateTier 是用户工资转给币商时,按区域和美元金额命中的金币兑换区间。 message CoinSellerSalaryExchangeRateTier { int64 region_id = 1; int64 min_usd_minor = 2; int64 max_usd_minor = 3; int64 coin_per_usd = 4; string status = 5; int32 sort_order = 6; int64 updated_at_ms = 7; } message ListCoinSellerSalaryExchangeRateTiersRequest { string request_id = 1; string app_code = 2; int64 region_id = 3; bool include_disabled = 4; } message ListCoinSellerSalaryExchangeRateTiersResponse { repeated CoinSellerSalaryExchangeRateTier tiers = 1; } // ExchangeSalaryToCoinRequest 扣当前用户某个身份工资美元钱包,并按固定比例给同一用户加普通 COIN。 message ExchangeSalaryToCoinRequest { string command_id = 1; int64 user_id = 2; string salary_asset_type = 3; int64 salary_usd_minor = 4; string reason = 5; string app_code = 6; } message ExchangeSalaryToCoinResponse { string transaction_id = 1; int64 salary_balance_after = 2; int64 coin_balance_after = 3; int64 salary_usd_minor = 4; int64 coin_amount = 5; int64 coin_per_usd = 6; } // TransferSalaryToCoinSellerRequest 扣当前用户某个身份工资美元钱包,并按区域区间比例给同区域币商加专用金币库存。 message TransferSalaryToCoinSellerRequest { string command_id = 1; int64 source_user_id = 2; int64 seller_user_id = 3; string salary_asset_type = 4; int64 salary_usd_minor = 5; int64 region_id = 6; string reason = 7; string app_code = 8; } message TransferSalaryToCoinSellerResponse { string transaction_id = 1; int64 source_salary_balance_after = 2; int64 seller_balance_after = 3; int64 salary_usd_minor = 4; int64 coin_amount = 5; int64 coin_per_usd = 6; int64 rate_min_usd_minor = 7; int64 rate_max_usd_minor = 8; } // FreezeSalaryWithdrawalRequest 将用户工资美元从可用余额转入冻结余额,等待财务审核。 message FreezeSalaryWithdrawalRequest { string command_id = 1; int64 user_id = 2; string salary_asset_type = 3; int64 salary_usd_minor = 4; string reason = 5; string app_code = 6; string withdrawal_ref = 7; } message FreezeSalaryWithdrawalResponse { string transaction_id = 1; AssetBalance balance = 2; int64 salary_usd_minor = 3; } // SettleSalaryWithdrawalRequest 在审核通过时扣掉已冻结工资;不会再扣可用余额。 message SettleSalaryWithdrawalRequest { string command_id = 1; int64 user_id = 2; string salary_asset_type = 3; int64 salary_usd_minor = 4; int64 operator_user_id = 5; string reason = 6; string app_code = 7; string withdrawal_application_id = 8; } message SettleSalaryWithdrawalResponse { string transaction_id = 1; AssetBalance balance = 2; int64 salary_usd_minor = 3; } // ReleaseSalaryWithdrawalRequest 在审核拒绝或申请创建失败回滚时把冻结工资返还到可用余额。 message ReleaseSalaryWithdrawalRequest { string command_id = 1; int64 user_id = 2; string salary_asset_type = 3; int64 salary_usd_minor = 4; int64 operator_user_id = 5; string reason = 6; string app_code = 7; string withdrawal_application_id = 8; } message ReleaseSalaryWithdrawalResponse { string transaction_id = 1; AssetBalance balance = 2; int64 salary_usd_minor = 3; } // FreezePointWithdrawalRequest 将 Huwaa 策略积分从可用余额冻结到提现审核池。 message FreezePointWithdrawalRequest { string command_id = 1; int64 user_id = 2; // asset_type 只能是 POINT 或 COIN_SELLER_POINT;旧工资美元资产继续使用 SalaryWithdrawal 接口。 string asset_type = 3; // gross_point_amount 是本次冻结的积分总额,Huwaa 普通 POINT 最低 1,000,000。 int64 gross_point_amount = 4; // fee_point_amount 是平台手续费积分;为空时服务端按 fee_bps 计算。 int64 fee_point_amount = 5; // net_point_amount 是预计到账积分,必须等于 gross - fee;为空时服务端计算。 int64 net_point_amount = 6; // points_per_usd 是展示折算快照,Huwaa 第一套默认 100000。 int64 points_per_usd = 7; int32 fee_bps = 8; string reason = 9; string app_code = 10; string withdrawal_ref = 11; } message FreezePointWithdrawalResponse { string transaction_id = 1; AssetBalance balance = 2; int64 gross_point_amount = 3; int64 fee_point_amount = 4; int64 net_point_amount = 5; int64 points_per_usd = 6; int32 fee_bps = 7; } // SettlePointWithdrawalRequest 在审核通过时扣掉已冻结积分;不会再次扣 available。 message SettlePointWithdrawalRequest { string command_id = 1; int64 user_id = 2; string asset_type = 3; int64 gross_point_amount = 4; int64 fee_point_amount = 5; int64 net_point_amount = 6; int64 points_per_usd = 7; int32 fee_bps = 8; int64 operator_user_id = 9; string reason = 10; string app_code = 11; string withdrawal_application_id = 12; } message SettlePointWithdrawalResponse { string transaction_id = 1; AssetBalance balance = 2; int64 gross_point_amount = 3; int64 fee_point_amount = 4; int64 net_point_amount = 5; int64 points_per_usd = 6; int32 fee_bps = 7; } // ReleasePointWithdrawalRequest 在审核拒绝或申请创建失败时释放冻结积分。 message ReleasePointWithdrawalRequest { string command_id = 1; int64 user_id = 2; string asset_type = 3; int64 gross_point_amount = 4; int64 fee_point_amount = 5; int64 net_point_amount = 6; int64 points_per_usd = 7; int32 fee_bps = 8; int64 operator_user_id = 9; string reason = 10; string app_code = 11; string withdrawal_application_id = 12; } message ReleasePointWithdrawalResponse { string transaction_id = 1; AssetBalance balance = 2; int64 gross_point_amount = 3; int64 fee_point_amount = 4; int64 net_point_amount = 5; int64 points_per_usd = 6; int32 fee_bps = 7; } // Resource 是资源库里可配置、可赠送、可被礼物引用的最小资源。 message Resource { string app_code = 1; int64 resource_id = 2; string resource_code = 3; string resource_type = 4; string name = 5; string status = 6; bool grantable = 7; string grant_strategy = 8; string wallet_asset_type = 9; int64 wallet_asset_amount = 10; repeated string usage_scopes = 11; string asset_url = 12; string preview_url = 13; string animation_url = 14; string metadata_json = 15; int32 sort_order = 16; int64 created_by_user_id = 17; int64 updated_by_user_id = 18; int64 created_at_ms = 19; int64 updated_at_ms = 20; bool manager_grant_enabled = 21; string price_type = 22; int64 coin_price = 23; // gift_point_amount 是历史字段;资源和礼物价格现在只维护真实 COIN 价格,新写入固定为 0。 int64 gift_point_amount = 24; } message ResourceGroupItem { int64 group_item_id = 1; int64 group_id = 2; int64 resource_id = 3; Resource resource = 4; int64 quantity = 5; int64 duration_ms = 6; int32 sort_order = 7; int64 created_at_ms = 8; int64 updated_at_ms = 9; string item_type = 10; string wallet_asset_type = 11; int64 wallet_asset_amount = 12; } message ResourceGroup { string app_code = 1; int64 group_id = 2; string group_code = 3; string name = 4; string status = 5; string description = 6; int32 sort_order = 7; repeated ResourceGroupItem items = 8; int64 created_by_user_id = 9; int64 updated_by_user_id = 10; int64 created_at_ms = 11; int64 updated_at_ms = 12; } message GiftConfig { string app_code = 1; string gift_id = 2; int64 resource_id = 3; Resource resource = 4; string status = 5; string name = 6; int32 sort_order = 7; string presentation_json = 8; string price_version = 9; int64 coin_price = 10; // gift_point_amount 是历史字段;送礼结算不再读取该值,新写入固定为 0。 int64 gift_point_amount = 11; int64 heat_value = 12; int64 created_by_user_id = 13; int64 updated_by_user_id = 14; int64 created_at_ms = 15; int64 updated_at_ms = 16; repeated int64 region_ids = 17; string gift_type_code = 18; string charge_asset_type = 19; int64 effective_from_ms = 20; int64 effective_to_ms = 21; repeated string effect_types = 22; string cp_relation_type = 23; } message GiftTypeConfig { string app_code = 1; string type_code = 2; string name = 3; string tab_key = 4; string status = 5; int32 sort_order = 6; int64 created_by_user_id = 7; int64 updated_by_user_id = 8; int64 created_at_ms = 9; int64 updated_at_ms = 10; } message ResourceShopItem { string app_code = 1; int64 shop_item_id = 2; int64 resource_id = 3; Resource resource = 4; string status = 5; int32 duration_days = 6; string price_type = 7; int64 coin_price = 8; int64 effective_from_ms = 9; int64 effective_to_ms = 10; int32 sort_order = 11; int64 created_by_user_id = 12; int64 updated_by_user_id = 13; int64 created_at_ms = 14; int64 updated_at_ms = 15; } message UserResourceEntitlement { string app_code = 1; string entitlement_id = 2; int64 user_id = 3; int64 resource_id = 4; Resource resource = 5; string status = 6; int64 quantity = 7; int64 remaining_quantity = 8; int64 effective_at_ms = 9; int64 expires_at_ms = 10; string source_grant_id = 11; int64 created_at_ms = 12; int64 updated_at_ms = 13; bool equipped = 14; } message ResourceGrantItem { int64 grant_item_id = 1; string grant_id = 2; int64 resource_id = 3; string resource_snapshot_json = 4; int64 quantity = 5; int64 duration_ms = 6; string result_type = 7; string wallet_transaction_id = 8; string entitlement_id = 9; int64 created_at_ms = 10; } message ResourceGrant { string app_code = 1; string grant_id = 2; string command_id = 3; int64 target_user_id = 4; string grant_source = 5; string grant_subject_type = 6; string grant_subject_id = 7; string status = 8; string reason = 9; int64 operator_user_id = 10; repeated ResourceGrantItem items = 11; int64 created_at_ms = 12; int64 updated_at_ms = 13; int64 revoked_at_ms = 14; int64 revoked_by_user_id = 15; string revoke_reason = 16; } message ResourceGroupItemInput { int64 resource_id = 1; int64 quantity = 2; int64 duration_ms = 3; int32 sort_order = 4; string item_type = 5; string wallet_asset_type = 6; int64 wallet_asset_amount = 7; } message ListResourcesRequest { string request_id = 1; string app_code = 2; string resource_type = 3; string status = 4; string keyword = 5; int32 page = 6; int32 page_size = 7; bool active_only = 8; bool manager_grant_only = 9; } message ListResourcesResponse { repeated Resource resources = 1; int64 total = 2; } message GetResourceRequest { string request_id = 1; string app_code = 2; int64 resource_id = 3; } message GetResourceResponse { Resource resource = 1; } message CreateResourceRequest { string request_id = 1; string app_code = 2; string resource_code = 3; string resource_type = 4; string name = 5; string status = 6; bool grantable = 7; string grant_strategy = 8; string wallet_asset_type = 9; int64 wallet_asset_amount = 10; repeated string usage_scopes = 11; string asset_url = 12; string preview_url = 13; string animation_url = 14; string metadata_json = 15; int32 sort_order = 16; int64 operator_user_id = 17; optional bool manager_grant_enabled = 18; string price_type = 19; int64 coin_price = 20; // gift_point_amount 是历史字段;服务端忽略请求值并固定写入 0。 int64 gift_point_amount = 21; } message UpdateResourceRequest { string request_id = 1; string app_code = 2; int64 resource_id = 3; string resource_code = 4; string resource_type = 5; string name = 6; string status = 7; bool grantable = 8; string grant_strategy = 9; string wallet_asset_type = 10; int64 wallet_asset_amount = 11; repeated string usage_scopes = 12; string asset_url = 13; string preview_url = 14; string animation_url = 15; string metadata_json = 16; int32 sort_order = 17; int64 operator_user_id = 18; optional bool manager_grant_enabled = 19; string price_type = 20; int64 coin_price = 21; // gift_point_amount 是历史字段;服务端忽略请求值并固定写入 0。 int64 gift_point_amount = 22; } message SetResourceStatusRequest { string request_id = 1; string app_code = 2; int64 resource_id = 3; string status = 4; int64 operator_user_id = 5; } message DeleteResourceRequest { string request_id = 1; string app_code = 2; int64 resource_id = 3; int64 operator_user_id = 4; } message BatchDeleteResourcesRequest { string request_id = 1; string app_code = 2; repeated int64 resource_ids = 3; int64 operator_user_id = 4; } message BatchDeleteResourcesResponse { repeated Resource resources = 1; } message ResourceResponse { Resource resource = 1; } message ListResourceGroupsRequest { string request_id = 1; string app_code = 2; string status = 3; string keyword = 4; int32 page = 5; int32 page_size = 6; bool active_only = 7; } message ListResourceGroupsResponse { repeated ResourceGroup groups = 1; int64 total = 2; } message GetResourceGroupRequest { string request_id = 1; string app_code = 2; int64 group_id = 3; } message GetResourceGroupResponse { ResourceGroup group = 1; } message CreateResourceGroupRequest { string request_id = 1; string app_code = 2; string group_code = 3; string name = 4; string status = 5; string description = 6; int32 sort_order = 7; repeated ResourceGroupItemInput items = 8; int64 operator_user_id = 9; } message UpdateResourceGroupRequest { string request_id = 1; string app_code = 2; int64 group_id = 3; string group_code = 4; string name = 5; string status = 6; string description = 7; int32 sort_order = 8; repeated ResourceGroupItemInput items = 9; int64 operator_user_id = 10; } message SetResourceGroupStatusRequest { string request_id = 1; string app_code = 2; int64 group_id = 3; string status = 4; int64 operator_user_id = 5; } message ResourceGroupResponse { ResourceGroup group = 1; } message ListGiftConfigsRequest { string request_id = 1; string app_code = 2; string status = 3; string keyword = 4; int32 page = 5; int32 page_size = 6; bool active_only = 7; int64 region_id = 8; bool filter_region = 9; string gift_type_code = 10; } message ListGiftConfigsResponse { repeated GiftConfig gifts = 1; int64 total = 2; } message ListGiftTypeConfigsRequest { string request_id = 1; string app_code = 2; string status = 3; bool active_only = 4; } message ListGiftTypeConfigsResponse { repeated GiftTypeConfig gift_types = 1; } message UpsertGiftTypeConfigRequest { string request_id = 1; string app_code = 2; string type_code = 3; string name = 4; string tab_key = 5; string status = 6; int32 sort_order = 7; int64 operator_user_id = 8; } message GiftTypeConfigResponse { GiftTypeConfig gift_type = 1; } message CreateGiftConfigRequest { string request_id = 1; string app_code = 2; string gift_id = 3; int64 resource_id = 4; string status = 5; string name = 6; int32 sort_order = 7; string presentation_json = 8; string price_version = 9; int64 coin_price = 10; // gift_point_amount 是历史字段;服务端忽略请求值并固定写入 0。 int64 gift_point_amount = 11; int64 heat_value = 12; int64 effective_at_ms = 13; int64 operator_user_id = 14; repeated int64 region_ids = 15; string gift_type_code = 16; string charge_asset_type = 17; int64 effective_from_ms = 18; int64 effective_to_ms = 19; repeated string effect_types = 20; string cp_relation_type = 21; } message BatchCreateGiftConfigsRequest { string request_id = 1; string app_code = 2; repeated CreateGiftConfigRequest items = 3; int64 operator_user_id = 4; } message BatchCreateGiftConfigsResponse { repeated GiftConfig gifts = 1; } message UpdateGiftConfigRequest { string request_id = 1; string app_code = 2; string gift_id = 3; int64 resource_id = 4; string status = 5; string name = 6; int32 sort_order = 7; string presentation_json = 8; string price_version = 9; int64 coin_price = 10; // gift_point_amount 是历史字段;服务端忽略请求值并固定写入 0。 int64 gift_point_amount = 11; int64 heat_value = 12; int64 effective_at_ms = 13; int64 operator_user_id = 14; repeated int64 region_ids = 15; string gift_type_code = 16; string charge_asset_type = 17; int64 effective_from_ms = 18; int64 effective_to_ms = 19; repeated string effect_types = 20; string cp_relation_type = 21; } message SetGiftConfigStatusRequest { string request_id = 1; string app_code = 2; string gift_id = 3; string status = 4; int64 operator_user_id = 5; } message DeleteGiftConfigRequest { string request_id = 1; string app_code = 2; string gift_id = 3; int64 operator_user_id = 4; } message GiftConfigResponse { GiftConfig gift = 1; } message GrantResourceRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 resource_id = 4; int64 quantity = 5; int64 duration_ms = 6; string reason = 7; int64 operator_user_id = 8; string grant_source = 9; } message GrantResourceGroupRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 group_id = 4; string reason = 5; int64 operator_user_id = 6; string grant_source = 7; } message RevokeResourceGrantRequest { string request_id = 1; string app_code = 2; string grant_id = 3; string reason = 4; int64 operator_user_id = 5; } message ResourceGrantResponse { ResourceGrant grant = 1; } message ListUserResourcesRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; string resource_type = 4; bool active_only = 5; } message ListUserResourcesResponse { repeated UserResourceEntitlement resources = 1; } message EquipUserResourceRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; int64 resource_id = 4; string entitlement_id = 5; } message EquipUserResourceResponse { UserResourceEntitlement resource = 1; } message UnequipUserResourceRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; string resource_type = 4; } message UnequipUserResourceResponse { string resource_type = 1; bool unequipped = 2; int64 updated_at_ms = 3; } message BatchGetUserEquippedResourcesRequest { string request_id = 1; string app_code = 2; repeated int64 user_ids = 3; repeated string resource_types = 4; } message UserEquippedResources { int64 user_id = 1; repeated UserResourceEntitlement resources = 2; } message BatchGetUserEquippedResourcesResponse { repeated UserEquippedResources users = 1; } message ListResourceGrantsRequest { string request_id = 1; string app_code = 2; int64 target_user_id = 3; string status = 4; int32 page = 5; int32 page_size = 6; } message ListResourceGrantsResponse { repeated ResourceGrant grants = 1; int64 total = 2; } message ResourceShopItemInput { int64 shop_item_id = 1; int64 resource_id = 2; string status = 3; int32 duration_days = 4; int64 effective_from_ms = 5; int64 effective_to_ms = 6; int32 sort_order = 7; } message ListResourceShopItemsRequest { string request_id = 1; string app_code = 2; string resource_type = 3; string status = 4; string keyword = 5; int32 page = 6; int32 page_size = 7; bool active_only = 8; } message ListResourceShopItemsResponse { repeated ResourceShopItem items = 1; int64 total = 2; } message UpsertResourceShopItemsRequest { string request_id = 1; string app_code = 2; repeated ResourceShopItemInput items = 3; int64 operator_user_id = 4; } message UpsertResourceShopItemsResponse { repeated ResourceShopItem items = 1; } message SetResourceShopItemStatusRequest { string request_id = 1; string app_code = 2; int64 shop_item_id = 3; string status = 4; int64 operator_user_id = 5; } message ResourceShopItemResponse { ResourceShopItem item = 1; } message PurchaseResourceShopItemRequest { string command_id = 1; string app_code = 2; int64 user_id = 3; int64 shop_item_id = 4; } message PurchaseResourceShopItemResponse { string order_id = 1; string transaction_id = 2; string resource_grant_id = 3; ResourceShopItem shop_item = 4; UserResourceEntitlement resource = 5; AssetBalance balance = 6; int64 coin_spent = 7; } message RechargeBill { string app_code = 1; string transaction_id = 2; string command_id = 3; string recharge_type = 4; string status = 5; string external_ref = 6; int64 user_id = 7; int64 seller_user_id = 8; int64 seller_region_id = 9; int64 target_region_id = 10; int64 policy_id = 11; string policy_version = 12; string currency_code = 13; int64 coin_amount = 14; int64 usd_minor_amount = 15; int64 exchange_coin_amount = 16; int64 exchange_usd_minor_amount = 17; int64 created_at_ms = 18; int64 provider_amount_minor = 19; // provider_code 标识账单实际支付渠道:google_play/mifapay/v5pay/usdt_trc20。 string provider_code = 20; // user_paid_* 是用户实付事实:外部订单来自三方下单快照,Google 订单来自 Play Orders API。 string user_paid_currency_code = 21; int64 user_paid_amount_micro = 22; // provider_fee/tax/net 是三方扣款事实(实付币种微单位);0 表示渠道未提供该数据。 int64 provider_fee_micro = 23; int64 provider_tax_micro = 24; int64 provider_net_micro = 25; // paid_synced_at_ms 仅对 Google 账单有意义:Orders API 实付明细的同步时间,0 表示未同步。 int64 paid_synced_at_ms = 26; } message ListRechargeBillsRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; int64 seller_user_id = 4; int64 region_id = 5; string recharge_type = 6; string status = 7; string keyword = 8; int64 start_at_ms = 9; int64 end_at_ms = 10; int32 page = 11; int32 page_size = 12; // paid_state=unsynced 只看实付明细未同步的谷歌账单(财务补数视图)。 string paid_state = 13; } message ListRechargeBillsResponse { repeated RechargeBill bills = 1; int64 total = 2; } message GetRechargeBillSummaryRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; int64 seller_user_id = 4; int64 region_id = 5; string recharge_type = 6; string status = 7; string keyword = 8; int64 start_at_ms = 9; int64 end_at_ms = 10; } message RechargeBillSummaryBucket { int64 bill_count = 1; int64 coin_amount = 2; int64 usd_minor_amount = 3; } message GetRechargeBillSummaryResponse { RechargeBillSummaryBucket total = 1; RechargeBillSummaryBucket google_play = 2; RechargeBillSummaryBucket third_party = 3; // coin_seller 是币商进货口径:coin_seller_stock_records 里 counts_as_seller_recharge 的进货与冲回净额。 RechargeBillSummaryBucket coin_seller = 4; } message GetRechargeBillOverviewRequest { string request_id = 1; string app_code = 2; int64 region_id = 3; string recharge_type = 4; string status = 5; int64 start_at_ms = 6; int64 end_at_ms = 7; // tz_offset_minutes 决定“日”边界(中国时区 480);日趋势与前端展示同一时区口径。 int32 tz_offset_minutes = 8; } message RechargeBillDailyBucket { // date 为 tz_offset_minutes 时区下的 YYYY-MM-DD。 string date = 1; int64 google_usd_minor = 2; int64 third_party_usd_minor = 3; int64 coin_seller_usd_minor = 4; int64 google_coin_amount = 5; int64 third_party_coin_amount = 6; int64 coin_seller_coin_amount = 7; } message RechargeBillRegionBucket { int64 region_id = 1; int64 bill_count = 2; int64 usd_minor_amount = 3; } // RechargeBillGooglePaidStats 是谷歌实付同步覆盖度与扣费估算: // est_* 只统计已同步且净收入有效的账单,按“美金流水 × 实付占比”折算成 USD 最小单位。 message RechargeBillGooglePaidStats { int64 google_bill_count = 1; int64 synced_count = 2; int64 unsynced_count = 3; int64 covered_usd_minor = 4; int64 est_fee_usd_minor = 5; int64 est_tax_usd_minor = 6; int64 est_net_usd_minor = 7; } // RechargeBillSalaryTransferStats 是“用户提现”口径中来自钱包账本的部分: // 用户把工资 USDT 转给币商(salary_transfer_to_coin_seller)。 message RechargeBillSalaryTransferStats { int64 transfer_count = 1; int64 transfer_usd_minor = 2; } message GetRechargeBillOverviewResponse { repeated RechargeBillDailyBucket daily = 1; repeated RechargeBillRegionBucket regions = 2; RechargeBillGooglePaidStats google_paid = 3; RechargeBillSalaryTransferStats salary_transfer = 4; } message RefreshGooglePaymentPricesRequest { string request_id = 1; string app_code = 2; repeated string transaction_ids = 3; } message GooglePaymentPrice { string transaction_id = 1; string currency_code = 2; int64 paid_amount_micro = 3; int64 tax_micro = 4; int64 net_micro = 5; int64 synced_at_ms = 6; string error = 7; } message RefreshGooglePaymentPricesResponse { repeated GooglePaymentPrice prices = 1; } // WalletFeatureFlags 是我的页和钱包首页使用的操作开关,来源属于 wallet-service。 message WalletFeatureFlags { bool recharge_enabled = 1; bool diamond_exchange_enabled = 2; } message GetWalletOverviewRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; } message GetWalletOverviewResponse { repeated AssetBalance balances = 1; WalletFeatureFlags feature_flags = 2; } // WalletValueSummary 是我的页钱包价值展示的轻量投影,只返回首屏展示需要的金币余额。 message WalletValueSummary { int64 coin_amount = 1; int64 updated_at_ms = 2; } message GetWalletValueSummaryRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; } message GetWalletValueSummaryResponse { WalletValueSummary summary = 1; } // GiftWallItem 是用户礼物墙按礼物类型聚合后的当前投影。 message GiftWallItem { string gift_id = 1; string gift_name = 2; int64 resource_id = 3; Resource resource = 4; string resource_snapshot_json = 5; string gift_type_code = 6; string presentation_json = 7; int64 gift_count = 8; int64 total_value = 9; int64 total_coin_value = 10; int64 total_diamond_value = 11; // total_gift_point 是历史礼物墙字段;新送礼不再累加。 int64 total_gift_point = 12; int64 total_heat_value = 13; string charge_asset_type = 14; string last_price_version = 15; int64 first_received_at_ms = 16; int64 last_received_at_ms = 17; int32 sort_order = 18; } message GetUserGiftWallRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; } message GetUserGiftWallResponse { repeated GiftWallItem items = 1; int64 gift_kind_count = 2; int64 gift_total_count = 3; int64 total_value = 4; int64 total_coin_value = 5; int64 total_diamond_value = 6; // total_gift_point 是历史礼物墙汇总字段;新送礼不再累加。 int64 total_gift_point = 7; int64 total_heat_value = 8; } // RechargeProduct 是 App 充值页可展示的区域化充值档位。 message RechargeProduct { int64 product_id = 1; string product_code = 2; string channel = 3; string currency_code = 4; int64 coin_amount = 5; int64 amount_minor = 6; string policy_version = 7; bool enabled = 8; int32 sort_order = 9; string product_name = 10; string description = 11; string platform = 12; repeated int64 region_ids = 13; string resource_asset_type = 14; int64 amount_micro = 15; int64 created_by_user_id = 16; int64 updated_by_user_id = 17; int64 created_at_ms = 18; int64 updated_at_ms = 19; string app_code = 20; string status = 21; // audience_type 区分 H5 普通用户档位和币商档位;旧 App 内购默认 normal。 string audience_type = 22; } message ListRechargeProductsRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; int64 region_id = 4; // platform 来自 gateway 解析的 App 平台请求头;为空时返回该区域全部已上架商品。 string platform = 5; // audience_type 只用于 H5 站外充值;App 旧入口为空时按 normal 兼容。 string audience_type = 6; } message ListRechargeProductsResponse { repeated RechargeProduct products = 1; repeated string channels = 2; } message ConfirmGooglePaymentRequest { string request_id = 1; string app_code = 2; string command_id = 3; int64 user_id = 4; int64 region_id = 5; int64 product_id = 6; string product_code = 7; string package_name = 8; string purchase_token = 9; string order_id = 10; int64 purchase_time_ms = 11; // country_id 由 gateway 从 user-service 当前用户资料注入,用于充值事实按真实国家进入 BI。 int64 country_id = 12; } message ConfirmGooglePaymentResponse { string payment_order_id = 1; string transaction_id = 2; string status = 3; int64 product_id = 4; string product_code = 5; int64 coin_amount = 6; AssetBalance balance = 7; bool idempotent_replay = 8; string consume_state = 9; } // ListAdminRechargeProductsRequest 是后台内购配置列表查询,不参与用户充值主链路。 message ListAdminRechargeProductsRequest { string request_id = 1; string app_code = 2; string status = 3; string platform = 4; int64 region_id = 5; string keyword = 6; int32 page = 7; int32 page_size = 8; string audience_type = 9; } message ListAdminRechargeProductsResponse { repeated RechargeProduct products = 1; int64 total = 2; } // CreateRechargeProductRequest 配置一个 App 内购商品;首版资源资产固定为 COIN。 message CreateRechargeProductRequest { string request_id = 1; string app_code = 2; int64 amount_micro = 3; int64 coin_amount = 4; string product_name = 5; string description = 6; string platform = 7; repeated int64 region_ids = 8; bool enabled = 9; int64 operator_user_id = 10; string audience_type = 11; } message UpdateRechargeProductRequest { string request_id = 1; string app_code = 2; int64 product_id = 3; int64 amount_micro = 4; int64 coin_amount = 5; string product_name = 6; string description = 7; string platform = 8; repeated int64 region_ids = 9; bool enabled = 10; int64 operator_user_id = 11; string audience_type = 12; } message DeleteRechargeProductRequest { string request_id = 1; string app_code = 2; int64 product_id = 3; int64 operator_user_id = 4; } message RechargeProductResponse { RechargeProduct product = 1; } message DeleteRechargeProductResponse { bool deleted = 1; } // ThirdPartyPaymentMethod 是后台和 H5 共用的三方支付方式配置快照。 message ThirdPartyPaymentMethod { int64 method_id = 1; string app_code = 2; string provider_code = 3; string provider_name = 4; string country_code = 5; string country_name = 6; string currency_code = 7; string pay_way = 8; string pay_type = 9; string method_name = 10; string logo_url = 11; string status = 12; string usd_to_currency_rate = 13; int32 sort_order = 14; int64 created_at_ms = 15; int64 updated_at_ms = 16; } message ThirdPartyPaymentChannel { string app_code = 1; string provider_code = 2; string provider_name = 3; string status = 4; int32 sort_order = 5; repeated ThirdPartyPaymentMethod methods = 6; } message ListThirdPartyPaymentChannelsRequest { string request_id = 1; string app_code = 2; string provider_code = 3; string status = 4; bool include_disabled_methods = 5; } message ListThirdPartyPaymentChannelsResponse { repeated ThirdPartyPaymentChannel channels = 1; } message SetThirdPartyPaymentMethodStatusRequest { string request_id = 1; string app_code = 2; int64 method_id = 3; bool enabled = 4; int64 operator_user_id = 5; } message ThirdPartyPaymentMethodResponse { ThirdPartyPaymentMethod method = 1; } message UpdateThirdPartyPaymentRateRequest { string request_id = 1; string app_code = 2; int64 method_id = 3; string usd_to_currency_rate = 4; int64 operator_user_id = 5; } message ThirdPartyPaymentMethodSyncIssue { string country_code = 1; string currency_code = 2; string code = 3; string message = 4; } message SyncThirdPartyPaymentMethodsRequest { string request_id = 1; string app_code = 2; string provider_code = 3; int64 operator_user_id = 4; } message SyncThirdPartyPaymentMethodsResponse { string provider_code = 1; int32 scanned_country_count = 2; int32 fetched_country_count = 3; int32 created_count = 4; int32 updated_count = 5; int32 skipped_count = 6; repeated ThirdPartyPaymentMethodSyncIssue issues = 7; } message H5RechargeOptionsRequest { string request_id = 1; string app_code = 2; int64 target_user_id = 3; int64 target_region_id = 4; string target_country_code = 5; string audience_type = 6; } message H5RechargeOptionsResponse { repeated RechargeProduct products = 1; repeated ThirdPartyPaymentMethod payment_methods = 2; bool usdt_trc20_enabled = 3; string usdt_trc20_address = 4; } message ExternalRechargeOrder { string order_id = 1; string app_code = 2; int64 target_user_id = 3; int64 target_region_id = 4; string target_country_code = 5; string audience_type = 6; int64 product_id = 7; string product_name = 8; int64 coin_amount = 9; int64 usd_minor_amount = 10; string provider_code = 11; int64 payment_method_id = 12; string country_code = 13; string currency_code = 14; int64 provider_amount_minor = 15; string pay_way = 16; string pay_type = 17; string pay_url = 18; string provider_order_id = 19; string tx_hash = 20; string receive_address = 21; string status = 22; string failure_reason = 23; string transaction_id = 24; int64 created_at_ms = 25; int64 updated_at_ms = 26; bool idempotent_replay = 27; // target_country_id 是下单时目标用户国家快照,支付回调入账直接复用,避免异步回调再查用户主数据。 int64 target_country_id = 28; } message CreateH5RechargeOrderRequest { string request_id = 1; string app_code = 2; string command_id = 3; int64 target_user_id = 4; int64 target_region_id = 5; string target_country_code = 6; string audience_type = 7; int64 product_id = 8; string provider_code = 9; int64 payment_method_id = 10; string return_url = 11; string notify_url = 12; string client_ip = 13; string language = 14; // payer_name / payer_account 来自 gateway 重新解析的目标用户资料,不接受 H5 前端自报。 string payer_name = 15; string payer_account = 16; string payer_email = 17; // target_country_id 由 gateway 从 user-service 解析目标用户,不接受 H5 前端自报。 int64 target_country_id = 18; } message CreateTemporaryRechargeOrderRequest { string request_id = 1; string app_code = 2; string command_id = 3; int64 coin_amount = 4; int64 usd_minor_amount = 5; string provider_code = 6; int64 payment_method_id = 7; string return_url = 8; string notify_url = 9; string client_ip = 10; string language = 11; string payer_name = 12; string payer_account = 13; string payer_email = 14; } message GetTemporaryRechargeOrderRequest { string request_id = 1; string app_code = 2; string order_id = 3; } message ListTemporaryRechargeOrdersRequest { string request_id = 1; string app_code = 2; string status = 3; string provider_code = 4; string keyword = 5; int32 page = 6; int32 page_size = 7; } message ListTemporaryRechargeOrdersResponse { repeated ExternalRechargeOrder orders = 1; int64 total = 2; } message SubmitH5RechargeTxRequest { string request_id = 1; string app_code = 2; string order_id = 3; int64 target_user_id = 4; string tx_hash = 5; } message GetH5RechargeOrderRequest { string request_id = 1; string app_code = 2; string order_id = 3; int64 target_user_id = 4; } message H5RechargeOrderResponse { ExternalRechargeOrder order = 1; } message VerifyCoinSellerRechargeReceiptRequest { string request_id = 1; string app_code = 2; string provider_code = 3; string external_order_no = 4; string chain = 5; int64 usd_minor_amount = 6; int64 order_date_ms = 7; string provider_country_code = 8; string provider_currency_code = 9; string provider_pay_type = 10; } message VerifyCoinSellerRechargeReceiptResponse { bool verified = 1; string provider_code = 2; string external_order_no = 3; string provider_order_id = 4; string status = 5; string currency_code = 6; int64 provider_amount_minor = 7; string raw_json = 8; string chain = 9; string receive_address = 10; int64 verified_at_ms = 11; string failure_reason = 12; } message HandleMifapayNotifyRequest { string request_id = 1; string app_code = 2; string mer_account = 3; string data = 4; string sign = 5; } message HandleMifapayNotifyResponse { bool accepted = 1; string response_text = 2; string order_id = 3; } message HandleV5PayNotifyRequest { string request_id = 1; string app_code = 2; string raw_json = 3; map fields = 4; } message HandleV5PayNotifyResponse { bool accepted = 1; string response_text = 2; string order_id = 3; } message DiamondExchangeRule { string exchange_type = 1; string from_asset_type = 2; string to_asset_type = 3; int64 from_amount = 4; int64 to_amount = 5; bool enabled = 6; } message GetDiamondExchangeConfigRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; } message GetDiamondExchangeConfigResponse { repeated DiamondExchangeRule rules = 1; } // WalletTransaction 是用户钱包流水页使用的分录级投影。 message WalletTransaction { int64 entry_id = 1; string transaction_id = 2; string biz_type = 3; string asset_type = 4; int64 available_delta = 5; int64 frozen_delta = 6; int64 available_after = 7; int64 frozen_after = 8; int64 counterparty_user_id = 9; string room_id = 10; int64 created_at_ms = 11; int64 transfer_usd_minor = 12; string transfer_currency_code = 13; } message ListWalletTransactionsRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; string asset_type = 4; int32 page = 5; int32 page_size = 6; } message ListWalletTransactionsResponse { repeated WalletTransaction transactions = 1; int64 total = 2; } message VipRewardItem { int64 resource_id = 1; string resource_code = 2; string resource_type = 3; string name = 4; int64 quantity = 5; int64 expires_at_ms = 6; string asset_url = 7; string preview_url = 8; string animation_url = 9; } message VipLevel { int32 level = 1; string name = 2; string status = 3; int64 price_coin = 4; int64 duration_ms = 5; int64 reward_resource_group_id = 6; repeated VipRewardItem reward_items = 7; bool can_purchase = 8; int32 sort_order = 9; bool recharge_gate_required = 10; int64 required_recharge_coin_amount = 11; int64 user_recharge_coin_amount = 12; string purchase_locked_reason = 13; int64 created_at_ms = 14; int64 updated_at_ms = 15; } message UserVip { int64 user_id = 1; int32 level = 2; string name = 3; bool active = 4; int64 started_at_ms = 5; int64 expires_at_ms = 6; int64 updated_at_ms = 7; } message ListVipPackagesRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; } message ListVipPackagesResponse { UserVip current_vip = 1; repeated VipLevel packages = 2; } message GetMyVipRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; } message GetMyVipResponse { UserVip vip = 1; } message PurchaseVipRequest { string command_id = 1; string app_code = 2; int64 user_id = 3; int32 level = 4; } message PurchaseVipResponse { string order_id = 1; string transaction_id = 2; UserVip vip = 3; int64 coin_spent = 4; int64 coin_balance_after = 5; repeated VipRewardItem reward_items = 6; } message DebitCPBreakupFeeRequest { string command_id = 1; string app_code = 2; int64 user_id = 3; string relationship_id = 4; string relation_type = 5; int64 amount = 6; } message DebitCPBreakupFeeResponse { string transaction_id = 1; int64 coin_spent = 2; int64 coin_balance_after = 3; AssetBalance balance = 4; } message DebitWheelDrawRequest { string command_id = 1; string app_code = 2; int64 user_id = 3; string wheel_id = 4; int32 draw_count = 5; int64 amount = 6; } message DebitWheelDrawResponse { string transaction_id = 1; int64 coin_spent = 2; int64 coin_balance_after = 3; AssetBalance balance = 4; } message GrantVipRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int32 level = 4; string grant_source = 5; int64 operator_user_id = 6; string reason = 7; } message GrantVipResponse { string transaction_id = 1; UserVip vip = 2; repeated VipRewardItem reward_items = 3; int64 server_time_ms = 4; } message AdminVipLevelInput { int32 level = 1; string name = 2; string status = 3; int64 price_coin = 4; int64 duration_ms = 5; int64 reward_resource_group_id = 6; int32 sort_order = 7; int64 required_recharge_coin_amount = 8; } message ListAdminVipLevelsRequest { string request_id = 1; string app_code = 2; } message ListAdminVipLevelsResponse { repeated VipLevel levels = 1; int64 server_time_ms = 2; } message UpdateAdminVipLevelsRequest { string request_id = 1; string app_code = 2; repeated AdminVipLevelInput levels = 3; int64 operator_user_id = 4; } message UpdateAdminVipLevelsResponse { repeated VipLevel levels = 1; int64 server_time_ms = 2; } // CreditTaskRewardRequest 是 activity-service 领取任务奖励时调用的钱包入账命令。 message CreditTaskRewardRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 amount = 4; string task_type = 5; string task_id = 6; string cycle_key = 7; string reason = 8; string reward_asset_type = 9; } // CreditTaskRewardResponse 返回任务奖励入账流水和用户奖励资产账后余额。 message CreditTaskRewardResponse { string transaction_id = 1; AssetBalance balance = 2; int64 amount = 3; int64 granted_at_ms = 4; } // CreditLuckyGiftRewardRequest 是 activity-service 抽奖 outbox 补偿 worker 调用的钱包入账命令。 message CreditLuckyGiftRewardRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 amount = 4; string draw_id = 5; string room_id = 6; string gift_id = 7; string pool_id = 8; string reason = 9; int64 visible_region_id = 10; // country_id 是中奖用户所属国家,钱包 outbox 原样发布给统计服务,避免返奖只落到区域未知国家。 int64 country_id = 11; } // CreditLuckyGiftRewardResponse 返回幸运礼物返奖入账流水和用户 COIN 账后余额。 message CreditLuckyGiftRewardResponse { string transaction_id = 1; AssetBalance balance = 2; int64 amount = 3; int64 granted_at_ms = 4; } // CreditWheelRewardRequest 是 activity-service 转盘金币奖品 outbox 调用的钱包入账命令。 message CreditWheelRewardRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 amount = 4; string draw_id = 5; string wheel_id = 6; string selected_tier_id = 7; string reason = 8; int64 visible_region_id = 9; } // CreditWheelRewardResponse 返回转盘金币奖品入账流水和用户 COIN 账后余额。 message CreditWheelRewardResponse { string transaction_id = 1; AssetBalance balance = 2; int64 amount = 3; int64 granted_at_ms = 4; } // CreditRoomTurnoverRewardRequest 是 activity-service 每周房间流水奖励结算后的金币入账命令。 message CreditRoomTurnoverRewardRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 amount = 4; string settlement_id = 5; string room_id = 6; int64 period_start_ms = 7; int64 period_end_ms = 8; int64 coin_spent = 9; int64 tier_id = 10; string tier_code = 11; string reason = 12; } // CreditRoomTurnoverRewardResponse 返回房间流水奖励入账流水和用户 COIN 账后余额。 message CreditRoomTurnoverRewardResponse { string transaction_id = 1; AssetBalance balance = 2; int64 amount = 3; int64 granted_at_ms = 4; } // CreditInviteActivityRewardRequest 是 activity-service 邀请活动达标后发起的 COIN 奖励入账命令。 message CreditInviteActivityRewardRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 amount = 4; string claim_id = 5; string reward_type = 6; int64 tier_id = 7; string tier_code = 8; string cycle_key = 9; int64 reached_value = 10; string reason = 11; } // CreditInviteActivityRewardResponse 返回邀请活动奖励入账流水和用户 COIN 账后余额。 message CreditInviteActivityRewardResponse { string transaction_id = 1; AssetBalance balance = 2; int64 amount = 3; int64 granted_at_ms = 4; } // CreditAgencyOpeningRewardRequest 是 activity-service 代理开业流水档位结算后的 COIN 入账命令。 message CreditAgencyOpeningRewardRequest { string command_id = 1; string app_code = 2; int64 target_user_id = 3; int64 amount = 4; string application_id = 5; string cycle_id = 6; int64 agency_id = 7; int32 rank_no = 8; int64 score_coins = 9; string reason = 10; } // CreditAgencyOpeningRewardResponse 返回代理开业奖励入账流水和用户 COIN 账后余额。 message CreditAgencyOpeningRewardResponse { string transaction_id = 1; AssetBalance balance = 2; int64 amount = 3; int64 granted_at_ms = 4; } // ApplyGameCoinChangeRequest 是 game-service 唯一可以调用的钱包游戏改账入口。 message ApplyGameCoinChangeRequest { string request_id = 1; string app_code = 2; string command_id = 3; int64 user_id = 4; string platform_code = 5; string game_id = 6; string provider_order_id = 7; string provider_round_id = 8; string op_type = 9; int64 coin_amount = 10; string room_id = 11; string request_hash = 12; } // ApplyGameCoinChangeResponse 返回游戏改账流水和用户 COIN 账后余额。 message ApplyGameCoinChangeResponse { string wallet_transaction_id = 1; int64 balance_after = 2; bool idempotent_replay = 3; } message RedPacketConfig { string app_code = 1; bool enabled = 2; repeated int32 count_tiers = 3; repeated int64 amount_tiers = 4; int32 delayed_open_seconds = 5; int32 expire_seconds = 6; int32 daily_send_limit = 7; int64 updated_by_admin_id = 8; int64 created_at_ms = 9; int64 updated_at_ms = 10; string rule_url = 11; } message RedPacketClaim { string app_code = 1; string claim_id = 2; string command_id = 3; string packet_id = 4; int64 user_id = 5; int64 amount = 6; string wallet_transaction_id = 7; string status = 8; string failure_reason = 9; int64 created_at_ms = 10; int64 updated_at_ms = 11; } message RedPacket { string app_code = 1; string packet_id = 2; string command_id = 3; int64 sender_user_id = 4; string room_id = 5; int64 region_id = 6; string packet_type = 7; int64 total_amount = 8; int32 packet_count = 9; int64 remaining_amount = 10; int32 remaining_count = 11; string status = 12; int64 open_at_ms = 13; int64 expires_at_ms = 14; int64 created_at_ms = 15; int64 updated_at_ms = 16; bool claimed_by_viewer = 17; int64 viewer_claim_amount = 18; repeated RedPacketClaim claims = 19; int64 refund_amount = 20; string refund_status = 21; int64 refunded_at_ms = 22; } message GetRedPacketConfigRequest { string request_id = 1; string app_code = 2; } message GetRedPacketConfigResponse { RedPacketConfig config = 1; int64 server_time_ms = 2; } message UpdateRedPacketConfigRequest { string request_id = 1; string app_code = 2; bool enabled = 3; repeated int32 count_tiers = 4; repeated int64 amount_tiers = 5; int32 delayed_open_seconds = 6; int32 expire_seconds = 7; int32 daily_send_limit = 8; int64 operator_user_id = 9; string rule_url = 10; } message UpdateRedPacketConfigResponse { RedPacketConfig config = 1; int64 server_time_ms = 2; } message CreateRedPacketRequest { string request_id = 1; string app_code = 2; string command_id = 3; int64 sender_user_id = 4; string room_id = 5; int64 region_id = 6; string packet_type = 7; int64 total_amount = 8; int32 packet_count = 9; } message CreateRedPacketResponse { RedPacket packet = 1; int64 balance_after = 2; int64 server_time_ms = 3; } message ClaimRedPacketRequest { string request_id = 1; string app_code = 2; string command_id = 3; string packet_id = 4; int64 user_id = 5; } message ClaimRedPacketResponse { RedPacketClaim claim = 1; int64 balance_after = 2; int64 server_time_ms = 3; RedPacket packet = 4; } message ListRedPacketsRequest { string request_id = 1; string app_code = 2; string room_id = 3; int64 sender_user_id = 4; int64 region_id = 5; string packet_type = 6; string status = 7; int64 viewer_user_id = 8; int64 start_at_ms = 9; int64 end_at_ms = 10; int32 page = 11; int32 page_size = 12; } message ListRedPacketsResponse { repeated RedPacket packets = 1; int64 total = 2; int64 server_time_ms = 3; } message GetRedPacketRequest { string request_id = 1; string app_code = 2; string packet_id = 3; int64 viewer_user_id = 4; bool include_claims = 5; } message GetRedPacketResponse { RedPacket packet = 1; int64 server_time_ms = 2; } message ExpireRedPacketsRequest { string request_id = 1; string app_code = 2; int32 batch_size = 3; } message ExpireRedPacketsResponse { int32 expired_count = 1; int64 refunded_amount = 2; int64 server_time_ms = 3; } message RetryRedPacketRefundRequest { string request_id = 1; string app_code = 2; string packet_id = 3; int64 operator_user_id = 4; } message RetryRedPacketRefundResponse { RedPacket packet = 1; int64 refunded_amount = 2; int64 server_time_ms = 3; } // CronBatchRequest 是 cron-service 触发 wallet-service 后台批处理的统一请求。 message CronBatchRequest { string request_id = 1; string app_code = 2; string run_id = 3; string worker_id = 4; int32 batch_size = 5; int64 lock_ttl_ms = 6; // trigger_mode 为空时由 wallet-service 按 automatic 处理;后台手动结算显式传 manual。 string trigger_mode = 7; // cycle_key 为空时由 wallet-service 按当前 UTC 月处理;后台手动补结可指定周期。 string cycle_key = 8; // user_ids 为空表示批处理扫描全部候选;后台手动结算只传已勾选主播。 repeated int64 user_ids = 9; // settlement_role 为空时结算完整 Host/Agency 权益;后台人工入口可传 host 或 agency 拆分钱包。 string settlement_role = 10; } // CronBatchResponse 返回一个批处理 run 的执行摘要。 message CronBatchResponse { int32 claimed_count = 1; int32 processed_count = 2; int32 success_count = 3; int32 failure_count = 4; bool has_more = 5; } message ResourceShopPurchaseOrder { string app_code = 1; string order_id = 2; string command_id = 3; int64 user_id = 4; int64 shop_item_id = 5; int64 resource_id = 6; Resource resource = 7; int32 duration_days = 8; int64 price_coin = 9; string status = 10; string wallet_transaction_id = 11; string resource_grant_id = 12; string entitlement_id = 13; int64 created_at_ms = 14; int64 updated_at_ms = 15; } message ListResourceShopPurchaseOrdersRequest { string request_id = 1; string app_code = 2; int64 user_id = 3; string resource_type = 4; string status = 5; string keyword = 6; int32 page = 7; int32 page_size = 8; } message ListResourceShopPurchaseOrdersResponse { repeated ResourceShopPurchaseOrder orders = 1; int64 total = 2; } message GetGiftCatalogVersionRequest { string request_id = 1; string app_code = 2; } message GetGiftCatalogVersionResponse { int64 version = 1; } // WalletCronService 只给 cron-service 调用;账务状态仍由 wallet-service owner 修改。 service WalletCronService { rpc ProcessHostSalaryDailySettlementBatch(CronBatchRequest) returns (CronBatchResponse); rpc ProcessHostSalaryHalfMonthSettlementBatch(CronBatchRequest) returns (CronBatchResponse); rpc ProcessHostSalaryMonthEndBatch(CronBatchRequest) returns (CronBatchResponse); } // WalletService 是内部账务 gRPC 边界,外部 HTTP 入口仍由 gateway-service 承载。 service WalletService { rpc DebitGift(DebitGiftRequest) returns (DebitGiftResponse); rpc DebitDirectGift(DebitDirectGiftRequest) returns (DebitGiftResponse); rpc BatchDebitGift(BatchDebitGiftRequest) returns (BatchDebitGiftResponse); rpc DebitRobotGift(DebitRobotGiftRequest) returns (DebitGiftResponse); rpc GetBalances(GetBalancesRequest) returns (GetBalancesResponse); rpc GetActiveHostSalaryPolicy(GetActiveHostSalaryPolicyRequest) returns (GetActiveHostSalaryPolicyResponse); rpc GetHostSalaryProgress(GetHostSalaryProgressRequest) returns (GetHostSalaryProgressResponse); // GetTeamHostSalaryStats 按 Agency 收款人集合聚合主播预收入工资;经理中心团队工资卡片使用。 rpc GetTeamHostSalaryStats(GetTeamHostSalaryStatsRequest) returns (GetTeamHostSalaryStatsResponse); rpc AdminCreditAsset(AdminCreditAssetRequest) returns (AdminCreditAssetResponse); rpc AdminCreditCoinSellerStock(AdminCreditCoinSellerStockRequest) returns (AdminCreditCoinSellerStockResponse); rpc TransferCoinFromSeller(TransferCoinFromSellerRequest) returns (TransferCoinFromSellerResponse); rpc ListCoinSellerSalaryExchangeRateTiers(ListCoinSellerSalaryExchangeRateTiersRequest) returns (ListCoinSellerSalaryExchangeRateTiersResponse); rpc ExchangeSalaryToCoin(ExchangeSalaryToCoinRequest) returns (ExchangeSalaryToCoinResponse); rpc TransferSalaryToCoinSeller(TransferSalaryToCoinSellerRequest) returns (TransferSalaryToCoinSellerResponse); rpc FreezeSalaryWithdrawal(FreezeSalaryWithdrawalRequest) returns (FreezeSalaryWithdrawalResponse); rpc SettleSalaryWithdrawal(SettleSalaryWithdrawalRequest) returns (SettleSalaryWithdrawalResponse); rpc ReleaseSalaryWithdrawal(ReleaseSalaryWithdrawalRequest) returns (ReleaseSalaryWithdrawalResponse); rpc FreezePointWithdrawal(FreezePointWithdrawalRequest) returns (FreezePointWithdrawalResponse); rpc SettlePointWithdrawal(SettlePointWithdrawalRequest) returns (SettlePointWithdrawalResponse); rpc ReleasePointWithdrawal(ReleasePointWithdrawalRequest) returns (ReleasePointWithdrawalResponse); rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse); rpc GetResource(GetResourceRequest) returns (GetResourceResponse); rpc CreateResource(CreateResourceRequest) returns (ResourceResponse); rpc UpdateResource(UpdateResourceRequest) returns (ResourceResponse); rpc SetResourceStatus(SetResourceStatusRequest) returns (ResourceResponse); rpc DeleteResource(DeleteResourceRequest) returns (ResourceResponse); rpc BatchDeleteResources(BatchDeleteResourcesRequest) returns (BatchDeleteResourcesResponse); rpc ListResourceGroups(ListResourceGroupsRequest) returns (ListResourceGroupsResponse); rpc GetResourceGroup(GetResourceGroupRequest) returns (GetResourceGroupResponse); rpc CreateResourceGroup(CreateResourceGroupRequest) returns (ResourceGroupResponse); rpc UpdateResourceGroup(UpdateResourceGroupRequest) returns (ResourceGroupResponse); rpc SetResourceGroupStatus(SetResourceGroupStatusRequest) returns (ResourceGroupResponse); rpc ListGiftConfigs(ListGiftConfigsRequest) returns (ListGiftConfigsResponse); rpc ListGiftTypeConfigs(ListGiftTypeConfigsRequest) returns (ListGiftTypeConfigsResponse); rpc GetGiftCatalogVersion(GetGiftCatalogVersionRequest) returns (GetGiftCatalogVersionResponse); rpc CreateGiftConfig(CreateGiftConfigRequest) returns (GiftConfigResponse); rpc BatchCreateGiftConfigs(BatchCreateGiftConfigsRequest) returns (BatchCreateGiftConfigsResponse); rpc UpdateGiftConfig(UpdateGiftConfigRequest) returns (GiftConfigResponse); rpc SetGiftConfigStatus(SetGiftConfigStatusRequest) returns (GiftConfigResponse); rpc DeleteGiftConfig(DeleteGiftConfigRequest) returns (GiftConfigResponse); rpc UpsertGiftTypeConfig(UpsertGiftTypeConfigRequest) returns (GiftTypeConfigResponse); rpc GrantResource(GrantResourceRequest) returns (ResourceGrantResponse); rpc GrantResourceGroup(GrantResourceGroupRequest) returns (ResourceGrantResponse); rpc RevokeResourceGrant(RevokeResourceGrantRequest) returns (ResourceGrantResponse); rpc ListUserResources(ListUserResourcesRequest) returns (ListUserResourcesResponse); rpc EquipUserResource(EquipUserResourceRequest) returns (EquipUserResourceResponse); rpc UnequipUserResource(UnequipUserResourceRequest) returns (UnequipUserResourceResponse); rpc BatchGetUserEquippedResources(BatchGetUserEquippedResourcesRequest) returns (BatchGetUserEquippedResourcesResponse); rpc ListResourceGrants(ListResourceGrantsRequest) returns (ListResourceGrantsResponse); rpc ListResourceShopItems(ListResourceShopItemsRequest) returns (ListResourceShopItemsResponse); rpc UpsertResourceShopItems(UpsertResourceShopItemsRequest) returns (UpsertResourceShopItemsResponse); rpc SetResourceShopItemStatus(SetResourceShopItemStatusRequest) returns (ResourceShopItemResponse); rpc ListResourceShopPurchaseOrders(ListResourceShopPurchaseOrdersRequest) returns (ListResourceShopPurchaseOrdersResponse); rpc PurchaseResourceShopItem(PurchaseResourceShopItemRequest) returns (PurchaseResourceShopItemResponse); rpc ListRechargeBills(ListRechargeBillsRequest) returns (ListRechargeBillsResponse); rpc GetRechargeBillSummary(GetRechargeBillSummaryRequest) returns (GetRechargeBillSummaryResponse); rpc GetRechargeBillOverview(GetRechargeBillOverviewRequest) returns (GetRechargeBillOverviewResponse); rpc RefreshGooglePaymentPrices(RefreshGooglePaymentPricesRequest) returns (RefreshGooglePaymentPricesResponse); rpc GetWalletOverview(GetWalletOverviewRequest) returns (GetWalletOverviewResponse); rpc GetWalletValueSummary(GetWalletValueSummaryRequest) returns (GetWalletValueSummaryResponse); rpc GetUserGiftWall(GetUserGiftWallRequest) returns (GetUserGiftWallResponse); rpc ListRechargeProducts(ListRechargeProductsRequest) returns (ListRechargeProductsResponse); rpc ConfirmGooglePayment(ConfirmGooglePaymentRequest) returns (ConfirmGooglePaymentResponse); rpc ListAdminRechargeProducts(ListAdminRechargeProductsRequest) returns (ListAdminRechargeProductsResponse); rpc CreateRechargeProduct(CreateRechargeProductRequest) returns (RechargeProductResponse); rpc UpdateRechargeProduct(UpdateRechargeProductRequest) returns (RechargeProductResponse); rpc DeleteRechargeProduct(DeleteRechargeProductRequest) returns (DeleteRechargeProductResponse); rpc ListThirdPartyPaymentChannels(ListThirdPartyPaymentChannelsRequest) returns (ListThirdPartyPaymentChannelsResponse); rpc SetThirdPartyPaymentMethodStatus(SetThirdPartyPaymentMethodStatusRequest) returns (ThirdPartyPaymentMethodResponse); rpc UpdateThirdPartyPaymentRate(UpdateThirdPartyPaymentRateRequest) returns (ThirdPartyPaymentMethodResponse); rpc SyncThirdPartyPaymentMethods(SyncThirdPartyPaymentMethodsRequest) returns (SyncThirdPartyPaymentMethodsResponse); rpc ListH5RechargeOptions(H5RechargeOptionsRequest) returns (H5RechargeOptionsResponse); rpc CreateH5RechargeOrder(CreateH5RechargeOrderRequest) returns (H5RechargeOrderResponse); rpc CreateTemporaryRechargeOrder(CreateTemporaryRechargeOrderRequest) returns (H5RechargeOrderResponse); rpc GetTemporaryRechargeOrder(GetTemporaryRechargeOrderRequest) returns (H5RechargeOrderResponse); rpc ListTemporaryRechargeOrders(ListTemporaryRechargeOrdersRequest) returns (ListTemporaryRechargeOrdersResponse); rpc SubmitH5RechargeTx(SubmitH5RechargeTxRequest) returns (H5RechargeOrderResponse); rpc GetH5RechargeOrder(GetH5RechargeOrderRequest) returns (H5RechargeOrderResponse); rpc VerifyCoinSellerRechargeReceipt(VerifyCoinSellerRechargeReceiptRequest) returns (VerifyCoinSellerRechargeReceiptResponse); rpc HandleMifapayNotify(HandleMifapayNotifyRequest) returns (HandleMifapayNotifyResponse); rpc HandleV5PayNotify(HandleV5PayNotifyRequest) returns (HandleV5PayNotifyResponse); rpc GetDiamondExchangeConfig(GetDiamondExchangeConfigRequest) returns (GetDiamondExchangeConfigResponse); rpc ListWalletTransactions(ListWalletTransactionsRequest) returns (ListWalletTransactionsResponse); rpc ListVipPackages(ListVipPackagesRequest) returns (ListVipPackagesResponse); rpc GetMyVip(GetMyVipRequest) returns (GetMyVipResponse); rpc PurchaseVip(PurchaseVipRequest) returns (PurchaseVipResponse); rpc DebitCPBreakupFee(DebitCPBreakupFeeRequest) returns (DebitCPBreakupFeeResponse); rpc DebitWheelDraw(DebitWheelDrawRequest) returns (DebitWheelDrawResponse); rpc GrantVip(GrantVipRequest) returns (GrantVipResponse); rpc ListAdminVipLevels(ListAdminVipLevelsRequest) returns (ListAdminVipLevelsResponse); rpc UpdateAdminVipLevels(UpdateAdminVipLevelsRequest) returns (UpdateAdminVipLevelsResponse); rpc CreditTaskReward(CreditTaskRewardRequest) returns (CreditTaskRewardResponse); rpc CreditLuckyGiftReward(CreditLuckyGiftRewardRequest) returns (CreditLuckyGiftRewardResponse); rpc CreditWheelReward(CreditWheelRewardRequest) returns (CreditWheelRewardResponse); rpc CreditRoomTurnoverReward(CreditRoomTurnoverRewardRequest) returns (CreditRoomTurnoverRewardResponse); rpc CreditInviteActivityReward(CreditInviteActivityRewardRequest) returns (CreditInviteActivityRewardResponse); rpc CreditAgencyOpeningReward(CreditAgencyOpeningRewardRequest) returns (CreditAgencyOpeningRewardResponse); rpc ApplyGameCoinChange(ApplyGameCoinChangeRequest) returns (ApplyGameCoinChangeResponse); rpc GetRedPacketConfig(GetRedPacketConfigRequest) returns (GetRedPacketConfigResponse); rpc UpdateRedPacketConfig(UpdateRedPacketConfigRequest) returns (UpdateRedPacketConfigResponse); rpc CreateRedPacket(CreateRedPacketRequest) returns (CreateRedPacketResponse); rpc ClaimRedPacket(ClaimRedPacketRequest) returns (ClaimRedPacketResponse); rpc ListRedPackets(ListRedPacketsRequest) returns (ListRedPacketsResponse); rpc GetRedPacket(GetRedPacketRequest) returns (GetRedPacketResponse); rpc ExpireRedPackets(ExpireRedPacketsRequest) returns (ExpireRedPacketsResponse); rpc RetryRedPacketRefund(RetryRedPacketRefundRequest) returns (RetryRedPacketRefundResponse); }