#
簽名與驗簽
更新時間:2017-06-13
# [](https://docs.open.alipay.com/#%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0%E7%AD%BE%E5%90%8D)請求參數簽名
1. 篩選
獲取所有請求參數,不包括字節類型參數,如文件、字節流,剔除sign與sign\_type參數。
2. 排序
將篩選的參數按照第一個字符的鍵值ASCII碼遞增排序(字母升序排序),如果遇到相同字符則按照第二個字符的鍵值ASCII碼遞增排序,以此類推。
3. 拼接
**將排序后的參數與其對應值,組合成“參數=參數值”的格式,并且把這些參數用&字符連接起來,此時生成的字符串為待簽名字符串。MD5簽名的商戶需要將key的值拼接在字符串后面,調用MD5算法生成sign;RSA簽名的商戶將待簽名字符串和商戶私鑰帶入SHA1算法中得出sign。**
商戶如用支付寶提供的demo集成,demo已寫好簽名驗簽的方法,商戶可直接調用,如自己開發不用demo,則按以上方法拼接待簽名字符串。**以下是待簽名字符串的示例,key值已被隱藏,參數值都是示例不是真實的,商戶參考格式即可:**
~~~
_input_charset=utf-8&body=testjsdzbody¬ify_url=http://www.test.com/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp&out_trade_no=9890879868657&partner=2088000000000000&payment_type=1&return_url=http://www.baidu.com&seller_id=2088000000000000&service=create_direct_pay_by_user&subject=testjsdz&total_fee=0.01svzitn**********pslfal77xlxm0qhc
~~~
以下是最終的請求信息,sign值被隱藏:
~~~
http://mapi.alipay.com/gateway.do?body=testjsdzbody&subject=testjsdz&sign_type=MD5¬ify_url=http://www.test.com/create_direct_pay_by_user-JAVA-UTF-8/notify_url.jsp&out_trade_no=9890879868657&return_url=http://www.baidu.com&sign=***&_input_charset=utf-8&total_fee=0.01&service=create_direct_pay_by_user&partner=2088000000000000&seller_id=2088000000000000&payment_type=1
~~~
# [](https://docs.open.alipay.com/#%E8%BF%94%E5%9B%9E%E5%8F%82%E6%95%B0%E9%AA%8C%E8%AF%81%E7%AD%BE%E5%90%8D)返回參數驗證簽名
1. 篩選
獲取所有支付寶返回的參數,不包括字節類型參數,如文件、字節流。驗簽參數剔除sign與sign\_type參數。
2. 排序
將篩選的參數按照第一個字符的鍵值ASCII碼遞增排序(字母升序),如果遇到相同字符則按照第二個字符的鍵值ASCII碼遞增排序,以此類推。
3. 拼接
將排序后的參數與其對應值,組合成“參數=參數值”的格式,并且把這些參數用&字符連接起來。
例如下面的返回示例(此示例跟上面的請求示例沒關系,其中的值都是示例不是真實的,商戶參考格式即可):
~~~
http://商戶自定義地址/notify_url.php?trade_no=2014040311001004370000361525&out_trade_no=3618810634349901&subject=測試&body=Hello&price=10.00&quantity=1&total_fee=10.00&trade_status=TRADE_FINISHED&seller_email=test@test.com&seller_id=2088002007018916&buyer_id=2088002000000000&buyer_email=13788888888&gmt_create=2014-04-03 20:49:31&is_total_fee_adjust=N&gmt_payment=2014-04-03 20:49:50&use_coupon=N¬ify_time=2014-04-03 20:49:52¬ify_type=trade_status_sync¬ify_id=70fec0c2730b27528665af4517c27b95&sign_type=DSA&sign=_p_w_l_h_j0b_gd_aejia7n_ko4_m%2Fu_w_jd3_nx_s_k_mxus9_hoxg_y_r_lunli_pmma29_t_q%3D%3D&extra_common_param=你好,這是測試商戶的廣告。
~~~
組成的待簽名字符串為:
~~~
body=Hello&buyer_email=13788888888&buyer_id=2088002007013600&extra_common_param=你好,這是測試商戶的廣告。&gmt_create=2014-04-03 20:49:31&gmt_payment=2014-04-03 20:49:50&is_total_fee_adjust=N¬ify_id=70fec0c2730b27528665af4517c27b95¬ify_time=2014-04-03 20:49:52¬ify_type=trade_status_sync&out_trade_no=3618810634349901&price=10.00&quantity=1&seller_email=test@test.com&seller_id=2088002007018916&subject=測試&total_fee=10.00&trade_no=2014040311001004370000361525&trade_status=TRADE_FINISHED&use_coupon=N
~~~
demo中提供了驗簽的示例,商戶可直接調用或參考。MD5:把MD5密鑰(Key)拼接在待驗證簽名的字符串尾部,然后使用各自語言對應的MD5加密函數進行加密,得到的加密值與支付寶返回的參數sign做“相等”判斷,同時對返回參數中的notify\_id進行驗證,如果這兩個數據同時為true,則驗證通過。