EN

# 三、功能介绍

# 3.1 平台初始化

如果您需要使用任一平台功能,必须先按照以下内容初始化奇遇SDK:

  • 初始化平台SDK
   /// <summary>
        /// 初始化平台接口
        /// </summary>
        /// <param name="callback">回调函数</param>
        /// <param name="app_id">APPID</param>
        /// <param name="app_secret">开发者秘钥</param>
        public static void InitQiyuSDK(RequestCallback callback, string app_id, string app_secret)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_InitQiyuSDK(QiyuMessageManager.AddRequest(callback), app_id, app_secret);
        }

参数说明:

  • app_id、app_secret:请您在登录奇遇开发者网站后,点击“管理 - 我的应用 - 新增”创建您的应用,系统将会给每个应用生成唯一app_id和app_secret。创建应用后,点击「API」查看App ID,App Secret信息

    图3.1 查看App ID 和 App Secret
  • 返回码

app初始化完毕后,开发者应该首先初始化sdk,来验证开发者身份,所有平台接口都需要身份验证成功后调用。msg.code的返回码如下:

监听码 原因
S0000 成功
S9000 系统异常
S9001 参数为空
B3021 应用ID或秘钥错误

  1. 初始化接口必须在Start函数或后面的时机调用,不能在Awake函数里调用,否则会崩溃或者初始化无效。
  2. SDK 升级到v1.2.1 及以上版本后,需要从“开发者平台-管理 - 我的应用 - API”获取应用密钥(app_secret),并更新初始化接口中的App Secret信息。

Demo :

       //Initialize SDK Just Once
        QiyuXRPlatform.InitQiyuSDK(QiyuMessage.GetRequestResult<QiyuMessage.SDKInit>((msg) =>
        {
            if (msg.IsSuccess())
            {
                Debug.Log( $" InitQiyuSDK OK!");
            }
            else
            {
                Debug.Log( $" InitQiyuSDK Failed! code:{msg.code}");
            }
        }),
        "", //AppId 从开发者后台的APP页面获取
        ""); //App秘钥 从开发者后台的APP页面获取

# 3.2 奇遇账户

在应用程序中获取奇遇用户的帐户状态和信息。

  • 获取奇遇账户是否登录
public static bool IsQiyuAccountLogin()
        {
            if (!QiyuPlatform.IsAndroid)
                return false;

            return QiyuXRPlatformPlugin.QVR_IsAccountLogin() == 1;
        }
  • 获取奇遇账户信息
 /// <summary>
        /// 获取Qiyu账户信息
        /// </summary>
        /// <param name="callback">请求的回调函数</param>
        public static void GetQiyuAccountInfo(RequestCallback callback)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_GetQiyuAccountInfo(QiyuMessageManager.AddRequest(callback));
        }

获取奇遇账号信息Demo

QiyuXRPlatform.GetQiyuAccountInfo(QiyuMessage.GetRequestResult<QiyuMessage.QiyuAccountInfo>((msg) =>
            {
                if (msg.IsSuccess())
                {
                    Debug.Log(string.Format( " GetQiyuAccountInfo uid is {0},name is {1}", msg.data.uid, msg.data.name));
                }
            }));

:开发者在获取奇遇账号信息时,应先判断是否已经登录奇遇账号,只有登录成功后,才会获取到账户信息。

调用登录界面Demo(未登录获取账号信息失败时需要):

public void GetQiyuAccountInfo()
    {
        if (QiyuXRPlatform.IsQiyuAccountLogin())
        {
            QiyuXRPlatform.GetQiyuAccountInfo(QiyuMessage.GetRequestResult<QiyuMessage.QiyuAccountInfo>((msg) =>
            {
                if (msg.IsSuccess())
                {
                    Debug.Log(string.Format(" GetQiyuAccountInfo uid is {0},name is {1}", msg.data.uid, msg.data.name));
                }
            }));
        }
        else
        {
            //跳转到Home进行登录
            QiyuXRPlatform.LaunchHome("login", "");
        }
    }

奇遇后台提供了校验用户账号有效性的服务器接口,参见4.3 奇遇用户认证API指南 (opens new window)

# 3.3 深度链接

当您有两个独立的应用程序时:例如一个单人游戏和一个多人游戏。如果你想要在两个应用程序中实现应用程序深度链接,用户可以从单人应用程序加入多人游戏应用。 深度链接需要在发出请求的应用程序和目标应用程序中进行集成。接下来的部分将描述这两个应用程序所需的实现。

