Skip to content

接入文档-微信小游戏

对接流程

DANGER

SDK接入完毕后请发送二维码到对接群,测试验收通过后再提审发布!!!

接入准备

通用域名加白

接入前请检查下述域名是否已加进微信域名配置白名单,配置项有request合法域名、socket合法域名、uploadFile合法域名、downloadFile合法域名等(根据具体使用到那些域名项进行配置,也可以通配)。

C#
https://yyx.vigame.cn
https://c.vigame.cn
https://p.vigame.cn 
https://u.vigame.cn 
https://x.vigame.cn

初始化(必接)

将下载的dnsdk.js拷贝到导出小游戏工程game.js同级目录下,game.js文件中添加如下代码

import './weapp-adapter';
import unityNamespace from './unity-namespace';
import './webgl.wasm.framework.unityweb';
import './unity-sdk/index.js';
import checkVersion, { canUseCoverview } from './check-version';
import 'texture-config.js';
import { launchEventType, scaleMode } from './plugin-config';
import './dnsdk.js'; // 添加动能小游戏sdk

初始化示例

csharp
/// <summary>
/// 微信小游戏sdk初始化
/// </summary>
/// <param name="appid">H5动能appid</param>
/// <param name="appKey">H5动能appkey</param>
/// <param name="offerId">米大师侧申请的应用ID</param>
/// <param name="cloudEnv">云函数的环境ID</param>
/// <param name="payRate">根据小游戏平台配置支付时设置的支付比例(1:1、1:10、1:100)确认传1、10、100</param>
/// <param name="callBack">sdk初始化回调bool:是否初始化成功;string:openId;string:userCode</param>
/// <param name="gravityEngineToken">引力引擎token</param>
public void MiniGameInit(string appid, string appKey, string offerId, string cloudEnv, Wb.MiniPayRate payRate = Wb.MiniPayRate.Shi, Action<bool, string, string> callBack = null, string gravityEngineToken = null)

示例

DANGER

接入时H5动能appid和H5动能appkey需改为正式参数!!!

csharp
Wb.CoreManager.Instance.MiniGameInit(您的H5动能appid, 您的H5动能appkey, "米大师侧申请的应用ID", "云环境ID", Wb.MiniPayRate.Shi,
    (ret, openId, userCode) =>
    {
        if (ret)
        {
            Debug.Log("DNSDK:  MiniGameInit 初始化成功 openId:" + openId + ", userCode:" + userCode);
        }
        else
        {
            Debug.Log("DNSDK:  MiniGameInit SDK初始化失败");
            WX.ShowModal(new ShowModalOption()
            {
                title = "提示",
                content = "SDK初始化失败,请重启!",
                success = (res) =>
                {
                    WX.RestartMiniProgram();
                }
            });
        }
    });

统计(必接)

根据统计埋点文件使用合适接口上报游戏中产生的事件。

DANGER

转化行为activeactive_register事件必接!!!

1. 自定义事件(必接)

接口说明

csharp
public void TJCustomEvent(string eventId)
public void TJCustomEvent(string eventId, string label)
public void TJCustomEvent(string eventId, Dictionary<string, string> attributes)

事件说明

事件名称事件ID触发时机附加参数
游戏loading页面app_loading_show
游戏引擎初始化后就触发上报
游戏内首页app_home_show主页展示时

使用示例

csharp
//示例
Wb.TjManager.Instance. TJCustomEvent("app_loading_show");
Wb.TjManager.Instance. TJCustomEvent("app_home_show");

2. 转化行为上报(必接)

WARNING

注意:转化行为上报使用TjSendTrackingEvent接口!!!
SDK会本地缓存埋点记录,再上报会进行拦截

接口说明

csharp
/// <summary>
/// 转化行为上报
/// </summary>
/// <param name="eventId">事件id</param>
/// <param name="val">额外参数json字符串</param>
public void TjSendTrackingEvent(string eventId, string val = "")
事件id事件定义data额外携带数据建议上报时机
active(自实现上报必接)激活


首次进入主页触发

active_register(自实现上报必接)

注册


完成角色创建后触发。如果没有角色创建过程,可跟active事件同时触发。

使用示例

csharp
Wb.TjManager.Instance.TjSendTrackingEvent("active");
Wb.TjManager.Instance.TjSendTrackingEvent("active_register");

3.关卡统计上报(必接)

接口说明

