分享

Android 第三方应用接入微信平台(2)

 quasiceo 2014-09-07
分类: android 2012-08-08 09:46 8808人阅读 评论(41) 收藏 举报

关键字:微信开放平台   Android第三方应用接入微信


微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信

建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方

面的开销,我最近由于实习需要也在研究这个东西,不过发现网上的相关资

料还是挺少的,这里把我的整个研究情况给出来,希望可以共同学习。


第三方应用接入微信平台(1)


二、第三方应用与微信通信的时序图

2、接收微信的请求信息



前面四步和之前的“1、向微信发送消息”是一样的,不需要重复执行,这里给出来只是为了

流程的整体性。当我们注册后,应用图标会出现在微信聊天的列表中,点击加号即可去添加,

添加后,如果聊天时点击应用图标将会回调第三方应用,如上面时序图所示。这里补充一点,

当我们向微信发消息的媒体类型是appdata类型,即WXAppExtendObject对象时,好友在

收到消息时点击消息,会出现类似的回调过程,需要修改的就是此时onReq被调用时,type

为ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而不是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX 。


当我们在onReq方法中接到ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX

类型的消息时,如果想要把响应发回微信,可用如下代码段来实现



可以发现响应的消息对象和发请求是一样的,下面看看效果图

这是聊天窗口,前提是你已经点击加号将应用添加到下面的列表中




此时,如果点击第三方应用,会回调我们设置好的界面



这个界面是自己定义的,你可以在接到微信的请求后自定义响应界面。

说了半天,还没说到onReq方法或是前面讲的onResp方法的由来,

也就是说如果我们想要处理给微信发请求后的回馈或是响应微信的请求

应该怎么做,我们需要下面3步操作:


a. 可以在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个
WXEntryActivity类,该类继承自Activity(当然这个路径是自定义的,随便你自己)


并在manifest文件里面加上exported属性,设置为true,例如:


 <activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:launchMode="singleTop" >


b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送
到微信请求的响应结果将回调到onResp方法


终于出现了这两个神奇的方法,可以看看他们的大致用法

  1. <span style="font-family:Microsoft YaHei;font-size:18px;">  @Override  
  2.     public void onReq(BaseReq req) {  
  3.         switch (req.getType()) {  
  4.         case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:  
  5.             goToGetMsg();         
  6.             break;  
  7.         case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:  
  8.             goToShowMsg((ShowMessageFromWX.Req) req);  
  9.             break;  
  10.         default:  
  11.             break;  
  12.         }  
  13.     }</span>  

  1. <span style="font-family:Microsoft YaHei;font-size:18px;">  @Override  
  2.     public void onResp(BaseResp resp) {  
  3.         int result = 0;  
  4.           
  5.         switch (resp.errCode) {  
  6.         case BaseResp.ErrCode.ERR_OK:  
  7.             result = R.string.errcode_success;  
  8.             break;  
  9.         case BaseResp.ErrCode.ERR_USER_CANCEL:  
  10.             result = R.string.errcode_cancel;  
  11.             break;  
  12.         case BaseResp.ErrCode.ERR_AUTH_DENIED:  
  13.             result = R.string.errcode_deny;  
  14.             break;  
  15.         default:  
  16.             result = R.string.errcode_unknown;  
  17.             break;  
  18.         }  
  19.           
  20.         Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  21.     }</span>  

c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对
象传递给IWXAPI接口的handleIntent方法:
                          api.handleIntent(intent, this);

ok,这三步可以结合时序图一起来理解,都可以一一对应的。

最后给出一些注意点,也是容易混淆的,我都写过Demo验证过了,如果大家觉得有

不对的,欢迎指出,欢迎讨论


1、注册是本地注册,且只需要注册一次,但是在发送的时候微信服务器会检测第三方

应用的合法性


2、说白了就是在本地第三方应用将要发送的内容先发给微信进程,微信进程收到后再

将消息发给自己的微信好友


3、卸载或者反注册后,第三方应用将不会出现在本机微信的可添加应用列表中


4、使用微信开放平台发送的媒体对象中,网页,音频和视频只能是网络URL,图片可

