玩轉(zhuǎn)京東支付(python)

說明

github地址

做了微信。支付寶和京東支付之后糕再,發(fā)現(xiàn),最扯蛋的支付玉转,肯定是京東支付突想,要完整開發(fā)京東支付,必須要看完京東支付開發(fā)者文檔的官網(wǎng)每一個(gè)角落究抓,絕對(duì)不能憑你的任何經(jīng)驗(yàn)去猜測(cè)有些流程猾担,比如公私鑰加解密(不看官網(wǎng),保證你后悔)刺下、發(fā)送請(qǐng)求的方式(form表單提交绑嘹,看了官網(wǎng)你會(huì)發(fā)現(xiàn)好怪異),支付同步跳轉(zhuǎn)(還是post橘茉,fk)工腋,支付成功后返回居然沒有支付訂單號(hào)(完全靠自己去維護(hù)姨丈,fk)

技術(shù)描點(diǎn)

首先要去看官網(wǎng)的:http://payapi.jd.com/。 項(xiàng)目使用的是pc網(wǎng)頁支付

一. 統(tǒng)一下單的接口:https://wepay.jd.com/jdpay/saveOrder

參數(shù)說明:http://payapi.jd.com/docList.html?methodName=2

一定要仔細(xì)的看這些參數(shù)的說明

特殊參數(shù)說明如下:

  1. 在以上的請(qǐng)求參數(shù)中夷蚊,商戶號(hào)是在注冊(cè)開通京東支付功能的時(shí)候构挤,京東支付商戶管理系統(tǒng)為用戶分配的。
  2. 用戶賬號(hào)是商戶系統(tǒng)的用戶賬號(hào)惕鼓。
  3. 交易流水號(hào)是用來標(biāo)識(shí)每次支付請(qǐng)求的號(hào)碼筋现,需要商戶保證在每一次支付請(qǐng)求的時(shí)候交易流水號(hào)唯一,多次請(qǐng)求不能使用同一交易流水號(hào)箱歧,否則京東支付服務(wù)在處理后面的支付請(qǐng)求時(shí)矾飞,會(huì)把此交易當(dāng)做重復(fù)支付處理。
  4. 簽名規(guī)則詳見:“接口安全規(guī)范-簽名算法”呀邢;
  5. 為保證信息安全洒沦,表單中的各個(gè)字段除了merchant(商戶號(hào))、版本號(hào)(version)价淌、簽名(sign)以外申眼,其余字段全部采用3DES進(jìn)行加密。

二. 生成簽名

簽名過程分為兩步蝉衣,首先是將原始參數(shù)按照規(guī)則拼接成一個(gè)字符串S1括尸,然后再將S1根據(jù)簽名算法生成簽名字符串sign。
參數(shù)原始字符串的拼接規(guī)則:

  1. 對(duì)于POST表單提交的參數(shù):所有參數(shù)按照參數(shù)名的ASCII碼順序從小到大排序(字典序)病毡,使用URL鍵值對(duì)的方式拼接成字符串S1濒翻,(如:k1=value1&k2=value2&k3=value3…)
  2. 對(duì)于XML報(bào)文交互的參數(shù):將XML報(bào)文的各行去掉空格后直接拼接成一行字符串作為S1。如果報(bào)文只有一行則直接作為S1啦膜,不需要再進(jìn)行拼接有送。

生成簽名的過程如下:

  1. 對(duì)拼接的參數(shù)字符串S1通過SHA256算法計(jì)算摘要,得到字符串S2僧家;
  2. 對(duì)字符串S2使用私鑰證書進(jìn)行加密雀摘,并進(jìn)行base64轉(zhuǎn)碼,得到簽名字符串sign八拱; 接收方收到報(bào)文后先進(jìn)行base64解碼届宠,再使用公鑰證書解密,然后驗(yàn)證簽名的合法性乘粒。

注意事項(xiàng):

  1. 空參數(shù)不參與簽名豌注;
  2. 參數(shù)列表中的sign字段不參與簽名;
  3. 為了簡化處理灯萍,<xml>標(biāo)簽也參與簽名轧铁;
  4. 參數(shù)區(qū)分大小寫;
  5. RSA加密的規(guī)則為:由交易發(fā)起方進(jìn)行私鑰加密旦棉,接收方進(jìn)行公鑰解密齿风;(可以使用RSA公私鑰校驗(yàn)工具來校驗(yàn)商戶RSA公私鑰是否匹配)
  6. 系統(tǒng)會(huì)對(duì)商戶公鑰證書的有效性進(jìn)行校驗(yàn)药薯。

