# 游戏自定义拉起红包活动
支持开发者在游戏内任意位置，通过调用 openlink 能力，让用户参与红包活动，并直接拉起红包活动主页。

---

## 一、能力简介

此前红包活动入口仅依赖「悬浮球 + 分享链路」，导致活动渗透还有较大的优化空间
因此平台为每个红包活动生成一个 `openlink` 字符串，开发者拿到后即可在游戏内任意位置（banner、按钮、任务面板等）放置红包入口，或针对不同分层用户进行个性化触达，直接拉起红包活动。

---

## 二、接入流程（三步）

**Step 1 · 获取 openlink**

在 MP 后台活动配置中，点击编辑，若活动处于「待生效 / 生效中」时展示 openlink 原文，直接复制。

![](https://res8.wxqcloud.qq.com.cn/wxdoc/aee20230-5ef4-4af1-b165-a2cbe7a22bbd.png)

**Step 2 · 加载 load**

调用[PageManager.load](/minigame/dev/api/open-api/openlink/PageManager.load.md)**调用 load 时意味着触发让用户参与了红包活动，不管用户有没有点击**

**❗️重点注意❗️：被邀请用户点击链接时，用户先进游戏、后进活动，因此被邀请用户若进游戏后就调了 load 方法，此时还没拉起活动，被邀请来的用户会提前因为 load 而变为「已参与活动」状态，因此不会给邀请人进度，平台看板也不会将其视为一个红包新用户（虽然实际上是）**

**因此建议开发者**

方式①： 绘制图标，用户点击后再调用load

方式②：针对红包来的用户，不触发 load 方法，调用 [Object wx.getLaunchOptionsSync()](Object wx.getLaunchOptionsSync())或 [Object wx.getEnterOptionsSync()](/minigame/dev/api/base/app/life-cycle/wx.getEnterOptionsSync.md) 方法，解析 query 字段，若其中  query = wxgame_platform_act_template_id ，则代表用户是通过红包活动启动的游戏

方式③：若游戏真的需要用户在进游戏后就直接调用 load 方法（如主界面），请适当延时 10s 左右再 load，让被邀请用户进入活动拆红包后再触发
![](https://res8.wxqcloud.qq.com.cn/wxdoc/3b770c53-5f3f-4df9-af82-1c9a2375c330.png)

**Step 3 · 打开 show**

校验通过后调用 [PageManager.show](/minigame/dev/api/open-api/openlink/PageManager.show.md)，打开红包活动主页。

> 说明：`show()` 若在 `load()` 之前调用，会自动先执行一次 `load()` 再展示。

---

## 三、平台校验规则

触发 `load` 即代表要向用户下发红包，平台后台在下发前校验以下条件，**全部满足才触发参与**：
 安全风控、活动剩余时间至少 > 1天、奖励「有库存」、当前环境不属于 PC 与鸿蒙、参与限制、活动在有效期内且未被停用（正常进行中）

> 「进行中」指活动在持续时间内即为进行中，不受用户是否已领取奖励影响。

> ⚠️ **校验不通过的处理**：返回错误码 `-5`，`errInfo` 中填充统一提示：「用户暂时无法参与活动，可能是活动未开始、剩余时间不足 3 天、鸿蒙设备、库存不足、同时参与红包活动过多或平台判断疑似风险用户」。此时**请勿给用户展示红包入口**，或用户点击后进行拦截。

---

## 四、特殊诉求

平台会自动校验用户条件，并主动触发参与，此时会和 openlink 打开并存

如果希望平台不自动触发，可联系客服，**关闭「自动触发入口」通路**，让用户只能通过 openlink 或者被邀请来参与活动

具体能力见文档 [特殊能力](https://docs.qq.com/doc/DQWVJSHZtVHBtYkhL)

---

## 五、示例代码

建议实现方式：先 load 请求，看看是否返回-5，若是，代表用户不符合要求，就不要绘制 ui，直到不是-5 才绘制 ui 并且让用户可以 open 进入活动

```js

// 1. 创建 PageManager 实例
const pageManager = wx.createPageManager();

// 2. 加载 openlink（平台后台完成 7 项校验）
pageManager.load({
  openlink: '替换为 MP 后台活动配置中的 openlink 原文'
}).then(() => {
  // 校验通过，用户已成为活动参与者，打开红包活动主页
  pageManager.show();
}).catch((err) => {
  // 校验失败，按错误码处理
  if (err.errCode === -5) {
    // 业务校验未通过：不展示红包入口，或点击后拦截
    console.log('业务报错：', err.errInfo);
  } else {
    console.error('load 失败：', err.errCode, err.errMsg);
  }
});
```

参考文档：[PageManager.load](/minigame/dev/api/open-api/openlink/PageManager.load.md) · [PageManager.show](/minigame/dev/api/open-api/openlink/PageManager.show.md)
