您的位置:首页 > 移动开发 > 微信开发

Android应用实现微信登录与分享

2015-12-21 16:22 861 查看


Android应用实现微信登录与分享


1. 闲话(可直接无视

项目慢慢的推进,逐渐的做到了微信第三方登录的功能模块了。其实我想说Orz,我等这一天等了好久了,想做个微信验证登录都等了两个多星期咧(其实是我们这边出了点问题),先要申请微信开放平台的帐号,在里面创建一个应用,通过审核之后再交300软妹币,是的,你没有听错,上交300软妹币(听说会成为传说中的认证开发者)才可以获得应用第三方登录的权限,否则只能够分享到盆友圈。中间也是遇到了一些小问题,微信那边的文档写的也不是特别的清楚,还有一些关于微信分享到朋友圈和好友方面的,下面就把问题和解决方法给大家呈上来。


2. 概述

在之前只有微信分享的功能,到后来慢慢的发展出了微信登录的模块,分享的功能比较好做,按照微信给的文档构造好需要传递的信息,再调用微信分享接口,即可跳转至微信的页面进行分享了。登录的功能比分享稍微复杂,需要和微信服务器进行至少三次的数据交换(第一步获取code, 第二步通过code获取access_token以及其他的凭证, 第三步再通过access_token来调用微信的接口)。


3. 正文


3.1 appId申请

如需帐号申请,请跟随链接移步,注册一个帐号后在管理中心—>移动应用找到创建移动应用。



进入后在里面填写各种需要的信息,要注意的是这里的应用审核通过后,应用名称不允许修改,所以各位给自己心爱的应用选一个好听的名字咯(貌似都被注册光了)。



下一步后,会看到要填写应用官网,应用下载地址,应用签名,应用包名等资料。



应用包名就是项目文件AndroidManifest.xml文件里面的
package="com.ldx.microtravelnotes"
这个东西。获取应用签名需要先在手机上面安装好应用的release签名版app,再安装一个微信提供的签名生成工具,这个工具安装在手机上后,输入app的应用包名,即可生成应用签名,填写后提交给微信,等待审核的通过。



通过审核之后,会得到微信分配给申请app的appId和appSecret,以及一些能够免费使用的权限(例如分享至微信朋友圈等),如果需要微信验证登录,则要上交300软妹币,成为传说中的验证开发者才可以使用。

在开始做登录和分享之前,还需要下载微信提供的SDK开发包,将这个包导入到项目的libs文件夹里面,再add as library就可以正常的使用了。还需要注意的一点就是要在AndroidManifest.xml文件里面加入如下的权限:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.INTERNET"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.ACCESS_NETWORK_STATE"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.ACCESS_WIFI_STATE"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.READ_PHONE_STATE"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.WRITE_EXTERNAL_STORAGE"</span>/></span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


3.2 微信分享

既然微信登录那边还需要再次验证开发者,我们就先来说说微信分享的实现步骤吧,其实小达在做分享的时候还是挺顺利的(相对于登录来说)。实现微信分享功能分为以下几个步骤:

第一步


利用appId(注册后会得到)将app注册到微信

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> IWXAPI api;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">registerToWx</span>() {
api = WXAPIFactory.createWXAPI(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, AppConstant.APP_ID, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);
api.registerApp(AppConstant.APP_ID);
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>


上面的AppConstant.APP_ID即字符串常量,也就是申请得到的appId,将这些代码放在应用启动时候的Activity或者Application类里面,onCreate()方法调用的时候,顺带的调用registerToWx(),小达这边是有一个在app启动时候绑定的一个Application类,放在了onCreate()里面,贴上一小部分代码,
<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">AndroidManifest.xml
<application
android:name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">".global.MTNApplication"</span>
android:allowBackup=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>
android:icon=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@mipmap</span>/ic_launcher"</span>
android:label=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@string</span>/app_name"</span>
android:theme=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@style</span>/AppTheme"</span>></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MTNApplication</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">CommonApplication</span> {</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> IWXAPI api;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">registerToWx</span>() {
api = WXAPIFactory.createWXAPI(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, AppConstant.APP_ID, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);
api.registerApp(AppConstant.APP_ID);
}

<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>() {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onCreate();
registerToWx();
}
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>


当然也可以写在Activity的onCreate()方法里面,个人觉得放在欢迎页面里面也不错哦。

第二步


在需要分享的位置编写如下代码

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">private void shareArticleToWx(final int flag) {
if (!MTNApplication<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.api</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isWXAppInstalled</span>()) {
AppData<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.showToast</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"您还未安装微信客户端"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
return<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
}
WXWebpageObject webPage = new WXWebpageObject()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
webPage<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.webpageUrl</span> = ArticleApi<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getDisplayArticleUrl</span>(mArticleId, mArticleTemp)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
WXMediaMessage msg = new WXMediaMessage(webPage)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
msg<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.title</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"笔记"</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
msg<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.description</span> = mArticleTitle<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
msg<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setThumbImage</span>(loadedImage)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
SendMessageToWX<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Req</span> req = new SendMessageToWX<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Req</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
req<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.transaction</span> = String<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.valueOf</span>(System<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.currentTimeMillis</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
req<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.message</span> = msg<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
req<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.scene</span> = flag == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> ? SendMessageToWX<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Req</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WXSceneSession</span> : SendMessageToWX<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Req</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.WXSceneTimeline</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
MTNApplication<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.api</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sendReq</span>(req)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>


上面的代码也就是按照微信给的结构,构造了一个微信分享信息,在这个微信分享信息中,可以设置点击跳转的url,这条分享信息的标题等,其中有一个flag参数,这个参数是用来确定分享给朋友圈(flag == 1)还是分享给好友(flag == 0)的。最后通过一个已经注册过的IWXAPI类的实例来发送出分享请求。

第三步


创建一个供微信调用的Activity

创建这个Activity的位置不能随便放,需要在包名下面创建一个新的文件夹wxapi,再在这个文件夹下创建WXEntryActivity.java文件。项目的结构如图,一定不要放错了,因为微信可能无法调用:



创建完成之后还需要在AndroidManifest.xml文件中对WXEntryActivity进行设置:
android:exported="true"


创建的WXEntryActivity.java继承自Activity,实现IWXAPIEventHandler接口,该接口即处理微信和app通信的不同event:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">WXEntryActivity</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Activity</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">implements</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">IWXAPIEventHandler</span> {</span>

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//这两个参数在文档中没有找到,可能是瞎了,,,自己在代码里面找了会才找到,这两个常量代表了微信返回的消息类型,是对登录的处理还是对分享的处理,登录会在后面介绍到</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> RETURN_MSG_TYPE_LOGIN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> RETURN_MSG_TYPE_SHARE = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> String TAG = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"WXEntryActivity"</span>;

<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果没回调onResp,八成是这句没有写</span>
MTNApplication.api.handleIntent(getIntent(), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//微信发送消息给app,app接受并处理的回调函数</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onReq</span>(BaseReq baseReq) {

}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//app发送消息给微信,微信返回的消息回调函数,根据不同的返回码来判断操作是否成功</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onResp</span>(BaseResp resp) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (resp.errCode) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BaseResp.ErrCode.ERR_AUTH_DENIED:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BaseResp.ErrCode.ERR_USER_CANCEL:
showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"微信失败"</span>);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BaseResp.ErrCode.ERR_OK:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (resp.getType()) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> RETURN_MSG_TYPE_SHARE:
showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"微信分享成功"</span>);
finish();
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
}
}
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li></ul>


