有關(guān)小程序的JAVA后臺(tái)解密encryptedData獲取openid及用戶信息

先貼上工具類(lèi),可獲取openid及session_key,session_key在解密時(shí)會(huì)用到韧掩,這里還需要用到幾個(gè)jar包

**bouncycastle-jce-jdk13-112.jar**

**xfire-core-1.2.6.jar**

百度搜一下就有

如果使用maven可以采用以下方法引入

<dependency>

? <groupId>bouncycastle</groupId>

? <artifactId>bouncycastle-jce-jdk13</artifactId>

? <version>112</version>

</dependency>

<dependency>

<groupId>org.codehaus.xfire</groupId>

<artifactId>xfire-core</artifactId>

<version>1.2.6</version>

</dependency>


GetOpenid.java獲取信息工具類(lèi)

```

package com.hongbao.utils;

import java.io.UnsupportedEncodingException;

import java.security.AlgorithmParameters;

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.NoSuchProviderException;

import java.security.Security;

import java.security.spec.InvalidParameterSpecException;

import java.util.Arrays;

import javax.crypto.BadPaddingException;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.codehaus.xfire.util.Base64;

import net.sf.json.JSONObject;

/**

*

* @author silen

* 獲取微信信息工具類(lèi)

*/

public class GetOpenid {

String appid = "wxd81c8f4c18******";

String secret = "7bebc83146c9979ce08d22f244******";

//可獲取openid及session_key,其實(shí)這里openid不需要獲取辅愿,encryptedData解密后包含openid

public String get(String js_code) throws Exception {

//官方接口,需要自己提供appid赋焕,secret和js_code

String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+js_code+"&grant_type=authorization_code";

//HttpRequestor是一個(gè)網(wǎng)絡(luò)請(qǐng)求工具類(lèi),貼在了下面

String oppid = new HttpRequestor().doGet(requestUrl);

JSONObject oppidObj = JSONObject.fromObject(oppid);

String openid = (String) oppidObj.get("openid");

String session_key = (String) oppidObj.get("session_key");

return session_key;

}

/**

* 獲取信息

? ? */

? ? public JSONObject getUserInfo(String encryptedData,String sessionkey,String iv){

? ? ? ? // 被加密的數(shù)據(jù)

? ? ? ? byte[] dataByte = Base64.decode(encryptedData);

? ? ? ? // 加密秘鑰

? ? ? ? byte[] keyByte = Base64.decode(sessionkey);

? ? ? ? // 偏移量

? ? ? ? byte[] ivByte = Base64.decode(iv);

? ? ? ? try {

? ? ? ? ? ? ? // 如果密鑰不足16位仰楚,那么就補(bǔ)足.? 這個(gè)if 中的內(nèi)容很重要

? ? ? ? ? ? int base = 16;

? ? ? ? ? ? if (keyByte.length % base != 0) {

? ? ? ? ? ? ? ? int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);

? ? ? ? ? ? ? ? byte[] temp = new byte[groups * base];

? ? ? ? ? ? ? ? Arrays.fill(temp, (byte) 0);

? ? ? ? ? ? ? ? System.arraycopy(keyByte, 0, temp, 0, keyByte.length);

? ? ? ? ? ? ? ? keyByte = temp;

? ? ? ? ? ? }

? ? ? ? ? ? // 初始化

? ? ? ? ? ? Security.addProvider(new BouncyCastleProvider());

? ? ? ? ? ? Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");

? ? ? ? ? ? SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");

? ? ? ? ? ? AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");

? ? ? ? ? ? parameters.init(new IvParameterSpec(ivByte));

? ? ? ? ? ? cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化

? ? ? ? ? ? byte[] resultByte = cipher.doFinal(dataByte);

? ? ? ? ? ? if (null != resultByte && resultByte.length > 0) {

? ? ? ? ? ? ? ? String result = new String(resultByte, "UTF-8");

? ? ? ? ? ? ? ? return JSONObject.fromObject(result);

? ? ? ? ? ? }

? ? ? ? } catch (NoSuchAlgorithmException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (NoSuchPaddingException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (InvalidParameterSpecException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (IllegalBlockSizeException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (BadPaddingException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (UnsupportedEncodingException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (InvalidKeyException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (InvalidAlgorithmParameterException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } catch (NoSuchProviderException e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? return null;

? ? }

}

```

網(wǎng)絡(luò)請(qǐng)求工具類(lèi),在使用官方提供的接口獲取信息的時(shí)候使用隆判,在上面的類(lèi)中已經(jīng)有使用方法,很簡(jiǎn)單

