失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > unity接入 微信登录sdk

unity接入 微信登录sdk

时间:2022-09-01 18:23:04

相关推荐

unity接入 微信登录sdk

首次吐槽一下,微信官方的文档真的是服了,各种坑,而且贼不详细,而且还只能原生接入,在做sdk给unity,对于不懂原生的小白来说简直噩梦啊!!!!为了接入恶补了一波原生

进入正题,首先还是要去注册账号,申请应用位,按照官方文档做就行了,哟啊拿到APPID,sercet,还有你打包apk的 签名,签名的获取官方也有说明不多说,直接进入接入部分

首先,对于安卓和unity交互不懂的可以自行百度,你会发现各种说法都有,我采取了这个verynice:

交互优化版本

流程还是很详细的,跟着做就行了。当你熟悉了交互原理,然后开始接入

首先是基于Androidstudio的,不是eslipe,其实差不多

第一步,要自己创建activity,继承自 UnityPlayerActivity,在这个类一遍纪要实现交互,又要接入sdk

第一个坑: 开放平台的是基于gradle的,然而当你导出arr包给unity,unity不能去动态下载实体包,很头疼,所以不能使用它最新方式,反正我是没整出来,各种测试始终找不到类就是找不到sdk

所以我在网上巴拉了一个老版本的, 基于sdk arr包的,包的话去下载就好了

说一下,接下来的所有操作都是基于刚才那个交互案例修改,或者你重新创建

将下载的包放到你创建的类库的lib文件夹下:可以直接复制粘贴到对应的文件夹位置,然后右键 点击 Add aslibrary

上述操作之后,点击类库模块的build.gradle 会有相应的依赖,当然可以直接这样添加代码

需要加上的一句是

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

然后, 去百度androidstudio导入arr的流程,都一样的,就是build.gradle的设置,这个文件就设置好了

接下来我们要按照官方的提示创建packge,和activity

这里又一个深坑,由于该arr的包名并非实际包名,而是applicationid,实际的包名是你unity打包设置的包名,这两者是不能一样的,一定记得,你在微信端申请的是基于你unity打包的包名

所以当你调用WXEntryActivity时候,你会发现又报错说找不到类,这是因为官方文档说的是在你包名下创建包,但是你的包名并不是在微信上申请的,所以你要另加一个包,去创建微信的activity

在箭头这里就是你Androidstudio上的包名地方,右键-new-packge,然后在其下创建javacalss,packge名字和类名必须与图片一致,因为微信端回调是要new一个类,名字固定的。只有这样你才能正常代用你社情的包名下的sdk脚本

最后设置Androidmanifest文件

对的, 里边什么都不要,就只有包名

然后点build-rebuild等待 arr包打包完成。

找到arr包,导入unity,必须放到 plugins/andrid 文件夹下,然后打开arr包,或者自己创建一个xml文件,名字AndroidManifest.xml,进行如下配置:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="0000000" ><uses-permission android:name="android.permission.INTERNET" /><!-- for mta statistics, not necessary--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><applicationandroid:exported="true"android:allowBackup="true"><activity android:name="000"//包名+你的交互类android:label="@string/app_name"android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><meta-data android:name="android.app.lib_name" android:value="wechat_ad" /><meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /></activity><!--注册微信回调 WXEntryActivity --><activityandroid:name=""//包名+.wxapi.WXEntryActivity 这个是unity打包的包名!!!!!android:exported="true"android:label="@string/app_name"android:launchMode="singleTop"android:theme="@android:style/Theme.Translucent" /></application></manifest>

然后unity做一个按钮,点击给android发消息执行 login方法,这点就不上码了,这些基本就能实现微信登录了

unity端的代码:

