【電商專題】第一期 | 統(tǒng)一下單

在介紹這篇文章之前我們先了解一下

Q1.什么是統(tǒng)一下單

大家如果做過微信狠半、支付寶支付的話设塔,那一定用過統(tǒng)一下單這個(gè)接口愉粤。
這里我們以微信支付為例

微信支付文檔:https://pay.weixin.qq.com/wiki/doc/api/index.html

clipboard.png


trade_type參數(shù)中我們有很多中選擇断楷,不同的參數(shù)代表我們不同的場景响委,不同的場景校驗(yàn)的參數(shù)以及鏈路是不同的铃辖,比如在小程序剩愧、微信內(nèi)置支付需要傳遞OpenId

Q2.統(tǒng)一下單解決了什么

提供了一個(gè)清晰對(duì)外的接口,根據(jù)傳入不同的參數(shù)來決定不同的鏈路方向以及返回不同的結(jié)果


電商應(yīng)用場景

在電商項(xiàng)目中,我們也會(huì)有統(tǒng)一下單的場景娇斩,比如我們有普通商品仁卷、新用戶專享活動(dòng)商品穴翩、會(huì)員用戶專享活動(dòng)商品、而活動(dòng)商品是基于普通商品轉(zhuǎn)換過來的(可能這里說的比較抽象锦积,給大家上一幅簡易的圖來解釋)


微信截圖_20201230113401.png

t_spu芒帕、t_sku表是所有商品的基礎(chǔ)信息以及價(jià)格(簡稱為普通商品)

t_activity_prod表是活動(dòng)商品信息,引入基礎(chǔ)表的spu_id丰介、sku_id
背蟆。但活動(dòng)商品的價(jià)格(price)、庫存(stock)則需要獨(dú)立添加哮幢,因?yàn)樵陔娚添?xiàng)目中带膀,活動(dòng)商品的價(jià)格比普通商品更低,并且?guī)齑孢€有限制


不同訂單不同走向

普通商品和活動(dòng)商品訂單流程也是不同的橙垢,這里以支付回調(diào)后的清算為例子(參考下圖)

普通商品清算后需要核銷使用的優(yōu)惠券和積分

活動(dòng)商品清算則需要核銷新人或新會(huì)員的專享機(jī)會(huì)(假設(shè)只能購買一次)

微信截圖_20201230160553.png


代碼中如何實(shí)現(xiàn)

在電商項(xiàng)目中一個(gè)支付成功訂單的生成分為三步
【確認(rèn)訂單】垛叨、【提交訂單并支付】、【訂單支付回調(diào)】

廢話不多說钢悲,我們直接開搞点额!前方高能!]毫铡;估狻!惭等!前方高能U涫帧!4亲觥A找!前方高能3用V刹埂!?蛟课幕!

/**
 * 統(tǒng)一訂單支付服務(wù) 2020年12月30日 13點(diǎn)49分
 *
 * @author bandari
 */
public interface OrderServiceFactory {

  /**
   * 統(tǒng)一確認(rèn)訂單
   *
   * @param configOrderBo 統(tǒng)一確認(rèn)訂單入?yún)?   * @return 統(tǒng)一確認(rèn)訂單出參
   */
  UnifiedConfigOrderVo unifiedConfigOrder(UnifiedConfigOrderBo configOrderBo);

  /**
   * 統(tǒng)一提交訂單
   *
   * @param submitOrderBo 統(tǒng)一提交訂單入?yún)?   * @return 統(tǒng)一提交訂單出參
   */
  UnifiedSubmitOrderVo unifiedSubmitOrder(ConfigOrderDTO configOrderDTO);

  /**
   * 統(tǒng)一訂單支付成功后的事件處理
   *
   * @param paySuccessOrderBo 支付成功訂單入?yún)?   * @return 支付成功訂單出參
   */
  UnifiedPaySuccessOrderVo unifiedPaySuccessOrder(UnifiedPaySuccessOrderBo paySuccessOrderBo);

  /**
   * 統(tǒng)一訂單退款成功后的事件處理
   *
   * @param refundSuccessOrderBo 退款成功訂單入?yún)?   * @return 退款成功訂單出參
   */
  UnifiedRefundSuccessOrderVo unifiedRefundSuccessOrder(
      UnifiedRefundSuccessOrderBo refundSuccessOrderBo);

普通訂單、新人專享訂單五垮、新會(huì)員訂單重寫這個(gè)接口

/**
 * 普通訂單服務(wù)
 * 注意這里的orderServiceFactory1
 * @author bandari
 */
@Slf4j
@Service("orderServiceFactory1")
public class OrdinaryOrderServiceFactoryImpl implements OrderServiceFactory {

