Android 微信第三方登錄(個人筆記)

来源:http://www.cnblogs.com/kevin-chen/archive/2016/12/10/6157950.html
-Advertisement-
Play Games

今天在寫微信登錄,花了半天時間搞定、然後寫下自己的筆記,希望幫助更多的人。。。歡迎各位指教。 微信授權登錄,官方說的不是很清楚、所以導致有一部分的坑。 微信註冊應用平臺的應用簽名,下載 微信簽名生成工具 輸入項目的packageName也可以查看到。 (註意:debug、Release 一定要區分, ...


今天在寫微信登錄,花了半天時間搞定、然後寫下自己的筆記,希望幫助更多的人。。。歡迎各位指教。

 

微信授權登錄,官方說的不是很清楚、所以導致有一部分的坑。

微信註冊應用平臺的應用簽名,下載 微信簽名生成工具 輸入項目的packageName也可以查看到。

(註意:debug、Release 一定要區分,因為2種生成的微信簽名不一致,會導致沒有跳轉、回調。。。。一般在微信開發者上面註冊的是正式環境打包好的、)

 

 

 

申請微信開發者賬號、應用申請省略。。。。

 

 

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.在圖一按鈕上面,加上微信跳轉方法、也就是啟動微信登錄的方法

private void loginToWeiXin(){
        IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true);
        mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID);

        if (mApi != null && mApi.isWXAppInstalled()) {
            SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "wechat_sdk_demo_test_neng";
            mApi.sendReq(req);
        } else
            Toast.makeText(this, "用戶未安裝微信", Toast.LENGTH_SHORT).show();
    }

 

3.在你的包名相應目錄下新建一個wxapi目錄,併在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自Activity

 package(項目報名).wxapi.WXEntryActivity.Java 

回調方法onResp() 方法沒有觸發回調、請監測WXEntryActivity onCreate中是否調用此方法  mApi.handleIntent(this.getIntent(), this);

package com.xxx.xxxx.android.wxapi;
/**
 * 微信登錄頁面
 * @author kevin_chen 2016-12-10 下午19:03:45
 * @version v1.0
 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private static final String APP_SECRET = "填寫自己的AppSecret";
    private IWXAPI mWeixinAPI;
    public static final String WEIXIN_APP_ID = "填寫自己的APP_id";
    private static String uuid;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
        mWeixinAPI.handleIntent(this.getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        mWeixinAPI.handleIntent(intent, this);//必須調用此句話
    }

    //微信發送的請求將回調到onReq方法
    @Override
    public void onReq(BaseReq req) {
        LogUtils.log("onReq");
    }

    //發送到微信請求的響應結果
    @Override
    public void onResp(BaseResp resp) {
        LogUtils.log("onResp");
        switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            LogUtils.log("ERR_OK");
            //發送成功
            SendAuth.Resp sendResp = (SendAuth.Resp) resp;
            if (sendResp != null) {
                String code = sendResp.code;
                getAccess_token(code);
            }
            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            LogUtils.log("ERR_USER_CANCEL");
            //發送取消
            break;
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            LogUtils.log("ERR_AUTH_DENIED");
            //發送被拒絕
            break;
        default:
            //發送返回
            break;
        }

    }

    /**
     * 獲取openid accessToken值用於後期操作
     * @param code 請求碼
     */
    private void getAccess_token(final String code) {
        String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
                + WEIXIN_APP_ID
                + "&secret="
                + APP_SECRET
                + "&code="
                + code
                + "&grant_type=authorization_code";
        LogUtils.log("getAccess_token:" + path);
        //網路請求,根據自己的請求方式
        VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
            @Override
            public void onSuccess(String result) {
                LogUtils.log("getAccess_token_result:" + result);
                JSONObject jsonObject = null;
                try {
                    jsonObject = new JSONObject(result);
                    String openid = jsonObject.getString("openid").toString().trim();
                    String access_token = jsonObject.getString("access_token").toString().trim();
                    getUserMesg(access_token, openid);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onError(String errorMessage) {

            }
        });
    }


    /**
     * 獲取微信的個人信息
     * @param access_token
     * @param openid
     */
    private void getUserMesg(final String access_token, final String openid) {
        String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
                + access_token
                + "&openid="
                + openid;
        LogUtils.log("getUserMesg:" + path);
        //網路請求,根據自己的請求方式
        VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
            @Override
            public void onSuccess(String result) {
                LogUtils.log("getUserMesg_result:" + result);
                JSONObject jsonObject = null;
                try {
                    jsonObject = new JSONObject(result);
                    String nickname = jsonObject.getString("nickname");
                    int sex = Integer.parseInt(jsonObject.get("sex").toString());
                    String headimgurl = jsonObject.getString("headimgurl");
                 
                    LogUtils.log("用戶基本信息:");
                    LogUtils.log("nickname:" + nickname);
                    LogUtils.log("sex:" + sex);
                    LogUtils.log("headimgurl:" + headimgurl);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                finish();
            }

            @Override
            public void onError(String errorMessage) {

            }
        });
    }

}

 