using System;using System.Collections;using System.Collections.Generic;using UnityEngine;using working;[Serializable]public class WeChatUserData{public string openid;public string nickname;public int sex;//性别 0-女 1-男public string province;//省份public string city;//城市public string country;//县级public string headimgurl;//头像urlpublic string[] privilege;//特权public string unionid;//会员}[Serializable]public class WechatData{public string access_token;public string expires_in;public string refresh_token;public string openid;public string scope;}public delegate void OnLogin(WeChatUserData data,Texture tex);/// <summary>/// 微信 sdk 组件/// </summary>public class WeChatCompent : MonoBehaviour{public string WXAppid;public string WXSecret;private OnLogin onlogin;//登录回调public static WeChatCompent instance;// Start is called before the first frame updatevoid Awake(){instance = this;}public void LoginCallBack(string MSG){Debug.Log("unity收到消息 : " + MSG);StartCoroutine(GetWechatData(MSG));}/// <summary>/// 登录回调/// </summary>/// <param name="str"></param>private void GetData(string str){Debug.Log("收到回调: " + str);StartCoroutine(GetWechatData(str));}IEnumerator GetWechatData(string code){Debug.Log("开始获取用户数据:WXAppid:" + WXAppid+ " secret=" + WXSecret + " code="+ code );//获取令牌string url = "https://api./sns/oauth2/access_token?appid=" + WXAppid + "&secret=" + WXSecret+ "&code=" + code + "&grant_type=authorization_code";UnityWebRequest req = new UnityWebRequest(url);DownloadHandlerTexture download = new DownloadHandlerTexture(true);req.downloadHandler = download;yield return req.SendWebRequest();Debug.Log("error:" + req.error);if (req.error == null){Debug.Log("req.downloadHandler .text:" + req.downloadHandler.text);WechatData data = JsonUtility.FromJson<WechatData>(req.downloadHandler .text);if (data == null){Debug.Log("空数据");yield break;}//获取信息string userurl = "https://api./sns/userinfo?access_token=" + data.access_token + "&openid=" + data.openid;UnityWebRequest get = new UnityWebRequest(userurl);DownloadHandlerTexture downloader = new DownloadHandlerTexture(true);get.downloadHandler = downloader;yield return get.SendWebRequest();Debug.Log("error:" + get.error);if (string.IsNullOrEmpty(get.error)){WeChatUserData userInfo = JsonUtility.FromJson<WeChatUserData>(downloader.text );if (userInfo == null){Debug.Log("数据获取异常");}else{Debug.Log("信息获取成功:" + userInfo.nickname);UnityWebRequest web = new UnityWebRequest(userInfo.headimgurl );DownloadHandlerTexture geticon = new DownloadHandlerTexture(true);web.downloadHandler = geticon;yield return web.SendWebRequest();Debug.Log("error:" + web.error);if (onlogin != null){onlogin.Invoke(userInfo,geticon .texture);onlogin = null;Destroy(gameObject);}}}if (onlogin != null){onlogin.Invoke(null, null);onlogin = null;}}}//------------------------------------外部接口-----------------------public void Login(OnLogin onlogin){this.onlogin = onlogin;#if UNITY_ANDROIDobject[] strs = new object[] { gameObject.name, "LoginCallBack" };AndroidTools.CallAndroid("Login", strs);#endif}}

x

/// <summary>/// unity 和安卓交互类/// </summary>public static class AndroidTools{private static AndroidJavaClass jc;private static AndroidJavaObject jo;/// <summary>/// 发送给android的/// </summary>/// <param name="methordName"></param>/// <param name="args"></param>public static void CallAndroid(string methordName, object[] args=null){#if UNITY_ANDROIDif (jo == null){Init();}if (args != null)jo.Call(methordName, args);elsejo.Call(methordName);#endif}/// <summary>/// 和安卓通信s/// </summary>/// <param name="methordName"></param>/// <returns></returns>public static T CallAndroid<T>(string methordName){#if UNITY_ANDROIDreturn jo.Call<T>(methordName);#endif}/// <summary>/// 初始化/// </summary>private static void Init(){jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//com.unity3d.player.UnityPlayerjo = jc.GetStatic<AndroidJavaObject>("currentActivity");//currentActivity}}

好了,完结!!!! 有问题欢迎来问

贴几个有用 的博客:

/u014078990/article/details/83752223

https://developers./doc/oplatform/Mobile_App/Access_Guide/Android.html

如果觉得《unity接入 微信登录sdk》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。