应用开发¶
本指南概述了使用Hive SDK开发应用程序的步骤。Hive SDK提供了多种功能,例如身份验证、支付、推送通知、广告横幅和客户数据分析。在本指南中,我们将重点介绍实现最基本的功能:身份验证和支付。
Note
Hive SDK 支持多种开发引擎(Android Native、iOS Native、Unity、Unreal Engine 等)。本指南假设您已经熟悉使用每个开发引擎开发、构建和发布应用程序,并将重点介绍如何使用 Hive SDK。有关每个开发引擎的开发、构建和发布应用程序的详细信息,请参考各自的开发者中心和文档。
在应用程序开发中使用Hive SDK的整体过程可以总结如下:
- 实现 Hive SDK 初始化
- 实现认证
- 实现支付
实现身份验证包括:
- 实现登录
- 实现登录令牌验证
实施支付包括:
- 实现支付初始化
- 实现产品列表检索
- 实现产品购买
- 实现购买收据验证
Hive SDK 实现流程¶
Hive SDK 开发应用功能的一般实施流程概述如下。
实现 Hive SDK 初始化¶
要操作Hive SDK,您首先需要初始化它。初始化Hive SDK涉及分配预先输入的Hive SDK设置并执行各种准备任务。要初始化Hive SDK,请调用AuthV4.setup
。如果调用成功,您将收到以下信息,可以在应用程序中适当的时候存储和使用。
Hive 初始化结果信息
字段名称 | 描述 | 示例 |
---|---|---|
isAutoSignIn | 是否可以自动登录 | true |
did | 应用安装时生成的标识符 | 123456789 |
providerTypeList | 当前应用中可用的 IdP 认证列表 | ProviderType.HIVEProviderType.GOOGLE |
以下是setup
方法的实现示例。
API 参考: hive.AuthV4.setup
API 参考: AuthV4::setup
// 请求初始化 Hive SDK
AuthV4::setup([=](ResultAPI const & result, bool isAutoSignIn, std::string did, std::vector<ProviderType> const & providerTypeList) {
if (result.isSuccess()) {
// 初始化成功。根据自动登录的可用性处理登录。
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// Cocos2d-x 引擎用户
// 例如,exit(0);
// Unreal 引擎用户
// 例如,UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
// 初始化失败
}
});
API 参考: com.hive.AuthV4.setup
// 请求初始化 Hive SDK
AuthV4.setup(object: AuthV4.AuthV4SetupListener{
override fun onAuthV4Setup(result: ResultAPI, isAutoSignIn: Boolean, did: String?, providerTypeList: ArrayList<AuthV4.ProviderType>?) {
if (result.isSuccess) {
// 初始化成功。根据自动登录的可用性处理登录。
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// 例如,exitProcess(0)
} else {
// 初始化失败
}
}
})
API 参考: com.hive.AuthV4.setup
// 请求初始化 Hive SDK
AuthV4.setup(new AuthV4.AuthV4SetupListener() {
@Override
public void onAuthV4Setup(ResultAPI result, boolean isAutoSignIn, String did, ArrayList<AuthV4.ProviderType> providerTypeList) {
if (result.isSuccess()) {
// 初始化成功。根据自动登录的可用性处理登录。
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// 例如,System.exit(0);
} else {
// 初始化失败
}
}
});
API 参考: HIVEAuthV4:setup
AuthV4Interface.setup { (result, isAutoSignIn, did, providerTypeList) in
if result.isSuccess() {
// Initialization succeeded. Handle login based on the auto-login availability.
} else if result.needExit() {
// TODO: Implement app exit functionality
// e.g., exit(0)
} else {
// Initialization failed
}
}
API 参考: HIVEAuthV4:setup
Info
有关更多详细信息,请参阅Hive 初始化指南。
认证实现¶
应用程序用户不仅可以使用他们的 Hive 会员账户登录应用程序,还可以使用各种身份提供者(IdP)账户,例如 Google 和 Facebook。在实现登录时,用户可以选择他们首选的 IdP 账户登录应用程序,并将其应用程序账户与 IdP 账户关联。提供的 IdP 类型可以根据应用程序的不同而进行不同配置,Hive 平台根据用户的国家信息向用户展示适当的 IdP。
首先,在 Hive 控制台中配置 IdP 设置。
- 保存由 IdP 提供的密钥值
- 在 应用中心 > 管理 AppID > 搜索并点击应用 > 点击 AppID 标签 > 点击应用 AppID > 登录 中启用 IdP 使用
Info
有关更多详细信息,请参阅Hive 控制台认证指南。
登录实现¶
完成控制台设置后,使用 Hive SDK 实现登录 UI。以下是使用 SDK 提供的 UI 的示例。
API 参考: hive.AuthV4.showSignIn
// Hive SDK AuthV4 认证 UI 请求
AuthV4.showSignIn((ResultAPI result, AuthV4.PlayerInfo playerInfo)=>{
if (result.isSuccess()) {
// 认证成功
// playerInfo: 认证用户信息
// 获取电子邮件信息的示例
foreach (KeyValuePair<AuthV4.ProviderType, AuthV4.ProviderInfo> entry in playerInfo.providerInfoData) {
AuthV4.ProviderInfo providerInfo = entry.Value;
if(providerInfo.providerEmail != null && providerInfo.providerEmail != "") {
string email = providerInfo.providerEmail;
break;
}
}
}
else if (result.needExit()) {
// TODO: Implement the app exit function
// e.g., Application.Quit();
}
});
API 参考: AuthV4::showSignIn
// Hive SDK AuthV4 认证 UI 请求
AuthV4::showSignIn([=](ResultAPI const & result, PlayerInfo const & playerInfo) {
if (result.isSuccess()) {
// 认证成功
// playerInfo: 认证用户信息
// 获取电子邮件信息的示例
for(auto it = playerInfo.providerInfoData.begin(); it != playerInfo.providerInfoData.end(); ++it) {
hive::ProviderInfo providerInfo = it->second;
if(!providerInfo.providerEmail.empty()) {
std::string email = providerInfo.providerEmail;
break;
}
}
}
else if (result.needExit()) {
// TODO: 实现应用程序退出功能
// Cocos2d-x 引擎用户
// 例如,exit(0);
// Unreal 引擎用户
// 例如,UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
}
});
API 参考: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 认证 UI 请求
AuthV4.showSignIn(object : AuthV4.AuthV4SignInListener {
override fun onAuthV4SignIn(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// 认证成功
// playerInfo: 认证用户信息
// 获取电子邮件信息的示例
playerInfo?.let {
for ((key, value) in it.providerInfoData) {
var providerInfo: AuthV4.ProviderInfo = value
if(providerInfo.providerEmail.isNotEmpty()) {
val email = providerInfo.providerEmail
break
}
}
}
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// 例如,exitProcess(0)
}
}
})
API 参考: com.hive.AuthV4.showSignIn
// Hive SDK AuthV4 authentication UI request
AuthV4.showSignIn(new AuthV4.AuthV4SignInListener() {
@Override
public void onAuthV4SignIn(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// 认证成功
// playerInfo: 认证用户信息
// 获取电子邮件信息的示例
if(playerInfo != null) {
for (Map.Entry<AuthV4.ProviderType, AuthV4.ProviderInfo> entry : playerInfo.getProviderInfoData().entrySet()) {
AuthV4.ProviderInfo providerInfo = entry.getValue();
if (providerInfo.getProviderEmail() != "") {
String email = providerInfo.getProviderEmail();
break;
}
}
}
}
else if (result.needExit()) {
// TODO: 实现应用退出功能
// 例如,System.exit(0);
}
}
});
API 参考: HIVEAuthV4:showSignIn
var email = String()
// 请求 Hive SDK AuthV4 认证 UI
AuthV4Interface.showSignIn { (result, playerInfo) in
if result.isSuccess() {
// 认证成功
// playerInfo: 经过认证的用户信息
// 检索电子邮件信息的示例
if let playerInfo = playerInfo {
// 使用 providerEmail(当前登录的提供者)搜索 providerInfo
for key in playerInfo.providerInfoData.keys {
if let providerInfo = playerInfo.providerInfoData[key],
providerInfo.providerEmail.count > 0 {
// providerEmail != ""
email = providerInfo.providerEmail
break
}
}
}
} else if result.needExit() {
// TODO: 实现应用退出功能
// 例如,exit(0)
}
}
API 参考: HIVEAuthV4:showSignIn
__block NSString* email = @"";
// Request Hive SDK AuthV4 authentication UI
[HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if([result isSuccess]){
// Authentication successful
// playerInfo: authenticated user information
// Example of retrieving email information
if(playerInfo != nil) {
// Search for providerInfo with providerEmail (currently logged-in provider)
for (NSString* key in playerInfo.providerInfoData.allKeys) {
HIVEProviderInfo* providerInfo = playerInfo.providerInfoData[key];
if (providerInfo != nil && providerInfo.providerEmail.length > 0) {
// providerEmail != ""
email = providerInfo.providerEmail;
break;
}
}
}
} else if ([result needExit]) {
// TODO: Implement app exit functionality
// e.g., exit(0);
}
}];
如果存在现有的身份验证令牌密钥,用户可以自动登录到应用程序。如果从 Hive SDK 初始化响应中接收到的 isAutoSignIn
为 true
,用户可以在不使用上述登录 UI 的情况下自动登录。下面是调用自动登录的示例。
API 参考: hive.AuthV4.Helper.signIn
// 尝试 Hive SDK 登录
AuthV4.Helper.signIn (delegate (ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// 登录成功
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// 例如:Application.Quit();
} else {
switch (result.code) {
case ResultAPI.Code.AuthV4ConflictPlayer:
// 账户冲突
break;
case ResultAPI.Code.AuthV4HelperImplifiedLoginFail:
// 隐式登录失败
// 例如)AuthV4.showSignIn(...);
break;
default:
// 其他异常情况
break;
}
}
});
API 参考: Auth4::signIn
// 尝试 Hive SDK 登录
AuthV4::Helper::signIn([=](ResultAPI const & result, std::shared_ptr playerInfo) {
if (result.isSuccess()) {
// 登录成功
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// Cocos2d-x 引擎用户
// 例如,exit(0);
// Unreal 引擎用户
// 例如,UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false);
} else {
switch (result.code) {
case ResultAPI::AuthV4ConflictPlayer:
// 账户冲突
break;
case ResultAPI::AuthV4HelperImplifiedLoginFail:
// 隐式登录失败
// 例如) AuthV4.showSignIn(...);
break;
default:
break;
}
}
});
API 参考: com.hive.Auth4.Helper.signIn
// 尝试 Hive SDK 登录
AuthV4.Helper.signIn(object : AuthV4.Helper.AuthV4HelperListener {
override fun onAuthV4Helper(result: ResultAPI, playerInfo: AuthV4.PlayerInfo?) {
if (result.isSuccess) {
// 登录成功
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// 例如,exitProcess(0)
} else {
when (result.code) {
ResultAPI.Code.AuthV4ConflictPlayer -> {
// 账户冲突
}
ResultAPI.Code.AuthV4HelperImplifiedLoginFail -> {
// 隐式登录失败
// 例如) AuthV4.showSignIn(...);
}
else -> {
// 其他异常情况
}
}
}
}
})
API 参考: Auth4::signIn
// 尝试使用 Hive SDK 登录
AuthV4.Helper.signIn(new AuthV4.Helper.AuthV4HelperListener() {
@Override
public void onAuthV4Helper(ResultAPI result, AuthV4.PlayerInfo playerInfo) {
if (result.isSuccess()) {
// 登录成功
} else if (result.needExit()) {
// TODO: 实现应用退出功能
// e.g., System.exit(0);
} else {
switch (result.code) {
case AuthV4ConflictPlayer:
// 账户冲突
break;
case AuthV4HelperImplifiedLoginFail:
// 隐式登录失败
// e.g., AuthV4.showSignIn(...);
break;
default:
// 其他异常情况
break;
}
}
}
API 参考: HIVEAuth4:signIn
// 尝试使用 Hive SDK 登录
AuthV4Interface.helper().signIn() { (result, playerInfo) in
if result.isSuccess() {
// 登录成功
}
else if result.needExit() {
// TODO: 实现应用退出功能
// 例如,exit(0)
}
else {
switch result.getCode() {
case .authV4ConflictPlayer:
// 账户冲突
case .authV4HelperImplifiedLoginFail:
// 隐式登录失败
// 例如,AuthV4Interface.showSignIn() { (result, playerInfo)
// // 做一些事情...
// }
default:
// 其他异常情况
break
}
}
}
API 参考: HIVEAuth4:signIn
// 尝试使用 Hive SDK 登录
[[HIVEAuthV4 helper] signIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
if (result.isSuccess) {
// 登录成功
}
else if (result.needExit) {
// TODO: 实现应用退出功能
// e.g., exit(0);
}
else {
switch (result.code) {
case kAuthV4ConflictPlayer:
// 账户冲突
break;
case kAuthV4HelperImplifiedLoginFail:
// 隐式登录失败
// e.g., [HIVEAuthV4 showSignIn:^(HIVEResultAPI *result, HIVEPlayerInfo *playerInfo) {
// // 做一些事情...
// }];
break;
default:
// 其他异常情况
break;
}
}
}];
此外,我们支持自定义功能,允许用户在他们的应用中实现自己的登录 UI,而不使用 Hive UI,以及允许用户作为访客使用应用而无需选择 IdP 的访客登录功能。
Info
有关更多详细信息,请参阅 Login/Logout。
验证登录令牌¶
为了防止账户盗窃或黑客攻击等安全事件,用户登录后必须进行登录令牌验证。使用成功登录后返回的令牌、PlayerID 和 DID,您的应用服务器可以验证已登录用户的令牌密钥是否有效。通过调用Hive 服务器 API > Auth v4 验证令牌 API来执行验证登录令牌。
Hive SDK 默认允许应用账户重复登录。因此,如果您在多个设备上使用一个账户登录,则在登录时生成的会话密钥会在所有设备上保持。如果您不希望在应用中允许重复登录,您必须实现使得只有一个会话密钥与一个 PlayerId 匹配(即,只有一个设备连接到应用服务器)。
Info
有关更多详细信息,请参阅 验证登录令牌密钥。
实现支付¶
Hive SDK 中的应用内商品销售和支付功能是通过 Hive SDK 计费模块实现的,Hive IAP v4。Hive IAP v4 提供的支付功能可以减少开发时间,并快速响应市场变化,例如商品购买收据验证、重复商品支付检查和支付日志传输。
Info
有关更多详细信息,请参阅此处。
要使用Hive SDK的支付功能,您必须首先在应用市场(Google Play)控制台和Hive 控制台中注册待售的商品信息。
Info
有关详细信息,请参阅各自的应用市场文档和Hive 控制台指南计费。
初始化计费¶
在应用市场控制台和Hive控制台中注册产品信息后,您必须在应用启动时执行Hive IAP v4初始化代码,以使用Hive IAP v4。当您请求Hive IAP v4初始化时,它将作为结果返回来自应用客户端的可用市场信息。以下是初始化Hive IAP v4的示例代码。
API 参考: hive.IAPV4.marketConnect
API 参考: IAPV4::marketConnect
API 参考: IAPV4.marketConnect
API 参考: com.hive.IAPV4.marketConnect
API 参考: IAPV4Interface.marketConnect
API 参考: HIVEIAPV4::marketConnect
Info
有关更多详细信息,请参阅 IAP 初始化。
获取产品列表实现¶
当用户进入应用内商品商店时,您需要显示待售商品的列表。为此,实施产品列表查询。下面是请求产品列表的示例代码。
API 参考: hive.IAPV4.getProductInfo
API 参考: IAPV4::getProductInfo
API 参考: IAPV4.getProductInfo
```kotlin import com.hive.IAPV4
import com.hive.ResultAPI
IAPV4.getProductInfo(object : IAPV4.IAPV4ProductInfoListener {
override fun onIAPV4ProductInfo(result: ResultAPI, iapV4ProductList: ArrayList
if (result.isSuccess) {
// 调用成功
}
}
})
API 参考: com.hive.IAPV4.getProductInfo
API 参考: IAPV4Interface.getProductInfo
API 参考: HIVEIAPV4::getProductInfo
在执行产品列表查询时,结果将返回IAPV4Product
类中的产品列表信息。产品信息包括marketPid
,用于商品购买请求,以及displayPrice
,这是货币符号和价格的组合(例如,$0.99)。
Info
有关更多详细信息,请参阅获取产品列表。
实现产品购买¶
当用户进入应用商店并查看待售商品列表时,他们可以选择特定商品进行购买。为此,您必须调用IAPV4类的purchase
方法,并将与产品ID对应的marketPid
作为参数,向应用市场请求完成商品购买。以下是请求产品购买的示例代码。
API 参考: hive.IAPV4.purchase
API 参考: IAPV4::purchase
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
string iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
IAPV4::purchase(marketPid, iapPayload, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
if (result.isSuccess()) {
// TODO: 使用收到的收据请求收据验证
}
});
API 参考: com.hive.IAPV4.purchase
import com.hive.IAPV4
import com.hive.ResultAPI
val marketPid = "{YOUR_PRODUCT_MARKET_PID}"
val iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
IAPV4.purchase(marketPid, iapPayload, object : IAPV4.IAPV4PurchaseListener {
override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {
if (result.isSuccess) {
// Call successful
}
}
})
API 参考: com.hive.IAPV4.purchase
API 参考: HIVEIAPV4::purchase:additionalInfo:handler:
#import <HIVEService/HIVEService-Swift.h>
NSString *marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString *iapPayload = @"{YOUR_CUSTOM_PAYLOAD}";
[HIVEIAPV4 购买: marketPid iapPayload: iapPayload 处理程序: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
if ([result isSuccess]) {
// TODO: 使用收到的收据请求收据验证
}
}];
<
在实现产品购买功能之前,您可以预定义购买元数据(iapPayload)。iapPayload
是以应用开发者所需格式定义的信息。使用此功能,您可以分析利用支付系统的用户信息或解决由于购买过程中出现错误而导致付款成功但物品未交付的情况。
验证收据实施¶
在执行请求购买产品的代码后,一旦用户在应用市场完成付款,Hive SDK 会将购买凭证传递给应用客户端。您的应用服务器应从应用客户端接收此凭证,并使用 Hive 服务器 API 验证凭证的有效性。验证凭证后,应用服务器应直接向用户提供该项目。
收据验证 API 验证应用内购买产品的收据,并返回收据有效性的结果。响应中的 hiveiap_transaction_id
是为每个收据发出的唯一 ID,因此您应该在应用服务器中存储此值,并在提供物品之前检查重复收据。
Info
有关更多详细信息,请参阅 验证收据。