阿里百川電商 SDK(3.1) 接入與使用

Blog: reezy.me/2016-12-20/…
簡書: www.jianshu.com/p/e8d1fad84…javascript

接入

接入準備

參考
baichuan.taobao.com/docs/doc.ht…html

  1. 申請百川無線應用
  2. 下載安全圖片
  3. 開通業務產品的使用權限
  4. 使用優惠券組件

添加安全圖片

將安全圖片放在/res/drawable目錄下,若是已經有安全圖片,就替換。java

Gradle配置

repositories { 
    maven { url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories/" }
} 
dependencies {
    // 受權登錄 (MemberSDK)
    compile 'com.ali.auth.sdk:alibabauth_core:1.2.4@jar'
    compile 'com.ali.auth.sdk:alibabauth_ui:1.2.4@aar'
    compile 'com.ali.auth.sdk:alibabauth_ext:1.2.4@jar'

    // fastjson
    compile 'com.alibaba:fastjson:1.2.9'
    // 基礎電商組件(AlibcTradeSDK, AlibcTrade, AlibcLogin)
    // 包含打開detail,淘客分潤,jsbridge注入等功能
    compile 'com.alibaba.sdk.android:alibc_trade_sdk:3.1.1.20@aar'
    // 集成支付寶(可選)
    compile 'com.alibaba.alipay:alipaySingle:20160825@jar'
    // 組件可用性統計
    compile 'com.alibaba.mtl:app-monitor-sdk:2.5.1_for_bc'

    // 基礎安全組件
    compile 'com.taobao.android:securityguardaar3:5.1.96@aar'
    // 網關
    compile 'com.taobao.android:mtopsdk_allinone_open:1.3.0@jar'
    // 手機淘寶與三方app之間的往返跳轉
    compile 'com.taobao.android:alibc_applink:2.0.0.9@jar'
    // deviceID,主要用於計算設備的uttid, 設備惟一標識
    compile 'com.taobao.android:utdid4all:1.1.5'
}複製代碼

Proguard 規則

-keepattributes Signature
-keep class sun.misc.Unsafe { ; }
-keep class com.taobao.* {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-keep class com.ut.** {*;}
-dontwarn com.ut.**
-keep class com.ta.** {*;}
-dontwarn com.ta.**
-keep class org.json.** {*;}
-keep class com.ali.auth.** {*;}複製代碼

使用電商SDK(3.1)

初始化

在應用的入口方法(好比Application的onCreate)中初始化百川SDKandroid

AlibcTradeSDK.asyncInit(this, new AlibcTradeInitCallback() {
    @Override
    public void onSuccess() {
        // 初始化成功,設置相關的全局配置參數

        // 是否使用支付寶
        AlibcTradeSDK.setShouldUseAlipay(true);

        // 設置是否使用同步淘客打點
        AlibcTradeSDK.setSyncForTaoke(true);

        // 是否走強制H5的邏輯,爲true時所有頁面均爲H5打開
        AlibcTradeSDK.setForceH5(true);

        // 設置全局淘客參數,方便開發者用同一個淘客參數,不須要在show接口重複傳入
        AlibcTradeSDK.setTaokeParams(taokeParams)

        // 設置渠道信息(若是有渠道專享價,須要設置)
        AlibcTradeSDK.setChannel(typeName, channelName)

        // ...
    }

    @Override
    public void onFailure(int code, String msg) {
        //初始化失敗,能夠根據code和msg判斷失敗緣由,詳情參見錯誤說明
    }
});複製代碼

資源銷燬

在使用完成後,能夠調用destroy方法,釋放百川相應的資源引用web

AlibcTradeSDK.destroy();複製代碼

顯示電商頁面

實例化頁面參數(必填)json

// 商品詳情,支持itemId和openItemId的商品,必填,不容許爲null
AlibcBasePage page = new AlibcDetailPage(itemId);

// 店鋪,店鋪id,支持明文id
AlibcBasePage page = new AlibcShopPage(shopId);

// 添加購物車,支持itemId和openItemId的商品,必填,不容許爲null;
AlibcBasePage page = new AlibcAddCartPage(itemId)

// 個人訂單
// status 默認跳轉頁面(0:所有, 1:待付款, 2:待發貨, 3:待收貨, 4:待評價)
// allOrder 爲 true 顯示全部訂單,爲false只顯示經過當前app下單的訂單 
AlibcBasePage page = new AlibcMyOrdersPage(status, allOrder);

// 個人購物車
AlibcBasePage page = new AlibcMyCartsPage();

// URL
AlibcBasePage page = new AlibcPage(taokeUrl);複製代碼

設置參數並並使用自定義webview打開頁面安全

[注意]:當傳入webviewClient,並重載shouldOverrideUrlLoading方法時,遇到淘系連接狀況下(即訪問淘寶、天貓、登陸、購物車等頁面時),該方法返回值要爲false,不然可能會出現業務流程錯誤問題。session

// 頁面打開方式
AlibcShowParams params = new AlibcShowParams(OpenType.Native, isNeedPush);
// 淘寶客參數
AlibcTaokeParams taoke = new AlibcTaokeParams(pid, unionId, subId);
// 提供給三方傳遞配置參數
Map<String, String> extras = new HashMap<>(); 

// activity, page, callback 爲必填
AlibcTrade.show(activity, webView, webViewClient, webChromeClient, page, params, taoke, extras, new AlibcTradeCallback() {
    @Override
    public void onTradeSuccess(TradeResult tradeResult) {
        //打開電商組件,用戶操做中成功信息回調。tradeResult:成功信息(結果類型:加購,支付;支付結果)
    }

    @Override
    public void onFailure(int code, String msg) {
        //打開電商組件,用戶操做中錯誤信息回調。code:錯誤碼;msg:錯誤信息
    }
});複製代碼

使用默認webview打開頁面app

AlibcTrade.show(context, page, params, taoke, extras, callback);複製代碼

登錄受權(1.2.5)

電商SDK已經集成登錄受權
在電商SDK初始化時,會自動初始化登錄受權 async

自動觸發登錄

在電商SDK打開的頁面中,在須要時會自動觸發調用登錄受權SDK

手動觸發登錄

經過 AlibcLogin.showLogin 方法能夠手動調起登錄

AlibcLogin.getInstance().showLogin(activity, new AlibcLoginCallback() {
    @Override
    public void onSuccess() { 
        // 
    }
    @Override
    public void onFailure(int code, String message) {

    }
});複製代碼

接收登錄/登出結果

爲了正常接收登錄/登出的結果,須要重寫傳入的 activity 的 onActivityResult 方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {   
    CallbackContext.onActivityResult(this, requestCode, resultCode, data);
}複製代碼

設置全局登錄回調

目前電商SDK裏的 AlibcLogin 還未提供該功能
只能經過 MemberSDK 獲取 LoginService 能夠設置全局登錄回調

LoginService service = (LoginService)MemberSDK.getService(LoginService.class)
service.setLoginCallback(new LoginCallback(){
    @Override
    public void onSuccess(Session session) { 
        // 
    }
    @Override
    public void onFailure(int code, String message) {

    }
})複製代碼

錯誤碼

public class KernelMessageConstants {
    public static final int GENERIC_SYSTEM_ERROR = 10010;
    public static final int SERVER_REQUEST_FAILED = 15;
    public static final int SERVICE_NOT_AVAILABLE_ERROR = 17; 
}

public class SystemMessageConstants extends KernelMessageConstants {
    public static final int JS_BRIDGE_MODULE_NOT_FOUND = 10000;
    public static final int USER_CANCEL_CODE = 10003;
    public static final int H5_LOGIN_FAILURE = 10101;
    public static final int TAOBAO_CANCEL_CODE = 10004;
    public static final int TAOBAO_ERROR_CODE = 10005;
    public static final int JS_BRIDGE_METHOD_NOT_FOUND = 951;
    public static final int JS_BRIDGE_ANNOTATION_NOT_PRESENT = 952;
    public static final int NET_WORK_ERROR = 10099;
    public static final int NPE_ERROR = 10098; 
}複製代碼

一些坑

在Dialog中打開頁面

因爲 dialog 會給 context 包上一層 ContextThemeWrapper, 而與 dialog 交互時 sdk 可能會從其中的 view 獲取 context 而後轉成 activity 這時就會出現異常致使崩潰。

一個解決辦法是使用 LayoutInflater.from(activity) 來 inflate 對話框的佈局

【bug】在受權或支付頁面返回(failure)時會把傳入的activity關閉(finish)

打開頁面時必需傳入一個activity,傳入的activity被關閉,這一般不是指望的效果

經過重載傳入的activity.finish方法能夠臨時解決

目前官方文檔上使用的sdk版本 3.1.0.7 有這個問題,更新到 3.1.1.20 已經沒有此問題

【bug】AlibcTrade 的默認 WebViewClient.shouldInterceptRequest 方法的邏輯錯誤

alibc_trade_sdk 包的 com.alibaba.baichuan.android.trade.c.b.b
它的 shouldInterceptRequest 方法以下

打開頁面時咱們傳入的WebViewClient會被這個類代理

public WebResourceResponse shouldInterceptRequest(WebView var1, String var2) {
  return VERSION.SDK_INT > 23 && this.a != null && this.a.get() != null?((WebViewClient)this.a.get()).shouldInterceptRequest(var1, var2):super.shouldInterceptRequest(var1, var2);
}複製代碼

這個方法是用於API LEVEL < 21 的,然而 VERSION.SDK_INT > 23 這個錯誤的判斷致使本來應該被執行的代碼未執行

4.x 的設備都會所以bug產生各類問題

參考

阿里百川 SDK 官方文檔
baichuan.taobao.com/docs/doc.ht…

3.1SDK 常見問題補充
baichuan.bbs.taobao.com/detail.html…

常見錯誤碼
baichuan.taobao.com/docs/doc.ht…

SG error:XXX錯誤碼
baichuan.taobao.com/docs/doc.ht…

客戶端SDK常見問題
baichuan.taobao.com/docs/doc.ht…

相關文章
相關標籤/搜索