# 运营 SDK 内部补充接口

---

## 游戏盒跳转

### 游戏盒首页

```java
/*
 * 打开游戏盒主页面
 *
 * @param activity Activity 实例
 */
public void startGameBox(Activity activity)；
```

### 游戏详情

```java
/*
 * 打开游戏盒详情页，若没有下载游戏盒则提示下载
 *
 * @param activity Activity对象
 */
public void showGameDetail(Activity activity);
```

### 活动详情

```java
/*
 * 打开游戏盒活动详情，若没有下载游戏盒则提示下载
 *
 * @param activity    Activity 实例
 * @param activityId  活动id
 * @param activityUrl 活动Url
 */
public void showActivityDetail(Activity activity, int activityId, String activityUrl);
```

### 礼包中心

```java
/*
 * 打开游戏盒礼包中心，若没有下载游戏盒则提示下载
 *
 * @param activity Activity 实例
 */
public void showGift(Activity activity);
```

### 优惠券中心

```java
/*
 * 打开游戏盒优惠券中心，若没有下载游戏盒则提示下载
 *
 * @param activity Activity 实例
 */
public void showCoupon(Activity activity);
```

### 论坛

```java
/*
 * 打开游戏盒该游戏的游戏圈页面
 * 若未安装游戏盒，则出现提示下载游戏盒的弹窗
 */
public void showGameForum(Activity activity);
```

### 论坛帖子详情

```java
/*
 * 打开游戏盒论坛（游戏圈）指定帖子，若没有游戏圈toast提示用户，若没有下载游戏盒则提示下载
 *
 * @param activity Activity 实例
 * @param id       帖子id
 */
public void showGameForumDetail(Activity activity, int id)；
```


### 游戏评论

```java
/*
 * 打开游戏盒该游戏的评论页面
 * 若未安装游戏盒，则出现提示下载游戏盒的弹窗
 */
public void showGameCommentArea(Activity activity);
```

## 外部跳转（3.14.4+）

外部跳转接口，都需要 SDK 初始化后才能进行，它们都是由 `OperateAction` 提供的接口
### 微信公众号搜索
```java
/*
 * 跳转微信，并复制公众号名称，协助用户搜索
 *
 * @param activity Activity对象
 * @param name     公众号名称
 * @param listener 跳转结果回调对象
 *                 回调状态码为 0 时表示跳转成功，其他情况为失败，具体错误看 message 信息
 */
public static void startWechat(Activity activity, String name, OpeResultListener listener);
```

调用示例
```java
OperateAction.startWechat(requireActivity(), "人民网", new OpeResultListener() {
    @Override
    public void onResult(int code, @Nullable String message) {
        if (code == OperateCode.SUCCESS) {
          // 跳转成功发放奖励
        }
          
    }
});
```

### 微博
```java
/*
 * 跳转微博，根据微博账号uid进入对应的官方账号主页
 *
 * @param activity Activity对象
 * @param uid      微博账号uid
 * @param listener 跳转结果回调对象
 *                 回调状态码为 0 时表示跳转成功，其他情况为失败，具体错误看 message 信息
 */
public static void startWeibo(Activity activity, String uid, OpeResultListener listener);
```

调用示例
```java
OperateAction.startWeibo(requireActivity(), "2972152170", new OpeResultListener() {
    @Override
    public void onResult(int code, @Nullable String message) {
        if (code == OperateCode.SUCCESS) {
          // 跳转成功发放奖励
        }
    }
});
```

## 违规举报（2.37.0+）

提供游戏内快速举报违规言论功能。

### 功能概要

![违规举报](https://4399public.oss-cn-beijing.aliyuncs.com/ope/report_violation.png)

- （0）游戏在频道消息合适位置添加“举报”入口
- （1）用户点击入口时，游戏调用 SDK 的`OperateCenter.reportViolation`举报接口，将一些固定信息传给 SDK
- （2）SDK 提供页面展示、填写、提交举报信息
- （3）查看举报
  - （3.1）举报者可以在 SDK 个人中心页面查看自己的举报信息
  - （3.2）运营或客服在 SDK 后台查看、处理所有提交到 SDK 服务端的举报
- （4）举报经核实后后，若还要在游戏内进一步处理，则需要和游戏沟通
- （5）游戏对被举报的信息和用户作出适当处理

### 接口调用

- 接口原型

```java
/**
 *
 * 游戏内举报接口
 *
 * 举报游戏内违规内容，举报结果由 SDK 内部提示
 *
 * @param activity Activity 实例
 * @param violation 违规信息，各字段必须且名称固定如下，若确实没有可留空，但不能不传
 *                  <pre><code>
 *                      Map<String, String> violation = new HashMap<String, String>();
 *                      violation.put("g_uid", "被举报人uid");
 *                      violation.put("g_tid", "聊天频道ID");
 *                      violation.put("g_sid", "服务器ID");
 *                      violation.put("g_rid", "角色ID");
 *                      violation.put("g_role", "角色名称");
 *                      violation.put("g_gname", "公会名");
 *                      violation.put("g_cname", "宠物名");
 *                      violation.put("g_content", "聊天内容");
 *                      violation.put("contact", "联系方式 电话、QQ");
 *                  <code/>
 *                  <pre/>
 */
public void reportViolation(Activity activity, Map<String, String> violation);
```

- 调用示例

```java
Map<String, String> violation = new HashMap<>();
violation.put("g_uid", "被举报人uid");
violation.put("g_tid", "聊天频道ID");
violation.put("g_sid", "服务器ID");
violation.put("g_rid", "角色ID" + r);
violation.put("g_content", "聊天内容");
violation.put("g_role", "角色名称");
violation.put("g_gname", "公会名");
violation.put("g_cname", "宠物名");
violation.put("contact", "联系方式 电话、QQ");
mOpeCenter.reportViolation(MainActivity.this, violation);
```

## 银联微信充值回调接入

SDK `3.3.1` 新接入银联微信渠道，充值过程中通过微信小程序与第三方对接，但支付完成后不能可靠回到游戏内。     
若游戏有微信 `appId`，并接入微信回调，支付后通过小程序可以直接回到游戏内，体验更好。

以下说明如何接入微信回调

### 接入准备
- 申请微信`appId`: 此过程需要在微信开发者后台完成，提供游戏包名、签名md5等信息
- 提交`appId`：向充值中心提交此标识，提交时带上游戏信息，特别是充值 id

以上流程可以咨询相关运营

### 引入微信OpenSDK

- *在线 aar*
  额外引入微信 openSDK 在线依赖
```gradle
dependencies {
    // 如果接入方已有，可忽略
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
}
```

- *jar+res*
  下载 [微信 openSDK v6.8.0](https://sdkftp.4399doc.com/external/3rd/wechat-sdk-android-v6.8.0.jar) 或更高版本，拷贝到游戏`libs`目录


以下假设游戏包名为`cn.m4399.operate.samples`
### 实现回调 Activity
区分游戏是否已有`WXEntryActivity`两种情况，当有时，称为已*有微信回调*，反之为 *无微信回调*

- *无微信回调*

新建`cn.m4399.operate.samples.wxapi.WXEntryActivity`类，将以下代码填充进此类，
并以实际的微信的 appId 填充`WECHAT_APP_ID`


```java
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
  // REPLACE：使用真实微信appId，它与包名、签名md5是对应的
  public static final String WECHAT_APP_ID = WECHAT_APP_ID;

  private IWXAPI api;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    api = WXAPIFactory.createWXAPI(this, WECHAT_APP_ID, false);
    try {
      Intent intent = getIntent();
      api.handleIntent(intent, this);
    } catch (Exception e) {
      Log.e("[OPERATE]", getClass().getName() + " onCreate but error: " + e.getMessage());
      e.printStackTrace();
    }
  }

  @Override
  public void onReq(BaseReq baseReq) {

  }

  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    api.handleIntent(intent, this);
  }

  @Override
  public void onResp(BaseResp resp) {
    // 4399 运营SDK：收到来自于充值的消息，finish 此 Activity 
    WXLaunchMiniProgram.Resp r = (WXLaunchMiniProgram.Resp) resp;
    Log.e("[OPERATE]",
            String.format("Receive wx message, extMsg:%s, openId:%s", r.extMsg, r.openId));
    if (!TextUtils.isEmpty(r.extMsg) && r.extMsg.contains("from=recharge"))
      finish();
  }
}
```

- 有微信回调
  只需要将以上代码模板`onResp`方法中内容，拷贝到已有回调的`onResp`即可

### 注册回调 Activity
在游戏`Activity`注册新加的类，并且将<span style="color:red">**`android:taskAffinity="cn.m4399.operate.samples"`中的包名  
替换为游戏实际包名**</span>（已注册过可忽略）
```xml
<!-- 注意：替换 android:taskAffinity="cn.m4399.operate.samples"-->
<activity
        android:name=".wxapi.WXEntryActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:exported="true"
        android:taskAffinity="cn.m4399.operate.samples"
        android:launchMode="singleTask">
</activity>
```
