支付總結之簽名驗證
之前寫接口的時候用到了簽名驗證,生成規則如下
1.根據參數名稱,按照字典順序,升序排序
2.拼接參數以及參數值,按照排序以後的key,value直接連接的方式,key和value之間不需要加任何的字符
3.將拼接以後的字符串前後加上簽名密鑰
4.進行MD5加密,然後轉大寫
生成部分(通過js)
function generateSign( params, secret_code ) { var names = []; for ( var name in params ) { names.push( name ); } names.sort();var str = secret_code; for ( var i = 0; i < names.length; i ++ ) { var name = names[i]; str += name + params[name]; } str += secret_code; alert(str); return hex_md5( str ).toUpperCase(); }
驗證部分(後臺php)
function generateSign( $partner, $params, $secret_code ) { ksort( $params ); $stringToBeSigned = $secret_code; foreach ( $params as $k => $v ) { $stringToBeSigned .= "$k$v"; } unset( $k, $v ); $stringToBeSigned .= $secret_code; return strtoupper( md5( $stringToBeSigned ) ); }
主要流程是商戶生成一個簽名然後請求我們的時候我們要通過他們的簽名密鑰生成一個簽名然後再驗證正確性,這個例子是典型的對稱加密,優點是生成方便解析速度快。但是密鑰雙方保存,一但一方丟失會有很大的危險。
隨著項目的擴展,我們需要有自己的支付平臺,因為涉及到支付,所以對於安全性也有一定的要求,因此商戶請求接口的時候用到了RSA2(一種非對稱加密方式)加密方式,非對稱加密我理解為公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麽只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。如果不懂的話可以參考阮一峰大神的講解http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
這就需要改下規則了
1.商戶生成一對密鑰(公鑰和私鑰),公鑰給我們,私鑰自己留下。
2.我們拿到公鑰之後存到對應的商戶的屬性裏面,主要是為了分清不同商戶對應的密鑰。
3.商戶請求接口的時候要根據自己的私鑰生成一個簽名放到自己的xml或者json數據中(生成方式下面)。
5.我們拿到xml或者json數據之後我們會分析數據找到sign,在進行下一步之前先要驗證簽名的正確性,這時就要取出相應商戶的公鑰來驗證了。
以上是大致流程,下面是代碼部分
支付總結之簽名驗證