Steam   https://partner.steamgames.com/doc/home

1.打开可执行文件闪退后有重新打开,日志打印:[Steamworks.NET] Shutting down because RestartAppIfNecessary returned true. Steam will restart the application.

可执行文件没有通过Steam启动,如果不是将通过Steam启动

2.Steam小额交易 https://partner.steamgames.com/doc/features/microtransactions/implementation

需要设置MicroTxnAuthorizationResponse_t回调;包含参数:
  m_unAppID    (uint32)    此小额交易的 App ID。m_ulOrderID    (uint64)    小额交易的订单 ID。m_bAuthorized    (uint8 )   用户授权了此交易(1),还是未授权此交易(0)?
该回调启用Steam的游戏内叠加面板 可以使用GameOverlayActivated_t回调来判断叠加面板的激活状态。
关于玩家所处国家/地区和货币类型,需要使用  ISteamMicroTxn/GetUserInfo  web API 进行获取(服务器发起访问)。
关于测试:使用沙盒进行测试时通过以下URl进行传送 “https://partner.steam-api.com/ISteamMicroTxnSandbox/*” ;
                    正常流程使用:“ https://partner.steam-api.com/ISteamMicroTxn/*”

相关参考:

WeGame  https://developer.wegame.com/developer/game-wiki/help/doc/getting-started-overview/zh_CN 

1.接入WeGame后使用编辑器启用包文件报错 : wegame RailNeedRestartAppForCheckingEnvironment return true!

WeGame Developer文件夹在C盘的根目录下,放到二级目录后可以解决,在桌面上也不会有该报错。

2.防沉迷接入

需要监听rail_anti_addiction_define.h文件中的RailCustomizeAntiAddictionActions中的回调事件。
具体注册方式:
RailCallBackHelper.Instance.RegisterCallback(RAILEventID.kRailEventAntiAddictionCustomizeAntiAddictionActions,方法);
已JSON格式返回数据,具体结果为 RailCustomizeAntiAddictionActions结构体中的anti_addiction_actions ,
JSON数据格式:
{
    "actions": [
        {
            "action": {
                "type": { "id": 1, "name": "kRailAntiAddictionActionShowTips" },
                "title": "游戏温馨提示",
                "content": "根据国家防沉迷通知的相关要求和腾讯最新强化的防沉迷策略,由于您是未成年人,
                           仅能在周五、周六、周日及法定节假日20时至21时进入游戏。",
                "display_duration_seconds": 60
            }
        },
        {
            "action": {
                "type": { "id": 2, "name": "kRailAntiAddictionActionHalt" }
            }
        }
    ]
}

可以使用 Newtonsoft.Json 将 JSON转化C#类
首先定义JSON对应的C#数据结构:如果变量名与对应的JSON变量名一致则不需要添加 :“[JsonProperty("对应Json名")]
/// <summary>
    /// 防沉迷数据结构
    /// </summary>
    internal class AddictionActions
    {
        [JsonProperty("actions")]
        public Action[] Actions = new Action[2];

        public class Action
        {
            [JsonProperty("action")]
            public ActionInfo ActionInfo = null;
        }

        public class ActionInfo
        {
            [JsonProperty("type")]
            public TypeParamInfo TypeInfo = new TypeParamInfo();

            [JsonProperty("title")]
            public string Title = "";

            [JsonProperty("content")]
            public string Content = "";

            [JsonProperty("display_duration_seconds")]
            public int DisplayDurationSeconds = 0;

            public class TypeParamInfo
            {
                [JsonProperty("id")]
                public int Id = 0;

                [JsonProperty("name")]
                public string Name = "";
            }
        }
    }
使用反序列化方法把json转换为C#类
AddictionActions actions = JsonConvert.DeserializeObject<AddictionActions>(addictionActions.anti_addiction_actions);
后续根据具体数据进行操作。

对于返回的Json数据说明:

有两种类型:单纯进行防沉迷提示:  kRailAntiAddictionActionShowTips ; 阻止进入游戏:kRailAntiAddictionActionHalt 
当两种类型都被返回时不仅需要在游戏中绘制防沉迷弹框提示,在玩家关闭防沉迷弹框提示时,需要自动保存游戏进度并立即退出游戏。
仅返回 kRailAntiAddictionActionShowTips 类型时 仅仅需要在游戏中绘制一个防沉迷弹框提示。