发送本地路径,本地字节数据,网络URL,文件可以发送本地字节数据和本地路径,

附带在媒体对象中的字节数组,微信默认会是点击则给出下载界面,下载后存储的

路径是在/sdcard/Tecent/MicroMsg/本机微信账号(一般是一串字母数字的组合体)/attachment

文件夹下,这个路径不需要自己去记录,微信会在媒体对象的filepath字段中记录,此时一定注意的是

当你响应微信的show请求时,媒体对象中的filedata字段是为空的,即使你在发送的时候附带在了这个

字段中,如前面所说,只能用filepath这个字段。

如果要自行处理只能是appdata类型数据,理由下面给出:

appdata类型的对象唯一特殊点就只是告诉微信这个消息点击时需要调用第三方应用,

而其他类型的媒体对象被点击时所显示的是微信的默认页面


5、微信根据transaction字段决定消息在聊天框中的表现以及点击后的响应,只有

appdata被点击时可以调用第三方应用的进程,所触发的方法是实现了IWXAPIEventHandler

接口的类的onReq方法,类型是ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX

而在微信中和好友聊天时点击第三方应用图标所所触发的方法是实现了IWXAPIEventHandler

接口的类的onReq方法,类型是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX


6、微信会根据第三方应用是否注册来给出应用安装的信息,比如传给微信好友一个音频消息时,

当好友点击那个消息,微信会以一个WebView来load音频消息中的URL,不过在此前会在URL

后面附加一些微信定义的信息,其中就会包括一个字段是isInstalled

有关微信包装后的URL的具体格式,我们可以将网络断开,然后再去点击,这时自然就出现了那个

经典界面,你也就可以看到URL的真面目了


因为我自己写的demo都在实习结束后丢失了,所以给一个官方的demo下载,如果有不清楚的可以交流

微信测试demo

注:本博客的原创文章欢迎转载,但是请注明转载地址,否则将追究法律责任,

谢谢合作,希望共同学习。


