Android Studio Mob第三方登錄分享(圖文教程)

前言:
現(xiàn)在國內(nèi)大部分APP應(yīng)用都集成了第三方登錄和社會化分享,主要都是為了方便用戶使用軟件的同時又宣傳推廣應(yīng)用。而市面上大多數(shù)的主流的軟件都開放了第三方登錄和社會化分享,假如每一個平臺都一個一個地去集成,可能就太消耗時間和加大了工作量,好在這種登錄和分享功能已經(jīng)有第三方平臺幫我們做好了,我們直接調(diào)用其SDK即可。國內(nèi)用的比較多的就是Mob和友盟,這里我們以mob為例。

首先官網(wǎng)地址是:http://www.mob.com/
當然只有注冊了用戶,才可以創(chuàng)建應(yīng)用,使用第Mob平臺提供的第三方登錄和社會化分享工具。好了不廢話,進入正題。

第一步登錄官網(wǎng)首頁
點擊右側(cè)頭像欄那里,選擇進入后臺,選擇ShareSDK,立即使用并創(chuàng)建名為MobShareSDKDemo的Android應(yīng)用。
獲取創(chuàng)建應(yīng)用成功后的APP Key和 APP Secret。

點擊下方鏈接下載SDK。
http://www.mob.com/#/downloadDetail/ShareSDK/android
這里我們以QQ,微信,新浪微博為例,僅需要下載相對應(yīng)的集成文檔即可。
下載完成后是一個壓縮包,解壓之后有兩個文件夾,一個是ShareSDK for Android ApiDoc,顧名思義就是一個api文檔。另外一個是ShareSDK for Android,這里我們打開這個文件夾,這里面包含分享的源碼和所需要的資源文件和jar包。如下圖:

第二步去各大社交平臺繼續(xù)注冊應(yīng)用
這里我們以QQ,微信,微博為例,所以需要到相應(yīng)的開發(fā)平臺進行注冊,跟Mob平臺同一個道理,只有注冊完之后才能進行py交易,歐不,是進行第三方平臺登錄和社會化分享。

1.騰訊開放平臺
申請地址: http://open.qq.com/
如果沒有在騰訊開放平臺注冊過開發(fā)者信息,需要先注冊完后,待開發(fā)者信息審核通過,我們實際項目應(yīng)用才能上線。否則會受到騰訊平臺的限制。以下微信,微博同理。

來到開放平臺首頁,找到“應(yīng)用接入”--->"創(chuàng)建移動應(yīng)用"--->“移動應(yīng)用 安卓”--->創(chuàng)建應(yīng)用后“完善信息”--->保存騰訊開放平臺提供給我們的APP ID和APP KEY


應(yīng)用信息填寫完整,這里我們僅僅是演示demo,把有的信息填上去即可,沒有的不填也沒有關(guān)系,最后保存應(yīng)用信息。然后點擊“管理中心”來到管理中心頁面,找到未上線的項目MobShareSDKDemo,點進去,進入我們Demo的詳情頁。由于這里我們需要做到QQ登錄,所以我們需要在基礎(chǔ)服務(wù)那一欄里找到“QQ登錄”,添加應(yīng)用調(diào)試者信息。其實說白了就是添加幾個qq號碼,在調(diào)試的時候可以使用。


2.微信開放平臺
申請地址: https://open.weixin.qq.com/
來到微信開放平臺首頁,在標題欄找到“管理中心”--->"創(chuàng)建移動應(yīng)用"--->“填寫基本信息”--->“填寫平臺信息”

這里需要注意的是應(yīng)用簽名這一欄,在實際項目開發(fā)過程中,應(yīng)用簽名需要先使用簽名文件生成apk包安裝到手機上,再根據(jù)簽名生成工具獲得應(yīng)用簽名。

studio如何生成簽名文件,可以戳下面這個鏈接:
Android Studio生成簽名工具,自動簽名,以及生成SHA1和MD5的值

下載簽名生成工具請戳下面這個鏈接:
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
最后得到的應(yīng)用簽名如下,填寫完信息,微信需要審核,審核時間為7天左右,但實際審核一般幾天就能通過,不過在實際開發(fā)過程中,最好還是提前申請注冊應(yīng)用信息。