HttpRequestor.java

```

package com.hongbao.utils;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.InetSocketAddress;

import java.net.Proxy;

import java.net.URL;

import java.net.URLConnection;

import java.util.Iterator;

import java.util.Map;

public class HttpRequestor {

? ? private String charset = "utf-8";

? ? ? ? private Integer connectTimeout = null;

? ? ? ? private Integer socketTimeout = null;

? ? ? ? private String proxyHost = null;

? ? ? ? private Integer proxyPort = null;


? ? ? ? /**

? ? ? ? * Do GET request

? ? ? ? * @param url

? ? ? ? * @return

? ? ? ? * @throws Exception

? ? ? ? * @throws IOException

? ? ? ? */

? ? ? ? public String doGet(String url) throws Exception {


? ? ? ? ? ? URL localURL = new URL(url);


? ? ? ? ? ? URLConnection connection = openConnection(localURL);

? ? ? ? ? ? HttpURLConnection httpURLConnection = (HttpURLConnection)connection;


? ? ? ? ? ? httpURLConnection.setRequestProperty("Accept-Charset", charset);

? ? ? ? ? ? httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


? ? ? ? ? ? InputStream inputStream = null;

? ? ? ? ? ? InputStreamReader inputStreamReader = null;

? ? ? ? ? ? BufferedReader reader = null;

? ? ? ? ? ? StringBuffer resultBuffer = new StringBuffer();

? ? ? ? ? ? String tempLine = null;


? ? ? ? ? ? if (httpURLConnection.getResponseCode() >= 300) {

? ? ? ? ? ? ? ? throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());

? ? ? ? ? ? }


? ? ? ? ? ? try {

? ? ? ? ? ? ? ? inputStream = httpURLConnection.getInputStream();

? ? ? ? ? ? ? ? inputStreamReader = new InputStreamReader(inputStream,"UTF-8");

? ? ? ? ? ? ? ? reader = new BufferedReader(inputStreamReader);


? ? ? ? ? ? ? ? while ((tempLine = reader.readLine()) != null) {

? ? ? ? ? ? ? ? ? ? resultBuffer.append(tempLine);

? ? ? ? ? ? ? ? }


? ? ? ? ? ? } finally {


? ? ? ? ? ? ? ? if (reader != null) {

? ? ? ? ? ? ? ? ? ? reader.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if (inputStreamReader != null) {

? ? ? ? ? ? ? ? ? ? inputStreamReader.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if (inputStream != null) {

? ? ? ? ? ? ? ? ? ? inputStream.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? }

? ? ? ? ? ? return resultBuffer.toString();

? ? ? ? }


? ? ? ? /**

? ? ? ? * Do POST request

? ? ? ? * @param url

? ? ? ? * @param parameterMap

? ? ? ? * @return

? ? ? ? * @throws Exception

? ? ? ? */

? ? ? ? public String doPost(String url, Map parameterMap) throws Exception {


? ? ? ? ? ? /* Translate parameter map to parameter date string */

? ? ? ? ? ? StringBuffer parameterBuffer = new StringBuffer();

? ? ? ? ? ? if (parameterMap != null) {

? ? ? ? ? ? ? ? Iterator iterator = parameterMap.keySet().iterator();

? ? ? ? ? ? ? ? String key = null;

? ? ? ? ? ? ? ? String value = null;

? ? ? ? ? ? ? ? while (iterator.hasNext()) {

? ? ? ? ? ? ? ? ? ? key = (String)iterator.next();

? ? ? ? ? ? ? ? ? ? if (parameterMap.get(key) != null) {

? ? ? ? ? ? ? ? ? ? ? ? value = (String)parameterMap.get(key);

? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? value = "";

? ? ? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? ? ? parameterBuffer.append(key).append("=").append(value);

? ? ? ? ? ? ? ? ? ? if (iterator.hasNext()) {

? ? ? ? ? ? ? ? ? ? ? ? parameterBuffer.append("&");

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }


? ? ? ? ? ? System.out.println("POST parameter : " + parameterBuffer.toString());


? ? ? ? ? ? URL localURL = new URL(url);


? ? ? ? ? ? URLConnection connection = openConnection(localURL);

? ? ? ? ? ? HttpURLConnection httpURLConnection = (HttpURLConnection)connection;


? ? ? ? ? ? httpURLConnection.setDoOutput(true);

? ? ? ? ? ? httpURLConnection.setRequestMethod("POST");

? ? ? ? ? ? httpURLConnection.setRequestProperty("Accept-Charset", charset);

? ? ? ? ? ? httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

? ? ? ? ? ? httpURLConnection.setRequestProperty("Content-Length", String.valueOf(parameterBuffer.length()));


? ? ? ? ? ? OutputStream outputStream = null;

? ? ? ? ? ? OutputStreamWriter outputStreamWriter = null;

? ? ? ? ? ? InputStream inputStream = null;

? ? ? ? ? ? InputStreamReader inputStreamReader = null;

? ? ? ? ? ? BufferedReader reader = null;

? ? ? ? ? ? StringBuffer resultBuffer = new StringBuffer();

? ? ? ? ? ? String tempLine = null;


? ? ? ? ? ? try {

? ? ? ? ? ? ? ? outputStream = httpURLConnection.getOutputStream();

? ? ? ? ? ? ? ? outputStreamWriter = new OutputStreamWriter(outputStream);


? ? ? ? ? ? ? ? outputStreamWriter.write(parameterBuffer.toString());

? ? ? ? ? ? ? ? outputStreamWriter.flush();


? ? ? ? ? ? ? ? if (httpURLConnection.getResponseCode() >= 300) {

? ? ? ? ? ? ? ? ? ? throw new Exception("HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? inputStream = httpURLConnection.getInputStream();

? ? ? ? ? ? ? ? inputStreamReader = new InputStreamReader(inputStream);

? ? ? ? ? ? ? ? reader = new BufferedReader(inputStreamReader);


? ? ? ? ? ? ? ? while ((tempLine = reader.readLine()) != null) {

? ? ? ? ? ? ? ? ? ? resultBuffer.append(tempLine);

? ? ? ? ? ? ? ? }


? ? ? ? ? ? } finally {


? ? ? ? ? ? ? ? if (outputStreamWriter != null) {

? ? ? ? ? ? ? ? ? ? outputStreamWriter.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if (outputStream != null) {

? ? ? ? ? ? ? ? ? ? outputStream.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if (reader != null) {

? ? ? ? ? ? ? ? ? ? reader.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if (inputStreamReader != null) {

? ? ? ? ? ? ? ? ? ? inputStreamReader.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? ? ? if (inputStream != null) {

? ? ? ? ? ? ? ? ? ? inputStream.close();

? ? ? ? ? ? ? ? }


? ? ? ? ? ? }

? ? ? ? ? ? return resultBuffer.toString();

? ? ? ? }

? ? ? ? private URLConnection openConnection(URL localURL) throws IOException {

? ? ? ? ? ? URLConnection connection;

? ? ? ? ? ? if (proxyHost != null && proxyPort != null) {

? ? ? ? ? ? ? ? Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));

? ? ? ? ? ? ? ? connection = localURL.openConnection(proxy);

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? connection = localURL.openConnection();

? ? ? ? ? ? }

? ? ? ? ? ? return connection;

? ? ? ? }


? ? ? ? /**

? ? ? ? * Render request according setting

? ? ? ? * @param request

? ? ? ? */

? ? ? ? private void renderRequest(URLConnection connection) {


? ? ? ? ? ? if (connectTimeout != null) {

? ? ? ? ? ? ? ? connection.setConnectTimeout(connectTimeout);

? ? ? ? ? ? }


? ? ? ? ? ? if (socketTimeout != null) {

? ? ? ? ? ? ? ? connection.setReadTimeout(socketTimeout);

? ? ? ? ? ? }


? ? ? ? }

? ? ? ? /*

? ? ? ? * Getter & Setter

? ? ? ? */

? ? ? ? public Integer getConnectTimeout() {

? ? ? ? ? ? return connectTimeout;

? ? ? ? }

? ? ? ? public void setConnectTimeout(Integer connectTimeout) {

? ? ? ? ? ? this.connectTimeout = connectTimeout;

? ? ? ? }

? ? ? ? public Integer getSocketTimeout() {

? ? ? ? ? ? return socketTimeout;

? ? ? ? }

? ? ? ? public void setSocketTimeout(Integer socketTimeout) {

? ? ? ? ? ? this.socketTimeout = socketTimeout;

? ? ? ? }

? ? ? ? public String getProxyHost() {

? ? ? ? ? ? return proxyHost;

? ? ? ? }

? ? ? ? public void setProxyHost(String proxyHost) {

? ? ? ? ? ? this.proxyHost = proxyHost;

? ? ? ? }

? ? ? ? public Integer getProxyPort() {

? ? ? ? ? ? return proxyPort;

? ? ? ? }

? ? ? ? public void setProxyPort(Integer proxyPort) {

? ? ? ? ? ? this.proxyPort = proxyPort;

? ? ? ? }

? ? ? ? public String getCharset() {

? ? ? ? ? ? return charset;

? ? ? ? }

? ? ? ? public void setCharset(String charset) {

? ? ? ? ? ? this.charset = charset;

? ? ? ? }

}

```

