跳转至

PG 付款

以下介绍 PG 支付功能及收据处理方式。

在应用PG 支付之前,请先确认PG 支付政策,并根据 PG 支付 Hive Console 指南中的前置准备在 Hive Console 中注册所需信息。

PG payment features

PG 支付的主要功能如下:

  • PG 支付基于 IAP v4PG Payment API 运行,并通过支付机构(PG)提供的 Web 浏览器异步处理。
  • 已完成支付的订单,必须通过 transactionFinish(marketPid) API 完成商品支付完成处理。
  • 若要重新购买已支付但尚未完成支付完成处理的商品,支付将不会继续进行。请先完成之前商品的支付完成处理。
  • 当存在未完成支付订单时(例如同时打开多个支付窗口)尝试追加购买其他商品时,仅首笔支付会完成,其余购买即使已支付也会被自动取消
  • 即使已请求支付完成处理,游戏服务器仍可按策略取消该支付。


PC PG 支付

Info

PC PG 支付自 Hive SDK 25.1.0 起支持。

在 PC 环境发起 PG 支付时,会以新窗口显示如下支付请求页面。


移动端 PG 支付

Info

移动端 PG 支付自 Hive SDK 26.3.2 起支持。

在移动端发起 PG 支付时,会通过应用内 WebView 显示支付请求页面。

移动端 PG 支付画面

Warning

在移动端进行 PG 支付时,必须先调用 setMarketSelection API 将市场切换为 Hive Store。若不切换直接请求购买,将使用原有市场(Google Play、App Store 等)进行支付。 详情请参阅 市场切换调用推荐时机

Tip

PG 支付完成后,如需切回原市场(App Store、Google Play 等),请再次调用 setMarketSelection API。 例如 iOS 调用 setMarketSelection(IAPV4Type.appStore)

前置准备事项

若要使用移动端 PG 支付,需要在项目中**添加 HiveStore 模块**。请根据各 SDK 的开发引擎和目标 OS 参考以下说明。

SDK Native Android

在模块级 build.gradle 文件中添加 HiveStore 市场库。

implementation "com.com2us.android.hive:hive-iapv4-market-hivestore" // Hive Store(PG)
Note

详情请参阅 Hive SDK Android Billing 设置

SDK Native iOS

在项目目录的 Podfile 中添加应用内支付框架与 PG(HiveStore) 框架。

pod 'HiveIAPV4', $HIVE_SDK_VERSION
pod 'HiveIAPV4HiveStore', $HIVE_SDK_VERSION // Hive Store(PG)
Note

详情请参阅 Hive SDK iOS Billing 设置

Unity

  1. 在 Unity 编辑器中点击 Hive > ExternalDependency
  2. Market Settings 中选择 Hive Store
Note

详情请参阅 Hive SDK Unity Billing 设置

Unreal

  1. 在 Unreal 编辑器菜单中点击 Edit > Project Settings
  2. 在左侧面板中选择 Hive SDK > Dependency - Android / Hive SDK > Dependency - iOS
  3. Market 中选择 Hive Store
Note

详情请参阅 Hive SDK Unreal Engine Billing 设置


移动端 PG 支付政策

移动端 PG 支付的支持范围受平台策略限制。

Platform Supported Note
iOS US storefront only 支持范围可能随 Apple App Review Guidelines 更新而变化
Android Not supported -

iOS 实现注意事项

在 iOS 上,根据 Apple 的 App Review Guidelines (Guideline 3.1.1, 3.1.1(a), 3.1.3),PG 支付仅支持 US storefront。自 2025 年 5 月起,Apple 根据美国法院判决更新了指南,允许在 US storefront 中展示引导至 IAP 以外支付方式的按钮、外部链接和 CTA,而无需额外 Entitlement。

  • 在美国以外 storefront 中,若在应用内显示引导至 IAP 以外支付方式的按钮或链接,将在 Apple 审核中被拒。
  • 建议根据用户 storefront 区域控制 PG 支付入口的显示与否。
Warning

Apple App Review Guidelines 可能变更。提交审核前,请务必确认 最新指南

不得仅设置第三方支付方式

根据 Apple 政策,应用必须包含 App Store IAP 作为默认支付方式。请勿在 Hive Console 中仅单独设置 Hive Store(PG) 市场。 仅提供第三方支付方式的应用可能在 Apple 审核中被拒,或从 App Store 下架。必须与 App Store 市场一同设置。

移动端 PG 支付接入流程

移动端环境接入 PG 支付的流程如下。

移动端 PG 支付示意图


支付与收据处理流程