  @Override
  public UnifiedConfigOrderVo unifiedConfigOrder(UnifiedConfigOrderBo configOrderBo) {
    log.info("");
    log.info("普通商品進(jìn)行確認(rèn)訂單操作:{}", JSONUtil.toJsonStr(configOrderBo));
    log.info("校驗(yàn)普通商品是否存在乍惊、庫存是否充足等");

    //這里用ThreadLocal 代替Redis
    ConfigOrderDTO dto = new ConfigOrderDTO();
    BeanUtils.copyProperties(configOrderBo, dto);
    Map<String, ConfigOrderDTO> configOrderDTOMap = new HashMap<>();
    configOrderDTOMap.put(Constant.CONFIG_ORDER_KEY, dto);
    ThreadLocalCache.set(configOrderDTOMap);

    log.info("====================普通商品確認(rèn)訂單操作完成===============");
    return new UnifiedConfigOrderVo();
  }

  @Override
  public UnifiedSubmitOrderVo unifiedSubmitOrder(ConfigOrderDTO configOrderDTO) {
    log.info("");
    log.info("普通商品提交訂單操作:{}", JSONUtil.toJsonStr(configOrderDTO));
    log.info("生成訂單及清算信息");

    log.info("====================普通商品提交訂單操作完成===============");
    return new UnifiedSubmitOrderVo();
  }

  @Override
  public UnifiedPaySuccessOrderVo unifiedPaySuccessOrder(
      UnifiedPaySuccessOrderBo paySuccessOrderBo) {
    log.info("");
    log.info("普通商品支付成功后的操作:{}", JSONUtil.toJsonStr(paySuccessOrderBo));
    log.info("核銷優(yōu)惠券、積分放仗、");
    log.info("====================普通商品支付成功后的操作完成===============");

    return new UnifiedPaySuccessOrderVo();
  }

  @Override
  public UnifiedRefundSuccessOrderVo unifiedRefundSuccessOrder(
      UnifiedRefundSuccessOrderBo refundSuccessOrderBo) {
    log.info("普通商品退款成功后的操作:{}", JSONUtil.toJsonStr(refundSuccessOrderBo));
    return new UnifiedRefundSuccessOrderVo();
  }
/**
 * 新人專享訂單服務(wù)
 * 注意這里的orderServiceFactory2
 * @author bandari
 */
@Slf4j
@Service("orderServiceFactory2")
public class NewPeopleOrderServiceFactoryImpl implements OrderServiceFactory {

  @Override
  public UnifiedConfigOrderVo unifiedConfigOrder(UnifiedConfigOrderBo configOrderBo) {
    log.info("");
    log.info("新人專享商品進(jìn)行確認(rèn)訂單操作:{}", JSONUtil.toJsonStr(configOrderBo));
    log.info("校驗(yàn)新人專享商品是否存在润绎、庫存、新人專享機(jī)會(huì)等條件是否充足等");

    //這里用ThreadLocal 代替Redis
    ConfigOrderDTO dto = new ConfigOrderDTO();
    BeanUtils.copyProperties(configOrderBo, dto);
    Map<String, ConfigOrderDTO> configOrderDTOMap = new HashMap<>();
    configOrderDTOMap.put(Constant.CONFIG_ORDER_KEY, dto);
    ThreadLocalCache.set(configOrderDTOMap);

    log.info("====================新人專享商品確認(rèn)訂單操作完成===============");
    return new UnifiedConfigOrderVo();
  }

  @Override
  public UnifiedSubmitOrderVo unifiedSubmitOrder(ConfigOrderDTO configOrderDTO) {
    log.info("");
    log.info("新人專享商品提交訂單操作:{}", JSONUtil.toJsonStr(configOrderDTO));
    log.info("生成訂單及清算信息");

    log.info("====================新人專享商品提交訂單操作完成===============");
    return new UnifiedSubmitOrderVo();
  }

  @Override
  public UnifiedPaySuccessOrderVo unifiedPaySuccessOrder(
      UnifiedPaySuccessOrderBo paySuccessOrderBo) {
    log.info("");
    log.info("新人專享商品訂單支付成功后的操作");
    log.info("核銷優(yōu)惠券、積分莉撇、");
    log.info("核銷新人專享機(jī)會(huì)");
    log.info("====================新人專享商品支付成功操作完成===============");

    return new UnifiedPaySuccessOrderVo();
  }

  @Override
  public UnifiedRefundSuccessOrderVo unifiedRefundSuccessOrder(
      UnifiedRefundSuccessOrderBo refundSuccessOrderBo) {
    log.info("新人專享商品退款成功后的操作:{}", JSONUtil.toJsonStr(refundSuccessOrderBo));
    return new UnifiedRefundSuccessOrderVo();
  }
}
/**
 * 新會(huì)員專享訂單服務(wù)
 * 注意這里的orderServiceFactory3
 * @author bandari
 */
@Slf4j
@Service("orderServiceFactory3")
public class NewMemberOrderServiceFactoryImpl implements OrderServiceFactory {