10
1
主题推荐
第三方应用 android 微信 开放平台 服务器
猜你在找
开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
ImageView属性详解
LinearLayout实现左右布局
Android网络加载时显示进度条
Cocos2d-x 3.0开发(六)使用cocoStudio创建一个骨骼动画
SMP3.0学习笔记之四 使用OData Native SDK获取数据
android利用SharedPreferences来保存用户参数及读取
采用调用链或者函数符号表来定位crash位置
详解android解析Xml的三种方式——DOM、SAX以及XMLpull
如何精确的控制FPS
查看评论
13楼 EnGe 2013-10-11 10:34发表 [回复]
大侠,android客户端分享到朋友圈怎么弄?官方demo没说在哪里搞啊?求指教。
Re: dengbodb 2013-10-18 16:42发表 [回复]
回复quliangjun:SendMessageToWX.Req的scene成员,如果scene填WXSceneSession,那么消息会发送至微信的会话内。如果scene填WXSceneTimeline(微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用IWXAPI的getWXAppSupportAPI方法,0x21020001及以上支持发送朋友圈),那么消息会发送至朋友圈。scene默认值为WXSceneSession。你可以看下http://open.weixin.qq.com/document/gettingstart/android/?lang=zh_CN
12楼 tmacsky 2013-08-29 10:06发表 [回复]
你好楼主!我是想表现蘑菇街的分享宝贝效果,从我的app发送一个宝贝页面到微信,然后让用户在微信里点击后弹出我自定义的界面,按你文章说的在onReq方法里设置,点击后只是弹出的我的web页面(宝贝的web页面),没有弹出我自定义的Activity!我已发微博私信给你了
Re: dengbodb 2013-10-18 16:40发表 [回复]
回复tmacsky:你分享到微信里的表现形式是什么样子的,是一个链接吗?
Re: tmacsky 2013-10-19 10:22发表 [回复]
回复dengbodb:是一个web连接
Re: dengbodb 2013-10-19 20:52发表 [回复]
回复tmacsky:如果是web链接的话是不能打开的,你仔细看下,必须是特定类型才可以,如果你一定要搞成web链接,然后调用自己的App的话,你可以参考下http://blog.csdn.net/dengbodb/article/details/7832409
Re: icyfox_bupt 2014-04-15 08:19发表 [回复]
回复dengbodb:你好,这里的“特定类型”说的是哪种方法?
如果想点击我的分享打开APP的话
Re: dengbodb 2014-05-02 10:37发表 [回复]
回复icyfox_bupt:文档里面有介绍,是apodata类型的,不知道现在改了没
11楼 declanzhang 2013-06-08 16:12发表 [回复]
你好, 请问下是否要通过审核了才能验证通过? 我的情况是官方DEMO已经正常可以跑通, 但是我自己去官网注册一个应用, 然后改掉官方DEMO的包名和keystore, 然后用官方提供的工具生成签名, 填好信息后却无法正常跑起来, 看log微信的页面已经启起来了, 但是马上销毁了, 应该也是验证没有过, 百思不得其解
Re: songdiyuan 2013-06-08 18:29发表 [回复]
回复declanzhang:我的审核通过了,还是遇到你这同样的问题,兄弟,你跑起来的时候是如何打包的,我打包是通过eclipse导出签名包的方式打包的
Re: dengbodb 2013-10-25 16:15发表 [回复]
回复songdiyuan:首先,你最好确认下你的应用是否确实通过审核了,之前有哥们的应用就是这步有问题,其次,它和打包方式没关系,用官方提供的工具生成key,并在注册时上传,这样你的应用跑起来的时候,会去微信服务器对比验证,所以你看下这两部分是不是一样的
Re: declanzhang 2013-06-08 18:35发表 [回复]
回复songdiyuan:都试过, 应该跟打包没啥关系, 官方DEMO怎么打包都是正常的..
Re: dengbodb 2013-10-25 16:13发表 [回复]
回复declanzhang:官方的是可以直接运行,他用的是自己测试的key,你可以等审核通过了再测试,也可以在官方demo的基础上去改代码,不要改它的包名之类的信息
10楼 allen_0220 2013-04-01 15:40发表 [回复]
请问楼主,微信第三方调用时,应用签名文件是否必须用后缀名为.keystore的才行,用其他后缀名的行吗,比如eclipse下生成的那种,后缀名为.keys的那种。
Re: dengbodb 2013-04-16 21:19发表 [回复]
回复allen_0220:最好是用微信官方提供的工具去生成,以免出现多余的错误,而且这个只是在官网注册的时候需要填写
9楼 wangweibo163 2013-02-05 15:20发表 [回复]
亲,调用完微信分享后,怎么也退不出去了,一直在微信里面,你说到finish(),没有用,就是退不出去。
Re: dengbodb 2013-04-16 21:18发表 [回复]
回复wangweibo163:不会啊,分享完了,你只要调用了finish就会把新生成的那个微信进程给杀掉
8楼 visualdata 2013-02-03 14:47发表 [回复]
很好,比在官网学习容易多了.自己跑跑例子,便于了解.这里有一篇和应用注册相关的帖子,值得学习.和大家分享.
http://blog.csdn.net/hxg130435477/article/details/8395441
7楼 crazyfiendsk 2012-11-20 17:30发表 [回复]
你好,请问,如何在 微信分享页面里启动第三方应用呢?就是从聊天框中点击进去后打开的网页中点击,然后启动第三方应用,有什么办法么?望回复,谢谢!
Re: dengbodb 2012-11-22 10:36发表 [回复]
回复crazyfiendsk:你实现IWXAPIEventHandler
接口的类的onReq方法,类型是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX,在该类型下写响应即可,和从第三方应用发消息给微信是一样的只不过两者的消息类型不一样而已
Re: crazyfiendsk 2012-11-20 20:29发表 [回复]
回复crazyfiendsk:问题补充,我在美丽说的分享页面中看到这样一个链接
<a href="wxd00a5f16e02bed58://person.meilishuo/?uid=11719752">微信就是根据这个来启动第三方应用的,不知道这个链接是需要先去哪里注册才会响应吗?还是要怎么做?
Re: dengbodb 2012-12-20 11:54发表 [回复]
回复crazyfiendsk:你在注册的时候需要给出你的app的下载地址,微信应该会根据这个绑定你的注册id
6楼 liuliang_china_cn 2012-11-12 17:26发表 [回复]
你好,包名,ID,keystore ,这三个都是需要在程序代码里用到吗,到现在,我只看到注册的时候,需要appid ,至于 包名,keystore ,在哪里用到了,能给点提示吗
Re: dengbodb 2012-11-19 11:23发表 [回复]
回复liuliang_china_cn:已经私信回复
Re: 潘zes 2013-10-25 11:07发表 [回复]
回复dengbodb:能不能和我也说一下楼上的问题,我也是下载了一个官网的demo来运行,例子可以运行就是分享时就直接没反应了,
Re: dengbodb 2013-10-25 16:17发表 [回复]
回复u012523405:没有反应是说好友列表没有弹出来吗?你在eclipse里有没有将key的路径设置上去
Re: 潘zes 2013-10-26 16:17发表 [回复]
回复dengbodb:是连微信的客户端都没有调用到,就是不能连接微信,如何在ecilse中设置key的路径??新手求救,调了几天了,还有在微信注册设置包名和签名,其中的包名是不是要和项目中的包名一样的?项目中有多个包,应该是设哪一个包的包名,谢谢楼主了!!
5楼 sos__sos 2012-11-08 14:54发表 [回复]
遇到一个问题,调用完微信发送完后,返回时,并没有返回到自己的 程序,请问这个是什么原因
Re: dengbodb 2012-11-19 11:24发表 [回复]
回复sos__sos:调用完后要像官网提供的demo那样调用finish,因为他发送的时候调用了一个新的进程
4楼 snwrking 2012-09-13 20:18发表 [回复]
十分感谢楼主和 a383028663兄。 我也被弄得晕了,就是那个点了发送,微信却不返回的问题。 一开始是小米手机,结果小米不支持部分微信功能,弄得我总在弄。后来发现了,用HTC测,又是时有时无,真的快崩溃了。顺便鄙视下腾讯的接口,文档简单,很多情况没有说明,给技术人员写邮件,又不回你。要真这样子不理会我们这些开放平台的开发者,那还开放个什么劲啊,直接封闭得了
Re: dengbodb 2012-10-13 12:01发表 [回复]
回复snwrking:呃。。很多情况下都是这样的,只能靠自己慢慢摸索和分享喽
3楼 happy15sheng 2012-08-27 18:54发表 [回复]
你好,最近把微信整合到自己的应用中,开始还成功分享了一两条(什么包名,signature都没提交),之后就再也调不出微信了。