PC 与移动端 PG 支付的收据处理流程相同。不同点在于移动端在请求购买前需额外执行一步,将 market 切换为 Hive Store。

  1. (仅移动端) 调用 IAPV4.setMarketSelection(IAPV4Type.hiveStore),将 market 切换为 Hive Store

  2. 调用 IAPV4.purchase(marketPid, iapPayload, onIAPV4PurchaseCB) 发起购买请求

    Warning

    若您已在 Hive Console Billing > Payment Environment Settings > PG Settings > Optional Feature Settings 中注册支付完成信息 URL,请先删除该 URL。

  3. 商品购买成功后,通过 onIAPV4PurchaseCB 回调接收收据信息(bypassInfo

  4. 游戏客户端将该收据信息发送至游戏服务器

  5. 游戏服务器调用 Receipt Verification API 验证该收据信息

  6. 收据验证成功后,调用 IAPV4.transactionFinish 完成商品发放

若在上述第 3 步中未通过 onIAPV4PurchaseCB 接收到表示购买成功的收据信息,请调用 IAPV4.restore 再次请求未发放商品的收据信息,然后按第 4-6 步完成收据验证与商品发放。

Note

收据处理流程与验证方式详情,请参阅 Receipt Verification


多数量购买

Hive PG支付 支持多数量购买。通过在请求购买时指定数量,您可以在一次支付中购买多个相同的应用内产品。

Hive SDK 调用 hive.IAPV4.purchase(marketPid, iapPayload, quantity, onIAPV4PurchaseCB),其中 quantity 参数允许您指定数量。

Note

多数量购买仅支持可重复购买的消耗性应用内产品。请注意不要重复购买一次性产品。

请求多数量购买的示例代码如下。

API 参考: [hive .IAPV4.purchase](http://developers.withhive.com/HTML/v4_api_reference/Unity3D/group___i_a_p_v4.html#ga4f5a16cebe1b2b1fab22126faacafbec)

```cs
using hive;    
        String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
        String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
        int quantity = 3;

        IAPV4.purchase(marketPid, iapPayload, quantity, (ResultAPI result, IAPV4Receipt receipt) => {    
        if (result.isSuccess()) {    
                         // TODO: Request verification of receipt with received receipt    
                 }    
});
```
```c++

#include "HiveIAPV4.h"

FString MarketPid = TEXT("YOUR_PRODUCT_MARKET_PID");
FString IapPayload = TEXT("YOUR_CUSTOM_PAYLOAD");
int32 Quantity = 3;

FHiveIAPV4::Purchase(MarketPid, IapPayload, Quantity, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
                if (Result.IsSuccess()) {
                                // API调用成功
                }
}));
```
API 参考: [IAPV4 ::purchase](http://developers.withhive.com/HTML/v4_api_reference/CPP/group___i_a_p_v4.html#ga2bff8cc9d70d0a25eaddc9d45dac86b8)

```cpp
#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
        using namespace std;    
        using namespace hive;    
        string marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
        string iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
        int quantity = 3;
        IAPV4::purchase(marketPid, iapPayload, quantity, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {    
                 if (result.isSuccess()) {    
                         // TODO: Request verification of receipt with received receipt    
                 }    
});
```
API 参考: [com.hive.IAPV4.purchase](https://developers.withhive.com/HTML/dokka/-hive%20-s-d-k%20v4/com.hive/-i-a-p-v4/purchase.html)

```kt
import com.hive.IAPV4    
        import com.hive.ResultAPI    
        val marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
        val iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
        val quantity = 3
        IAPV4.purchase(marketPid, iapPayload, quantity, object : IAPV4.IAPV4PurchaseListener {    
                 override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {    
                         if (result.isSuccess) {    
                                 // call successful    
                         }    
                 }    
})
```
API 参考: [com .hive.IAPV4.purchase](https://developers.withhive.com/HTML/v4_api_reference/Android/group___i_a_p_v4.html#gad5e467681ef02fc2ab393bad201e617c)

```java
import com.hive.IAPV4;    
        import com.hive.ResultAPI;    
        String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
        String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
        int quantity = 3;
        IAPV4.INSTANCE.purchase(marketPid, iapPayload, quantity, (result, iapV4Receipt) -> {    
                 if (result.isSuccess()) {    
                         // call successful    
                 }    
});
```
API 参考: [HIVEIAPV4::purchase:additionalInfo:handler:](https://developers.withhive.com/documentation/hiveiapv4/iapv4interface/purchase(_:iappayload:handler:))

```swift
import HIVEService    
        let marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
        let iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
        let quantity = 3

        HIVEIAPV4.purchase(marketPid, iapPayload, quantity) { result, receipt in    
                 if result.isSuccess() {    
                         // TODO: 请求验证收到的收据    
                 }    
}
```
<strong>API 参考</strong>: <a href="[cgv hive_sdk4_ios_api_ref_en]/group___i_a_p_v4.html#ga4cd19176f947717f2c7be545ed76a6e0" target="_blank" rel="noopener noreferrer">HIVEIAPV4::purchase:additionalInfo:handler:</a >

```objc
#import <HIVEService/HIVEService-Swift.h>

NSString *marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString *iapPayload = @"{YOUR_CUSTOM_PAYLOAD}";
NSNumber quantity = 3;

[HIVEIAPV4 购买: marketPid iapPayload: iapPayload 数量 handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
        if ([result isSuccess]) {
                // TODO: 使用收到的收据请求验证
        }
}];
```