簽名代碼:


def get_sign_str(params, is_compatible=False):
    """
    生成簽名的字符串
    Args:
        params: 簽名的字典數(shù)據(jù)
        is_compatible: 是否是兼容模式(對(duì)字典中value值為空的也簽名)

    Returns:
        返回簽名
    """

    raw = [(k, params[k]) for k in sorted(params.keys())]
    if is_compatible:
        order_str = "&".join("=".join(kv) for kv in raw)
    else:
        order_str = "&".join("=".join(kv) for kv in raw if kv[1])

    return order_str



def sign(self, prestr):
    """
    生成簽名
    Args:
        prestr(str): 生成簽名的原字符串

    Returns:
        返回生成好的簽名
    """
    key = MRSA.load_key(self.MERCHANT_RSA_PRI_KEY)
    signature = key.private_encrypt(self.sha256(prestr), MRSA.pkcs1_padding)
    sign = base64.b64encode(signature)
    return sign

三. DES3對(duì)每個(gè)參數(shù)進(jìn)行加密(merchant(商戶號(hào))、版本號(hào)(version)救斑、簽名(sign)除外)

為防止明文數(shù)據(jù)在post表單提交的時(shí)候暴露童本,所以京東做了DES3對(duì)字段進(jìn)行加密(不用表單提交不就行了,還搞這么復(fù)雜脸候,真該學(xué)學(xué)支付寶和微信)

京東DES加密說明如下:

   除特定說明外穷娱,商戶和京東支付接口調(diào)用報(bào)文采用3DES加密,再通過base64轉(zhuǎn)換為字符串运沦。
   3DES加密算法標(biāo)為DESede泵额,工作模式為電子密碼本模式ECB,不填充(DESede/ECB/NoPadding)携添。
注:服務(wù)端NoPadding 為不填充嫁盲,所以加密的原文字節(jié)必須是8的整數(shù)倍(如果調(diào)用我們提供的加密接口API則不必處理原文字節(jié),加密接口內(nèi)部已處理)烈掠。如果自己實(shí)現(xiàn)加密羞秤,原文字節(jié)不夠8的整數(shù)倍,則按如下規(guī)則轉(zhuǎn)為8的整數(shù)倍左敌。
    1.  把原文字符串轉(zhuǎn)成字節(jié)數(shù)組锥腻。
    2.  根據(jù)字節(jié)數(shù)組長度判斷是否需要補(bǔ)位。
        補(bǔ)位邏輯為:
        int x = (i+ 4) % 8;
        int y = (x == 0) ? 0 : (8 - x);
        i為字節(jié)數(shù)組的長度母谎,y為需要補(bǔ)位的長度。
        補(bǔ)位值為0京革。
    3.  將有效數(shù)據(jù)長度byte[]添加到原始byte數(shù)組的頭部奇唤。
        i為字節(jié)數(shù)組的長度。
        result[0] = (byte) ((i >> 24) & 0xFF);
        result[1] = (byte) ((i >> 16) & 0xFF);
        result[2] = (byte) ((i >> 8) & 0xFF);
        result[3] = (byte) (i & 0xFF);

    4.  原文字節(jié)數(shù)組前面加上第三步的4個(gè)字節(jié)匹摇,再加上需補(bǔ)位的值咬扇。
        例如:字符串”1”,轉(zhuǎn)換成字節(jié)數(shù)組是[49],計(jì)算補(bǔ)位y=3, 計(jì)算有效數(shù)據(jù)長度為[0, 0, 0, 1]廊勃,最后字節(jié)數(shù)組為[0, 0, 0, 1, 49, 0, 0, 0]懈贺。
Form表單接口的加密方式:
如果商戶通過表單方式提交支付請(qǐng)求至收銀臺(tái),為保證信息安全坡垫,表單中的各個(gè)字段除了merchant(商戶號(hào))梭灿、verion(版本號(hào))、sign(簽名)以外冰悠,其余字段全部采用3DES進(jìn)行加密堡妒。

