Android 三方使用之微信登錄,微信分享,微信分享圖片,支付

近年來三方導(dǎo)流,方便用戶使用App,以及方便App數(shù)據(jù)分享越來越多的App支持了三方登錄以及三方分享網(wǎng)頁和圖片.在此,整理了一系列三方庫(kù)的集成方法以及集成中遇到的問題


微信三方

一,微信配置

1:說明文檔

   文檔 :  https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html

2.資源引用

  implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'

3.微信AndroidManifest.xml配置

 <activity
        android:name=".wxapi.WXEntryActivity"
        android:exported="true"
        android:launchMode="singleTop"
        android:taskAffinity="com.mango.voaenglish"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />

    <activity
        android:name=".wxapi.WXPayEntryActivity"
        android:exported="true"
        android:launchMode="singleTop"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />

注意!!!

A:WXEntryActivity,WXPayEntryActivity所處的包名必須在

image.png

B:微信的回掉現(xiàn)在不區(qū)分成功和取消(微信SDK的問題)

C:新版本微信可能沒有province或者country 請(qǐng)仔細(xì)查閱文檔做適配

二,微信三方使用

1:微信登錄

1.第一步

  //登錄微信
fun loginWechat(mContext: Context) {
    if (isWXAppInstalledAndSupported(mContext)) {
        Thread {
            val req = SendAuth.Req()
            req.scope = "snsapi_userinfo"
            req.state = ""
            val iwxapi = WXAPIFactory.createWXAPI(mContext, APP_WECHAT_KEY, true)
            iwxapi.registerApp(APP_WECHAT_KEY)
            iwxapi.sendReq(req)
        }.start()
    } else {
    }
}

2.回調(diào)獲取數(shù)據(jù)

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

private IWXAPI api;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    api = WXAPIFactory.createWXAPI(this, Constant.INSTANCE.getAPP_WECHAT_KEY(), false);
    api.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    api.handleIntent(intent, this);
}

@Override
public void onReq(BaseReq baseReq) {
}


private SendAuth.Resp resp;

@Override
public void onResp(BaseResp baseResp) {

    //微信登錄為getType為1董朝,分享為0
    if (baseResp.getType() == 1) {
        //登錄回調(diào)
        resp = (SendAuth.Resp) baseResp;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                String code = String.valueOf(resp.code);
                //獲取用戶信息
                ThirdUtil.INSTANCE.getAccessToken(code);
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED://用戶拒絕授權(quán)
                showMessage("用戶拒絕授權(quán)");
                this.finish();
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://用戶取消
                showMessage( "用戶取消綁定");
                this.finish();
                break;
            default:
                this.finish();
                break;
        }
    }else if (baseResp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
        String result = "";
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                result = "支付成功";

                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "支付取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "支付失敗";
                break;
            default:
                result = "支付失敗";
                break;
        }
        showMessage( result);
        this.finish();

    }else {
        String result = "";
        switch (baseResp.errCode) {
            //現(xiàn)階段 取消分享以及分享成功默認(rèn)返回的都是分享成功 邏輯需求請(qǐng)注意
            case BaseResp.ErrCode.ERR_OK:
                result = "分享成功";
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "分享取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "分享失敗";
                break;
            default:
                result = "分享失敗";
                break;
        }
        showMessage(result);
        this.finish();
    }


}

private  void showMessage(String message){
    Toast.makeText(this,message,Toast.LENGTH_LONG).show();
}
}
獲取數(shù)據(jù)
//獲取用戶token
fun getAccessToken(code: String) {
    val getTokenUrl = String.format(
        "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                "appid=%s&secret=%s&code=%s&grant_type=authorization_code", APP_WECHAT_KEY,
        APP_WECHAT_SERECT, code
    )
    val resultCallback: OkHttpUtils.ResultCallback<String> =
        object : OkHttpUtils.ResultCallback<String>() {
            override fun onSuccess(response: String) {
                var openId: String? = null
                try {
                    val jsonObject = JSONObject(response)
                    access = jsonObject.getString("access_token")
                    openId = jsonObject.getString("openid")
                } catch (e: JSONException) {
                    e.printStackTrace()
                }
                getWechatUserInfo(openId)
            }

            override fun onFailure(e: java.lang.Exception) {
                // todo 異常處理
            }
        }
    OkHttpUtils.get(getTokenUrl, resultCallback)
}
    
 //獲取微信用戶信息
private fun getWechatUserInfo(openId: String?) {

    //獲取個(gè)人信息
    val getUserInfo =
        "https://api.weixin.qq.com/sns/userinfo?access_token=$access&openid=$openId"
    val resultCallback: OkHttpUtils.ResultCallback<WeChatInfo> =
        object : OkHttpUtils.ResultCallback<WeChatInfo>() {
            override fun onSuccess(response: WeChatInfo) {
                response.errCode = response.errCode
                response.accessToken = access
                //獲取到微信用戶信息
                if (response != null) WechatLoginObservable.getInstance().update(response)
            }

            override fun onFailure(e: java.lang.Exception) {
                // todo 異常處理
            }
        }
    OkHttpUtils.get(getUserInfo, resultCallback)
}

