Node.js集成支付寶接口注意事項


簽名

使用node.js自帶的加密模塊crypto和字符編碼模塊iconv-lite
根據支付寶接口文檔參數格式得到簽名之前的字符串beforeSignStr,然后一定要編碼為gbk格式再進行簽名。

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寫的,注意:表單字符串編碼也要設置為gbk

//請求表單
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格式再進行簽名。

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" );
}

總結

  1. 在node中請求參數和響應參數都要轉換為gbk才能正常簽名和驗簽。
  2. 如果你使用的是沙箱模式,請注意請求參數time_express訂單超時時間不能設置超過15h(盡管文檔說明最大可以設置15d),否則支付寶無法響應訂單。
  3. noical_url不響應,可能是響應頭:'content-type' : 'application/x-www-form-urlencoded; text/html..的問題,導致bodyparse解析不出來,可以在bodyparse之前增加一個中間件,判斷響應頭是否從支付寶過來的,然后修改為正常的'content-type' : 'application/x-www-form-urlencoded'
  4. 如果驗簽不通過,最好用支付寶自帶的驗簽工具測試下,如果依然不行那可能是你用的公鑰不對,不能使用應用公鑰,應該使用支付寶公鑰。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM