使用node.js自帶的加密模塊crypto和字符編碼模塊iconv-lite
根據支付寶接口文檔參數格式獲得簽名以前的字符串beforeSignStr,而後必定要編碼爲gbk格式再進行簽名。html
let crypto = require('crypto'); const iconv = require('iconv-lite'); // RSA2簽名 function getSign( beforeSignStr ) { let sign = crypto.createSign('RSA-SHA256'); return sign.update( iconv.encode( beforeSignStr, "gbk" ) ).sign( 私鑰字符串, "base64" ); }
我這裏是直接參考支付寶PHP接口SDK寫的,注意:表單字符串編碼也要設置爲gbkjava
//請求表單 function getRequestForm( requestBody ) { let form = "<form id='alipaysubmit' name='alipaysubmit' action='" + 請求支付寶url + "' accept-charset='gbk' method='POST'>"; for( let key in requestBody ) { form += "<input type='hidden' name='" + key + "' value='" + requestBody[key] + "'/>"; } form += "<input type='submit' value='ok' style='display:none;'></form><script>document.forms['alipaysubmit'].submit();</script>"; return form; }
驗籤須要用到加密模塊crypto、字符串編碼模塊iconv-lite、url編碼模塊urlencode
根據支付寶接口文檔參數格式獲得驗籤以前的字符串beforeVerifyStr,而後必定要編碼爲gbk格式再進行簽名。node
let crypto = require('crypto'); const urlencode = require('urlencode'); const iconv = require('iconv-lite'); // 獲得驗簽結果 function getVerifySign( beforeVerifyStr ) { let verify = crypto.createVerify('RSA-SHA256'); return verify.update( iconv.encode( urlencode.decode( beforeVerifyStr, "gbk" ), "gbk" ) ).verify( 公鑰字符串, 支付寶響應簽名, "base64" ); }
- 在node中請求參數和響應參數都要轉換爲gbk才能正常簽名和驗籤。
- 若是你使用的是沙箱模式,請注意請求參數
time_express
訂單超時時間不能設置超過15h(儘管文檔說明最大能夠設置15d),不然支付寶沒法響應訂單。- noical_url不響應,多是響應頭:
'content-type' : 'application/x-www-form-urlencoded; text/html..
的問題,致使bodyparse解析不出來,能夠在bodyparse以前增長一箇中間件,判斷響應頭是否從支付寶過來的,而後修改成正常的'content-type' : 'application/x-www-form-urlencoded'
。- 若是驗籤不經過,最好用支付寶自帶的驗籤工具測試下,若是依然不行那多是你用的公鑰不對,不能使用應用公鑰,應該使用支付寶公鑰。