看到你的博客,很高兴,于是照做。

由于是在开发阶段,于是把debug.keystore对应的signature和包名提交到了qq网站上。

但是应用还在开发中,所以没有提交到应用商店上,所以下载地址不填。

但是之后还是调不出微信。

该怎么办呢?
Re: dengbodb 2012-08-31 09:03发表 [回复]
你好,首先对于你说的“什么包名,signature都没提交”,环境是否有网,如果没网,是可以发送,因为第一次发送和注册就是在本地进程间发送了一个消息,合法性验证要等到联网后服务器端验证,而且显示发送成功其实只是说你把信息发到了微信进程,并不代表你已经发送给好友了。
然后调不出微信,你检查下自己的appid,包名,keystore三者是否全部和申请的时候一样,只有三者全部相同的情况下才可以通过验证。其次你尝试下每次发送前都注册下,可能由于微信数据被清,注册信息丢失。
希望对你有所帮助。
回复happy15sheng:
2楼 hungxn 2012-08-21 16:14发表 [回复]
你好,我最近也要接入微信sdk,遇到些问题想请教一下。我的代码调用微信的时候,微信没任何反应(微信未登录的时候倒是可以把它的登录界面调出来),我现在怀疑是签名有问题。提交上去的签名是在ubuntu下生成的,我在win7下用cygwin生成的签名跟那个却不同,而且我发现,生成那个签名的时候,即使我把keystore的路径写个错的也能生成签名,这样就让我不知道该取哪个签名了。(在win7下签名填keystore的路径的时候<keystore放在桌面>,我把keystore文件直接拖到cygwin命令行窗口生成路径 或者 直接填 c:/....../keystore,两种路径生成的签名也不一样,这里不知道哪种路径是对的)
Re: dengbodb 2012-08-22 09:11发表 [回复]
你好,微信在验证时会将包名,ID,keystore三者进行比对,只有都符合的情况下才可以通信。如果你当时用的是ubuntu下生成的keystore,那你的应用就应该用那个keystore,而不是新生成的。如果突然没有了反应,你看看自己在eclipse里window->prefrence->Android->build中的keystore路径是否是你提交时的keystore,或者看看是不是因为微信那边有什么操作把数据清除了,可以试下在发送前都注册一遍。然后对于你说的“生成那个签名的时候,即使我把keystore的路径写个错的也能生成签名”,我不是很明白你说的这个签名指的是什么?
希望我说的对你有用
回复hungxn:
1楼 a383028663 2012-08-08 15:19发表 [回复]
先前我也在搞Android端的微信调用,途中出现了N多问题,借博主的帖子也来说一下免得其他人重蹈覆辙:

