【Unity微信】Unity发布微信小游戏+对接第三方SDK过程

官方文档:https://wechat-miniprogram.github.io/minigame-unity-webgl-transform/

上面的文档,能完成库的导入和发布操作
下面开始调用接口获取玩家信息

 1  
 2     /// <summary>
 3     /// 初始化SDK
 4     /// </summary>
 5     private void InitSDK()
 6     {
 7         WX.InitSDK((code) =>
 8         {
 9             Debug.Log("微信SDK初始化成功");
10  
11             LoginOption loginOption = new LoginOption()
12             {
13                 success = LoginSuccess,
14                 fail = (result) => { Debug.Log($"登录失败 code={result.errno} msg={result.errMsg}"); }
15             };
16  
17             Debug.Log("开始登录");
18             WX.Login(loginOption);
19         });
20     }
21  
22  
23     /// <summary>
24     /// 登陆成功回调
25     /// </summary>
26     /// <param name="result"></param>
27     private void LoginSuccess(LoginSuccessCallbackResult result)
28     {
29         Debug.Log($"登录成功 code={result.code} msg={result.errMsg}");
30  
31         code = result.code;
32         GetSettingOption getSettingOption = new GetSettingOption()
33         {
34             success = GetSettingSuccess,
35             fail = (result) => { Debug.Log($"获取设置信息失败 {result.errMsg}"); }
36         };
37         WX.GetSetting(getSettingOption);
38     }
39  
40  
41  
42     /// <summary>
43     /// 获取玩家配置成功
44     /// </summary>
45     /// <param name="result"></param>
46     private void GetSettingSuccess(GetSettingSuccessCallbackResult result)
47     {
48         if (!result.authSetting.ContainsKey("scope.userInfo") || !result.authSetting["scope.userInfo"])
49         {
50             Debug.Log("生成按钮开始请求获取用户信息");
51  
52             //此处设置虚拟按钮大小 
53             WXUserInfoButton wxUserInfoButton = WX.CreateUserInfoButton(0, 0, Screen.width, Screen.height, "zh_CN", false);
54             wxUserInfoButton.Show();
55             wxUserInfoButton.OnTap((data) =>
56             {
57                 if (data.errCode == 0)
58                 {
59                     //获取成功
60                     Debug.Log($"用户同意授权 用户名:{data.userInfo.nickName} 用户头像{data.userInfo.avatarUrl}");
61                     Xcxlogin();
62                     wxUserInfoButton.Hide();
63                 }
64                 else
65                 {
66                     Debug.Log("用户拒绝授权");
67                     wxUserInfoButton.Hide();
68                 }
69             });
70         }
71         else
72         {
73             Debug.Log("已获取过权限");
74             GetUserInfoOption getUserInfoOption = new GetUserInfoOption()
75             {
76                 lang = "zh_CN",
77                 withCredentials = false,
78                 success = GetUserInfoSuccess,
79                 fail = (result) => { Debug.Log($"获取玩家信息失败 {result.errMsg}"); }
80             };
81             WX.GetUserInfo(getUserInfoOption);
82         }
83     }
84  
85     /// <summary>
86     /// 获取玩家信息成功回调
87     /// </summary>
88     /// <param name="data"></param>
89     private void GetUserInfoSuccess(GetUserInfoSuccessCallbackResult data)
90     {
91         Debug.Log($"用户名:{data.userInfo.nickName} 用户头像{data.userInfo.avatarUrl}");   
92     }

第一次操作的玩家,会有一个问题(反正我遇到了),没有弹获取权限弹窗,直接失败的
这个问题是开发后台的用户隐私没配置好,打开微信公众平台>设置>基本信息>服务内容声明

按照顺序配置更新,然后重新运行就可以正常弹窗,确定后成功返回用户信息

 

=客户端获取玩家的唯一OpenID

WX.GetUserInfo
这个接口返回的基本有用的只有用户昵称和头像地址
我们需要一个用户唯一的ID(OpenID)来作为用户标识,一般可以用来作为登录账号或者记录ID

 而微信返回的OpenID在这个加密数据里面,我们需要反编译一下

 1 IEnumerator GetSessionKeyFromServer(string code)
 2 {
 3     string url = $"https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code"; // 替换为你的服务器地址
 4 
 5     using (UnityWebRequest www = UnityWebRequest.Get(url))
 6     {
 7         yield return www.SendWebRequest();
 8         if (www.result == UnityWebRequest.Result.Success)
 9         {
10             // 假设服务器返回session_key
11             string sessionKey = www.downloadHandler.text;
12 
13             Debug.Log("Received session key: " + sessionKey);
14             // 可以进一步通过JS获取用户加密数据并解密
15             GetUserInfo(sessionKey);
16         }
17         else
18         {
19             Debug.LogError("Failed to get session key: " + www.error);
20         }
21     }
22 }

上面方法参数解释:

appid:AppID(小程序ID)
secret:AppSecret(小程序密钥)
code: WX.Login接口,登录成功的返回值

 

 上面请求返回的sessionKey里包含了OpenID等隐私数据的解密Json字符串

{"session_key":"******","openid":"******","unionid":"******"}

=对接第三方SDK js文件
一般的js代码编写以及C#调用官方示例:https://docs.unity3d.com/cn/2021.3/Manual/webgl-interactingwithbrowserscripting.html
第三方的SDK js文件:sdk.js(举例)
1.将上面的sdk.js文件放入Unity工程Assets/WX-WASM-SDK-V2/Runtime/wechat-default 目录下面
2.打开该目录下的game.js文件,加入引用

import './sdk'

3.在目录Assets/Plugins/WebGL目录下新建文件sdk.jslib

mergeInto(LibraryManager.library, {
  SDKInit: function (id) {
    opensdk.init({
        appid: UTF8ToString(id),//将C#传递到Js层的参数正确转换成字符串
        success:function(res){
                SendMessage('CSDKCallBack','OnInitSuccess',JSON.stringify(res));
        },
        fail:function(res){
                SSendMessage('CSDKCallBack','OnInitFailure',JSON.stringify(res));
        }
    });
  },

});

opensdk.init是sdk.js中的接口,在jslib里面按照JavaScript规则调用
SendMessage向Unity发送消息


4.C#层:

[DllImport("__Internal")]
private static extern void SDKInit(string id);


void Start()
{
    SDKInit("123"); 
}

根据上面步骤既可完成对接第三方SDK js

**常见报错:构建打包时如果出现jslib的报错,首先检查jslib是不是有异常编码格式字符(中文)

posted @ 2024-10-16 17:18  lovewaits  阅读(190)  评论(0编辑  收藏  举报