微信分享到这里就做完了,需要上面的三个步骤即可实现,需要注意的是第二步构造分享信息,以及第三步在设置微信回调页面的时候。


3.3 微信登录

在上面微信分享的基础上,再来做微信登录的功能。微信登录前的准备工作和微信分享一样,先将app注册到微信端,app也是通过WXEntryActivity来处理返回的消息。分下面几个步骤进行:

第一步


注册app到微信

这一步的工作和前面是一样的,如果这个已经完成了,直接跳到下一步。

第二步


发送code请求到微信

在需要微信登录的地方添加上一个按钮,用来点击后调用微信登录页面。之前开始不知道微信验证登录的界面是什么情况,还以为要自己写好,其实是微信那边已经写好了的界面(并非我们的WXEntryActivity),我们只需要在自己的app这边发送请求就会自动跳转到微信的页面。发送code请求的代码如下:

<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!MTNApplication.api.isWXAppInstalled()) {
AppData.showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"您还未安装微信客户端"</span>);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;
}
final SendAuth.Req req = new SendAuth.Re<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q()</span>;
req.scope = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"snsapi_userinfo"</span>;
req.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">state</span> = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"diandi_wx_login"</span>;
MTNApplication.api.sendRe<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">q(req)</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>


上面构造并通过注册好了的api发送了一个请求,请求中scope是固定的形式,用来请求微信验证登录,官方解释:
<code class="hljs d has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">授权作用域(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">scope</span>)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">scope</span>的权限后,使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。如获取用户个人信息则填写snsapi_userinfo</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


参数state是可以自定义的,官方解释:
<code class="hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


效果大概是这样的:

这个页面就是WXEntryActivity,上面加了一个按钮,用来点击之后执行上面的那一段代码,



点击之后,向微信发送了请求,会自动跳转到微信的界面,也就是下面的这张图片,这个界面是微信已经写好了的,我们就不用操心了。



实验了一下,先开始将这个微信验证登录的按钮放在了WXEntryActivity.java中,点击了微信界面登录之后会返回到WXEntryActivity界面中去,后来又想了下,如果不放在WXEnrtyActivity中会怎么样,于是另外写了一个Activity专门用来登录,结果是从微信确认登录之后又返回了WXEnrtyActivity,所以个人认为还是直接放在WXEnrtyActivity里面比较好。反正去了总是要回到这个界面进行处理的。

第三步


利用微信返回的code去请求access_token

第二步拿到的code还不算完呢,这个code的声明周期只有五分钟,而且每个code只可以用一次,切记请勿重复使用,否则就会出现
{"errcode":40029,"errmsg":"invalid
code"}
这种问题了。也是构造一个请求发送给微信,可以直接接在获取code之后,立马把这个请求发送出去,因为是属于微信登录的中间操作。通过code请求access_token的接口如下:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-label" style="box-sizing: border-box;">https:</span>//api<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.weixin</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.qq</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.com</span>/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>


参数说明

参数必须说明
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
secret应用密钥AppSecret,在微信开放平台提交应用审核通过后获得
code填写第一步获取的code参数
grant_type填authorization_code
问我在那里获取微信返回的code?肯定是在WXEntryActivity里面咯,前面提到了这个activity是专门用来给微信调用的,附上WXEnrtyActivity.java里面的代码:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">WXEntryActivity</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Activity</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">implements</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">IWXAPIEventHandler</span> {</span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> Button checkLogin;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> RETURN_MSG_TYPE_LOGIN = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> RETURN_MSG_TYPE_SHARE = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> String TAG = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"WXEntryActivity"</span>;

<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>(Bundle savedInstanceState) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onCreate(savedInstanceState);
setContentView(R.layout.activity_wxentry);
checkLogin = (Button) findViewById(R.id.check_login);
checkLogin.setOnClickListener(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> View.OnClickListener() {
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(View v) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!MTNApplication.api.isWXAppInstalled()) {
AppData.showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"您还未安装微信客户端"</span>);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;
}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> SendAuth.Req req = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> SendAuth.Req();
req.scope = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"snsapi_userinfo"</span>;
req.state = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"diandi_wx_login"</span>;
MTNApplication.api.sendReq(req);
}
});

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//如果没回调onResp,八成是这句没有写</span>
MTNApplication.api.handleIntent(getIntent(), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);
}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//微信直接发送给app的消息处理回调</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onReq</span>(BaseReq baseReq) {

}

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//app发送消息给微信,处理返回消息的回调</span>
<span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onResp</span>(BaseResp resp) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (resp.errCode) {

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BaseResp.ErrCode.ERR_AUTH_DENIED:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BaseResp.ErrCode.ERR_USER_CANCEL:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (RETURN_MSG_TYPE_SHARE == resp.getType()) AppData.showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"分享失败"</span>);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> AppData.showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"登录失败"</span>);
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> BaseResp.ErrCode.ERR_OK:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">switch</span> (resp.getType()) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> RETURN_MSG_TYPE_LOGIN:
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//拿到了微信返回的code,立马再去请求access_token</span>
String code = ((SendAuth.Resp) resp).code;