3.新浪微博開放平臺
申請地址:http://open.weibo.com/
來到新浪微博開放平臺首頁,在找到“移動應(yīng)用”--->"立即接入"--->“創(chuàng)建新應(yīng)用”--->填寫完應(yīng)用名稱,選擇Android平臺即可
在應(yīng)用信息中“基本信息”可以找到我們需要接下來填入到ShareSDK.xml中的App Key、App Secret

這里需要注意的是我們需要在“高級信息”中填寫OAuth2.0 授權(quán)設(shè)置回調(diào)地址。否則會報一個redirect_uri_mismatch的錯誤信息


同時要注意的是我們需要在“基本信息”中編輯應(yīng)用基本信息。我們可以填3套對應(yīng)包名簽名應(yīng)用信息。這里,包名都一樣(com.donkor.demo.mobsharesdk),我們填寫兩套Android簽名即可,一個根據(jù)debug.apk安裝上去根據(jù)包名獲取。一個根據(jù)對應(yīng)的簽名文件安裝到手機上的release.apk獲得。第一個是方便我們在調(diào)試的過程中測試,第二個則是方便我們項目上線時使用。新浪微博要求的其他應(yīng)用基本信息必須填寫的,根據(jù)要求把他填寫完整,保存即可。

應(yīng)用信息沒有提交審核。想要測試的話,還需要添加測試賬號信息。否則會報一個號碼403的 applications over the unaudited use restrictions!錯誤。

文件不存在(C8998)的錯誤,同樣經(jīng)常出現(xiàn)。原因可能是臺上的包名和簽名與應(yīng)用的不相同,或者是OAuth2.0授權(quán)設(shè)置中設(shè)置你的回調(diào)地址與應(yīng)用內(nèi)調(diào)用的不同。

第三步配置信息與使用
1.打開studio新建MobShareSDKDemo的項目
2.依賴所需要的jar包和新建一個assets文件夾放入ShareSDK.xml
3.將上面下載下來,解壓出來的SDK中ShareSDK for Android\Libs\OneKeyShare\src目錄下的源碼直接拷貝到項目中


4.這里由于使用到了微信,所以需要新建wxapi目錄再放置WXEntryActivity(這里的目錄名和類名必須遵從微信的要求)

WXEntryActivity.java的代碼如下:

/*
 * 官網(wǎng)地站:http://www.mob.com
 * 技術(shù)支持QQ: 4006852216
 * 官方微信:ShareSDK   (如果發(fā)布新版本的話,我們將會第一時間通過微信將版本更新內(nèi)容推送給您。如果使用過程中有任何問題,也可以通過微信與我們?nèi)〉寐?lián)系,我們將會在24小時內(nèi)給予回復(fù))
 *
 * Copyright (c) 2013年 mob.com. All rights reserved.
 */

package com.donkor.demo.mobsharesdk.wxapi;

import android.content.Intent;
import android.widget.Toast;
import cn.sharesdk.wechat.utils.WXAppExtendObject;
import cn.sharesdk.wechat.utils.WXMediaMessage;
import cn.sharesdk.wechat.utils.WechatHandlerActivity;

/** 微信客戶端回調(diào)activity示例 */
public class WXEntryActivity extends WechatHandlerActivity {

    /**
     * 處理微信發(fā)出的向第三方應(yīng)用請求app message
     * <p>
     * 在微信客戶端中的聊天頁面有“添加工具”,可以將本應(yīng)用的圖標添加到其中
     * 此后點擊圖標,下面的代碼會被執(zhí)行。Demo僅僅只是打開自己而已,但你可
     * 做點其他的事情,包括根本不打開任何頁面
     */
    public void onGetMessageFromWXReq(WXMediaMessage msg) {
        if (msg != null) {
            Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
            startActivity(iLaunchMyself);
        }
    }

    /**
     * 處理微信向第三方應(yīng)用發(fā)起的消息
     * <p>
     * 此處用來接收從微信發(fā)送過來的消息,比方說本demo在wechatpage里面分享
     * 應(yīng)用時可以不分享應(yīng)用文件,而分享一段應(yīng)用的自定義信息。接受方的微信
     * 客戶端會通過這個方法,將這個信息發(fā)送回接收方手機上的本demo中,當作
     * 回調(diào)。
     * <p>
     * 本Demo只是將信息展示出來,但你可做點其他的事情,而不僅僅只是Toast
     */
    public void onShowMessageFromWXReq(WXMediaMessage msg) {
        if (msg != null && msg.mediaObject != null
                && (msg.mediaObject instanceof WXAppExtendObject)) {
            WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;
            Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
        }
    }

}

