1. 程式人生 > >android app使用微信登錄接口回調沒有被執行的問題研究

android app使用微信登錄接口回調沒有被執行的問題研究

The 應用平臺 cat 分享 github theme 調用 runnable handler

本人開發的一個app使用了sharesdk集成微信登錄功能,在測試的過程中微信授權登錄界面有調用,但是授權後原應用的回調沒有被執行

應用的包名是com.kimi.searcher

首先,確認微信點擊授權後有沒有執行回調,方法是通過日誌過濾activitymanager,

日誌中有出現

04-16 13:27:43.345 1805-3279/? I/ActivityManager: START u0 {flg=0x18000000 cmp=com.kimi.searcher/.wxapi.WXEntryActivity (has extras)} from uid 10156 on display 0

說明微信有回調app的wxentryactivity

那麽繼續判斷安裝包中的WXEntryActivity是否存在

使用https://github.com/iBotPeaches/Apktool 來反編譯apk安裝包,發現安裝包中不存在com.kimi.searcher.wxapi.WXEntryActivity.取而代之的是com.qq.rnsharesdk.wxapi.WXEntryActivity.

原因分析:com.qq.rnsharesdk.wxapi.WXEntryActivity是放在一個依賴項目中的微信入口activity.被依賴的項目的package是com.qq.rnsharesdk。 activity的名稱是.wxapi.WXEntryActivity。 原來gradle 在編程的過程中,androidmanifest.xml中的相對路徑組件會根據被依賴包中的package名來生成全路徑名稱,而不是app項目中的package來生成全路徑名稱。

於是我在app項目中添加一條activity, 並且把build.gradle中的applicationId改成了com.kimi.searcher。編譯後發現回調依然沒有被執行,把新包進行反編譯,發現androidmanifest.xml中多了一條com.awesomeproject.wxapi.WXEntryActivity。

原因是androidmanfiest.xml的相對路徑填充不會使用build.gradle中使用的applicationId,而會使用androidmanifest.xml中的package來進行路徑填充。

與往常使用gradlew編譯安卓項目,build.gradlew的配置會覆蓋androidmanifest.xml的配置的經驗不同,androidmanifest.xml的相對路徑填充的規則:

1.使用最近的package配置,2.不使用build.gradle中的配置


Android 微信授權登錄、獲取Wx用戶信息,解決無法回調問題

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

據此記載..(坑)

1.微信註冊應用平臺的應用簽名為 打包keystore的MD5 小寫並且去掉 ":" 號組成、或者去下載 微信簽名生成工具 輸入項目的packageName也可以查看到。

2.授權沒反應,監測微信App_Id是否正確、是否按照上1.生成。 當前的App是否正式簽名?也就是正式App.. DeBug簽名環境的App貌似無法調動微信。

3.關於回調:是否按照官方要求註冊WXEntryActivity並且繼承Acticiy、 此Activity不能改名,並且在你的 package(項目報名).wxapi.WXEntryActivity.java 下面。 註冊* 每段代碼都別少...

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

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

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private final String TAG = this.getClass().getSimpleName();
    public static final String APP_ID = "請自己填寫";
    public static final String APP_SECRET = "請自己填寫";
    private IWXAPI mApi;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mApi = WXAPIFactory.createWXAPI(this, APP_ID, true);
        mApi.handleIntent(this.getIntent(), this);
    }

    //微信發送的請求將回調到onReq方法
    @Override
    public void onReq(BaseReq baseReq) {
    }

    //發送到微信請求的響應結果
    @Override
    public void onResp(BaseResp resp) {
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                //發送成功
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                //發送取消
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                //發送被拒絕
                break;
            default:
                //發送返回
                break;
        }
        finish();

    }

}

5.當授權時候進入WXEntryActivity、當前背景可能是黒或白,為了不影響用戶體驗,可以把當前Activity設置為透明。android:theme="@android:style/Theme.Translucent" ,可以參照上3. WXEntryActivity註冊格式。

以上便是授權登錄遇到的坑、只怪Wx要求格式的有個性、多多少少會遇到這樣的坑。技術分享圖片

授權登錄並且拿取Wx用戶信息,簡單三部曲:

* 
* 1.sendReq(req). 用戶授權可以拿到 code
* 
* 2.用code.調用Wx接口拿到 openid & accessToken
* 
* 3.通過openid & accessToken 倆參數可以拿到最終用戶信息
*
* 

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

部分代碼:

/**
 * 獲取openid accessToken值用於後期操作
 *
 * @param code 請求碼
 */
private void getAccess_token(final String code) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
                    + APP_ID
+ "&secret="
                    + APP_SECRET
+ "&code="
                    + code
                    + "&grant_type=authorization_code";
            try {
                JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 請求https連接並得到json結果
                if (null != jsonObject) {
                    String openid = jsonObject.getString("openid").toString().trim();
                    String access_token = jsonObject.getString("access_token").toString().trim();
                    getUserMesg(access_token, openid);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

}


/**
 * 獲取微信的個人信息
 *
 * @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;
    try {
        JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 請求https連接並得到json結果
        if (null != jsonObject) {
            String nickname = jsonObject.getString("nickname");
            int sex = Integer.parseInt(jsonObject.get("sex").toString());
            String headimgurl = jsonObject.getString("headimgurl");

            Log.e(TAG, "getUserMesg 拿到了用戶Wx基本信息.. nickname:" + nickname);

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return;
}

具體代碼:微信授權登錄 - 案例 Dome。

參考、感謝:

1.http://blog.csdn.net/xiong_it/article/details/48317527

2.https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN

android app使用微信登錄接口回調沒有被執行的問題研究