csharp
/// <summary>
/// 关卡开始
/// </summary>
/// <param name="level">关卡id</param>
public void StartLevel(string level)

/// <summary>
/// 关卡获胜
/// </summary>
/// <param name="level">关卡id</param>
/// <param name="score">得分</param>
public void FinishLevel(string level, string score)

/// <summary>
/// 关卡失败
/// </summary>
/// <param name="level">关卡id</param>
/// <param name="score">得分</param>
public void FailLevel(string level, string score)

事件说明

事件id事件定义data额外携带数据建议上报时机
begin开始levelid:关卡ID进入关卡
complete胜利levelid:关卡IDscore:得分关卡胜利
fail失败levelid:关卡IDscore: 得分关卡失败

使用示例

csharp
Wb.TjManager.Instance.StartLevel("3-1");
Wb.TjManager.Instance.FinishLevel("3-1""100");
Wb.TjManager.Instance.FailLevel("3-1""100");

4.用户行为统计上报

事件id事件定义data额外携带数据建议上报时机
online在线时长duration--时长(秒)用户切到后台或者杀掉进程时
setting_page_click设置页点击button_click:1用户反馈,2游戏圈,3微信客服设置页内点击按钮时(用户反馈,游戏圈、微信客服)
self_button_click大厅内点击button:1-点击购物车,2-点击跳转合成界面,3-点击任务栏,4-点击能量弹窗(各游戏需要自己定义数值)

大厅界面点击按钮时

5.分享/邀请统计上报

事件id事件定义data额外携带数据建议上报时机
分享help_share分享小程序分享小程序到会话时
点击求助好友按钮help_button_clickbonus_status:1领取成功,2领取失败 help_times_left: 剩余领取次数1,2,3点击求助好友按钮时
邀请invite_click点击邀请好友入口invite_number:邀请好友的数量 0,1,2...玩家在主页点击邀请好友入口时上报 (首次弹出时上报0)
点击加号邀请好友invite_click_plus/玩家在邀请好友界面点击加号时
点击领取奖励bonus_clickbonus_status:1领取成功,2领取失败点击领取奖励时

6.设置关卡和活动进度

WARNING

sdk上报stay_time事件时会携带下面设置的数据

接口说明

csharp
/// <summary>
/// 设置上报level_id参数
/// </summary>
/// <param name="levelId"></param>
public void SetTjLevelId(string levelId) 

/// <summary>
/// 设置上报活动进度参数
/// </summary>
/// <param name="json">活动json格式的字符串</param>
public void SetTjActivityProgress(string json)

使用示例

csharp
Wb.TjManager.Instance.SetTjLevelId("10");

Wb.TjManager.Instance.SetTjActivityProgress("{\"activity_id\":10,\"activity_progress\":15,\"activity_bonus_id\":15,\"begain_time\":100,\"valid_time\":120}");

7.设置用户标识

WARNING

调用下面接口设置后,所有事件上报都会携带用户id

csharp
/// <summary>
/// 设置用户id
/// </summary>
/// <param name="userId">用户id</param>
public void SetLoginId(string userId)

使用示例

csharp
Wb.CoreManager.Instance.SetLoginId("123321");

广告(必接)

1. 打开广告

csharp
/// <summary>
/// 打开广告
 /// </summary>
/// <param name="adName">广告位名称</param>
/// <param name="callBackFun">广告关闭回调,状态0成功、1失败、2加载失败</param>
/// <param name="adStartFun">广告播放状态回调,小游戏不要使用</param>
public void OpenAd(string adName, ADCallback callBackFun = null, AdStartCallback adStartFun = null)

示例

csharp
Wb.ADManager.Instance.OpenAd("home_mfzs", (ret, info) => {
    if (ret == ADResult.Success)
    {
        Debug.Log("Unity: 广告打开成功 OpenAdTest VideoAd info = " + info);
    }
    else
    {
        Debug.Log("Unity: 广告打开失败 OpenAdTest VideoAd info = " + info);
    }
});

2. 广告是否缓存好

广告为实时加载方式(不缓存广告),调用接口直接返回true

csharp
/// <summary>
/// 广告是否缓存好
/// </summary>
/// <param name="adName">广告位名称</param>
public bool IsAdReady(string adName)

3. 某关卡是否可以打开该广告