5.配置相應(yīng)的權(quán)限和注冊所需要的Activity

<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_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.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- 藍牙分享所需的權(quán)限,不需要用到的話可以省略 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<activity
    android:name="com.mob.tools.MobUIShell"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateHidden|adjustResize" >

<intent-filter>
     <!-- ※這里需要將1105785901改成你在騰訊申請后得到的AppId-->
    <data android:scheme="tencent1105785901" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

<!-- 調(diào)用新浪原生SDK,需要注冊的回調(diào)activity -->
    <intent-filter>
       <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

<!--微信分享回調(diào) -->
<activity
    android:name=".wxapi.WXEntryActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:exported="true"
    android:screenOrientation="portrait" />

6.修改ShareSDK.xml文件
這里我們以新浪微博,QQ為例。微信因為沒有審核通過,所以沒辦法驗證。想驗證的話,需要在微信平臺填寫完清晰,完整的信息,提交審核通過之后即可,修改的過程同下。

 <!-- 修改成你在sharesdk后臺注冊的應(yīng)用的appkey"-->
<ShareSDK
    AppKey = "1985fae01629d"/>

<SinaWeibo
    Id="2"
    SortId="2"
    AppKey="2022241043"
    AppSecret="6e22ea802d34e493d6663294bd7597a0 "
    RedirectUrl="http://blog.csdn.net/donkor_"
    ShareByAppClient="true"
    Enable="true" />
<QQ
    Id="7"
    SortId="7"
    AppId="1105785901"
    AppKey="k2sXKmeDIqrjpLO4"
    BypassApproval="true"
    ShareByAppClient="true"
    Enable="true"/>

7.添加分享代碼

ShareSDK.initSDK(MainActivity.this);
OnekeyShare oks = new OnekeyShare();
// 關(guān)閉sso授權(quán)
oks.disableSSOWhenAuthorize();
// 分享時Notification的圖標和文字 2.5.9以后的版本不調(diào)用此方法
// oks.setNotification(R.drawable.ic_launcher,
// getString(R.string.app_name));
// title標題,印象筆記、郵箱、信息、微信、人人網(wǎng)和QQ空間使用
oks.setTitle("分享標題");
// titleUrl是標題的網(wǎng)絡(luò)鏈接,僅在人人網(wǎng)和QQ空間使用
oks.setTitleUrl("http://blog.csdn.net/donkor_");
// text是分享文本,所有平臺都需要這個字段
oks.setText("分享文本內(nèi)容");
// imagePath是圖片的本地路徑,Linked-In以外的平臺都支持此參數(shù)
// oks.setImagePath("/sdcard/test.jpg");//
// 確保SDcard下面存在此張圖片
oks.setImageUrl("http://img.blog.csdn.net/20161115193036196");
// url僅在微信(包括好友和朋友圈)中使用
oks.setUrl("http://blog.csdn.net/donkor_");
// comment是我對這條分享的評論,僅在人人網(wǎng)和QQ空間使用
//oks.setComment("");
// site是分享此內(nèi)容的網(wǎng)站名稱,僅在QQ空間使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此內(nèi)容的網(wǎng)站地址,僅在QQ空間使用
//oks.setSiteUrl(getString(R.string.settingShareSiteUrl));
// 啟動分享GUI
oks.show(MainActivity.this);

8.添加第三方登錄代碼

//初始化
ShareSDK.initSDK(this);
//執(zhí)行授權(quán),獲取用戶信息
private void authorize(Platform plat) {
    if (plat.isValid()) {
        String userId = plat.getDb().getUserId();
        if (!TextUtils.isEmpty(userId)) {
            UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
            login(plat.getName(), userId, null);
            return;
        }
    }
    plat.setPlatformActionListener(MainActivity.this);
    //true不使用SSO授權(quán),false使用SSO授權(quán)
    plat.SSOSetting(false);
    plat.showUser(null);
}
//發(fā)送登陸信息
private void login(String plat, String userId, HashMap<String, Object> userInfo) {
    Message msg = new Message();
    msg.what = MSG_LOGIN;
    msg.obj = plat;
    UIHandler.sendMessage(msg, this);
}

UIHandler需要實現(xiàn)接口,并實現(xiàn)其中的方法