<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//就在这个地方,用网络库什么的或者自己封的网络api,发请求去咯,注意是get请求</span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> RETURN_MSG_TYPE_SHARE:
AppData.showToast(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"微信分享成功"</span>);
finish();
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
}
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">break</span>;
}
}
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li></ul>


请求返回回来的参数形式如下:
<code class="hljs json has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">{
"<span class="hljs-attribute" style="box-sizing: border-box;">access_token</span>":<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ACCESS_TOKEN"</span></span>,
"<span class="hljs-attribute" style="box-sizing: border-box;">expires_in</span>":<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7200</span></span>,
"<span class="hljs-attribute" style="box-sizing: border-box;">refresh_token</span>":<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"REFRESH_TOKEN"</span></span>,
"<span class="hljs-attribute" style="box-sizing: border-box;">openid</span>":<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"OPENID"</span></span>,
"<span class="hljs-attribute" style="box-sizing: border-box;">scope</span>":<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"SCOPE"</span></span>,
"<span class="hljs-attribute" style="box-sizing: border-box;">unionid</span>":<span class="hljs-value" style="box-sizing: border-box;"><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"o6_bmasdasdsad6_2sgVt7hMZOPfL"</span>
</span>}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>


官方给出的参数列表:
参数说明
access_token微信接口调用凭证
expires_inaccess_token接口调用凭证超时时间,单位(秒)
refresh_token用户刷新access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔
unionid只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
微信验证登录到这里就差不多了,验证的主要目的就是拿到微信给的这个access_token,用来调用微信的各种接口,可以获取用户的基本信息等等。下面就来说说在做的过程中遇到了那些坑的地方(其实就是在自己坑自己Orz)。


4. 填坑环节

在做微信登录模块的时候,遇到了一些小的问题如下,现在给出一些小的建议:

请求登录,没有回调,可能是由于WXEntryActivity的onCreate()方法里面没有处理intent。
MTNApplication.api.handleIntent(getIntent(),
this);

获取到code之后,一个code的寿命只有5分钟,而且只能用一次,如果重复利用就会出现{“errcode”:40029,”errmsg”:”invalid code”}的情况。
应用签名:XXXXX 包名:com.X.X这两个一定不能写反咯,写反就死翘翘了,写反了也会{“errcode”:40029,”errmsg”:”invalid code”}。
拿到code后,如果需要通过自己的服务器向微信发送获取access_token的请求,也要注意code只能用一次(当然不算你给自己服务器的那次),如果你们后台还承担着微信公众号的事务,则要小心不要将微信公众号的appid和app_secret与微信开放平台上的弄混了,否则也会返回{“errcode”:40029,”errmsg”:”invalid code”}。

以上就是对微信登录以及分享的一些小心得,拿出来和大家分享一下,有什么错误的地方还望多多指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: