請(qǐng)到微信開放平臺(tái)https://open.weixin.QQ.com/注冊(cè)成為開發(fā)者,然后創(chuàng)建應(yīng)用并提交審核,只有審核通過(guò)的應(yīng)用才能進(jìn)行開發(fā)。
Android Studio環(huán)境下:
在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'}(其中,前者包含統(tǒng)計(jì)功能)
3.在代碼中使用開發(fā)工具包
[1] AndroidManifest.xml 設(shè)置
添加必要的權(quán)限支持:
<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] 注冊(cè)到微信
要使你的程序啟動(dòng)后微信終端能響應(yīng)你的程序,必須在代碼中向微信終端注冊(cè)你的id。(如下圖所示,可以在程序入口Activity的onCreate回調(diào)函數(shù)處,或其他合適的地方將你的應(yīng)用id注冊(cè)到微信。注冊(cè)函數(shù)示例如下圖所示。

[3] 發(fā)送請(qǐng)求或響應(yīng)到微信
現(xiàn)在,你的程序要發(fā)送請(qǐng)求或發(fā)送響應(yīng)到微信終端,可以通過(guò)IWXAPI的 sendReq 和 sendResp 兩個(gè)方法來(lái)實(shí)現(xiàn)。
boolean sendReq(BaseReq req);
sendReq是第三方app主動(dòng)發(fā)送消息給微信,發(fā)送完成之后會(huì)切回到第三方app界面。
boolean sendResp(BaseResp resp);
sendResp是微信向第三方app請(qǐng)求數(shù)據(jù),第三方app回應(yīng)數(shù)據(jù)之后會(huì)切回到微信界面。
sendReq的實(shí)現(xiàn)示例,如下圖所示:

需要注意的是,SendMessageToWX.Req的scene成員,如果scene填WXScenesession,那么消息會(huì)發(fā)送至微信的會(huì)話內(nèi)。如果scene填WXSceneTimeline(微信4.2以上支持,如果需要檢查微信版本支持API的情況, 可調(diào)用IWXAPI的getWXAppSupportAPI方法,0x21020001及以上支持發(fā)送朋友圈),那么消息會(huì)發(fā)送至朋友圈。scene默認(rèn)值為WXSceneSession。
sendResp的實(shí)現(xiàn)與SendReq類似,如下圖所示:

具體要發(fā)送的內(nèi)容由第三方app開發(fā)者定義,這里需要說(shuō)一下,為了實(shí)現(xiàn)第三方登陸,這里請(qǐng)求是這樣的:
微信登錄的官方文檔將微信登錄分為3個(gè)步驟:
{ // send oauth request Final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test"; api.sendReq(req); }1234567812345678用這段代碼向微信開放平臺(tái)請(qǐng)求授權(quán)碼code,可拉起微信并打開授權(quán)登錄頁(yè)(前提是你安裝了微信應(yīng)用并已登錄,未登錄的會(huì)引導(dǎo)你先登錄),如下圖:

1.如果微信授權(quán)頁(yè)不顯示,請(qǐng)檢查你的APP簽名是否和你在騰訊開放平臺(tái)的APP簽名一致,不一致可修改騰訊開放平臺(tái)中的APP簽名,修改后重裝微信或清除微信數(shù)據(jù)后重試。
2.在你的包名相應(yīng)目錄下新建一個(gè)wxapi目錄,并在該wxapi目錄下新增一個(gè)WXEntryActivity類,該類繼承自Activity(例如應(yīng)用程序的包名為net.sourceforge,則新的包名為:net.sourceforge.wxapi),此處應(yīng)注意包名不要弄錯(cuò),新增類的名字必須為WXEntryActivity,如下圖示:

并在manifest文件里面加上exported屬性,設(shè)置為true,例如:

返回說(shuō)明 用戶點(diǎn)擊授權(quán)后,微信客戶端會(huì)被拉起,跳轉(zhuǎn)至授權(quán)界面,用戶在該界面點(diǎn)擊允許或取消,SDK通過(guò)SendAuth的Resp返回?cái)?shù)據(jù)給調(diào)用方。通過(guò)IWXAPIEventHandler接口的onReq方法進(jìn)行回調(diào),類似的,應(yīng)用請(qǐng)求微信的響應(yīng)結(jié)果將通過(guò)onResp回調(diào),如下:
@Override public void onResp(BaseResp resp) { int errorCode = resp.errCode; switch (errorCode) { case BaseResp.ErrCode.ERR_OK: //用戶同意 String code = ((SendAuth.Resp) resp).code; //code:授權(quán)碼 break; case BaseResp.ErrCode.ERR_AUTH_DENIED: //用戶拒絕 break; case BaseResp.ErrCode.ERR_USER_CANCEL: //用戶取消 break; default: break; } ToastUtil.showMessageLong(this, resp.errStr); }1234567891011121314151617181912345678910111213141516171819客戶端收到授權(quán)碼后,向自己的服務(wù)器發(fā)起登錄請(qǐng)求,并附帶收到的授權(quán)碼code ,可以通過(guò)code獲取access_token(建議在自己服務(wù)器端獲取)
獲取access_token鏈接為:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
得到的Json對(duì)象解析為: 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");參數(shù)說(shuō)明:
參數(shù) 是否必須 說(shuō)明 appid 是 應(yīng)用唯一標(biāo)識(shí),在微信開放平臺(tái)提交應(yīng)用審核通過(guò)后獲得secret 是 應(yīng)用密鑰AppSecret,在微信開放平臺(tái)提交應(yīng)用審核通過(guò)后獲得code 是 填寫第一步獲取的code參數(shù)grant_type 是 填authorization_code回說(shuō)明**正確的返回:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN","openid":"OPENID", "scope":"SCOPE","unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"}1234567812345678 參數(shù) 說(shuō)明access_token 接口調(diào)用憑證expires_in access_token 接口調(diào)用憑證超時(shí)時(shí)間,單位(秒)refresh_token 用戶刷新access_tokenopenid 授權(quán)用戶唯一標(biāo)識(shí)scope 用戶授權(quán)的作用域,使用逗號(hào)(,)分隔unionid 只有在用戶將公眾號(hào)綁定到微信開放平臺(tái)帳號(hào)后,才會(huì)出現(xiàn)該字段。錯(cuò)誤返回樣例:{"errcode":40029,"errmsg":"invalid code"}客戶端可利用access_token獲取微信用戶信息,但進(jìn)行接口調(diào)用,有以下前提:access_token有效且未超時(shí);微信用戶已授權(quán)給第三方應(yīng)用帳號(hào)相應(yīng)接口作用域(scope)。授權(quán)作用域(scope) 接口 接口說(shuō)明snsapi_base /sns/oauth2/access_token 通過(guò)code換取 access_token、refresh_token和已授權(quán)scope /sns/oauth2/refresh_token 刷新或續(xù)期access_token使用 /sns/auth 檢查access_token有效性snsapi_userinfo /sns/userinfo 獲取用戶個(gè)人信息其中snsapi_base屬于基礎(chǔ)接口,若應(yīng)用已擁有其它scope權(quán)限,則默認(rèn)擁有snsapi_base的權(quán)限。使用snsapi_base可以讓移動(dòng)端網(wǎng)頁(yè)授權(quán)繞過(guò)跳轉(zhuǎn)授權(quán)登錄頁(yè)請(qǐng)求用戶授權(quán)的動(dòng)作,直接跳轉(zhuǎn)第三方網(wǎng)頁(yè)帶上授權(quán)臨時(shí)票據(jù)(code),但會(huì)使得用戶已授權(quán)作用域(scope)僅為snsapi_base,從而導(dǎo)致無(wú)法獲取到需要用戶授權(quán)才允許獲得的數(shù)據(jù)和基礎(chǔ)功能。
以獲取用戶信息舉例:
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(); } } }重復(fù)登錄
假設(shè)用戶已經(jīng)獲得授權(quán),則下次登錄時(shí)只需要驗(yàn)證access_token是否有效,無(wú)效則重新獲取授權(quán),有效則無(wú)需重新獲得授權(quán)。
1.用戶向自己的服務(wù)器請(qǐng)求登錄,登錄方式為微信登錄,附帶上次登錄返回的的access_token
2.服務(wù)器收到用戶的登錄請(qǐng)求,向微信開放平臺(tái)發(fā)送access_token是否有效的驗(yàn)證請(qǐng)求如下:
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; }12345678910111213141516171819202122232425262728293031323334351234567891011121314151617181920212223242526272829303132333435返回說(shuō)明
正確的Json返回結(jié)果:{ "errcode":0,"errmsg":"ok"}錯(cuò)誤的Json返回示例:{ "errcode":40003,"errmsg":"invalid openid"}
1234567812345678如果access_token有效,服務(wù)端將信息返回給客戶端,客戶端成功登錄。
如果access_token無(wú)效,服務(wù)端向微信開放平臺(tái)發(fā)送刷新access_token的請(qǐng)求如下:
access_token是調(diào)用授權(quán)關(guān)系接口的調(diào)用憑證,由于access_token有效期(目前為2個(gè)小時(shí))較短,當(dāng)access_token超時(shí)后,可以使用refresh_token進(jìn)行刷新,access_token刷新結(jié)果有兩種:
1.若access_token已超時(shí),那么進(jìn)行refresh_token會(huì)獲取一個(gè)新的access_token,新的超時(shí)時(shí)間; 2.若access_token未超時(shí),那么進(jìn)行refresh_token不會(huì)改變access_token,但超時(shí)時(shí)間會(huì)刷新,相當(dāng)于續(xù)期access_token。
refresh_token擁有較長(zhǎng)的有效期(30天),當(dāng)refresh_token失效的后,需要用戶重新授權(quán)。
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返回說(shuō)明
正確的返回:{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }參數(shù) 說(shuō)明access_token 接口調(diào)用憑證expires_in access_token接口調(diào)用憑證超時(shí)時(shí)間,單位(秒)refresh_token 用戶刷新access_tokenopenid 授權(quán)用戶唯一標(biāo)識(shí)scope 用戶授權(quán)的作用域,使用逗號(hào)(,)分隔錯(cuò)誤返回樣例:{"errcode":40030,"errmsg":"invalid refresh_token"}12345678910111213141516171819123456789101112131415161718193.服務(wù)端獲取到新的access_token等信息,并返回給客戶端,客戶端成功登錄或者重新獲取授權(quán)。
注意事項(xiàng)
[1]如果需要混淆代碼,為了保證sdk的正常使用,需要在proguard.cfg加上下面兩行配置:
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
[2]如果需要運(yùn)行SDK Sample工程,需要通過(guò)指定的debug.keystore來(lái)進(jìn)行簽名:
Android Studio環(huán)境下:
signingConfigs { debug { storeFile file("../debug.keystore") }}Eclipse環(huán)境下:
請(qǐng)查閱文檔《如何運(yùn)行SDK Demo工程》
至此,你已經(jīng)能使用微信Android開發(fā)工具包的API內(nèi)容了。如果想更詳細(xì)了解每個(gè)API函數(shù)的用法,請(qǐng)查閱 Android 平臺(tái)參考手冊(cè) 或自行下載閱讀微信SDK Sample Demo源碼。
微信SDK Sample Demo源碼
參考博文:http://blog.csdn.net/luoyan973387349/article/details/49815225
官網(wǎng)接口地址:開發(fā)前需要知道的那些事 、 集成前資源配置 、 授權(quán)后接口調(diào)用(重)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注