请到微信开放平台https://open.weixin.QQ.com/注册成为开发者,然后创建应用并提交审核,只有审核通过的应用才能进行开发。
Android Studio环境下:
在build.gradle文件中,添加如下依赖即可:
dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'}或
dependencies { compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.0.2'}(其中,前者包含统计功能)
3.在代码中使用开发工具包
[1] AndroidManifest.xml 设置
添加必要的权限支持:
<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"/>
[2] 注册到微信
要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。注册函数示例如下图所示。
[3] 发送请求或响应到微信
现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的 sendReq 和 sendResp 两个方法来实现。
boolean sendReq(BaseReq req);
sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。
boolean sendResp(BaseResp resp);
sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。
sendReq的实现示例,如下图所示:
需要注意的是,SendMessageToWX.Req的scene成员,如果scene填WXScenesession,那么消息会发送至微信的会话内。如果scene填WXSceneTimeline(微信4.2以上支持,如果需要检查微信版本支持API的情况, 可调用IWXAPI的getWXAppSupportAPI方法,0x21020001及以上支持发送朋友圈),那么消息会发送至朋友圈。scene默认值为WXSceneSession。
sendResp的实现与SendReq类似,如下图所示:
具体要发送的内容由第三方app开发者定义,这里需要说一下,为了实现第三方登陆,这里请求是这样的:
微信登录的官方文档将微信登录分为3个步骤:
{ // send oauth request Final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test"; api.sendReq(req); }1234567812345678用这段代码向微信开放平台请求授权码code,可拉起微信并打开授权登录页(前提是你安装了微信应用并已登录,未登录的会引导你先登录),如下图:
1.如果微信授权页不显示,请检查你的APP签名是否和你在腾讯开放平台的APP签名一致,不一致可修改腾讯开放平台中的APP签名,修改后重装微信或清除微信数据后重试。
2.在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge,则新的包名为:net.sourceforge.wxapi),此处应注意包名不要弄错,新增类的名字必须为WXEntryActivity,如下图示:
并在manifest文件里面加上exported属性,设置为true,例如:
返回说明 用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK通过SendAuth的Resp返回数据给调用方。通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调,如下:
@Override public void onResp(BaseResp resp) { int errorCode = resp.errCode; switch (errorCode) { case BaseResp.ErrCode.ERR_OK: //用户同意 String code = ((SendAuth.Resp) resp).code; //code:授权码 break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //用户拒绝 break; case BaseResp.ErrCode.ERR_USER_CANCEL: //用户取消 break; default: break; } ToastUtil.showMessageLong(this, resp.errStr); }1234567891011121314151617181912345678910111213141516171819客户端收到授权码后,向自己的服务器发起登录请求,并附带收到的授权码code ,可以通过code获取access_token(建议在自己服务器端获取)
获取access_token链接为:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
得到的Json对象解析为:JSONObject object = new JSONObject(sb.toString().trim()); accessToken = object.getString("access_token"); openID = object.getString("openid"); refreshToken = object.getString("refresh_token"); expires_in = object.getLong("expires_in");参数说明:
参数 是否必须 说明 appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得secret 是 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得code 是 填写第一步获取的code参数grant_type 是 填authorization_code回说明**
1234567812345678正确的返回:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN","openid":"OPENID", "scope":"SCOPE","unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"}参数 说明access_token 接口调用凭证expires_in access_token 接口调用凭证超时时间,单位(秒)refresh_token 用户刷新access_tokenopenid 授权用户唯一标识scope 用户授权的作用域,使用逗号(,)分隔unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。错误返回样例:{"errcode":40029,"errmsg":"invalid code"}客户端可利用access_token获取微信用户信息,但进行接口调用,有以下前提:access_token有效且未超时;微信用户已授权给第三方应用帐号相应接口作用域(scope)。
1234567812345678授权作用域(scope) 接口 接口说明snsapi_base /sns/oauth2/access_token 通过code换取 access_token、refresh_token和已授权scope /sns/oauth2/refresh_token 刷新或续期access_token使用 /sns/auth 检查access_token有效性snsapi_userinfo /sns/userinfo 获取用户个人信息
12345678910111213141516171819202122232425262728293031323334351234567891011121314151617181920212223242526272829303132333435其中snsapi_base属于基础接口,若应用已拥有其它scope权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。
以获取用户信息举例:
PRivate void getUserInfo() { if (isAccessTokenIsInvalid() && System.currentTimeMillis() < expires_in) { String uri = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openID; HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(URI.create(uri)); try { HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); StringBuilder builder = new StringBuilder(); for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) { builder.append(temp); } JSONObject object = new JSONObject(builder.toString().trim()); String nikeName = object.getString("nickname"); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }重复登录
假设用户已经获得授权,则下次登录时只需要验证access_token是否有效,无效则重新获取授权,有效则无需重新获得授权。
1.用户向自己的服务器请求登录,登录方式为微信登录,附带上次登录返回的的access_token
2.服务器收到用户的登录请求,向微信开放平台发送access_token是否有效的验证请求如下:
private boolean isAccessTokenIsInvalid() { String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID; URI uri = URI.create(url); HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(uri); HttpResponse response; try { response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { HttpEntity entity = response.getEntity(); BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8")); StringBuilder sb = new StringBuilder(); for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) { sb.append(temp); } JSONObject object = new JSONObject(sb.toString().trim()); int errorCode = object.getInt("errcode"); if (errorCode == 0) { return true; } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; }返回说明
正确的Json返回结果:{ "errcode":0,"errmsg":"ok"}错误的Json返回示例:{ "errcode":40003,"errmsg":"invalid openid"}如果access_token有效,服务端将信息返回给客户端,客户端成功登录。
如果access_token无效,服务端向微信开放平台发送刷新access_token的请求如下:
access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间; 2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
private void refreshAccessToken() { String uri = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + ShareUtil.APP_ID + "&grant_type=refresh_token&refresh_token=" + refreshToken; HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(URI.create(uri)); try { HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); StringBuilder builder = new StringBuilder(); for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) { builder.append(temp); } JSONObject object = new JSONObject(builder.toString().trim()); accessToken = object.getString("access_token"); refreshToken = object.getString("refresh_token"); openID = object.getString("openid"); expires_in = object.getLong("expires_in"); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }123456789101112131415161718192021222324252627282930123456789101112131415161718192021222324252627282930返回说明
正确的返回:{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }参数 说明access_token 接口调用凭证expires_in access_token接口调用凭证超时时间,单位(秒)refresh_token 用户刷新access_tokenopenid 授权用户唯一标识scope 用户授权的作用域,使用逗号(,)分隔错误返回样例:{"errcode":40030,"errmsg":"invalid refresh_token"}12345678910111213141516171819123456789101112131415161718193.服务端获取到新的access_token等信息,并返回给客户端,客户端成功登录或者重新获取授权。
注意事项
[1]如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
[2]如果需要运行SDK Sample工程,需要通过指定的debug.keystore来进行签名:
Android Studio环境下:
signingConfigs { debug { storeFile file("../debug.keystore") }}Eclipse环境下:
请查阅文档《如何运行SDK Demo工程》
至此,你已经能使用微信Android开发工具包的API内容了。如果想更详细了解每个API函数的用法,请查阅 Android 平台参考手册 或自行下载阅读微信SDK Sample Demo源码。
微信SDK Sample Demo源码
参考博文:http://blog.csdn.net/luoyan973387349/article/details/49815225
官网接口地址:开发前需要知道的那些事 、 集成前资源配置 、 授权后接口调用(重)
新闻热点
疑难解答