@Override
public boolean handleMessage(Message msg) {
    switch (msg.what) {
        case MSG_USERID_FOUND: {
            Toast.makeText(this, R.string.userid_found, Toast.LENGTH_SHORT).show();
        }
        break;
        case MSG_LOGIN: {
            String text = getString(R.string.logining, msg.obj);
            Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
        }
        break;
        case MSG_AUTH_CANCEL: {
            Toast.makeText(this, R.string.auth_cancel, Toast.LENGTH_SHORT).show();
        }
        break;
        case MSG_AUTH_ERROR: {
            Toast.makeText(this, R.string.auth_error, Toast.LENGTH_SHORT).show();
        }
        break;
        case MSG_AUTH_COMPLETE: {
            Toast.makeText(this, R.string.auth_complete, Toast.LENGTH_SHORT).show();
        }
        break;
    }
    return false;
}

plat.setPlatformActionListener(MainActivity.this)設(shè)置監(jiān)聽,需要實現(xiàn)它的三個方法:

  • onCancel 取消
  • onComplete 完成
  • onError 異常
@Override
public void onComplete(Platform platform, int action, HashMap<String, Object> res) {
    if (action == Platform.ACTION_USER_INFOR) {
        //登錄成功,獲取需要的信息
        UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE, this);
        login(platform.getName(), platform.getDb().getUserId(), res);
        Log.e("asd", "platform.getName():" + platform.getName());
        Log.e("asd", "platform.getDb().getUserId()" + platform.getDb().getUserId());
        String openid = platform.getDb().getUserId() + "";
        String gender = platform.getDb().getUserGender();
        String head_url = platform.getDb().getUserIcon();
        String nickname = platform.getDb().getUserName();

        Log.e("asd", "openid:" + openid);
        Log.e("asd", "gender:" + gender);
        Log.e("asd", "head_url:" + head_url);
        Log.e("asd", "nickname:" + nickname);
    }
}

@Override
public void onError(Platform platform,int action,Throwable t){
    if(action==Platform.ACTION_USER_INFOR){
        UIHandler.sendEmptyMessage(MSG_AUTH_ERROR,this);
    }
    t.printStackTrace();
}

@Override
public void onCancel(Platform platform, int action) {
    if (action == Platform.ACTION_USER_INFOR) {
        UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this);
    }
}

清除第三方登錄,分享的信息與緩存

Platform qq = ShareSDK.getPlatform(MainActivity.this, QQ.NAME);
Platform wechat = ShareSDK.getPlatform(MainActivity.this, Wechat.NAME);
Platform weibo = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME);
if (qq.isValid()) {
    qq.removeAccount();
}
if (wechat.isValid()) {
    wechat.removeAccount();
}
if (weibo.isValid()) {
    weibo.removeAccount();
}

string.xml

<string name="userid_found">用戶信息已存在,正在跳轉(zhuǎn)登錄操作…</string>
<string name="logining">使用%s帳號登錄中…</string>
<string name="auth_cancel">授權(quán)操作已取消</string>
<string name="auth_error">授權(quán)操作遇到錯誤,請閱讀Logcat輸出</string>
<string name="auth_complete">授權(quán)成功,正在跳轉(zhuǎn)登錄操作…</string>

布局activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="50dp"
        android:orientation="horizontal">

        <View
            android:layout_width="0dp"
            android:layout_height="0.3dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1"
            android:background="@android:color/black" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="30dp"
            android:layout_marginRight="30dp"
            android:text="第三方賬號登錄"
            android:textSize="14sp" />

        <View
            android:layout_width="0dp"
            android:layout_height="0.3dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1"
            android:background="@android:color/black" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/ivQQ"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/img_qq" />

        <ImageView
            android:id="@+id/ivWeChat"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/img_wechat" />

        <ImageView
            android:id="@+id/ivSinaWeibo"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/img_weibo" />

    </LinearLayout>


    <Button
        android:id="@+id/btnRemoveMsg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="退出第三方登錄數(shù)據(jù)信息"
        android:layout_margin="30dp"
        />

    <Button
        android:id="@+id/btnShare"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="社會化分享"
        android:layout_margin="30dp"
        />
</LinearLayout>

視頻演示效果:
視頻鏈接地址

下載地址 : http://download.csdn.net/detail/donkor_/9700844

關(guān)于我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

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