Android 集成微信、QQ、微博、支付寶、銀聯(lián)、華為、OPPO

效果圖

WechatIMG26.png

源碼

版本

  1. 華為: 2.6.3.301
  2. QQ: 3.3.3 (6008)
  3. 微博: 4.3.9
  4. 微信: 5.4.0
  5. 銀聯(lián): 3.4.1
  6. 支付寶: 15.6.4
  7. OPPO:2.0.0

集成

  1. 添加倉庫地址

    maven { url "https://dl.bintray.com/thelasterstar/maven/" }     // 微博 aar
    maven { url 'http://developer.huawei.com/repo/' }               // 華為倉庫
    maven { url 'https://dl.bintray.com/wenjie/maven' }
    
  2. 根據(jù)要集成的第三方庫添加依賴

    api 'com.enowr.android:Auth:0.0.7'
    api 'com.enowr.android:AuthHW:0.0.7'
    api 'com.enowr.android:AuthQQ:0.0.7'
    api 'com.enowr.android:AuthWB:0.0.7'
    api 'com.enowr.android:AuthWX:0.0.7'
    api 'com.enowr.android:AuthYL:0.0.7'
    api 'com.enowr.android:AuthZFB:0.0.7'
    api 'com.enowr.android:AuthOPPO:0.0.7'
    
  3. Manifest

    <manifest>
        <!-- 華為權(quán)限 -->
        <uses-permission android:name="android.permission.INTERNET" />                                  <!--HMS-SDK引導(dǎo)升級HMS功能,訪問OTA服務(wù)器需要網(wǎng)絡(luò)權(quán)限-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />                    <!--HMS-SDK引導(dǎo)升級HMS功能,保存下載的升級包需要SD卡寫權(quán)限-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>                       <!--檢測網(wǎng)絡(luò)狀態(tài)-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>                          <!--檢測wifi狀態(tài)-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>                           <!--為了獲取用戶手機的IMEI,用來唯一的標識用戶。-->
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />                  <!--如果是安卓8.0,應(yīng)用編譯配置的targetSdkVersion>=26,請務(wù)必添加權(quán)限 -->
    
        <!-- QQ權(quán)限 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!-- SDK2.1新增獲取用戶位置信息 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
        <!-- 微博權(quán)限 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 用于調(diào)用 JNI -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        
        <!-- 微信權(quán)限 其中網(wǎng)絡(luò)權(quán)限如果沒有使用掃碼登錄功能非必要;后三個權(quán)限,如果沒有使用mta,也非必要,即使有使用mta,去掉也不影響功能 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        
        <!-- 銀聯(lián) -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.NFC" />
        <uses-permission android:name="org.simalliance.openmobileapi.SMARTCARD" />
        <uses-feature android:name="android.hardware.nfc.hce" />
        
        <!-- 支付寶 -->
        <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" />
        
        <!-- OPPO -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.USE_CREDENTIALS" />
        <uses-permission android:name="android.permission.SEND_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
        <uses-permission android:name="android.permission.WRITE_SMS" />
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
    
        <application>
            <!-- 華為 -->
            <!-- value的值“xxx”用實際申請的應(yīng)用ID替換,來源于開發(fā)者聯(lián)盟網(wǎng)站應(yīng)用的服務(wù)詳情。-->
            <!-- replace 用于避免其他庫引用華為sdk時設(shè)置 appId 沖突 -->
            <meta-data
                tools:replace="android:value"
                android:name="com.huawei.hms.client.appid"
                android:value="appid=xxx">
            </meta-data>
            <!-- 在application節(jié)點下增加provider,UpdateProvider用于HMS-SDK引導(dǎo)升級HMS,提供給系統(tǒng)安裝器讀取升級文件。UpdateSdkFileProvider用于應(yīng)用自升級。-->
            <!--“xxx.xxx.xxx”用實際的應(yīng)用包名替換-->
            <provider
                android:name="com.huawei.hms.update.provider.UpdateProvider"
                android:authorities="xxx.xxx.xxx.hms.update.provider"
                android:exported="false"
                android:grantUriPermissions="true" >
            </provider>
            <!-- 如果應(yīng)用使用了HMSAgent.checkUpdate(Activity activity,CheckUpdateHandler callback)接口,則必須配置UpdateSdkFileProvider -->
            <!--“xxx.xxx.xxx”用實際的應(yīng)用包名替換-->
            <provider
                android:name="com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider"
                android:authorities="xxx.xxx.xxx.updateSdk.fileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
            </provider>
        
        
            <!-- QQ -->
            <!-- xxxxxx 用注冊的appId替換 -->
            <activity
                android:name="com.tencent.tauth.AuthActivity"
                android:launchMode="singleTask"
                android:noHistory="true">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data android:scheme="tencentxxxxxx" />
                </intent-filter>
            </activity>
        
        
            <!-- 微信 分享登錄實現(xiàn) WXEntryActivity 繼承自 AuthActivity, 支付實現(xiàn) WXPayEntryActivity 繼承自 AuthActivity -->
            <activity
                android:name=".wxapi.WXEntryActivity"
                android:exported="true"
                android:label="@string/app_name"
                android:launchMode="singleTask"
                android:taskAffinity="net.sourceforge.simcpux"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />
            <activity
                android:name=".wxapi.WXPayEntryActivity"
                android:exported="true"
                android:launchMode="singleTask"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />
            
            
            <!-- 支付寶簽約 支付寶免密支付完成時走此filter,必須匹配scheme -->
            <activity
                android:name="com.enowr.auth.AliRouseActivity"
                android:allowTaskReparenting="true">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                    <data android:scheme="xxx" />
                </intent-filter>
            </activity>
            
            <!-- OPPO -->
            <meta-data
                android:name="debug_mode"
                android:value="false" />                        <!-- 日志開關(guān),發(fā)布時候設(shè)置為false -->
            <meta-data
                android:name="app_key"
                android:value="c5217trjnrmU6gO5jG8VvUFU0" />    <!-- appKey -->
            </application>
    </manifest>
    
  4. 混淆

    # Auth
    -keep class com.enowr.** {*;}
    
    
    # 華為
    -ignorewarning
    -keepattributes *Annotation*
    -keepattributes Exceptions
    -keepattributes InnerClasses
    -keepattributes Signature
    -keepattributes SourceFile,LineNumberTable
    -keep class com.hianalytics.android.**{*;}
    -keep class com.huawei.updatesdk.**{*;}
    -keep class com.huawei.hms.**{*;}        
    -keep class com.huawei.android.hms.agent.**{*;}
    
    
    # QQ
    -keep class com.tencent.open.TDialog$*
    -keep class com.tencent.open.TDialog$* {*;}
    -keep class com.tencent.open.PKDialog
    -keep class com.tencent.open.PKDialog {*;}
    -keep class com.tencent.open.PKDialog$*
    -keep class com.tencent.open.PKDialog$* {*;}
    
    
    # 微博
    -keep class com.sina.weibo.sdk.** {*;}
    
    
    # 微信
    -keep class com.tencent.mm.opensdk.** {*;}
    -keep class com.tencent.wxop.** {*;}
    -keep class com.tencent.mm.sdk.** {*;}
    
    
    # 銀聯(lián)
    -keep  public class com.unionpay.uppay.net.HttpConnection {public <methods>;}
    -keep  public class com.unionpay.uppay.net.HttpParameters {public <methods>;}
    -keep  public class com.unionpay.uppay.model.BankCardInfo {public <methods>;}
    -keep  public class com.unionpay.uppay.model.PAAInfo {public <methods>;}
    -keep  public class com.unionpay.uppay.model.ResponseInfo {public <methods>;}
    -keep  public class com.unionpay.uppay.model.PurchaseInfo {public <methods>;}
    -keep  public class com.unionpay.uppay.util.DeviceInfo {public <methods>;}
    -keep  public class com.unionpay.uppay.util.PayEngine {
        public <methods>;
        native <methods>;
    }
    -keep  public class com.unionpay.utils.UPUtils {native <methods>;}
    
    
    # 支付寶
    -keep class com.alipay.android.app.IAlixPay{*;}
    -keep class com.alipay.android.app.IAlixPay$Stub{*;}
    -keep class com.alipay.android.app.IRemoteServiceCallback{*;}
    -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
    -keep class com.alipay.sdk.app.PayTask{ public *;}
    -keep class com.alipay.sdk.app.AuthTask{ public *;}
    -keep class com.alipay.sdk.app.H5PayCallback {
        <fields>;
        <methods>;
    }
    -keep class com.alipay.android.phone.mrpc.core.** { *; }
    -keep class com.alipay.apmobilesecuritysdk.** { *; }
    -keep class com.alipay.mobile.framework.service.annotation.** { *; }
    -keep class com.alipay.mobilesecuritysdk.face.** { *; }
    -keep class com.alipay.tscenter.biz.rpc.** { *; }
    -keep class org.json.alipay.** { *; }
    -keep class com.alipay.tscenter.** { *; }
    -keep class com.ta.utdid2.** { *;}
    -keep class com.ut.device.** { *;}
    # SDK 包可能不包含 utdid
    -dontwarn com.ta.utdid2.**
    -dontwarn com.ut.device.**
    # SDK 包可能不包含 securitysdk
    -dontwarn com.alipay.mobilesecuritysdk.**
    
    # OPPO
    -keep class com.nearme.** {*;}
    
  5. 初始化

     Auth.init()
            .setHWAppID("")
            .setHWKey("")
            .setHWMerchantID("")
            .setQQAppID("")
            .setWXAppID("")
            .setWXSecret("")
            .setWBAppKey("")
            .setWBRedirectUrl("")
            .setWBScope("")
            .setOPPOAppSecret("secret")
            .build();
    
    // 如果使用華為支付功能, 還需要在 MainActivity 里初始化華為
    Auth.withHW(context).initHW(activity);
    
    // OPPO 要求使用OPPO 自帶的退出功能
    Auth.withOPPO(context).exit(activity);
    
    // 使用微信相關(guān)功能
    // 包名相應(yīng)目錄下新建一個wxapi目錄,并在該wxapi目錄下新增兩個WXPayEntryActivity、WXEntryActivity類,繼承自AuthActivity
    