csharp
/// <summary>
/// 某关卡是否可以打开该广告
/// </summary>
/// <param name="adName">广告位名称</param>
/// <param name="level">关卡id</param>
public bool IsAdBeOpenInLevel(string adName, int level)

4. 关闭广告

csharp
/// <summary>
/// 关闭广告
/// </summary>
/// <param name="adName">广告位名称</param>
public void CloseAd(string adName)

支付

1.支付接口

INFO

注:
1: 虚拟支付 1.0版本
2: 虚拟支付 2.0版本
3: SDK默认为1:10旧接口升级后参数要赋值给新接口PayParam对应字段!!!
custom字段为透传自定义数据字段,该字段会包含在订单信息中,有透传需求请使用该字段!!!

支付接口

csharp
/// <summary>
/// 小游戏支付
/// </summary>
/// <param name="ver">小游戏支付版本,1:虚拟支付1.0版本; 2:虚拟支付2.0版本</param>
/// <param name="payParam">付参数</param>
/// <param name="callFun"></param>
public void MiniPay(int ver, PayParam payParam, OrderPayCallbackHandler callFun = null)

调用示例

// payId 计费点id
// price 金额(单位分)
// payDesc 商品描述,使用#拼接
// payCode 支付code,没有填写计费点payId
// giftId 礼包id,没有的话写计费点payId
// giftType 礼包类型
// giftNum 礼包数量,一次购买了几份,最小值为1
// giftPrice 礼包价值,没有可填写price金额值(单位分)
// levelId 有用户等级的传用户等级,没有用户等级的游戏传关卡id
// tokenType 代币类型(当礼包类型为代币礼包时,传参。否则传空串)
// custom 用户自定义数据代替userdata(截取16个字符赋值userdata),最长128个字符
// payPush 礼包推送:1主动点击;0被动推送
// userId 户的账号ID,无账号游戏为空。最长128个字符

public void OrderPay()
{
    Debug.Log("OrderPay 被点击");
    ShowPreInputDialog("购买礼包", "钻石礼包", "2",(inputValue, inputValue2)=>
    {
        var payParam = new Wb.PayParam(1, 100,
            inputValue +
            "#https://yyx.vigame.cn/MergeZoo/small.png#客服发送#https://yyx.vigame.cn/MergeZoo/big.png");

        Debug.Log("PayManager payParam json = " + payParam.ToJson());
        var ver = inputValue2 == "1" ? Wb.MiniPayVer.Ver1 : Wb.MiniPayVer.Ver2;
        Wb.PayManager.Instance.MiniPay(ver, payParam, (result, payId, userData, orderId) =>
        {
            switch (result)
            {
                case Wb.PayStatus.PaySuccess:
                    Debug.Log("PayManager 支付成功");
                    text.GetComponent<Text>().text = "支付成功";
                    Debug.Log("PayManager OrderPay 充值到账上报");
                    Wb.TjManager.Instance.TjPayOnAccount(orderId);
                    break;
                case Wb.PayStatus.PayFail:
                    Debug.Log("PayManager 支付失败");
                    text.GetComponent<Text>().text = "支付失败";
                    break;
                case Wb.PayStatus.PayCancel:
                    Debug.Log("PayManager 支付取消");
                    text.GetComponent<Text>().text = "支付取消";
                    break;
                case Wb.PayStatus.PayNetError:
                    Debug.Log("PayManager 支付完成,遇到网络问题,请重新消耗订单");
                    text.GetComponent<Text>().text = "遇到网络问题";
                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(result), result, null);
            }
            Debug.Log("PayManager payId = " + payId);
            Debug.Log("PayManager orderId = " + orderId);
            Debug.Log("PayManager userData = " + userData);
        });
    });
}

自测示例

虚拟支付2.0会进行验签请求,可通过日志查看

虚拟支付1.0不会进行验签请求,会直接拉起支付

2.上报到账事件和消单

INFO

游戏发奖的同时调用该接口上报充值到账事件,同时sdk会进行消单处理,整个支付流程结束。

csharp
/// <summary>
/// 充值到账后上报
/// </summary>
/// <param name="tradeId">订单id</param>
public void TjPayOnAccount(string tradeId)

3. 补单

适用场景:使用sdk支付

INFO

游戏在合适时机调用该接口设置补单回调,sdk会在游戏首次调用和onShow时,触发补单逻辑进行补单

设置补单回调,触发sdk中的补单逻辑。

