微信授權登錄步驟及賬號部分在微信相關功能中體現,此處不再贅述:微信相關功能
賬號註冊號之後創建APP基本信息,APP信息,注意包名與簽名填寫必須正確。
下面進入功能集成部分
1、資源集成,兩種方式:
1)下載資源集成(已經不再推薦,最新的下載鏈接連接到的是Jcenter)。
地址:微信資源下載
下載之後解壓得到 libammsdk.jar集成到項目中並進行依賴即可
2)gradle方式集成。
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
或者
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
第一個包含統計功能,第二個不包含統計功能。
2、權限註冊:
在Manifests進行相關的權限註冊如下:
<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"/>
3、將APP註冊到微信(注意將appId替換成你自己註冊的AppId):
IWXAPI weixinAPI=WXAPIFactory.createWXAPI(this, 'appiId', true);
weixinAPI.registerApp('appId');
4、微信授權請求(返回code):
微信登錄只支持安裝客戶端之後進行授權,所以需要先檢測是否安裝了微信再分情情況進行相關的處理,WeixinAPI對象就用上述步驟3中初始化的對象即可。
if (PigeonApp.WeixinAPI.isWXAppInstalled()) {
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_pigeon_racing";
PigeonApp.WeixinAPI.sendReq(req);
ToastUtils.getInstance(mContext).showToast("正在進行微信登錄,請稍後...", false);
} else {
ToastUtils.getInstance(mContext).showToast("請先安裝微信客戶端", false);
}
授權請求需要三個參數,分別爲:
appid 是 應用唯一標識,在微信開放平臺提交應用審覈通過後獲得
scope 是 應用授權作用域,如獲取用戶個人信息則填寫snsapi_userinfo
state 否 用於保持請求和回調的狀態,授權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗(其實就是一個校驗碼,自己寫一個字符串就可以了)。
5、微信授權回調的Activity,內容如下(由於此處是分享和授權都有,所以首先判斷類型再進行分情況處理,Activity名稱必須爲WXEntryActivity,注意在Manifests中註冊Activity):
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.orhanobut.logger.Logger;
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.modelmsg.SendMessageToWX;
import com.tencent.mm.sdk.modelpay.PayResp;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import com.zhy.http.okhttp.https.HttpsUtils;
import com.zhy.http.okhttp.request.RequestCall;
import org.json.JSONObject;
import java.io.IOException;
import javax.net.ssl.SSLSocketFactory;
import okhttp3.Call;
import okhttp3.OkHttpClient;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PigeonApp.WeixinAPI.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
String result = "";
if (baseResp instanceof SendAuth.Resp){//登錄授權回調
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
SendAuth.Resp resp = (SendAuth.Resp) baseResp;
//發送相關消息 在相關的頁面接受
result = "授權成功";
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "授權取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "授權被拒絕";
break;
default:
result = "授權返回";
break;
}
}else if (baseResp instanceof SendMessageToWX.Resp){//分享
switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = "分享成功";
// commitScore();
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = "分享取消";
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = "分享被拒絕";
break;
default:
result = "分享返回";
break;
}
}
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
}
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:launchMode="singleTop"
android:label="@string/app_name"/>
返回的參數如下:
ErrCode ERR_OK = 0(用戶同意) ERR_AUTH_DENIED = -4(用戶拒絕授權) ERR_USER_CANCEL = -2(用戶取消)
code 用戶換取access_token的code,僅在ErrCode爲0時有效
state 第三方程序發送時用來標識其請求的唯一性的標誌,由第三方程序調用sendReq時傳入,由微信終端回傳,state字符串長度不能超過1K
lang 微信客戶端當前語言
country 微信用戶當前國家信息
6、獲取接口調用憑證access_token(詳細說明):
接口url:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
參數:
appid 是 應用唯一標識,在微信開放平臺提交應用審覈通過後獲得
secret 是 應用密鑰AppSecret,在微信開放平臺提交應用審覈通過後獲得
code 是 填寫第一步獲取的code參數
grant_type 是 填authorization_code
返回:
access_token 接口調用憑證
expires_in access_token接口調用憑證超時時間,單位(秒)
refresh_token 用戶刷新access_token
openid 授權用戶唯一標識
scope 用戶授權的作用域,使用逗號(,)分隔
unionid 當且僅當該移動應用已獲得該用戶的userinfo授權時,纔會出現該字段
正確示例:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
7、通過access_token調用接口獲取自己需要的信息進行業務處理:
接口url:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
參數:
access_token 是 調用接口憑證
openid 是 普通用戶標識,對該公衆帳號唯一
lang 否 國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語,默認爲zh-CN
返回:
參數 說明
openid 普通用戶的標識,對當前開發者帳號唯一
nickname 普通用戶暱稱
sex 普通用戶性別,1爲男性,2爲女性
province 普通用戶個人資料填寫的省份
city 普通用戶個人資料填寫的城市
country 國家,如中國爲CN
headimgurl 用戶頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項爲空
privilege 用戶特權信息,json數組,如微信沃卡用戶爲(chinaunicom)
unionid 用戶統一標識。針對一個微信開放平臺帳號下的應用,同一用戶的unionid是唯一的。
正確示例:
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
建議最好保存unionID信息,以便以後在不同應用之間進行用戶信息互通,比如網頁登錄,APP登錄同時存在時候就必須保存unionID,因爲同一個用戶採用兩種方式登錄的時候openid可能不同。
完成!