1.APP无法调用微信。让最多开发者头脑爆炸的问题,我先前也是其中之一,情况就是明明已经按照文档里说的写好代码,Log里一切输出信息正常,可就是打开不了微信,调了接口却没反应。原因就是博主最后6点中的第一点验证合法性不过关,而原因肯定是以下两种:1.APP尚未审核通过。2.你的包名和签名与他网站后台登记的不一致。所以遇到这种问题时先仔细核对自己的包名和签名跟腾讯网站上填写的有没有不同,在完全确认没问题后递交然后默默地等待,腾讯的后台更新是非常慢的哪怕他显示审核通过,只能等了。

2.明明先前注册了能调,突然就调不了。这是因为在微信内部数据是存储在手机内存里的,所以如果用户在系统设置里给微信清除了数据,那么包括所有第三方注册信息都会被清掉。因此不要以为注册一次以后就万事大吉了,最好还是每次发送的时候再调一下注册的接口,反正重复注册不会出任何问题的。

3.调用微信后的回调。相信看过SampleSDK的程序猿们都知道他里面每一句发送调用完后都有一句Finish()来自我毁灭。但是调了你微信就要关了我的APP这不是开玩笑吗?所以我想有不少人给APP写代码时会去掉Finish()这句让微信发送完后回到自己的APP。一开始的测试是完美的,然后肯定会有从微信那调用你的APP的要求(反正上头肯定会有这种要求要你完成的),这时你按照腾讯的文档加上WXEntryActivity,然后测试,嗯是能完美打开你自己的APP。可是请等一下,立刻回过头重新测试从你的APP调用到微信然后返回这个过程,你会发现。。。APP怎么重启了?!其实只要按几下回退键就会发现并不是重启而是被微信又打开了一个你的APP,因为在你加上WXEntryActivity之后从第三方返回时就会调用到那里,先前之所以不会是因为你还没有写WXEntryActivity所以才能回到你APP发送前的状态,解决方法也简单,在微信调用的WXEntryActivity内部对应接口内执行Finish()结束掉新开的APP自然就能回到先前的APP了

希望这些对大家有帮助,虽然帮腾讯擦屁股很不爽,但出问题后怎么问他客服都是回答一些废话的感觉让人很恼火的
Re: Bill_Ming 2012-11-12 10:18发表 [回复]
回复a383028663:能把你的DEMO发我一份吗?我想研究下,真的很感谢啊。
Re: dengbodb 2012-11-19 11:26发表 [回复]
回复Bill_Ming:不好意思,我的demo被清掉了,你直接用官网的demo就可以了
Re: dengbodb 2012-08-10 09:07发表 [回复]
多谢补充,我刚开始做这个的时候也特别无语,客服不管用,只好自己一点一点去写Demo测试验证。
对于你说的第一点,微信在验证时包名,ID,和签名是绑定的,所以必须所有都符合的时候才能通过验证。
对于你说的第二点,SDK Sample中是加了reciever来监听一些事件来持续注册,当然按照你所说的方法是比较保险的。
对于你说的第三点,微信所说的开放平台和通信实际上就是本地进程间通信,所以它会每次加个finish来结束自己的调用。
回复a383028663:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多