  @Override
  public UnifiedConfigOrderVo unifiedConfigOrder(UnifiedConfigOrderBo configOrderBo) {
    log.info("");
    log.info("新會(huì)員專享商品進(jìn)行確認(rèn)訂單操作:{}", JSONUtil.toJsonStr(configOrderBo));
    log.info("校驗(yàn)新會(huì)員專享商品是否存在呢蛤、庫存、新會(huì)員專享機(jī)會(huì)稼钩、是否為會(huì)員等條件是否充足等");

    //這里用ThreadLocal 代替Redis
    ConfigOrderDTO dto = new ConfigOrderDTO();
    BeanUtils.copyProperties(configOrderBo, dto);
    Map<String, ConfigOrderDTO> configOrderDTOMap = new HashMap<>();
    configOrderDTOMap.put(Constant.CONFIG_ORDER_KEY, dto);
    ThreadLocalCache.set(configOrderDTOMap);

    log.info("====================新會(huì)員專享商品確認(rèn)訂單操作完成===============");
    return new UnifiedConfigOrderVo();
  }

  @Override
  public UnifiedSubmitOrderVo unifiedSubmitOrder(ConfigOrderDTO configOrderDTO) {
    log.info("");
    log.info("新會(huì)員專享商品提交訂單操作:{}", JSONUtil.toJsonStr(configOrderDTO));
    log.info("生成訂單及清算信息");

    log.info("====================新會(huì)員專享商品提交訂單操作完成===============");
    return new UnifiedSubmitOrderVo();
  }

  @Override
  public UnifiedPaySuccessOrderVo unifiedPaySuccessOrder(
      UnifiedPaySuccessOrderBo paySuccessOrderBo) {
    log.info("");
    log.info("新會(huì)員專享商品訂單支付成功后的操作");
    log.info("核銷優(yōu)惠券顾稀、積分、");
    log.info("核銷新會(huì)員專享機(jī)會(huì)");
    log.info("新增會(huì)員成長值");
    log.info("====================新會(huì)員專享商品支付成功操作完成===============");

    return new UnifiedPaySuccessOrderVo();
  }

  @Override
  public UnifiedRefundSuccessOrderVo unifiedRefundSuccessOrder(
      UnifiedRefundSuccessOrderBo refundSuccessOrderBo) {
    log.info("新會(huì)員專享商品退款成功后的操作:{}", JSONUtil.toJsonStr(refundSuccessOrderBo));
    return new UnifiedRefundSuccessOrderVo();
  }
}

不同訂單不同走向坝撑,所以我們需要一個(gè)ProdType參數(shù)來控制方向

/**
 * 工廠服務(wù),可抽離出一個(gè)接口(此處省略)
 */
@Component
public class MasterFactory implements Serializable {

  @Autowired
  private Map<String, OrderServiceFactory> orderServiceMap;

  /**
   * 獲取商品對(duì)應(yīng)的訂單服務(wù)
   *
   * @param prodType 商品類型
   * @return 返回對(duì)應(yīng)的訂單服務(wù)
   */
  @SneakyThrows
  public OrderServiceFactory getOrderService(Integer prodType) {
    OrderServiceFactory orderServiceFactory = orderServiceMap.get("orderServiceFactory" + prodType);
    if (ObjectUtil.isNull(orderServiceFactory)) {
      throw new Exception("訂單服務(wù)不存在");
    }
    return orderServiceFactory;
  }
}

項(xiàng)目測試案例


@SpringBootTest
@Slf4j
@WebAppConfiguration
class OrderTest {

  @Autowired
  private OrderController orderController;

  @BeforeEach
  public void configOrder() {
    //模擬確認(rèn)訂單
    UnifiedConfigOrderBo configOrderBo = new UnifiedConfigOrderBo();
    configOrderBo.setNum(1);
    configOrderBo.setSpuId(1L);
    configOrderBo.setSkuId(2L);
    //NEW_MEMBER:新會(huì)員專享商品 NEW_PEOPLE:新人專享商品 ORDINARY:普通商品
    configOrderBo.setProdType(ProdTypeEnum.NEW_MEMBER.getCode());
    orderController.unifiedConfigOrder(configOrderBo);
  }

  @Test
  public void submitOrder() {
    //模擬提交訂單
    orderController.unifiedSubmitOrder();
  }

