[Unity] Unity WebGL 转微信小游戏,不用麻烦”互动型托管数据“中的 int32 作为 id 建立数据库,而是用 open_id 或者 Unio

1,304 阅读3分钟

关系链互动数据

官方文档:

developers.weixin.qq.com/minigame/de…

运行官方示例可能发生的报错

npm 报错

根据官方 README

  1. 进入server安装依赖 npm install

  2. 修改server/config/index.js中的APPIDSECRET为你的APPIDSECRET

  3. 启动后台服务 npm run start

按照这个步骤走,最终启动不了服务器,如图

图片.png

解决方法:使用 cnpm

下载 cnpm,然后使用 cnpm 安装包

npm install -g cnpm --registry=

cnpm install

npm run start 报错 koaBody is not a function

报错信息:

图片.png

解决方法:重新解压工程,只运行 cnpm install 和 npm run start

图片.png

开发者不是登录用户

这个只在我第一次打开这个工程的时候出现了,之后我重启项目后他就没出现了,也没来得及截屏

好像对后续没有影响……?

游戏界面只有一行字 VM121 WAGame.js:1 TypeError: Cannot read property 'key' of undefined

图片.png

报错信息:

VM121 WAGame.js:1 TypeError: Cannot read property 'key' of undefined
at RankList.drawFriendItemData (index.js:243)
at index.js:152
at Array.forEach (<anonymous>)
at RankList.drawRankList (index.js:151)
at success (index.js:134)
at g (VM121 WAGame.js:1)
at Function.B (VM121 WAGame.js:1)
at Function.<anonymous> (VM136 WAGameSubContext.js:1)
at p (VM121 WAGame.js:1)
at VM121 WAGame.js:1(env: Windows,mg,1.05.2204264; lib: 2.32.0)

然后我在这个错误之前设置了断点……在 drawFriendItemData 中

图片.png

这个 KVDataList 列表是空的,所以获取不到 score

它的 KVDataList 是从 KVDataList = userData.KVDataList 来的

图片.png

传进 drawFriendItemData 的时候列表就是空的

图片.png

传入 drawFriendItemData 的变量是从 drawRankList 的 var dyFriendItemDataCanvas = _this3.drawFriendItemData(item, offsets.friendListItemOffsetWidth, offsets.friendListItemOffsetHeight); 传入

图片.png

drawRankList 的 item 又是 drawRankList 的 this.globalVar.friendsDataList 的 foreach 的产物

drawRankList 的 globalVar.friendsDataList 又是别人传入的,是来自别人的 this

图片.png

drawRankList 是 initFriendsData 调用的,drawRankList 的 this 是 initFriendsData 的 _this2

图片.png

initFriendsData 的 _this2 又来自于 bindMessageListener 的 _this

图片.png

bindMessageListener 的 _this 又来自于 RankList 的 this

图片.png

RankList 在上面就没了……

一开始进入 RankList 的时候,globalVar 里面还没有 friendsDataList

图片.png

于是这个东西一定是在之后复制的,于是定位到 initFriendsData

图片.png

这里面有一个 globalVar.friendsDataList = data;

在这里设置断点,发现它刚获取就列表为空

图片.png

那么显然问题出在 wx.getFriendCloudStorage

于是去看官方文档

developers.weixin.qq.com/minigame/de…

其中提到了 wx.getFriendCloudStorage 的用法

然后点到 KVData 的文档

developers.weixin.qq.com/minigame/de…

其中提到了排行榜还需要再微信公众平台里面设置,fine,Unity WebGL 转微信小游戏的文档中完全没说

排行榜官方文档:

developers.weixin.qq.com/minigame/de…

于是我先在微信公众平台申请了一个排行榜试试

图片.png

恶心的是他还要审核……

关于互动型数据的 api

等审核等了一天……也没有过审

demo 都运行不了,没办法 debug

那就只能随便看看了

然后看到了 interactive-demo.027dee93\game\game.js

其中有个函数用 wx.getUserInteractiveStorage 获得加密的交互型数据,然后用 openid 解密,解密之后用 'kv_list' 的 key 从解密后的数据 decryptData 中得到 const kvList = decryptData['kv_list'],然后使用 kvList[0].value 就得到了这个交互型数据

  initUserInteractiveStorage() {
    // 获取用户的加密交互数据
    wx.getUserInteractiveStorage({
      keyList: ['1'],
      success: ({encryptedData, iv}) => {
        // 使用用户的openid对交互数据解密
        this.getSelfOpenId().then(openid => {
          console.log('openid', openid)
          return this.updateSession().then(() => {
            return this.decrypt({
              encryptedData,
              iv,
              openid
            })
          })
        })
        // 绘制交互数据
        .then(decryptData => {
          const kvList = decryptData['kv_list']
          if (kvList && kvList[0]) {
            const selfCoinsNum = Number(kvList[0].value)
            this.drawMyCoins(selfCoinsNum)
          }
        })
      }
    })
  }

我主要是不知道这个 kv_list 是怎么定义的……就很神奇,然后我也不知道里面结构是怎样

很烦,不想搞

不用麻烦用这个!用 open_id!

我特么,一开始我是不知道有这个 open_id 的,别人一说我才知道

OpenID:为了识别用户,每个用户针对每个公众号或小程序等应用会产生一个安全的 OpenID,公众号或应用可将此 ID 进行存储,便于用户下次登录时辨识其身份,或将其与用户在第三方应用中的原有账号进行绑定

UnionId: UnionId 也是用户的标识符,但它与 OpenID 不同的是,同一个微信用户,登录同一个开发主体下的多个小程序或公众号的时候,分配的 UnionId 是一样的。

客户端是可以直接拿到 open_id 的……