首次吐槽一下,微信官方的文档真的是服了,各种坑,而且贼不详细,而且还只能原生接入,在做sdk给unity,对于不懂原生的小白来说简直噩梦啊!!!!为了接入恶补了一波原生
进入正题,首先还是要去注册账号,申请应用位,按照官方文档做就行了,哟啊拿到APPID,sercet,还有你打包apk的 签名,签名的获取官方也有说明不多说,直接进入接入部分
首先,对于安卓和unity交互不懂的可以自行百度,你会发现各种说法都有,我采取了这个verynice:
流程还是很详细的,跟着做就行了。当你熟悉了交互原理,然后开始接入
第一步,要自己创建activity,继承自 UnityPlayerActivity,在这个类一遍纪要实现交互,又要接入sdk
第一个坑: 开放平台的是基于gradle的,然而当你导出arr包给unity,unity不能去动态下载实体包,很头疼,所以不能使用它最新方式,反正我是没整出来,各种测试始终找不到类就是找不到sdk
所以我在网上巴拉了一个老版本的, 基于sdk arr包的,包的话去下载就好了
说一下,接下来的所有操作都是基于刚才那个交互案例修改,或者你重新创建
将下载的包放到你创建的类库的lib文件夹下:可以直接复制粘贴到对应的文件夹位置,然后右键 点击 Add as library
上述操作之后,点击类库模块的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,进行如下配置:
然后unity做一个按钮,点击给android发消息执行 login方法,这点就不上码了,这些基本就能实现微信登录了
unity端的代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
[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;//头像url
public 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);
///
/// 微信 sdk 组件
///
public class WeChatCompent : MonoBehaviour
{
public string WXAppid;
public string WXSecret;
private OnLogin onlogin;//登录回调
public static WeChatCompent instance;
// Start is called before the first frame update
void Awake()
{
instance = this;
}
public void LoginCallBack(string MSG)
{
Debug.Log("unity收到消息 : " + MSG);
StartCoroutine(GetWechatData(MSG));
}
///
/// 登录回调
///
///
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.weixin.qq.com/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(req.downloadHandler .text);
if (data == null)
{
Debug.Log("空数据");
yield break;
}
//获取信息
string userurl = "https://api.weixin.qq.com/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(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_ANDROID
object[] strs = new object[] { gameObject.name, "LoginCallBack" };
AndroidTools.CallAndroid("Login", strs);
#endif
}
}
x
///
/// unity 和安卓交互类
///
public static class AndroidTools
{
private static AndroidJavaClass jc;
private static AndroidJavaObject jo;
///
/// 发送给android的
///
///
///
public static void CallAndroid(string methordName, object[] args=null)
{
#if UNITY_ANDROID
if (jo == null)
{
Init();
}
if (args != null)
jo.Call(methordName, args);
else
jo.Call(methordName);
#endif
}
///
/// 和安卓通信s
///
///
///
public static T CallAndroid(string methordName)
{
#if UNITY_ANDROID
return jo.Call(methordName);
#endif
}
///
/// 初始化
///
private static void Init()
{
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//com.unity3d.player.UnityPlayer
jo = jc.GetStatic("currentActivity");//currentActivity
}
}
好了,完结!!!! 有问题欢迎来问
贴几个有用 的博客:
https://blog.csdn.net/u014078990/article/details/83752223
https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html