使用

    public void hwLogin() {
        Auth.withHW(this)
                .loginForceLogin(false)  // 當force為false時,錯誤碼為2001、2002時,會再次以參數(shù)為ture嘗試調(diào)用一次
                .login(mCallback);
    }

    public void hwPay() {
        Auth.withHW(this)
                .payAmount("")
                .payApplicationId("")
                .payChannel(1)
                .payCountry("")
                .payCurrency("")
                .payExtReserved("")
                .payMerchantId("")
                .payMerchantName("")
                .payProductDesc("")
                .payProductName("")
                .payPublicKey("")
                .payRequestId("")
                .payServiceCatalog("")
                .paySign("")
                .payUrl("")
                .payVersion("")
                .pay(mCallback);
    }

    public void hwRouse() {
        Auth.withHW(this)
                .rouseAmount("")
                .rouseApplicationId("")
                .rouseChannel(1)
                .rouseCountry("")
                .rouseCurrency("")
                .rouseExtReserved("")
                .rouseMerchantId("")
                .rouseMerchantName("")
                .rouseProductDesc("")
                .rouseProductName("")
                .rousePublicKey("")
                .rouseRequestId("")
                .rouseServiceCatalog("")
                .rouseSign("")
                .rouseUrl("")
                .rouseVersion("")
                .rouseTradeType("")
                .rouse(mCallback);
    }
    
    public void oppoPay() {
        Auth.withOPPO(this)
                .payAmount(1)
                .payAttach("attach")
                .payOrderId(String.valueOf(System.currentTimeMillis()))
                .payProductName("test")
                .payProductDesc("test")
                .payCallbackUrl("")
                .payUseCachedChannel(false)
                .pay(mCallback);
    }

    public void qqLogin() {
        Auth.withQQ(this)
                .loginQrcode(true)
                .login(mCallback);
    }

    public void qqShareText() {
        Auth.withQQ(this)
                .shareTextArk("")
                .shareTextImage("")
                .shareTextName("")
                .shareTextQzoneHide(true)
                .shareTextSummary("")
                .shareTextTargetUrl("")
                .shareTextTitle("")
                .shareText(mCallback);
    }

    public void qqShareImage() {
        Auth.withQQ(this)
                .shareImageArk("")
                .shareImagePath("")
                .shareImageName("")
                .shareImageQzoneHide(true)
                .shareImage(mCallback);
    }

    public void qqShareMusic() {
        Auth.withQQ(this)
                .shareMusicImageUrl("")
                .shareMusicSummary("")
                .shareMusicArk("")
                .shareMusicName("")
                .shareMusicQzoneHide(true)
                .shareMusicTargetUrl("")
                .shareMusicTitle("")
                .shareMusicUrl("")
                .shareMusic(mCallback);
    }

    public void qqShareVideo() {
        Auth.withQQ(this)
                .shareVideoPath("")
                .shareVideoBack("")
                .shareVideoImageList(null)
                .shareVideoScene("")
                .shareVideoSummary("")
                .shareVideo(mCallback);
    }

    public void qqShareApp() {
        Auth.withQQ(this)
                .shareAppName("")
                .shareAppImageUrl("")
                .shareAppSummary("")
                .shareAppTitle("")
                .shareAppArk("")
                .shareAppQzoneHide(true)
                .shareApp(mCallback);
    }

    public void qqShareQzone() {
        Auth.withQQ(this)
                .shareToQzoneImageList(null)
                .shareToQzoneSummary("")
                .shareToQzoneTargetUrl("")
                .shareToQzoneTitle("")
                .shareToQzone(mCallback);
    }

    public void qqShareMood() {
        Auth.withQQ(this)
                .shareToMoodBack("")
                .shareToMoodImageList(null)
                .shareToMoodScene("")
                .shareToMoodSummary("")
                .shareToMoodVideoPath("")
                .shareToMood(mCallback);
    }

    public void wbLogin() {
        Auth.withWB(this)
                .login(mCallback);
    }

    public void wbShareText() {
        Auth.withWB(this)
                .shareTextContent("")
                .shareTextSummary("")
                .shareTextTitle("")
                .shareTextUrl("")
                .shareText(mCallback);
    }

    public void wbShareImage() {
        Auth.withWB(this)
                .shareImageBitmap(null)
                .shareImageContent("")
                .shareImage(mCallback);
    }

    public void wbShareMultiImage() {
        Auth.withWB(this)
                .shareMultiImageContent("")
                .shareMultiImageUriList(null)
                .shareMultiImage(mCallback);
    }

    public void wbShareLink() {
        Auth.withWB(this)
                .shareLinkContent("")
                .shareLinkSummary("")
                .shareLinkThumbImage(null)
                .shareLinkTitle("")
                .shareLinkUrl("")
                .shareLink(mCallback);
    }

    public void wbShareVideo() {
        Auth.withWB(this)
                .shareVideoPath("")
                .shareVideoContent("")
                .shareVideoSummary("")
                .shareVideoTitle("")
                .shareVideo(mCallback);
    }

    public void wbShareToStory() {
        Auth.withWB(this)
                .shareToStoryImagePath("")
                .shareToStoryVideoPath("")
                .shareToStory(mCallback);
    }

    public void wxLogin() {
        Auth.withWX(this)
                .login(mCallback);
    }

    public void wxPay() {
        Auth.withWX(this)
                .payNonceStr("")
                .payPackageValue("")
                .payPartnerId("")
                .payPrepayId("")
                .paySign("")
                .payTimestamp("")
                .pay(mCallback);
    }

    public void wxRouse() {
        Auth.withWX(this)
                .rouseUrl("")
                .rouse(mCallback);
    }

    public void wxShareText() {
        Auth.withWX(this)
                .shareTextSummary("")
                .shareTextContent("")
                .shareTextThumbData(null)
                .shareTextTitle("")
                .shareText(mCallback);
    }

    public void wxShareImage() {
        Auth.withWX(this)
                .shareImageBitmap(null)
                .shareImageSummary("")
                .shareImageThumbData(null)
                .shareImageTitle("")
                .shareImage(mCallback);
    }

    public void wxShareLink() {
        Auth.withWX(this)
                .shareLinkThumbData(null)
                .shareLinkSummary("")
                .shareLinkTitle("")
                .shareLinkUrl("")
                .shareLink(mCallback);
    }

    public void wxShareVideo() {
        Auth.withWX(this)
                .shareVideoThumbData(null)
                .shareVideoSummary("")
                .shareVideoLowBandUrl("")
                .shareVideoTitle("")
                .shareVideoUrl("")
                .shareVideo(mCallback);
    }

    public void wxShareMusic() {
        Auth.withWX(this)
                .shareMusicThumbData(null)
                .shareMusicSummary("")
                .shareMusicDataUrl("")
                .shareMusicLowBandDataUrl("")
                .shareMusicLowBandUrl("")
                .shareMusicTitle("")
                .shareMusicUrl("")
                .shareMusic(mCallback);
    }

    public void wxShareApp() {
        Auth.withWX(this)
                .shareAppId("")
                .shareAppPath("")
                .shareAppSummary("")
                .shareAppThumbData(null)
                .shareAppTitle("")
                .shareAppType(1)
                .shareAppUrl("")
                .shareAppWithShareTicket(true)
                .shareApp(mCallback);
    }

    public void ylPay() {
        Auth.withYL(this)
                .payOrderInfo("")
                .payIsTest(true)
                .pay(mCallback);
    }

    public void zfbPay() {
        Auth.withZFB(this)
                .payOrderInfo("")
                .payIsShowLoading(true)
                .pay(mCallback);
    }


    public void zfbRouse() {
        Auth.withZFB(this)
                .rouseUrl("")
                .rouse(mCallback);
    }