XML請(qǐng)求接口的加密方式:
通過XML接口方式和京東支付服務(wù)器交互的請(qǐng)求,應(yīng)該對(duì)報(bào)文進(jìn)行加密溉卓,加密方式為對(duì)整個(gè)報(bào)文整體進(jìn)行3DES加密皮迟,再進(jìn)行base64轉(zhuǎn)碼使其變?yōu)榭勺x字符串搬泥,加密后的密文置于<encrypt></encrypt>標(biāo)簽中,同時(shí)再將報(bào)文中的<merchant>(商戶號(hào))伏尼、<version>(版本號(hào))這兩個(gè)字段單獨(dú)置于<jdpay>標(biāo)簽下忿檩。

接收到京東支付加密報(bào)文后的處理方式:
接收到京東支付返回的加密報(bào)文后,先判斷<jdpay>標(biāo)簽下的<result>標(biāo)簽的返回碼爆阶,檢查接口調(diào)用是否正常返回燥透。然后再讀取<encrypt>標(biāo)簽的密文內(nèi)容進(jìn)行base64解碼,再進(jìn)行3DES解密扰她,解密后的報(bào)文即是原始報(bào)文兽掰。

示例代碼:


def des_pad(data):
    e = len(data)
    x = (e + 4) % 8
    y = 0 if x == 0 else 8 - x
    sizeByte = struct.pack('>I', e)
    resultByte = range(len(sizeByte) + e + y)
    resultByte[0:4] = sizeByte
    resultByte[4:4 + e] = data
    for i in range(0, y):
        resultByte[e + 4 + i] = "\x00"
    resultstr = ''.join(resultByte)
    return resultstr


def encode_des(to_encode_str, des_key):
    """
    DES3加密數(shù)據(jù)
    Args:
        to_encode_str(str): 要被加密的原字符串,這里的字符串需要被des_pad一下
        des_key(str): 加密的key
    Returns:

    """

    key = base64.b64decode(des_key)
    des3 = DES3.new(key, DES3.MODE_ECB)
    return des3.encrypt(ToolsClass.des_pad(to_encode_str)).encode('hex_codec')

這樣的話徒役,簽名和加密都已完成孽尽,往后就拼到頁面里的form里

 <form method="post" action="https://wepay.jd.com/jdpay/saveOrder" id="batchForm">
        <input name="merchant" type="hidden" id="merchant" value="22294531" /><br/>
        <input name="notifyUrl" type="hidden" id="notifyUrl" value="da652ac3b881c4ddc2ac26793b20c37fba91a994f108bf8a0a42b5ead05111997bfe2a97eaf4aa49562de1b6d1d32cd7" /><br/>
         <input name="userId" type="hidden" id="userId" value="f23f2b73027cb0f8deb349af3086fdc50f6892f17c9f45b81b6d273d0cdb1cae8151f083427fc8f0" /><br/>
            <input name="sign" type="hidden" id="sign" value="SJ6qfS+9CmXkt6ghJcf9nIdHJDReTFNkRyjFh5XZAsTAtfHT4SdmKeD88t+2dMnaszJ7vVjBnSu64aJyt6SODW2FHJk0WXEvZNixmo2h8F7vHO5lTE2jEG/9uN7sqg2c7kH2Fnu5cFLCeaMfb8uZqZ8CKi+g7Aw4b6rywvoH/8M="
        /><br/>
        <input name="currency" type="hidden" id="currency" value="ac7132c57f10d3ce" /><br/>
         <input name="orderType" type="hidden" id="orderType" value="e00c693e6c5b8a60" /><br/>
         <input name="tradeNum" type="hidden" id="tradeNum" value="05439876d54534c7604c42eca17c14cdf8eece390982627a0799194a74809ee6c9d07d3cff8a7c60"
        /><br/>
         <input name="amount" type="hidden" id="amount" value="e5a6c3761ab9ddaf" /><br/>
        <input name="version" type="hidden" id="version" value="V2.0" /><br/>
        <input name="tradeTime" type="hidden" id="tradeTime" value="d9668085c69c2ecb33367c0710f42c4bc7432967ba39f140"
        /><br/> <input name="tradeName" type="hidden" id="tradeName" value="3e111657e2839e3a3ba10d54bb446817e5000daf14a2e3badbf9a93316ed6003" /><br/>
        <input name="callbackUrl" type="hidden" id="callbackUrl" value="51c916293675ac44c2ac26793b20c37fba91a994f108bf8a0a42b5ead05111997bfe2a97eaf4aa49229a23b8c688e767"
        /><br/><input type="submit" />
    </form>

