微信开放平台android接入笔记(unity3d)
http://blog.csdn.net/linxinfa/article/details/74994233
这两天接了下微信开放平台的sdk,总结下
首先,申请appId和appSecret这部分就不多讲了,上官网申请,审核通过就可以拿到了
有两个,一个旧的一个新的,一开始我下的是新的,就是下图打x的那个,发现数据结构跟文档说的不一样,原来是微信开放平台的文档没有更新(不得不吐槽一下微信开放平台的小伙伴),数据结构还是按旧的sdk来说的,所以我还是使用了旧的sdk进行开发,就是我打钩的那个
下载下来之后,解压,在lib目录下有两个jar包,我用的是框框那个
好了,这个jar包怎么用呢,首先我们是要给unity调用的,所以,得写一个中间件,就是作为unity和这个jar包接口之间的桥梁
用eclipse新建一个android工程,导入unity中关于编译Android程序的Jar包:classes.jar
project - Properties - Java Build Path - Add External
JARs...
Jar包路径一般为:
%Unity安装目录%\Editor\DataPlaybackEngines\androidplayer\development\bin\classes.jar
然后让主Activity继承UnityPlayerActivty,因为我们在Unity中要获得这个主Activity然后进行一些接口调用,下面再说怎么调用
然后,在android工程中新建个libs目录,把上面的那个wechat-sdk-android-with-mta-1.3.4.jar丢进来
在onCreate中创建api对象
按照微信开放平台的文档,我们需要进行注册接口的调用,写个注册接口
再写个授权接口
其中SessionMgr.GenSession是自己写的一个产生一个字符串的方法,用来作为校验标志
sendReq给微信了,微信客户端就会收到我们发给它的信息,它会启动自己的Activity
在这个Activity,你点取消按钮或者确认登录按钮,微信的Activity都会new一个叫WXEntryActivity的东东然后调用onResp
这个WXEntryActivity必须放在名字叫做wxapi的文件下面,所以必须新建一个wxapi文件夹,并且Activity名字必须是WXEntryActivity,继承Activity并继承接口IWXAPIEventHandler
它也是在onCreate中通过WXAPIFactory创建一个api对象,然后调用接口handleIntent,这样才能收到微信的回调
下面就是onResp和onReq了
为了理解这两个回调,我画了个图
相信大家应该都能看懂,我们上面授权其实是调用了sendReq,微信启动了个Activity,点取消或者确认登录的时候呢,它就会回调到我们那个WXEntryActivity的onResp啦
回调回来的数据结构是个BaseResp,我们要根据type转化为对应的子类,由于我们是要传给unity的,说以得把数据转成json,写个单独的类专门转成json,然后写个专门的类作为unity的消息发送器,这样,就可以把数据传到unity啦
注意记得处理完执行finish,这样才能回到主Activity
例:
将数据结构转化为json的类
unity消息发送器
其他接口就不继续讲了,现在我们要把我们写的这些java代码打成jar包导入unity中
注意,只需要将java代码打成jar包即可,所以右键src->Export->Java->Jar file
打成jar包,比如叫SPHelper.jar
轮到unity工程部分啦,在unity工程Assets目录下新建Plugins/Android/libs目录
然后把SPHelper.jar丢进去,把wechat-sdk-android-with-mta-1.3.4.jar也丢进去
然后是AndroidManifest,我们至少有两个Activity,一个是主Activity,一个是WXEntryActivity
<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:exported="true"/>
记得添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
好了,可以开始unity的调用了,就是通过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之间的通信不是很清楚的,可以看我另外一篇博文:http://blog.csdn.net/linxinfa/article/details/72852155