線上支付開發文檔
安全規範

數字簽名

為了保證數據傳輸過程中的數據真實性和完整性,我們需要對數據進行數字簽名,在接收簽名數據之後進行簽名校驗。

數字簽名有兩個步驟,先按一定規則拼接要簽名的原始串,再選擇具體的算法和密鑰計算出簽名結果。

一般失敗的結果不簽名。

簽名原始串

無論是請求還是應答,簽名原始串按以下方式組裝成字符串:

1、除sign字段外,所有參數按照字段名的ascii碼從小到大排序後使用QueryString的格式(即key1=value1&key2=value2…)拼接而成,空值不傳遞,不參與簽名組串。

2、簽名原始串中,字段名和字段值都採用原始值,不進行URL Encode。

3、 平台返回的應答或通知消息可能會由於升級增加參數,請驗證應答簽名時注意允許這種情況。

 

舉例:

正確的簽名字段排序為:

{
    "attach" : "It is the description of the product.",
    "body" : "測試產品",
    "mch_create_ip" : "127.0.0.1",
    "mch_id" : "10085200000000",
    "nonce_str" : "54fa7f8e1006aecb8b58ef6059abb09c",
    "notify_url" : "http://www.ionline.com.hk/notify_callback",
    "out_trade_no" : "TRDNO150271173415530",
    "service" : "ionline.pay.weixin.native.intl",
    "sign_type" : "MD5",
    "total_fee" : "10",
    "sign" : "6C3441C872CEEC1ACF7AB1E69D1C2C76"
}

正確的簽名字段排序為:

attach=It is the description of the product.&body=測試產品&mch_create_ip=127.0.0.1&mch_id=10085200000000&nonce_str=54fa7f8e1006aecb8b58ef6059abb09c&notify_url=http://www.ionline.com.hk/notify_callback&out_trade_no=TRDNO150271173415530&service=ionline.pay.weixin.native.intl&sign_type=MD5&total_fee=10

簽名算法

目前暫只支持MD5簽名

MD5簽名

MD5 是一種摘要生成算法,通過在簽名原始串後加上商戶通信密鑰的內容,進行MD5運算,形成的摘要字符串即為簽名結果。為了方便比較,簽名結果統一轉換為大寫字符。

注意:簽名時將字符串轉化成字節流時指定的編碼字符集應與參數charset一致。

MD5簽名計算公式:

sign=Md5(原字符串&key=商戶密鑰).toUpperCase

如:

假設以下為 XML 傳入參數:

{
    "attach" : "It is the description of the product.",
    "body" : "測試產品",
    "mch_create_ip" : "127.0.0.1",
    "mch_id" : "10085200000000",
    "nonce_str" : "54fa7f8e1006aecb8b58ef6059abb09c",
    "notify_url" : "http://www.ionline.com.hk/notify_callback",
    "out_trade_no" : "TRDNO150271173415530",
    "service" : "ionline.pay.weixin.native.intl",
    "sign_type" : "MD5",
    "total_fee" : "10"
}

假设商户密钥为:902d9aa50087b9fbc7898b926c2cd9f0

  1. 经过 a 过程 URL 键值对字典序排序后的字符串 string1 为: attach=It is the description of the product.&body=測試產品&mch_create_ip=127.0.0.1&mch_id=10085200000000&nonce_str=54fa7f8e1006aecb8b58ef6059abb09c&notify_url=http://www.ionline.com.hk/notify_callback&out_trade_no=TRDNO150271173415530&service=ionline.pay.weixin.native.intl&sign_type=MD5&total_fee=10
  2. 经过 b 过程后得到 sign 为: sign =md5(string1&key=902d9aa50087b9fbc7898b926c2cd9f0).toUpperCase =md5(attach=It is the description of the product.&body=測試產品&mch_create_ip=127.0.0.1&mch_id=10085200000000&nonce_str=54fa7f8e1006aecb8b58ef6059abb09c&notify_url=http://www.ionline.com.hk/notify_callback&out_trade_no=TRDNO150271173415530&service=ionline.pay.weixin.native.intl&sign_type=MD5&total_fee=10&key=902d9aa50087b9fbc7898b926c2cd9f0).toUpperCase() ="6C3441C872CEEC1ACF7AB1E69D1C2C76"