controller僧界,這里就是工具類(lèi)的使用方法了侨嘀,沒(méi)什么難度,簡(jiǎn)單的調(diào)用

```

// 獲取信息

@ResponseBody

@RequestMapping("getOpenid")

public void getOpenid(HttpServletRequest request,

HttpServletResponse response) throws Exception {

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

//需要使用小程序傳過(guò)來(lái)的js_code獲取session_key

String js_code = request.getParameter("js_code");

//這個(gè)就是要解密的東西--用戶敏感信息加密數(shù)據(jù)

String encryptedData = request.getParameter("encryptedData");

//加密算法的初始向量

String iv = request.getParameter("iv");

//調(diào)用工具類(lèi)中獲取session_key的方法

String sessionkey = new GetOpenid().get(js_code);

//調(diào)用工具類(lèi)中的解密方法捂襟,然后返回給小程序就OK了

JSONObject obj = new GetOpenid().getUserInfo(encryptedData, sessionkey,

iv);

Gson gson = new Gson();

String json = gson.toJson(obj);

PrintWriter pw = response.getWriter();

pw.write(json);

pw.close();

}

```

最后是小程序端的請(qǐng)求代碼

```

var that = this

? ? wx.login({

? ? ? success: function (res) {

? ? ? ? if (res.code) {

? ? ? ? ? wx.getUserInfo({

? ? ? ? ? ? success: datas => {

? ? ? ? ? ? ? wx.request({

? ? ? ? ? ? ? ? url: that.baseurl + 'getOpenid',

? ? ? ? ? ? ? ? data: {

? ? ? ? ? ? ? ? ? js_code: res.code,

? ? ? ? ? ? ? ? ? encryptedData: datas.encryptedData,

? ? ? ? ? ? ? ? ? iv: datas.iv

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? header: {

? ? ? ? ? ? ? ? ? 'content-type': 'application/json'

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? success: function (e) {

? ? ? ? ? ? ? ? ? console.log(e.data)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? })

? ? ? ? ? ? }

? ? ? ? ? })

? ? ? ? }

? ? ? ? else {

? ? ? ? ? console.log('獲取用戶登錄態(tài)失斠蟆!' + res.errMsg)

? ? ? ? }

? ? ? }

? ? })

```

大功告成T岷伞U枪病!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宠漩,一起剝皮案震驚了整個(gè)濱河市举反,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扒吁,老刑警劉巖火鼻,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡魁索,警方通過(guò)查閱死者的電腦和手機(jī)融撞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粗蔚,“玉大人尝偎,你說(shuō)我怎么就攤上這事∨艨兀” “怎么了冬念?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牧挣。 經(jīng)常有香客問(wèn)我急前,道長(zhǎng),這世上最難降的妖魔是什么瀑构? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任裆针,我火速辦了婚禮,結(jié)果婚禮上寺晌,老公的妹妹穿的比我還像新娘世吨。我一直安慰自己,他們只是感情好呻征,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布耘婚。 她就那樣靜靜地躺著,像睡著了一般陆赋。 火紅的嫁衣襯著肌膚如雪沐祷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天攒岛,我揣著相機(jī)與錄音赖临,去河邊找鬼。 笑死灾锯,一個(gè)胖子當(dāng)著我的面吹牛兢榨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顺饮,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吵聪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了兼雄?” 一聲冷哼從身側(cè)響起吟逝,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎君旦,沒(méi)想到半個(gè)月后澎办,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嘲碱,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡金砍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澎媒。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡樊诺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹅巍,到底是詐尸還是另有隱情千扶,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布骆捧,位于F島的核電站澎羞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敛苇。R本人自食惡果不足惜妆绞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枫攀。 院中可真熱鬧括饶,春花似錦、人聲如沸来涨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹦掐。三九已至技羔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卧抗,已是汗流浹背堕阔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颗味,地道東北人超陆。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像浦马,于是被迫代替她去往敵國(guó)和親时呀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348