csharp
/// <summary>
/// 支付回调
/// </summary>
/// <param name="payStatus">支付状态</param>
/// <param name="payId">计费点id</param>
/// <param name="userData">自定义参数</param>
/// <param name="orderId">订单id</param>
public delegate void OrderPayCallbackHandler(PayStatus payStatus, int payId, string userData, string orderId);

/// <summary>
/// 设置补单回调
/// 调用该接口会触发sdk补单流程
/// 根据实际情况确认调用时机
/// </summary>
/// <param name="callFun">支付回调</param>
public void SetInventoryCallBack(OrderPayCallbackHandler callFun)

分享

分享策略名称由策划或运营提供。

1.主动分享

csharp
/// <summary>
/// 小游戏-主动分享接口
/// </summary>
/// <param name="shareName">分享策略名称</param>
/// <param name="userData">自定义数据使用'&'拼接</param>
public void ShareAppMessage(string shareName, string userData = "")

//调用示例
Wb.SocialManager.Instance.ShareAppMessage("分享策略名称", "t1=1&t2=2");

2. 点击右上角分享

点击右上角"..."进行分享触发前提是要先主动调用设置分享监听OnShareAppMessage,触发右上角分享时才会调用下面的设置。

csharp
/// <summary>
/// 小游戏-右上角分享接口
/// </summary>
/// <param name="shareName">分享策略名称</param>
/// <param name="userData">自定义数据使用'&'拼接</param>
public void OnShareAppMessage(string shareName, string userData = "")

//调用示例
Wb.SocialManager.Instance.OnShareAppMessage("分享策略名称", "t1=1&t2=2");

游戏圈

微信文档

1. 创建

csharp
/// <summary>
/// 创建游戏圈按钮
/// <param name="rect">按钮显示位置</param>
/// <param name="param">文本GameClubText、图片GameClubImage</param>
/// <param name="func">点击回调</param>
/// </summary>
public void GameClubButtonCreate(RectTransform trans, GameClubBase param, Action<string> func) 

//文本按钮示例
Wb.GameClubBase config = new Wb.GameClubText
{
    text = "游戏圈",
    style = new Wb.GameClubStyle
    {
        color = "#ffffff",
        fontSize = 16,
        backgroundColor = "#ff0000",
        lineHeight = 40
    }
};
if (text.TryGetComponent(out RectTransform rect))
{
    Wb.CoreManager.Instance.GameClubButtonCreate(rect, config, (res) =>
    {
        Debug.Log("GameClub res = " + res);
    });
    Wb.CoreManager.Instance.GameClubButtonShow();
}
else
{
    Debug.Log("GameClub RectTransform 获取失败");
}

//图片按钮示例
Wb.GameClubBase config = new Wb.GameClubImage
{
    image = "images/green.png",
    icon = "green"
};
if (image.TryGetComponent(out RectTransform rect))
{
    Wb.CoreManager.Instance.GameClubButtonCreate(rect, config, (res) =>
    {
        Debug.Log("GameClub res = " + res);
    });
    Wb.CoreManager.Instance.GameClubButtonShow();
}
else
{
    Debug.Log("GameClub RectTransform 获取失败");
}

2. 销毁

csharp
/// <summary>
/// 销毁游戏圈按钮
 /// </summary>
public void GameClubButtonDestroy()

3. 隐藏

csharp
/// <summary>
/// 隐藏游戏圈按钮
/// </summary>
public void GameClubButtonHide()

4. 显示

csharp
/// <summary>
/// 显示游戏圈按钮
/// </summary>
public void GameClubButtonShow()

5. 移除按钮的点击事件的监听函数

csharp
/// <summary>
/// 移除游戏圈按钮的点击事件的监听函数
/// </summary>
public void GameClubButtonOffTap()

意见反馈

微信文档

1. 创建

csharp
/// <summary>
/// 创建意见反馈按钮
/// <param name="rect">按钮显示位置</param>
/// <param name="param">文本GameClubText、图片GameClubImage</param>
/// <param name="func">点击回调</param>
/// </summary>
public void FeedbackButtonCreate(RectTransform trans, GameClubBase param, Action<string> func) 

//文本示例
Wb.GameClubBase config = new Wb.GameClubText
{
    text = "问题反馈",
    style = new Wb.GameClubStyle
    {
        color = "#ffffff",
        fontSize = 16,
        backgroundColor = "#ff0000",
        lineHeight = 40
    }
};
if (text.TryGetComponent(out RectTransform rect))
{
    Wb.CoreManager.Instance.FeedbackButtonCreate(rect, config, (res) =>
    {
        Debug.Log("Feedback res = " + res);
    });
    Wb.CoreManager.Instance.FeedbackButtonShow();
}
else
{
    Debug.Log("Feedback RectTransform 获取失败");
}

//图片示例
Wb.GameClubBase config = new Wb.GameClubImage
{
    image = "images/dark.png",
};
if (image.TryGetComponent(out RectTransform rect))
{
    Wb.CoreManager.Instance.FeedbackButtonCreate(rect, config, (res) =>
    {
        Debug.Log("Feedback res = " + res);
    });
    Wb.CoreManager.Instance.FeedbackButtonShow();
}
else
{
    Debug.Log("Feedback RectTransform 获取失败");
}

2. 销毁

csharp
/// <summary>
/// 销毁意见反馈按钮
/// </summary>
public void FeedbackButtonDestroy()

3. 隐藏

C#
/// <summary>
/// 隐藏意见反馈按钮
/// </summary>
public void FeedbackButtonHide()

4. 显示

csharp
/// <summary>
/// 显示意见反馈按钮
/// </summary>
public void FeedbackButtonShow()

5. 移除按钮的点击事件的监听函数

csharp
/// <summary>
/// 移除意见反馈按钮的点击事件的监听函数
/// </summary>
public void FeedbackButtonOffTap()

其他功能

1.一次性订阅消息通知

需要自己接入微信的订阅功能,接入完毕后。可以使用下面的接口将通知时间(服务器时间单位毫秒,通知时间 = 服务器时间+间隔多长时间收到通知)告诉服务器。服务器根据设置的时间发送消息给玩家。

csharp
/// <summary>
/// 一次性订阅消息通知
/// </summary>
/// <param name="templateId">游戏后台配置的模板id</param>
/// <param name="noticeTime">发送通知的时间戳单位毫秒,为服务器时间</param>
public void SetSubscribe (string templateId, string noticeTime, ReportUserDataCallback callFun)

示例:订阅1小时后收到微信通知

csharp
string timeStamp = "请求的服务器时间";
//订阅1小时后收到微信通知
long endTime = long.Parse(timeStamp) + 60 * 60 * 1000;
Wb.CoreManager.Instance.SetSubscribe("模板id", endTime.ToString(), (ret, info) => {
    if (ret)
    {
        // Debug.Log("Subscribe 订阅成功 info = " + info);
    }
    else
    {
        // Debug.Log("Subscribe 订阅失败 info = " + info);
    }
});

2.获取黑名单

判断是否加入黑名单,根据请求返回的数据判断。code为200,返回的info中包含forbidden时即为加入了黑名单。

csharp
/// <summary>
/// 获取黑名单数据
/// </summary>
/// <param name="userId">用户唯一标识</param>
/// <param name="callFun">回调ret:true时需根据返回的info中是否有forbidden来判断是否被禁, info返回信息</param>
public void GetBlackConfig(string userId, ReportUserDataCallback callFun = null)

返回值

json
{
  "code":200,              --返回结果码 200 请求成功 500服务器错误   
  "data":{
      "forbidden":{            --判断是否有值
          "leftTime":"-1",       --解禁剩余时间 -1 永久封禁  其他为具体解封秒数
          "reason":"封禁",         --封禁原因
          "forbiddenTime":"-1",  --封禁截止时间  -1 永久封禁 其他 具体解封时间 yyyy-MM-dd HH:mm:ss
      }
  },
  "retMsg":"", --错误提示信息  
}

结果码

结果码说明
200成功
401签名不通过
403必要请求参数为空
500服务器出错

3.客服中心

INFO

使用客服中心,需在后台进行配置

csharp
/// <summary>
/// 打开客服中心
/// </summary>
/// <param name="title">标题</param>
/// <param name="loginId">用户id</param>
public void OpenClientCenter(string title, string loginId)

4. 获取用户信息

微信公众平台用户信息相关接口调整公告

csharp
/// <summary>
/// 获取用户微信信息
/// </summary>
/// <param name="type">登录类型1,默认微信</param>
/// <param name="callFun">通知回调</param>
public void GetUserInfo(Wb.LoginType type = Wb.LoginType.TYPE_WX, UserInfoCallback callFun = null)