unity接入 微信登录sdk

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

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

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

  • 交互优化版本  

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

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

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

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

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

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

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

unity接入 微信登录sdk_第1张图片

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

unity接入 微信登录sdk_第2张图片

需要加上的一句是

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

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

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

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

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

unity接入 微信登录sdk_第3张图片

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

最后设置Androidmanifest文件

unity接入 微信登录sdk_第4张图片

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

然后点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

你可能感兴趣的:(知识点,代码)