打开其他应用

/// <summary>
        /// 打开其他应用
        /// </summary>
        /// <param name="app_id">应用id</param>
        /// <param name="key">深度连接Key(注:Key参数为小写字母)</param>
        /// <param name="value">深度连接value</param>
        public static void LaunchOtherApp(string app_id, string key, string value)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_LaunchOtherApp(app_id, key, value);
        }

注:跳转请求发出后,如果目标应用未购买或者未安装,会跳转到奇遇商店-目标应用详情页

  • 获取深度连接信息
/// <summary>
        /// 获取深度连接信息
        /// </summary>
        /// <param name="callback">回调函数</param>
        public static void GetDeepLink(RequestCallback callback)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_GetDeepLink(QiyuMessageManager.AddRequest(callback));
        }

Demo:

  • 从A app 打开 B app, 调用LaunchOtherApp 并传入深度链接参数。
QiyuXRPlatform.LaunchOtherApp("70519169", "show", "1"); 
  • B app 在初始化完毕之后,调用GetDeepLink 函数获取之前传入的深度链接参数。
QiyuXRPlatform.GetDeepLink(QiyuMessage.GetRequestResult<QiyuMessage.DeepLinkParam>(msg =>
        {
            if (msg.IsSuccess() && msg.data != null)
            {
                Debug.Log(string.Format( " OnGetDeepLink key is {0},value is {1}", msg.data.key, msg.data.value));
            }
        }));
  • 跳转到商店游戏详情页(可用于查看游戏介绍、游戏升级)
QiyuXRPlatform.LaunchHome("store", app_id); 

# 3.4 数据存档

在奇遇商店上线的内容,需要存档用户数据,防止用户在版本升级、卸载重装后丢失已有数据和档案。如果您的应用需要存档用户数据,请使用SDK提供的QiyuPrefs类及方法,实现应用数据持久化功能。退出游戏前记得调用Save保存。

  • 获取Float类型存档
 /// <param name="key">关键字</param>
 /// <param name="defValue">默认值</param>
 /// <returns>返回值</returns>
public static float GetFloat(string key, float defValue = 0)
    {
        if (QiyuPlatform.IsAndroid)
        {
            return QiyuXRPlatformPlugin.QVR_Prefs_GetFloat(key, defValue);
        }
        else
        {
            return PlayerPrefs.GetFloat(key, defValue);
        }
    }
  • 获取Int类型存档
/// <param name="key">关键字</param>   
/// <param name="defValue">默认值</param>   
/// <returns>返回值</returns>   
public static int GetInt(string key, int defValue = 0)
    {
        if (QiyuPlatform.IsAndroid)
        {
            return QiyuXRPlatformPlugin.QVR_Prefs_GetInt(key, defValue);
        }
        else
        {
            return PlayerPrefs.GetInt(key, defValue);
        }
    }
  • 获取String类型存档
/// <param name="key">关键字</param>   
/// <param name="defValue">默认值</param>   
/// <returns>返回值</returns>   
public static string GetString(string key, string defValue = "")
    {
        if (QiyuPlatform.IsAndroid)
        {
            return QiyuXRPlatformPlugin.QVR_Prefs_GetString(key, defValue);
        }
        else
        {
            return PlayerPrefs.GetString(key, defValue);
        }
    }
  • 设置Float类型存档
/// <param name="key">关键字</param>   
/// <param name="defValue">默认值</param>   
public static void SetFloat(string key, float value)   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
        QiyuXRPlatformPlugin.QVR_Prefs_SetFloat(key, value);     
    }     
    else     
    {       
        PlayerPrefs.SetFloat(key, value);     
    }   
}
  • 设置Int类型存档
  /// <param name="key">关键字</param>   
/// <param name="defValue">默认值</param>   
public static void SetInt(string key, int value)   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
        QiyuXRPlatformPlugin.QVR_Prefs_SetInt(key, value);     
    }     
    else     
    {       
        PlayerPrefs.SetInt(key, value);     
    }   
}
  • 设置String类型存档
 /// <param name="key">关键字</param>   
/// <param name="defValue">默认值</param>   
public static void SetString(string key, string value)   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
        QiyuXRPlatformPlugin.QVR_Prefs_SetString(key, value);     
    }     
    else     
    {       
        PlayerPrefs.SetString(key, value);     
    }   
}
  • 删除所有存档
public static void DeleteAll()   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
        QiyuXRPlatformPlugin.QVR_Prefs_DeleteAll();     
    }     
    else     
    {       
        PlayerPrefs.DeleteAll();     
    }   
} 
  • 删除指定key存档
/// <param name="key">关键字</param>   
public static void DeleteKey(string key)   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
        QiyuXRPlatformPlugin.QVR_Prefs_DeleteKey(key);     
    }     
    else     
    {       
        PlayerPrefs.DeleteKey(key);     
    }   
}  
  • 指定key存档是否存在
/// <param name="key">关键字</param>   
public static bool HasKey(string key)   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
        return QiyuXRPlatformPlugin.QVR_Prefs_HasKey(key);     
    }     
    else     
    {       
        return PlayerPrefs.HasKey(key);     
    }   
}
  • 将存档写入磁盘
public static void Save()   
{     
    if (QiyuPlatform.IsAndroid)     
    {       
       QiyuXRPlatformPlugin.QVR_Prefs_Save();     
    }     
    else     
    {       
        PlayerPrefs.Save();     
    }   
}

注意:

  • 奇遇设备支持多账号登陆和退登,所以在使用Prefs提供的方法时,需将奇遇账号信息连同需要存储的数据关联,以实现针对每个用户正确的档案数据。

  • QiyuPrefs为本地存档方案,支持应用升级、卸载重装后保留用户数据,并非“云存档”。

多账号存档Demo:

QiyuXRPlatform.GetQiyuAccountInfo(QiyuMessage.GetRequestResult<QiyuMessage.QiyuAccountInfo>((msg) =>
           {
               if (msg.IsSuccess())
               {
                    //记录uid
                    string uid = msg.data.uid;
                   
                    //使用uid前缀存取存档
                   string name = QiyuPrefs.GetString(uid + "name");
                   QiyuPrefs.SetString(uid + "name", name);
                   int level = QiyuPrefs.GetInt(uid + "level");
                   QiyuPrefs.SetInt(uid + "level", level);
                   QiyuPrefs.Save();
                }
           }));

# 3.5 应用内支付

应用内支付仅支持“应用”使用,不支持“游戏”使用。

应用内支付支持用户在应用里购买虚拟商品、代币等内容。开发者可在奇遇开发者平台创建、配置、编辑商品信息,再通过SDK提供的接口集成进应用中。

奇遇商品支付通过"手机短信-链接跳转到微信/支付宝"完成,主要流程如下图所示,您可根据流程和SDK Demo完成内支付功能的接入和开发。

图3.5 奇遇商品支付流程

# 3.5.1 开发者平台配置

奇遇开发者平台 - 应用 - 附加内容页提供新增、查看和管理应用程序的应用内支付商品的功能。

图3.5.1.1 应用-附加内容

1. 新增商品

  • 单个新增

点击「新增」按钮,然后填入:

名称: 此名称为您创建的应用内购买的名称。

SKU: SKU 是代码中映射关联到此附加内容的唯一标识符,不同物品间的 SKU 不可以重复。

价格: 以人民币(CNY)为单位。

物品类型: 物品类型分为消耗型和持久型。消耗型为可重复购买的商品,如金币;持久型为一次性购买产品,如视频资源。

  • 批量新增

点击「批量上传」按钮。按照“文件模板”提供的格式,将更改好的文件进行上传。

文件内需要批量录入:1.名称,2.SKU,3.价格,4.物品类型。

图3.5.1.2 批量上传商品

2. 查看商品

点击应用操作栏中的「附加内容」可查看属于该应用的商品列表和信息。有关示例,请参见下图:

图3.5.1.3 商品列表

3. 操作商品

  • 应用内购买状态&操作

待发布:首次录入商品之后,为待发布状态。可以进行发布以及编辑操作。

已发布:发布操作后,状态变为已发布。可以进行下线操作。

已下线:下线操作后,状态变为已下线。可以进行发布以及上线操作。

  • 立即/定时 上下线操作

在发布或者下线的弹窗中,可以选择立即或者定时。如果您选择定时发布/下线的话,游戏内购买状态将在您选择的时间节点进行状态变更。

  • 编辑

商品创建成功后,可以通过编辑,修改商品价格。

4. 通知地址

此地址为订单通知的服务器地址。点击「通知地址」按钮,输入订单支付通知地址。

图3.5.1.4 通知地址

# 3.5.2 SDK接口

  • 初始化奇遇支付
/// <summary>
/// 初始化奇遇支付接口
/// </summary>
public static void InitQiyuPay(RequestCallback callback)
	{
     if (!QiyuPlatform.IsAndroid)
     return;
   QiyuXRPlatformPlugin.QVR_InitQiyuPay(QiyuMessageManager.AddRequest(callback));
     }
返回码 原因
S0000 初始化成功
S9000 系统异常
S1000 平台未初始化或初始化失败
  • 获取商品列表
/// <param name="callback"></param>
/// <param name="skuList">参数格式:"sku1,sku2,sku3",参数为空时获取全部</param>
public static void GetSkuList(RequestCallback callback, string skuList = "")
{
    if (!QiyuPlatform.IsAndroid)
    return;
    QiyuXRPlatformPlugin.QVR_GetSkuList(QiyuMessageManager.AddRequest(callback), skuList);
}
返回码 原因
S0000 查询成功
B1001 查询结果为空
S9000 系统异常
S9001 参数错误
S1000 平台未初始化或初始化失败
S1001 支付未初始化或初始化失败
  • 下单购买
/// <param name="callback"></param>
/// <param name="sku">要购买商品的sku</param>
public static void PlaceOrder(RequestCallback callback, string sku)
{  
    if (!QiyuPlatform.IsAndroid)    
    return;   
    QiyuXRPlatformPlugin.QVR_PlaceOrder(QiyuMessageManager.AddRequest(callback), sku);
}
返回码 原因
S0000 成功下单
B3007 设备识别码无效
B4010 您已购买过该SKU
B4009 您有一笔待支付订单
B3019 商品不存在
S9000 系统异常
S9001 参数错误
S1000 平台未初始化或初始化失败
S1001 支付未初始化或初始化失败
  • 查询订单结果
/// <param name="callback"></param>
/// <param name="orderId">PlaceOrder返回的订单号</param>
public static void QueryOrderResult(RequestCallback callback, string orderId)
{  
    if (!QiyuPlatform.IsAndroid)    
    return;
QiyuXRPlatformPlugin.QVR_QueryOrderResult(QiyuMessageManager.AddRequest(callback), orderId);
}
返回码 原因
S0000 查询成功
B1003 authCookie失效
B3019 商品不存在
B1001 查询结果为空
S9000 系统异常
S9001 参数错误
S1000 平台未初始化或初始化失败
S1001 支付未初始化或初始化失败

订单查询成功后,同时会返回订单数据,开发者根据“orderStatus”字段判断支付是否成功。

  • 查询历史订单信息
/// <param name="callback"></param>
/// <param name="sku">要查询商品的sku</param>
/// <param name="curPage">分页查询的页号,默认查询第1页</param>
/// <param name="pageSize">每页指定订单数量,默认每页显示10个</param>
public static void QueryHistoryOrders(RequestCallback callback, string sku, int curPage = 1, int pageSize = 10)
{   
    if (!QiyuPlatform.IsAndroid)    
    return; QiyuXRPlatformPlugin.QVR_QueryHistoryOrders(QiyuMessageManager.AddRequest(callback), sku, curPage, pageSize);
}
返回码 原因
S0000 查询成功
B1003 authCookie失效
B3019 商品不存在
B1001 查询结果为空
S9000 系统异常
S9001 参数错误
S1000 平台未初始化或初始化失败
S1001 支付未初始化或初始化失败
  • 使用注意事项
  1. 必须先调用平台初始化接口InitQiyuSDK和支付初始化接口InitQiyuPay,再使用支付模块提供的其他功能接口。
  2. 下单接口会有15分钟的间隔,如果上一个订单没有完成,再次下单,会返回错误码提示未完成支付(B4009);如果已完成了支付,可以立即第二次下单,此时,开发者需要根据商品类型,决定是否可重复购买。
  3. 奇遇平台是手机短信支付方式,完整的支付过程参见图3.5,效果参见应用商店购买应用的流程,下单和支付中间有时间空隙,所以开发者在调用下单接口PlaceOrder无法直接获取支付结果,需要主动调用订单查询接口QueryOrderResult获取支付状态。一定要做一些权益到账的保证逻辑,如果用户离开购物现场,可以通过轮询订单结果来发放,中断app或崩溃以后,可以通过启动游戏时、进入商品商店页面时查询历史订单接口来补发。
  4. 对于有服务端的开发者,尽量通过3.5.3提供的服务端通知接口保证权益到账;单机游戏需要开发者自行保存订单信息,并且通过奇遇SDK提供的数据存档功能保存,防止应用再卸载重装后丢失数据。
  5. 详细用法请参考QiyuPayTest.cs脚本以及QiyuPayTest场景。

