微信授權登錄

    微信授權登錄步驟及賬號部分在微信相關功能中體現,此處不再贅述:微信相關功能

    賬號註冊號之後創建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可能不同

完成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章