微信开放平台android接入笔记(unity3d)
发布日期:2021-06-30 19:39:28 浏览次数:2 分类:技术文章

本文共 5051 字,大约阅读时间需要 16 分钟。

我新写了篇文章,想要Unity demo工程的可以去这篇文章

《Unity3D接入微信开放平台SDK(有Unity demo工程下载)》


 

这两天接了下微信开放平台的sdk,总结下。

1 申请应用

首先,申请appId和appSecret这部分就不多讲了,上官网申请,审核通过就可以拿到了

2 SDK下载

然后就是下载sdk了

sdk下载地址: 

有两个,一个旧的一个新的,一开始我下的是新的,就是下图打x的那个,发现数据结构跟文档说的不一样,原来是微信开放平台的文档没有更新(不得不吐槽一下微信开放平台的小伙伴),数据结构还是按旧的sdk来说的,所以我还是使用了旧的sdk进行开发,就是我打钩的那个

下载下来之后,解压,在lib目录下有两个jar包,我用的是框框那个

 

3 封装接口(中间件)

好了,这个jar包怎么用呢,首先我们是要给unity调用的,所以,得写一个中间件,就是作为unity和这个jar包接口之间的桥梁。

用eclipse新建一个android工程,导入unity中关于编译Android程序的jar包:classes.jar

project - Properties - Java Build Path - Add External JARs...

unity的classes.jar路径一般为:

%Unity安装目录%\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar

然后让主Activity继承UnityPlayerActivty,因为我们在Unity中要获得这个主Activity然后进行一些接口调用,下面再说怎么调用

然后,在android工程中新建个libs目录,把上面的那个wechat-sdk-android-with-mta-1.3.4.jar丢进来

在onCreate中创建api对象

private IWXAPI m_wxApi;@Overrideprotected void onCreate(Bundle savedInstanceState){    super.onCreate(savedInstanceState);    m_wxApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);}

 

按照微信开放平台的文档,我们需要进行注册接口的调用,写个注册接口

// 注册微信apipublic void RegistWXApi(){    if(null == m_wxApi) return;    m_wxApi.registerApp(Constants.APP_ID);}

再写个授权接口

// 请求授权登录public void ReqLogin(){    final SendAuth.Req req = new SendAuth.Req();    req.scope = "snsapi_userinfo";    // SessionMgr.GenSession是自己写的一个产生一个字符串的方法,用来作为校验标志    req.state = SessionMgr.GetSession(Constants.SESSION_SCOPE_SNSAPI_USERINFO);    m_wxApi.sendReq(req);}

sendReq给微信了,微信客户端就会收到我们发给它的信息,它会启动自己的Activity

在这个Activity,你点取消按钮或者确认登录按钮,微信的Activity都会new一个叫WXEntryActivity的东东然后调用onResp

这个WXEntryActivity必须放在名字叫做wxapi的文件下面,所以必须新建一个wxapi文件夹,并且Activity名字必须是WXEntryActivity,继承Activity并继承接口IWXAPIEventHandler

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{    private IWXAPI m_wxApi;        @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);                m_wxApi = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);        try        {            m_wxApi.handleIntent(getIntent(), this);        }        catch(Exception e)        {            e.printStackTrace();        }    }}

它也是在onCreate中通过WXAPIFactory创建一个api对象,然后调用接口handleIntent,这样才能收到微信的回调

下面就是onResp和onReq了

为了理解这两个回调,我画了个图

我们上面授权其实是调用了sendReq,微信启动了个Activity,点取消或者确认登录的时候呢,它就会回调到我们那个WXEntryActivity的onResp了

@Overridepublic void onResp(BaseResp resp){    switch(resp.getType())    {        case ConstantsAPI.COMMAND_SENDAUTH:            OnSendAuthResp(resp);            break;        case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:            break;        case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:            break;        case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:            break;    }    finish();}

回调回来的数据结构是个BaseResp,我们要根据type转化为对应的子类,由于我们是要传给unity的,说以得把数据转成json,写个单独的类专门转成json,然后写个专门的类作为unity的消息发送器,这样,就可以把数据传到unity啦

注意记得处理完执行finish,这样才能回到主Activity

例:

将数据结构转化为json的类

public class ConvertToJson{    public static String ConvertSendAuthRespToJson(SendAuth.Resp resp)    {        JSONObject jsonObj = new JSONObject();        try        {            jsonObj.put("errCode", resp.errCode);            jsonObj.put("code", resp.code);            jsonObj.put("state", resp.state);            jsonObj.put("lang", resp.lang);            jsonObj.put("country", resp.country);            boolean sessionOk = (SessionMgr.GetCurSession(Constants.SESSION_SCOPE_SNSAPI_USERINFO) == resp.state);            jsonObj.put("sessionOk", resp.sessionOk);            jsonObj.put("appId", Constants.APP_ID);            jsonObj.put("appSecret", Constants.APP_SECRET);                        return jsonObj.toString();        }        catch(JSONException e)        {            return "{}";        }    }}

unity消息发送器

public class UnitySendMessage{    public static void Send(String json)    {        UnityPlayer.UnitySendMessage("WXSdkAndroidConnector","OnRecvMsg", json);    }}

其他接口就不继续讲了,现在我们要把我们写的这些java代码打成jar包导入unity中

4 将我们写的中间件打成.jar文件

注意,只需要将java代码打成jar包即可,所以右键src->Export->Java->Jar file

打成jar包,比如叫SPHelper.jar

在unity工程Assets目录下新建Plugins/Android/libs目录

然后把SPHelper.jar丢进去,把wechat-sdk-android-with-mta-1.3.4.jar也丢进去

5 AndroidManifest配置

然后是AndroidManifest,我们至少有两个Activity,一个是主Activity,一个是WXEntryActivity

Unity安装目录中有一个AndroidManifest.xml模板,可以拿模板进行修改

目录Unity安装目录/Editor/Data/PlaybackEngines/AndroidPlayer/Apk/AndroidManifest.xml

记得添加权限

6 Unity调用java

好了,可以开始unity的调用了,

var m_jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");var m_jo = m_jc.GetStatic
("currentActivity");m_jo.Call("RegistWXApi");m_jo.Call("ReqLogin");

就是通过com.unity3d.player.UnityPlayer创建一个AndroidJavaClass对象: m_jc

然后通过这个对象GetStatic<AndroidJavaObject>("currentActivity")得到一个AndroidJavaObject对象: m_jo

然后我们就可以用这个m_jo.Call("RegistWXApi")跟m_jo.Call("ReqLogin")了,它就会调用我们上面的java接口了

 

回调回来是通过SendMessage到Unity的一个同名GameObject的方法上的,

所以我们搞个名字叫WXSdkAndroidConnector的GameObject,并且挂上脚本,脚本上有个OnRecvMsg的共有成员函数,参数是个字符串

这样我们就能接受到java那边的回调了,剩下的就是解析json跟一些逻辑处理了,这里就不展开了

先讲这么多吧,关于iOS部分的还没有研究,有机会再研究写总结,望共勉


如果关于Unity与Android之间的通信不是很清楚的,可以看我另外一篇博文:

 

转载地址:https://linxinfa.blog.csdn.net/article/details/74994233 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:lua解析json
下一篇:Eclipse好用的快捷键

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月20日 18时23分15秒