  @AfterEach
  public void paySuccessOrder() {
    //模擬訂單支付成功
    orderController
        .unifiedPaySuccessOrder(new UnifiedPaySuccessOrderBo());
  }
}

當(dāng)ProdType為NEW_MEMBER(新會(huì)員專享)静秆,訂單日志流程如下

 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 新會(huì)員專享商品進(jìn)行確認(rèn)訂單操作:{"num":1,"prodType":3,"spuId":1,"skuId":2}
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 校驗(yàn)新會(huì)員專享商品是否存在、庫存巡李、新會(huì)員專享機(jī)會(huì)抚笔、是否為會(huì)員等條件是否充足等
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : ====================新會(huì)員專享商品確認(rèn)訂單操作完成===============
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 新會(huì)員專享商品提交訂單操作:{"num":1,"prodType":3,"spuId":1,"skuId":2}
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 生成訂單及清算信息
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : ====================新會(huì)員專享商品提交訂單操作完成===============
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 新會(huì)員專享商品訂單支付成功后的操作
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 核銷新會(huì)員專享機(jī)會(huì)
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : 新增會(huì)員成長值
 [           main] b.f.s.i.NewMemberOrderServiceFactoryImpl : ====================新會(huì)員專享商品支付成功操作完成===============

當(dāng)ProdType為NEW_PEOPLE(新人專享),訂單日志流程如下

[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 新人專享商品進(jìn)行確認(rèn)訂單操作:{"num":1,"prodType":2,"spuId":1,"skuId":2}
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 校驗(yàn)新人專享商品是否存在侨拦、庫存殊橙、新人專享機(jī)會(huì)等條件是否充足等
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : ====================新人專享商品確認(rèn)訂單操作完成===============
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 新人專享商品提交訂單操作:{"num":1,"prodType":2,"spuId":1,"skuId":2}
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 生成訂單及清算信息
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : ====================新人專享商品提交訂單操作完成===============
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 新人專享商品訂單支付成功后的操作
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : 核銷新人專享機(jī)會(huì)
[           main] b.f.s.i.NewPeopleOrderServiceFactoryImpl : ====================新人專享商品支付成功操作完成===============

當(dāng)ProdType為ORDINARY(普通商品),訂單日志流程如下

[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 普通商品進(jìn)行確認(rèn)訂單操作:{"num":1,"prodType":1,"spuId":1,"skuId":2}
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 校驗(yàn)普通商品是否存在狱从、庫存是否充足等
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : ====================普通商品確認(rèn)訂單操作完成===============
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 普通商品提交訂單操作:{"num":1,"prodType":1,"spuId":1,"skuId":2}
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 生成訂單及清算信息
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : ====================普通商品提交訂單操作完成===============
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 普通商品支付成功后的操作:{}
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : 核銷優(yōu)惠券膨蛮、積分、
[           main] .b.f.s.i.OrdinaryOrderServiceFactoryImpl : ====================普通商品支付成功后的操作完成===============

好了季研,上述就是作者在電商項(xiàng)目中寫的【統(tǒng)一下單】流程敞葛,并已滿足現(xiàn)存業(yè)務(wù)場景;關(guān)于這個(gè)流程實(shí)現(xiàn)的方法有很多与涡。每個(gè)人都有不同的想法和見解惹谐。希望這篇文章能給你一些新的啟發(fā)。

最后

上述代碼已經(jīng)上傳至GitHub驼卖。有需要的同學(xué)去上面看看吧氨肌。

項(xiàng)目案例地址:https://github.com/gitbandari/example-unifiedorder

后續(xù)作者將會(huì)更新一期電商優(yōu)惠券的設(shè)計(jì),敬請(qǐng)期待酌畜。

歡迎各位同學(xué)的點(diǎn)贊怎囚、收藏、評(píng)論

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桥胞,一起剝皮案震驚了整個(gè)濱河市恳守,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埠戳,老刑警劉巖井誉,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉扮,死亡現(xiàn)場離奇詭異整胃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喳钟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門屁使,熙熙樓的掌柜王于貴愁眉苦臉地迎上來在岂,“玉大人,你說我怎么就攤上這事蛮寂”挝纾” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵酬蹋,是天一觀的道長及老。 經(jīng)常有香客問我,道長范抓,這世上最難降的妖魔是什么骄恶? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匕垫,結(jié)果婚禮上僧鲁,老公的妹妹穿的比我還像新娘。我一直安慰自己象泵,他們只是感情好寞秃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著偶惠,像睡著了一般春寿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洲鸠,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天堂淡,我揣著相機(jī)與錄音,去河邊找鬼扒腕。 笑死绢淀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘾腰。 我是一名探鬼主播皆的,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼蹋盆!你這毒婦竟也來了费薄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤栖雾,失蹤者是張志新(化名)和其女友劉穎楞抡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體析藕,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召廷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竞慢。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡先紫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筹煮,到底是詐尸還是另有隱情遮精,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布败潦,位于F島的核電站本冲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏劫扒。R本人自食惡果不足惜眼俊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粟关。 院中可真熱鬧疮胖,春花似錦、人聲如沸闷板。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遮晚。三九已至性昭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間县遣,已是汗流浹背糜颠。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萧求,地道東北人其兴。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像夸政,于是被迫代替她去往敵國和親元旬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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