怎么組織就自己去實(shí)現(xiàn)好了

四. 異步回調(diào)

提交之后請(qǐng)求之后,就會(huì)跳轉(zhuǎn)到京東的支付頁面忧勿,可登錄賬戶支付杉女,也可用京東app或者微信掃描支付。

當(dāng)用戶掃碼支付之后鸳吸,京東會(huì)主動(dòng)跳轉(zhuǎn)到你指定的一個(gè)網(wǎng)址(在提交支付請(qǐng)求的時(shí)候有這個(gè)字段)熏挎,并且會(huì)異步post一個(gè)請(qǐng)求到指定的一個(gè)地址(在提交支付請(qǐng)求的時(shí)候有這個(gè)字段),同步跳轉(zhuǎn)是在用戶掃碼支付之后晌砾,如果京東支付頁面還在的話會(huì)跳轉(zhuǎn)坎拐。而異步是無論如何都會(huì)發(fā)支付結(jié)果通知的。對(duì)于新手來說养匈,一定要知道這個(gè)行業(yè)潛規(guī)則(微信哼勇,支付寶or其它都是)。而且一定要以這個(gè)異步通知的結(jié)果為準(zhǔn)呕乎。

京東返回的是xml格式的字符串

返回格式如下(沒有換行的积担,我這里演示換了行的):

<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<jdpay>
<version>V2.0</version>
<merchant>22294531</merchant>
<result> <code>000000</code> <desc>success</desc> </result>
<encrypt>MWYxMjBjMzViZjgwOWM5ZDhjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVmYzBmYTgyMDYyM2Q0YjM0NGM1ODFkZDhlYTA2Mjk0ZDE5ZDBlZDk5NTc3MmE4Nzk4OTFlYjIwZDgzMTc4MDU3NGVkZTFjNDY0MDMzNzNjZjc2OWZiMDQ0YjVhZGNhYmRhMGZmYTkyNzRhZDNhM2IxOGY5ZjZhYjBmYjhmZmI3Yzg0OTA3YzM0OGJmZTYwZTIzNzM3YjVmYzMzNmNkYTE0MjM2OWIwZDM5MjI2YWM5YmY3ZmZjZDBkNWJmM2ZkYWY4YTU3OWU4MDE3ZjQ5YmQ0ZWIyMDA0NTFmODZkNmViMDBiMDE2YTU3NTNjMzJjNDIzNWI5ZDkyYzQ3OTU4OTc2ZGIyZmNiMGUxNGRjNTM2OGZjYjQ0NmE0YWY1ZWVjZDYzNWI5ZDkyYzQ3OTU4OTc2NmIwM2QyZTU1ODJlNDNjM2M1NjA2YmQ5ZDc3MTRkMmNjN2ZiMDM3Yzg5ZDk1ODFkMWJhZmVjYjUwMzJlNTdkMTFmN2QxMDAxNjgyMzJjNTZhMmQzNTcyZGE4OTUzYWFjNTU5MDY4YWYyODE5ZDcyNmY5NmE1YTBmYWFiZTRiZTQ2OGZhMmM4M2JjMGM5NmNiMDE3ZWQ4MDkxY2FjZThiNzg4MjY5OWY1ZTJlYzBjOTIxODBhOGExNjExNGY4NWQwM2NkZjI2MTFmM2VmODcxYWM3MjUxZjMxMzZlYjFmNzI1NWE0OWM4MjMxZGY1MzBmY2Y1Mjg2NGUzMWRlMjc0M2I5ZDM5NjQzN2ZmZWQ1Y2M5NDY4ZDcwNWM1YzVhZmRlYzYwZWU3MDVhNjE0N2I1MGVlM2UyMGE2MzExNTE4YTUxOGRjMzBmMmUxZjE2NzYzNGRiNDJlODFmMDczOGYzZjMxN2NkMjkzNmU4ODc3NzJjMjkzM2ZlODlmMjUyNDVmNDI2MDA0M2VkYmUwOTlkNGEyNjU3YTM5YTE4ODU2OTBmNGQyNDcwZDE0ZWRjMmQxYjgxMzhhNjA5M2ZlNDkxYTQyMzE5YzBlNTA0MTdkYTg2ZGQ2NDQwODBmMjM4ZGI2YzIzMjNhOTE0M2VmMjZiZjczN2M5NWQwODYxMWY2OGE5MDQ0ZDZmNzE0NmIxZjQwZDdmZDMxOTQ2ZDM3YjIwNDJiODUzZGM0NTk0MzM5YzJkN2M2NDdiNGM4MzQ4MTRjZTIxZTlmYTYzNDYxNGMxMjlhZTE3NjE0ZDIzM2Q2MTQ4YzJiNWE3ZWVjMDU5MjFmNzJkNGNjNTU1NWZkNzVhN2U5Y2I1MDU1NjhlMWRlNjVhNzkyOGUxMThlODQyMGJkNzE2NjdmMDc3YmEyYTFkNmQyOTFiOGNjZTU2ZGMyYmE3ODY5ZGZiNmMyMWViYjc2ODc0Y2I3YTc4NGQ5NWY2NjY2Y2E5NjI0N2I1MGE4MTliMDBkNGIzNmViZTJlY2JmYTcwODUzYTM5ZTcwMDVmYWEzNWY2MDFhMWM2MGQ1MzEyYmQxNDU3Zjg4ZWVhNzY2YjZhOGE4ZGMxMGY3NjYwOWEzNWY2MDFhMWM2MGQ1MzFhNzA4NTNhMzllNzAwNWZhYTYxMmJmNjJiMmFlMGY5ODMxMzQ0MzQ0NjMxZDc3MTUyY2FiMjZlMjcyYmJjYmQzODVmNDY4OTA5YTdjMjlmNTI5NWFlZjE3NTI4ZmE4MzVhNzA4NTNhMzllNzAwNWZhNDk5OTQ2ZGU0OGU0NGQ2ZTE4YmRiYTBjZjNhM2ZkNjY5ODJjNGVhZjQzMjIyYWFhMWM0ZmU1ODRiNTg5OWEwYzAwNjI2NTllMDZkYzhiYTVmMjI3ZjUyYmQ3MjcyODllZmEwYzhiNDIwODc4ZjUzODY1MzAzZDkyNDM5OTRkNDczMTBjZDBhMTc4ZjAwOTIyZmM2ODk5YjkyYTJiODcwNjU4MzkzMzJkZWYzNDY1MzJlYTNiYTFhNjM0MWIwNjM4NjBjNjlmMzg1NWZjZWM5YWExMDdjZWY1MjkwZTZjMzgzOGYxNTRiNzFlN2E1YTczYWFkNzJlOTRiOWI3MmI2YWYyMTJjMjQ5Y2UzMmUxMGI4YWE0N2YzYzFmNjNiOGY4NjJlZmU1ZDM5NjcwODA3MGNjY2JjYWFkYjM3NzBmMGQzYjIyMGFmZTE3YWNjZWU1N2RmZTQxMzAxYjA2MDdlMg==</encrypt>
</jdpay>