# 3.5.3 服务端支付结果通知

请参见4.2 服务端支付结果通知 (opens new window)

# 3.5.4 开发者测试账号

点击「申请测试用户账号」,选择申请数量(最多可申请3个),点击确认后可以看到测试账号的列表;同时,我们会将测试账号的邮箱和密码以邮件形式发出,请注意查收。

图3.5.4.1 申请测试账号

开发者通过账号右侧的开关来模拟测试账号支付成功或失败的结果,再在奇遇设备中登录测试测试账号,以实验应用前端的效果。 注意:密码中特殊符号请使用英文字符,中文字符会登录失败。

图3.5.4.2 测试账号模拟IAP结果

如果需要申请更多测试用户账号,请发邮件至vrsupport@qiyi.com,我们会尽快给您回复。

# 3.6 DLC

奇遇平台提供应用可下载附加内容(Downloadable Add-on Content)的售卖。

开发者可在奇遇开发者平台创建、配置、编辑DLC信息,再通过SDK提供的接口集成进游戏中。DLC内容通过平台审核后,可在奇遇商店上架进行销售。用户在商店里购买游戏币、新的关卡、地图、媒体库等内容。进入游戏后,解锁新关卡,下载新资源。您可根据流程和SDK Demo完成DLC功能的接入和开发。

# 3.6.1 开发者平台配置

奇遇开发者平台 - 应用 - 附加内容提供新增、查看和管理应用程序的可下载内容商品的功能。

  1. 新增可下载内容

点击「新增」按钮,然后填入:

附加内容类型:选择可下载内容。

名称: 此名称为您创建的游戏内购买的名称。

SKU: SKU 是代码中映射关联到此附加内容的唯一标识符,不同物品间的 SKU 不可以重复。

价格: 可以选择免费或付费,付费的价格以人民币(CNY)为单位,可以精确到分。

物品类型: 物品类型分为消耗型和持久型。消耗型为可重复购买的商品,如金币;持久型为一次性购买产品,如新关卡。

简介: 输入关于该商品的简介,上限为500字符。

描述: 输入关于该商品更为细致的描述,上限为1000字符。

ICON:上传该DLC的ICON,该ICON将会展示给用户。

  1. 编辑可下载内容

如果您有其他资产需要上传,或者您的可下载内容有文件需要上传,请在列表中点击「编辑」按钮。

  • DLC文件

您可以在这里选择您通过奇遇开发者上传工具上传的DLC文件。

  • 描述

您可以在描述页对您填入的名称、简介、描述进行修改。

  • 资产

您可以在资产页补充关于该可下载内容的资产物料。

请注意:虽然只有ICON为必填项,但其他非必填项如果您填写并审核通过的话将获得最高优先级的推荐。

  • 价格

可以在这里修改价格。

  1. 查看可下载内容

点击应用操作栏中的「附加内容」可查看属于该应用的可在列表中看到可下载内容信息。有关示例,请参见下图:

  1. 提交审核

可下载内容均需要提交奇遇平台进行审核,只有审核通过后,奇遇平台才会对该可下载内容进行上线操作。点击操作栏中的「提交审核」。

  1. 可下载内容排序

您可以对已经发布的可下载内容进行排序,从而控制可下载内容在产品详情页的展示顺序,点击「产品详情页排序」。

操作栏的上下按钮可以控制附加内容的排序。

# 3.6.2 SDK接口

SDK提供以下数据结构和客户端接口,支持应用完成DLC权益查验、文件下载功能:

  • DLC列表数据
public class QiyuDlcAssetDetail
        {
            public const int ASSET_TYPE_PERSISTENT = 1;//持久型dlc
            public const int ASSET_TYPE_CONSUMED = 2;//消耗型dlc
            public const int PAY_TYPE_FREE = 0;//免费
            public const int PAY_TYPE_PAID = 1;//付费

            public string sku;
            public string name;
            public int type;
            public int payType;  //PAY_TYPE_FREE, PAY_TYPE_PAID
            public float originalPrice;
            public float salePrice;
            public string shortDescription;
            public string iconURL;
        }
  • DLC状态
