--- front: https://mc.res.netease.com/pc/zt/20201109161633/mc-dev/assets/img/syh1.b9bdf6e5.png hard: 入门 time: 20分钟 --- # 商业化流程 ​ 网络服中要用钻石、绿宝石购买的商品的话,需要走商品审核流程,提审通过才能将商品正式上架。另外商品需要在游戏中生效,需配合官方的“商城”插件(neteaseShop)。 ### 商品提审 - 在开发者平台中的“PE商品管理”添加商品。 ![1568016399843](./images/syh1.png) ![1568016399843](./images/syh2.png) - 正确填写商品的各项基本信息,填写完成后点击“保存” ![1568016399843](./images/syh3.png) 其中,”实现指令“填写的是开发者自己设定的指令,每次购买将执行该指令1次。 ![1568016399843](./images/syh11.png) “首充内容“控制的是玩家首次购买该商品时的发货奖励,如有需要,请将”是否有首充内容“勾选为”是“。 ”首充实现指令“填写的是开发者自己设定的指令,玩家首次购买时将执行该指令1次。 ![1568016399843](./images/syh12.png) - 在“PE商品管理——查看详情——库存编辑”分页处提交审核 ![1568016399843](./images/syh4.png) - **审核通过**的商品将出现在“PE商品管理——查看详情——橱窗编辑”分页,点击“上架”可让货品在客户端中显示(未通过审核的商品无法在橱窗编辑分页展示)。 ![1568016399843](./images/syh5.png) ### MCStudio服务器ID配置 - 此处将会解释服务器游戏ID(即46ID)的具体配置逻辑。 ![syh17.png](./images/syh17.png) #### 开发者平台部分 - 点击**上架管理**中的“**编辑更新**”,找到**游戏ID**和**是否为测试服**选项。 ![syh18.png](./images/syh18.png) - 其中,请将游戏ID**复制**下来,然后编辑**是否为测试服**选项。 > 是否为测试服的配置规则:在MCStudio内,服务器阶段为**开发阶段**的,配置为**是**;服务器阶段为**审核阶段**的,配置为**否**,否则填入后点击完成会检验失败(提示:“网络游戏ID【46XXX】为正式服,无法在开发阶段部署正式服,请在开发者平台新建一个测试服提审后进行部署。”或与此相反,提示为测试服)。 #### MCStudio部分 - 进入**网络服开发**页面,点击**更多**,然后点击**服务器配置**,转到**更多**。 - 在**游戏ID**处粘贴你刚才复制的游戏ID,如图所示。 - ![syh19.png](./images/syh19.png) - 点击完成,**重新部署服务器**,即可生效商城签名。 #### 不填写游戏ID是否有影响? 影响:**无法获取商品信息**(最重要)以及一些其他影响 #### 一些小建议 服务器创建时,MCStudio默认填写游戏ID为0,推荐开发者**不要在开发阶段测试商品**,这样可以不动开发者平台的部分(保持“**是否为测试服**”为**是**),需要测试商品时用审核阶段服,保持游戏ID一直留在这个审核阶段服里就可以了。 ### 关联商城插件 > 使用Spigot开服时,商城插件的内容请参考[Spigot商城插件详解](../课程10:使用Spigot开服/30-Spigot服Demo详解/3-商城Demo详解.md) - 强烈推荐使用官方商城插件辅助实现发货逻辑。 #### 打开道具商店 - 假如游戏仅支持PE端登录,那么可以选择使用引擎自带的道具商店(mod.json中配置use_custom_shop为false),或者插件自定义的道具商店(mod.json中配置use_custom_shop为true)。 - 假如游戏需要支持PC端的登陆,由于PC端引擎没有自带的道具商店,必须使用插件自定义的道具商店(mod.json中配置use_custom_shop为true) ![1568016399843](./images/syh15.png) #### 实现发货逻辑 - 假如游戏没有特殊的自定义发货逻辑(比如说到特定NPC那边对话),那么建议选择自动发货(mod.json中配置auto_detect为true),然后按照商城插件readme.txt中的指引,监听【ServerShipItemsEvent】事件,处理发货逻辑 - 假如游戏有自定义的特殊发货逻辑,那么可以选择不自动发货(mod.json中配置auto_detect为false),然后按照商城插件readme.txt中的指引,使用API【StartShipProcess】触发查询订单的逻辑 ![1568016399843](./images/syh13.png) - 发货逻辑的实现,可以参考示例代码,位于商城插件服务端mod的【neteaseTestServerSystem.py】中 ```Python class TestServerSystem(ServerSystem): def __init__(self, namespace, systemName): self.ListenForEvent("neteaseShop", "neteaseShopDev", "ServerShipItemsEvent", self, self.OnServerShipItems) def OnServerShipItems(self, args): ''' 收到订单信息,执行发货逻辑 ''' uid = args["uid"] entities = args["entities"] #根据 entities 执行发货逻辑,entities参数如下 # entities = [{ # "item_id": 90027446413343740, #商品id,仅记录用 # "uuid": "8a0886b5-eeb5-41f0-b517-f65691a2ce3b",# 玩家的唯一编号 # "item_num":1,#玩家购买的道具数量 # "orderid":"1234", #订单id # "cmd":"test",#实现指令 # "buy_time":1230782400,#购买时间戳 # "group" : 1#道具分类 # }, # { # "item_id": 90027446413343740, # "uuid": "8a0886b5-eeb5-41f0-b517-f65691a2ce3b", # "item_num":1, # "orderid":"1235", # "cmd":"test", # "buy_time":1230782400, # "group" : 1 # } # ] for entity in entities: itemNum = entity['item_num'] cmd = entity['cmd'] #todo:开发者在需要根据cmd给玩家发货 #发货之后,需要通知Apollo发货成功了。 self.ShipSuccess(args) def ShipSuccess(self,args): ''' 通知Apollo发货成功了 ''' neteaseShopServerSystem = serverApi.GetSystem("neteaseShop", "neteaseShopDev") neteaseShopServerSystem.ShipOrderSuccess(args) ``` #### 部署商城插件 ![1568016399843](./images/syh8.png) ### 测试 #### 移动端测试 - 在[测试版登录器](./第2节:PE测试.md)中登录游戏。 - 假如配置了不使用商城插件的自定义道具商店(mod.json中配置use_custom_shop为false),点击左上角商店入口,可以打开引擎的道具商店,用测试货币购买对应成功上架的商品。 ![1568016399843](./images/syh10.png) - 假如配置了使用商城插件的自定义道具商店(mod.json中配置use_custom_shop为true),点击左上角的【打开商店】按钮,可以打开插件自定义道具商店,点击购买对应成功上架的商品。 - 注意:配置了商城插件的自定义道具商店后,插件打开商店和PE引擎自己的商店会显示在一起,点两个其中任何一个效果都一样。 ![1568016399843](./images/syh14.png) #### PC端测试 - 在McStudio——基岩版服务器——网络服开发,选中需要测试的游戏,点击"开发测试"可以打开测试客户端 ![1568016399843](./images/syh16.png) - PC端引擎没有道具商店,必须配置使用商城插件的自定义道具商店(mod.json中配置use_custom_shop为true),进入测试客户端后,点击左上角的【打开商店】按钮,可以打开插件自定义道具商店,点击购买对应成功上架的商品。 ![1568016399843](./images/syh14.png) #### McStudio测试 - 在McStudio——基岩版服务器——线上服务器,选中需要测试的游戏,点击“更多”——“商店”,可打开测试商店界面。 ![1568016399843](./images/plugin_11.png) ![1568016399843](./images/plugin_12.png) ![1568016399843](./images/plugin_13.png)