1. 程式人生 > >node 網站呼叫支付寶介面探索過程

node 網站呼叫支付寶介面探索過程

node 網站呼叫支付寶支付 全程記錄。

該遇到的坑,我覺得都遇到了,整個過程不算太順,也沒花多少時間。

1.找介面

2.簽名

使用工具生成公鑰和私鑰,公鑰上傳到螞蟻金服的網站上。

let signer = crypto.createSign('RSA-SHA256') //rsa2
signer.update(_r)//_r 待簽名的字串
let _s = signer.sign(_privateKey, 'base64'); //_privateKey 私鑰

在node 端 如果使用私鑰

需要在開頭新增一行—–BEGIN RSA PRIVATE KEY—–

在結尾新增 一行 —–END RSA PRIVATE KEY—–

產生簽名後,再拿出待簽名欄位放在工具裡,填上私鑰,發現產生的簽名和程式的不一樣!!!

經過一番查詢,,你妹的,待簽名的引數排序的問題,順序沒排對��。

3.傳送請求

我第一感覺是用node傳送https 請求。(不要問為什麼)
先用的是post ,發現返回的是 html (好吧,我已經發現該介面是 前端直接訪問拼接好的url 即可,但是發現返回的是亂碼,編碼格式GB2312,平時爬蟲沒遇到過,正好試一下。)
使用的是iconv-lite 這個模組。我使用的是 原始的https 請求,自己封裝的。所以使用方法是,先把 res.setEncoding(‘utf8’)控制編碼的語句刪掉。如此處理後,請求到的資料返回的是以二進位制的形式,然後使用 let decodeHtmlData = iconv.decode(chunk,'gb2312')

然後我把引數和地址拼成一個url ,輸入瀏覽器回車。
簽名錯誤 不過還好支付寶把待簽名的字串給返回了,我比較了一下,
找到了問題,支付寶簽名 除了排序,還需要使用 =和& 序列化,我比較懶直接使用的querystring模組。這個模組會把字串直接進行url編碼,然而簽名時 不需要進行url 編碼,然後就自己隨便寫了一個拼接的函式,因為是些demo 沒寫的那麼嚴謹,也沒寫排序,因為我是按順序新增的

function wjoin(par) {
  let a = '';
  for (let i in par) {
    par[i]&&(a = a + i + '='
+ par[i] + '&'); } return a.slice(0, a.length - 1) }

再次嘗試,直接ok

4.驗籤

接收到支付寶的非同步通知後,需要做的就是驗籤。不驗籤 誰知道這介面是誰通知你的。 需要接受阿里的非同步通知 需要post 介面。

驗籤的函式crypto 裡面有,網上一搜也是很多。

  let verify = crypto.createVerify('RSA-SHA256');
  verify.update(strp, 'utf8');
  let result = verify.verify(_publishKey, sign, 'base64');

ps. 公鑰需要新增
需要在開頭新增一行—–BEGIN PUBLIC KEY—–
在結尾新增 一行 —–END PUBLIC KEY—–
本來我以為是—–BEGIN RSA PUBLIC KEY—– //-_-

然後只返回了個 false
用工具再試了一次,也是驗證失敗。
我試了很多次。查了N 多個文件。

最後 我發現 需要的是 支付寶公鑰,而不是之前我們自己生成的公鑰。
當我知道了這個東西后,我狠狠的說了一句 *

ps. 如果按我這個教程,還不能解決您的問題的話,可以留言。