5.在 AndroidManifest.xml 設置註冊微信的頁面

當授權時候進入WXEntryActivity、當前背景可能是黒或白,為了不影響用戶體驗,可以把當前Activity設置為透明:

android:theme="@android:style/Theme.Translucent" 

<!--註冊微信回調 WXEntryActivity -->
<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:label="@string/app_name"
    android:launchMode="singleTop"
    android:theme="@android:style/Theme.Translucent" />

 

 

 

 

具體可參考:微信授權登錄取用戶信息步驟

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> *{ margin: 0; padding: 0; } .box{ width: 180px; height: 30 ...
  • Array.prototype.reduce() 概述 reduce()方法是數組的一個實例方法(共有方法),可以被數組的實例對象調用。reduce() 方法接收一個函數作為累加器(accumulator),數組中的每個值(從左到右)開始縮減,最終為一個值。 語法 arr.reduce(callba ...
  • 今天我們一起來探討下安卓中BroadcastReceiver組件以及詳細分析下它的兩種註冊方式。 BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣 ...
  • 今日,在學習AnimatorSet時,使用play、with、after、before時,代碼書寫如下: 運行代碼時,報錯,錯誤報告如下: 然後,我將set.play(animator1).after(animator2).before(animator3).with(animator2);代碼修改 ...
  • Toast的多種使用方法 Toast其實是一個功能特別強大的組件,不僅僅可以吐司一個文本內容,還可以吐司圖片以及圖文混排的界面。具體用法如下: 第一種:簡單的純文本內容的吐司: 第二種:吐司一張圖片: 第三種:圖文混合吐司 Toast還有一些其它的屬性,知道這最基本的,然後發揮我們的想象,t就可以利 ...
  •   對於直播來說,客戶端主要做兩件事情,推流和播放。今天先講播放。 播放流程 1.拉流:伺服器已有直播內容,從指定地址進行拉取的過程。其實就是向伺服器請求數據。 2.解碼:對視屏數據進行解壓縮。 3.渲染:生成圖片的過程。視屏其實就是一張張連續的圖片進行切換,一張圖片就是一幀。幀 ...
  • ➠更多技術乾貨請戳:聽雲博客 動態鏈接 要解決空間浪費和更新困難這兩個問題最簡單的方法就是把程式的模塊相互分割開來,形成獨立的文件,而不再將它們靜態的鏈接在一起。簡單地講,就是不對那些組成程式的目標文件進行鏈接,等到程式要運行時才進行鏈接。也就是說,把鏈接過程推遲到了運行時再進行,這就是 _動態鏈接 ...
  • 示例一:實現通知欄管理 當針對相同類型的事件多次發出通知,作為開發者,應該避免使用全新的通知,這時就應該考慮更新之前通知欄的一些值來達到提醒用戶的目的。例如我們手機的簡訊系統,當不斷有新消息傳來時,我們的通知欄僅僅是更改傳來簡訊的數目,而不是對每條簡訊單獨做一個通知欄用於提示。 修改通知 可以設置一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...