返回碼

  1. 華為

  2. QQ

    110201:未登陸
    110405:登錄請求被限制
    110404:請求參數(shù)缺少appid
    110401:請求的應(yīng)用不存在
    110407:應(yīng)用已經(jīng)下架
    110406:應(yīng)用沒有通過審核
    100044:錯誤的sign
    110500:獲取用戶授權(quán)信息失敗
    110501:獲取應(yīng)用的授權(quán)信息失敗
    110502:設(shè)置用戶授權(quán)失敗
    110503:獲取token失敗
    110504:系統(tǒng)內(nèi)部錯誤
    
  3. 微博

    C8998: 簽名不一致
    8000: 沒有安裝客戶端
    8001: 非官方客戶端
    
  4. 微信

  5. 支付寶

  6. OPPO 為離線文檔

說明

  1. 華為:Mac 下集成Agent執(zhí)行腳本文件沒反應(yīng)。

    GetHMSAgent_cn.sh 換行符的原因?qū)е略趍acos下執(zhí)行無反映,可通過下列命令替換下?lián)Q行符:
    cat GetHMSAgent_cn.sh | tr "^M" "\n" > GetHMSAgent_cn_new.sh

  2. 華為:同時引入其他第三方華為支持時(如極光的華為推送插件)

    禁用華為依賴傳遞,由于極光插件全量引入了華為SDK,所以全部禁用所有依賴
    implementation ('com.enowr.android:AuthHW:0.0.3'){transitive false}
    引入極光的華為插件,配置相關(guān)配置即可
    implementation 'cn.jiguang.sdk.plugin:huawei:3.3.2'

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容