2:分享網(wǎng)頁

  //微信分享
fun shareWechat(
    mContext: Context,
    url: String,
    title: String,
    desc: String,
    thumbBmp: Bitmap?
) {
    var webpage = WXWebpageObject()
    val api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY)
    //長(zhǎng)度小于 10240
    webpage.webpageUrl = url
    //分享的內(nèi)容
    var msg = WXMediaMessage(webpage)
    //長(zhǎng)度限制 512
    msg.title = title
    //長(zhǎng)度限制 1024
    msg.description = desc
    //byty[] 限制 65536 預(yù)覽圖
    msg.setThumbImage(thumbBmp)
    val req = SendMessageToWX.Req()
    req.message = msg
    //分享類型
    req.scene = SendMessageToWX.Req.WXSceneSession
    api.sendReq(req) //發(fā)送到微信
}

3.分享圖片

    fun shareWechatImg(mContext: Context, bmp: Bitmap?) {

    val api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY)
    //初始化 WXImageObject 和 WXMediaMessage 對(duì)象
    val imgObj = WXImageObject(bmp)
    val msg = WXMediaMessage()

    msg.mediaObject = imgObj
    val thumbBmp = Bitmap.createScaledBitmap(bmp!!, 120, 120, true)
    bmp.recycle()
    // 限制 65536 預(yù)覽圖
    msg.thumbData = Util.bmpToByteArray(thumbBmp, true)


    //構(gòu)造一個(gè)Req

    //構(gòu)造一個(gè)Req
    val req = SendMessageToWX.Req()
    req.transaction = buildTransaction("img")
    req.message = msg
    req.scene = SendMessageToWX.Req.WXSceneSession

    //調(diào)用api接口,發(fā)送數(shù)據(jù)到微信
    api.sendReq(req)
}

fun buildTransaction(type: String?): String? {
    return if (type == null) System.currentTimeMillis()
        .toString() else type + System.currentTimeMillis()
}

4.微信支付

  //微信支付 數(shù)據(jù)需要后臺(tái)生成預(yù)訂單的時(shí)候返回支付的數(shù)據(jù)(放后臺(tái)做前端不做)
fun payWechat(
    mContext: Context,
    appId: String,
    partnerId: String,
    prepayId: String,
    nonceStr: String,
    timeStamp: String,
    packageValue: String,
    sign: String,
    extData: String
) {
    var api = WXAPIFactory.createWXAPI(mContext, Constant.APP_WECHAT_KEY);
    api.registerApp(Constant.APP_WECHAT_KEY)

    var req = PayReq()
    req.appId = appId
    req.partnerId = partnerId
    req.prepayId = prepayId
    req.nonceStr = nonceStr
    req.timeStamp = timeStamp
    req.packageValue = "Sign=WXPay"
    req.sign = sign
    req.extData = extData
    api.sendReq(req)
}

總結(jié):

三方庫(kù)簡(jiǎn)單的集成以及主要功能實(shí)現(xiàn),以此記錄,歡迎問題探討,來都來了點(diǎn)個(gè)贊再走吧!!!

1.Android 三方使用之QQ登錄,QQ圖片分享,QQ分享網(wǎng)頁

2.源碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伏社,隨后出現(xiàn)的幾起案子唯绍,更是在濱河造成了極大的恐慌毕籽,老刑警劉巖聋涨,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趣钱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡星岗,警方通過查閱死者的電腦和手機(jī)填大,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俏橘,“玉大人允华,你說我怎么就攤上這事×绕” “怎么了靴寂?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)召耘。 經(jīng)常有香客問我百炬,道長(zhǎng),這世上最難降的妖魔是什么污它? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任剖踊,我火速辦了婚禮,結(jié)果婚禮上衫贬,老公的妹妹穿的比我還像新娘德澈。我一直安慰自己,他們只是感情好固惯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布圃验。 她就那樣靜靜地躺著,像睡著了一般缝呕。 火紅的嫁衣襯著肌膚如雪澳窑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天供常,我揣著相機(jī)與錄音摊聋,去河邊找鬼。 笑死栈暇,一個(gè)胖子當(dāng)著我的面吹牛麻裁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播源祈,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼煎源,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了香缺?” 一聲冷哼從身側(cè)響起手销,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎图张,沒想到半個(gè)月后锋拖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诈悍,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年兽埃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侥钳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柄错,死狀恐怖舷夺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情售貌,我是刑警寧澤冕房,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站趁矾,受9級(jí)特大地震影響耙册,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毫捣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一详拙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔓同,春花似錦饶辙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至则北,卻和暖如春矿微,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尚揣。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工涌矢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人快骗。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓娜庇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親方篮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子名秀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容