防沉迷调试:

调试游戏防沉迷时长的入口位于WeGame开发者版本客户端的系统设置对话框 -->Debug --> 取消勾选:“跳过当前账户的防沉迷检查” --> 配置GameID -->触发防沉迷。

3.内购 只对于多人联机游戏

1.在游戏内购买时需要向服务器发送请求通过服务器WebAPI获取order_id(数据类型string);
2.使用获取到的order_id调用AsyncShowPaymentWindow接口弹出支付面板。
rail_api.RailFactory().RailInGameStorePurchaseHelper().AsyncShowPaymentWindow
                            (“WeGameOrderId”, rail_api.RailFactory().RailPlayer().GetRailID().id_);
3.支付界面的显示和关闭可以通过RailInGameStorePurchasePayWindowDisplayed和RailInGameStorePurchasePayWindowClosed事件感知,支付结果可以通过RailInGameStorePurchaseResult事件感知。result 为0表示成功;1010001表示失败;2表示结束(在支付成功后点击面板que'dian


对于支付防沉迷 需要游戏服务器在下单前向WeGame服务器发送 

请求: POST https://api.rail.tgp.qq.com/web/in_game_purchase/order/judge_pay HTTP/1.1

客户端根据请求结果进行界面显示。
注意:
  • 解析JSON数据的顺序为先判断result.error_code是否为0,如果非0则说明请求失败,可以弹框提示玩家充值失败;
  • 在result.error_code为0的前提下,判断data.ret是否为0,如果非0则说明中控返回错误信息,可以弹框提示玩家充值失败;
  • 在data.ret为0的前提下,判断data.instructions数组是否为空,为空说明没有需要指定的指令,可以直接给玩家账号进行充值;
  • 如果data.instructions数组不为空,说明有需要执行的指令,此时判断data.instructions.type字段;
  • 如果data.instructions.type为1,则需要弹框提示data.instructions.msg返回的内容,当玩家关闭弹框时可以给玩家充值;如果data.instructions.type为7,则需要弹框提示玩家,并禁止玩家充值。
返回样例:
1. 成年玩家或者未成年玩家第一次充值
"result":{
        "error_code":0,
        "error_message":"success"
    },
    "data":{
        "context":"caa09d68-1afc-49c6-b44a-ee3dafd98da6",
        "duration":0,
        "guestDuration":0,
        "instructions":[
        ],
        "msg":"success",
        "ret":0,
        "traceId":"HP1705993862CIIUISWXLYUOWZFLCL"
    }
2. 未成年玩家进行累计充值
"result":{
        "error_code":0,
        "error_message":"success"
    },
    "data":{
        "context":"caa09d68-1afc-49c6-b44a-ee3dafd98da6",
        "duration":0,
        "guestDuration":0,
        "instructions":[
            {
                "type": 1,
                "title": "温馨提示",
                "msg": "亲爱的用户:根据腾讯未成年人健康上网保护计划,由于您未满18周岁,你本月已经充值超过200元,本月充值金额不允许超过400元。",
                "modal": 0,
                "ruleName":"pay_8_3"
            }
        ],
        "msg":"success",
        "ret":0,
        "traceId":"HP1705993862CIIUISWXLYUOWZFLCL"
    }
3. 未成年玩家超出充值限额
"result":{
        "error_code":0,
        "error_message":"success"
    },
    "data":{
        "context":"caa09d68-1afc-49c6-b44a-ee3dafd98da6",
        "duration":0,
        "guestDuration":0,
        "instructions":[
            {
                "type": 7,
                "title": "温馨提示",
                "msg": "亲爱的用户:根据腾讯未成年人健康上网保护计划,由于您未满18周岁,您本月充值不能超过400元。",
                "modal": 1,
                "ruleName":"pay_8_9"
            }
        ],
        "msg":"success",
        "ret":0,
        "traceId":"HP1705993862CIIUISWXLYUOWZFLCL"
    }