先要用DES3對(duì)encrypt節(jié)點(diǎn)里的串進(jìn)行解密


def un_des_pad(data):
    resultByte = data[0:4]
    e = struct.unpack('>I', resultByte)[0]
    x = (e + 4) % 8
    y = 0 if x == 0 else 8 - x
    return data[4:] if y == 0 else data[4:-y]

def decode_des(to_decode_str, des_key):
    """
    解密數(shù)據(jù)
    Args:
        to_decode_str(str): 要解密的原字符串
        des_key(str): 解密的key
    Returns:

    """
    key = base64.b64decode(des_key)
    des3 = DES3.new(key, DES3.MODE_ECB)
    param = to_decode_str.decode("hex_codec") if to_decode_str is bytes else base64.b64decode(to_decode_str).decode(
        "hex_codec")
    param = des3.decrypt(param)
    return ToolsClass.un_des_pad(param)


sign_begin = xml_data.find('<encrypt>')
sign_end = xml_data.find('</encrypt>')
encrypt_str = xml_data[sign_begin + 9:sign_end]
xml_str = JdPay.decode_des(encrypt_str, deskey)

解密后的明文如下:

<?xml version="1.0" encoding="UTF-8" >
<jdpay>
  <version>V2.0</version>
  <merchant>110290193003</merchant>
<result>
  <code>000000</code>
  <desc>success</desc>
