1. 程式人生 > >Android平臺以WebView方式整合H5+SDK和支付寶登入授權外掛開發問題總結

Android平臺以WebView方式整合H5+SDK和支付寶登入授權外掛開發問題總結

1、問題

原因沒有引入aar包

2、問題

Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 16 declared in library [:alipaySdk-15.5.7-20181023110917:] C:\Users\WMXX\.gradle\caches\transforms-1\files-1.1\alipaySdk-15.5.7-20181023110917.aar\e003387131f245820a9020941ca1ddf6\AndroidManifest.xml as the library might be using APIs not available in 15

    Suggestion: use a compatible library with a minSdk of at most 15,

       or increase this project's minSdk version to at least 16,

       or use tools:overrideLibrary="com.alipay.sdk" to force usage (may lead to runtime failures)

原因

專案 App Module 的 build.gradle 中的minSdkVersion的版本號小於生成的C:\Users\WMXX\.gradle\caches\transforms-1\files-1.1\alipaySdk-15.5.7-20181023110917.aar檔案的  minSdkVersion的版本號

3、問題

   支付寶授權之後資料如何返回到js?

   解決:支付寶登入授權要求必須通過多執行緒呼叫,然而對於run方法沒有返回值,那麼登入授權之後的auth_code如何返回到js那??這裡想到H5+sdk的外掛開發中回到js是使用JSUtil.execCallback

()或者JSUtil.wrapJsVar(),當前是非同步形式,則使用JSUtil.execCallback()方法,所以將Activity 、IWebview、JSONArray傳入自定義的authV2方法,在方法內的run中返回到呼叫者js。

public  void authV2(final String url, final Activity activity,final IWebview iWebview, final JSONArray jsonArray) {
    Log.e(
"authV2","支付寶方法");
   
Thread authRunnable = new Thread() {
      
// AuthResult authResult = null;
       
@Override
       
public void run() {
           
// 構造AuthTask 物件
           
Log.e("authV2","123");
           
AuthTask authTask = new AuthTask(activity);
           
// 呼叫授權介面,獲取授權結果
           
Log.e("authV2","456");
           
Map<String, String> result = authTask.authV2(url, true);
           
Log.e("result","資料"+result);
           
AuthResult authResult = new AuthResult(result, true);
           
String resultStatus = authResult.getResultStatus();
           
// 判斷resultStatus 為“9000”且result_code
            // 為“200”則代表授權成功,具體狀態碼代表含義可參考授權介面文件
           
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
               
// 獲取alipay_open_id,調支付時作為引數extern_token 的value
                // 傳入,則支付賬戶為該授權賬戶
               
Log.e("authV23","進入到hander--成功");
           
} else {
               
// 其他狀態值則為授權失敗
               
Log.e("authV23","進入到hander--失敗");
           
}
           
// 呼叫方法將原生程式碼的執行結果返回給js層並觸發相應的JS層回撥函式
           
JSONArray newArray = new JSONArray();
           
newArray.put(authResult.getResultCode());
           
newArray.put(authResult.getResultStatus());
           
newArray.put(authResult.getAuthCode());
           
newArray.put(authResult.getScope());
           
newArray.put(authResult.getUser_id());
           
Log.e("newArray","------"+newArray);
           
JSUtil.execCallback(iWebview, jsonArray.optString(0),newArray, JSUtil.OK, false);
       
}
    }
;
   
// 必須非同步呼叫
   
Thread authThread = new Thread(authRunnable);
   
authThread.start();
}

 

4、問題

問題描述(v1v2)

Android 7.0中引入了APK Signature Scheme v2v1jar Signature來自JDK
V1
:應該是通過ZIP條目進行驗證,這樣APK 簽署後可進行許多修改 - 可以移動甚至重新壓縮檔案。
V2:驗證壓縮檔案的所有位元組,而不是單個 ZIP 條目,因此,在簽名後無法再更改(包括 zipalign)。正因如此,現在在編譯過程中,我們將壓縮、調整和簽署合併成一步完成。好處顯而易見,更安全而且新的簽名可縮短在裝置上進行驗證的時間(不需要費時地解壓縮然後驗證),從而加快應用安裝速度。


解決方案一
v1v2的簽名使用
1)只勾選v1簽名並不會影響什麼,但是在7.0上不會使用更安全的驗證方式
2)只勾選V2簽名7.0以下會直接安裝完顯示未安裝,7.0以上則使用了V2的方式驗證
3)同時勾選V1V2則所有機型都沒問題