public class QiyuDlcAssetStatus
        {
            public const int DOWNLOAD_STATUS_AVAILABLE = 0;//可下载
            public const int DOWNLOAD_STATUS_DOWNLOADING = 1;//下载中
            public const int DOWNLOAD_STATUS_COMPLETE = 2;//下载完成
            public const int DOWNLOAD_STATUS_PENDING = 3;//下载暂停

         	public string sku;
         	public bool purchased;  //true是已经购买,false未购买
         	public int downloadStatus;  //上面的四种DOWNLOAD_STATUS之一
           	public string filePath;
        }
  • 下载状态
public class QiyuDlcNotifications
        {
            public const string CODE_COMPLETE = "S0000";//下载完成
            public const string CODE_ERROR = "C1000";  // 未知错误
            public const string CODE_MD5_FAILED = "C1001";  // MD5校验失败
            public const string CODE_LOW_STORAGE = "C1002";  // 文件储存空间不足
            public const string CODE_INTERUPT = "C1003";  // 接收数据被中断
            public const string CODE_SERVER_DISCONNECT = "C1004";  // 与服务器链接失败
            public const string CODE_INVALID_VERSION = "C1005";  // 资源不存在
            public const string CODE_DOWNLOADING = "C1006";  // DLC正在下载中

            public string sku;
            public double currentSize;//当前下载进度的文件大小,单位MB
            public double totalSize; //总的文件大小,单位MB
            public string code;  //返回码是上面的CODE之一
            public string filePath;//下载完成之后的路径
        }
  • 初始化(QiyuDLC.Init)
    /// <summary>
        /// 初始化接口
        /// </summary>
        /// <param name="callback"></param>
        public static void Init(RequestCallback callback)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_InitDLC(QiyuMessageManager.AddRequest(callback));
        }
返回码 原因
S0000 初始化成功
S1000 SDK尚未初始化
S9000 系统异常
S9001 参数错误
  • 获取DLC列表(QiyuDLC.GetAssetsList)
 /// <summary>
        /// 获取dlc列表
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="curPage">分页查询的页号,默认查询第1页</param>
        /// <param name="pageSize">每页指定数量,默认每页显示10个</param>
        public static void GetAssetsList(RequestCallback callback, int curPage = 1, int pageSize = 10)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_GetAssetsList(QiyuMessageManager.AddRequest(callback), curPage, pageSize);
        }
返回码 原因
S0000 查询成功
S1001 未初始化
B1001 查询结果为空
S9000 系统异常
S9001 参数错误
  • 获取当前用户指定DLC状态(适用于持久型DLC) (QiyuDLC.GetAssetStatus)
 /// <summary>
        /// 获取指定dlc状态
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="sku">dlc的sku</param>
        public static void GetAssetStatus(RequestCallback callback, string sku)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_GetAssetStatus(QiyuMessageManager.AddRequest(callback), sku);
        }
返回码 原因
S0000 成功
S1001 未初始化
B1001 查询结果为空
S9000 系统异常
B4015 不支持消耗型DLC鉴权
B1003 用户账户已过期
B4000 APP鉴权失败

注:消耗型DLC,参见4.2 服务端支付结果通知 (opens new window)

  • 下载DLC文件(QiyuDLC.DownloadAsset)
 /// <summary>
        /// 下载指定dlc
        /// </summary>
        /// <param name="callback"></param>
        /// <param name="sku">dlc的sku</param>
        public static void DownloadAsset(RequestCallback callback, string sku)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            QiyuXRPlatformPlugin.QVR_DownloadAsset(QiyuMessageManager.AddRequest(callback), sku);
        }
返回码 原因
S0000 查询成功
S1001 未初始化
C1002 储存空间不足
C1005 资源不存在
B4015 不支持消耗型DLC的鉴权
B1003 用户账户已过期
B4000 APP鉴权失败
B4013 DLC鉴权失败
B3033 DLC版本错误