</result>
<device>6220</device>
<sign>SJ6qfS+9CmXkt6ghJcf9nIdHJDReTFNkRyjFh5XZAsTAtfHT4SdmKeD88t+2dMnaszJ7vVjBnSu64aJyt6SODW2FHJk0WXEvZNixmo2h8F7vHO5lTE2jEG/9uN7sqg2c7kH2Fnu5cFLCeaMfb8uZqZ8CKi+g7Aw4b6rywvoH/8M=</sign>
<tradeNum>201704250935156041484635</tradeNum>
<tradeType>0</tradeType>
<amount>3140</amount>
<status>2</status>
<payList>
  <pay>
    <payType>3</payType>
    <amount>1500</amount>
    <currency>CNY</currency>
    <tradeTime>20170425093516</tradeTime>
 </pay>
 <pay>
   <payType>1</payType>
   <amount>1640</amount>
   <currency>CNY</currency>
   <tradeTime>20170425093516</tradeTime>
   <detail>
     <cardHolderMobile>150****1596</cardHolderMobile>
   </detail>
  </pay>
</payList>
</jdpay>

解密之后就是驗(yàn)證簽名是否正確,從上邊的串中拿到簽名和去除簽名之后的字符串

def verify_mysign(cls, sign, xml_str, jd_public_key):
    """
    驗(yàn)證簽名
    Args:
        sign: 簽名
        xml_str: 去除簽名后的xml字符串
        jd_public_key: 用于驗(yàn)證的key

    Returns:

    """
    xml_sha_str = SHA256.new(xml_str).hexdigest()
    key = MRSA.load_pub_key(jd_public_key)
    signature = key.public_decrypt(base64.standard_b64decode(sign),
                                   MRSA.pkcs1_padding)
    return signature == xml_sha_str

驗(yàn)證通過之后再返回去除sign的xml字符串,并提取出里邊的內(nèi)容(詳情參數(shù)所代表的含義請(qǐng)看官方文檔)

五. 同步跳轉(zhuǎn)

同步跳轉(zhuǎn)就沒啥好說了猬仁,只是給個(gè)跳轉(zhuǎn)地址帝璧,但是這里一定要注意,這個(gè)的是一個(gè)post請(qǐng)求(好像京東啥都喜歡post)湿刽,而非微信或者支付寶或者other什么的get請(qǐng)求的烁。所以不要設(shè)置錯(cuò)了

好了,到這里一個(gè)完整的在線支付就完成了诈闺。這里還要說明的是撮躁,涉及到加密和解密,就一定會(huì)有key,有DES3使用的對(duì)稱加密key把曼,還有簽名使用的非對(duì)稱公鑰和私鑰杨帽。所以一定要配置好。
這里我的源代碼里用的都是京東提供的測(cè)試商戶號(hào)嗤军,還有一大推京東設(shè)置好的key注盈,具體要去下載京東的【京東支付PC&H5接口文檔】,在文檔的最底部有帳號(hào)信息叙赚。

demo里邊還有申請(qǐng)退款老客,申請(qǐng)撤單的接口,其實(shí)寫好一個(gè)接口的完成流程震叮,別的流程都是直接套用就可以了胧砰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苇瓣,隨后出現(xiàn)的幾起案子尉间,更是在濱河造成了極大的恐慌,老刑警劉巖击罪,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哲嘲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡媳禁,警方通過查閱死者的電腦和手機(jī)眠副,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竣稽,“玉大人囱怕,你說我怎么就攤上這事『帘穑” “怎么了娃弓?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拧烦。 經(jīng)常有香客問我,道長钝计,這世上最難降的妖魔是什么恋博? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮私恬,結(jié)果婚禮上债沮,老公的妹妹穿的比我還像新娘。我一直安慰自己本鸣,他們只是感情好疫衩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荣德,像睡著了一般闷煤。 火紅的嫁衣襯著肌膚如雪童芹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天鲤拿,我揣著相機(jī)與錄音假褪,去河邊找鬼。 笑死近顷,一個(gè)胖子當(dāng)著我的面吹牛生音,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窒升,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缀遍,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了饱须?” 一聲冷哼從身側(cè)響起域醇,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冤寿,沒想到半個(gè)月后歹苦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡督怜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年殴瘦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片号杠。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚪腋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姨蟋,到底是詐尸還是另有隱情屉凯,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布眼溶,位于F島的核電站悠砚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堂飞。R本人自食惡果不足惜灌旧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绰筛。 院中可真熱鬧枢泰,春花似錦、人聲如沸铝噩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毛甲,卻和暖如春年叮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丽啡。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工谋右, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人补箍。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓改执,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坑雅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辈挂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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