注意事项

  1. 调用下载接口前,须先调用GetAssetStatus查询资源的状态;当已购买未下载 或 有文件更新时,通过GetAssetStatus接口查询DLC的状态,downloadStatus为DOWNLOAD_STATUS_AVAILABLE,游戏需提示用户下载资源或升级。
  2. 支持后台下载,即设备息屏、回到Home(未退出)资源会继续下载。应用完全退出时下载会中断,重新启动应用后,开发者需要检查下载状态,决定是否需要继续下载,如下载没有完成需要再次调用DownloadAsset进行断点续下。
  • 获取下载进度(QiyuDLC.SetDownloadUpdateCallBack)
     /// <summary>
        /// 设置下载进度通知
        /// </summary>
        /// <param name="callback">回调函数</param>
        public static void SetDownloadUpdateCallBack(Action<QiyuMessage.QiyuDlcNotifications> callback)
        {
            if (!QiyuPlatform.IsAndroid)
                return;

            callbackInner = callback;
            QiyuXRPlatformPlugin.QVR_DownloadUpdateNotifications(DownloadUpdateCallBack);
        }
返回码 原因
S0000 下载成功
C1001 MD5校验不通过
C1002 写入错误,可能是储存空间不足
C1003 接收数据中断,可能是网络中断
C1004 向服务器发起连接请求失败
C1006 文件正在下载中
C1007 重复的下载请求
C1008 文件MD5正在校验中
C1000 系统异常
  • 跳转到商店指定DLC详情页
QiyuXRPlatform.LaunchHome("dlc", "123456");//第二个参数为DLC sku

# 3.6.3 服务端

# 3.6.3.1 服务器端查单接口

请参见4.1 服务器端查单接口 (opens new window)

# 3.6.3.2 服务端支付结果通知

请参见4.2 服务端支付结果通知 (opens new window)

# 3.6.4 接入注意事项

  1. DLC发布和更新均需要经过平台审核,审核通过后上线到奇遇商店,审核标准参见《奇遇应用审核标准》 (opens new window)
  2. 奇遇后台允许1个DLC对应上传1个文件,如果1个DLC包含多个文件,需压缩后上传。
  3. 压缩文件类型的DLC下载后,如果需要解压,推荐使用SharpZipLib (opens new window)等第三方库实现加载前的解压功能。
  4. 对于持久型DLC,可通过客户端接口查验权益;对于消耗型DLC,用户可重复购买,平台无法标记游戏内多次权益下发的状态,需要开发者通过自己的游戏后台,接收奇遇后台的订单支付通知,进行权益下发并维护订单状态。

# 3.6.5 开发者自测

奇遇开发者平台给您提供了测试账号,您可以使用测试账号登录到一体机,以及配置相关选项来测试适配您的附加内容。

在DLC测试结果列,点击「设置」按钮,可以在弹窗内配置该测试账号是否购买该可下载内容,以及该可下载内容是否发布。

请注意:

  1. 配置的可下载内容是否发布,仅影响接口返回,并不影响真实线上情况。所有的可下载内容均需要提交奇遇平台进行审核。审核通过后,奇遇平台会与您沟通上线时间进行正式发布。
  2. 配置的可下载内容是否购买,仅影响接口返回,并不需要实际支付。
  3. 如果需要测试查询DLC订单支付结果,可将「是否购买」选择「已购」,点击「订单生成」,此时可通过查询DLC订单支付结果查询到此订单,持久型DLC只会生成一笔订单,消耗型DLC每次都会生成一笔新的订单。
  4. 如果需要测试服务端支付结果通知,需要先填入通知地址,再将「是否购买」选择「已购」,先点击「订单生成」,持久型DLC每次通知都是通知同一笔订单;消耗型DLC每次通知都会通知最新的一笔订单。

# 3.6.6 DLC Demo

我们在奇遇商店的开发者通道提供了DLC Demo,演示商店中DLC的展示效果和应用内相关接口的使用。体验步骤如下:

  1. 使用开发者平台提供的测试账号登录奇遇设备。
  2. 打开“应用商店”,拖到页面底部“我的预览应用”,可看到DLCDemo。
  1. 点击DLCDemo打开详情页,可看到附属的2个DLC。
  1. 点击DLC打开详情页,可查看标题、描述、配图、视频、评论等信息。
  1. 在应用详情页,“免费购买”Demo APP;在DLC详情页,“免费购买”附加内容。

  2. 点击“打开应用”,启动Demo,通过GetAssetsList可获取到本应用DLC列表;通过GetAssetStatus可获取到当前用户对于指定DLC的权益,同时对于包含附件文件的DLC,可获取到下载地址;通过DownloadAsset接口可下载已购买的附件文件;LaunchHome可跳转到奇遇商店指定DLC详情页。