前言:公司的業務主要是對接財務系統做單據傳輸或者憑證處理的,難免少不了和各大財務軟體做資料對接,其中當然是必須通過介面來傳遞資料了。於是乎,用友T+的版本來了,對接的工作自然是我來做,可沒想到就是這樣一個T+介面,搞得我快吐血了。
1.先簡單描述下專案的執行環境,.net core 2.2。這也是導致後來一直卡在介面對接上的一大原因。介面不太支援.net core的執行環境。因為自己之前也處理過財務介面,金蝶K3,KIS賬務平臺,K3wise,U8Cloud等等,說實話,T+還是第一次接觸,當然第一件事肯定是看官方文件了。直通車 T+開發平臺,不過開啟之後,瀏覽器一直在重新整理頁面,後來問了社群的服務人員人家說換個瀏覽器試試,換了T+的瀏覽器,結果還是一直重新整理,到底是啥問題,我們也不知道,我們也不敢問??,後來在官網的文件中給瞭解釋,說是最好使用IE和360瀏覽器,估計是客戶使用的比較多吧,所以才不相容主流的Google瀏覽器嘛?
2.OK,那麼首要任務就是先熟悉介面定義以及相關的請求方式和請求引數等等,當然返回引數也是需要的。接著就開始將介面封裝到專案中了,T+ OpenAPI v2 介面需要引入鑑權機制,簡單的來說就是需要在每次請求業務介面時,請求的Header需要帶上Authorization引數,那麼Authorization怎麼來獲取呢?見下圖,即 對appKey,authInfo,orgId做base64位的加密。那麼authInfo的值又如何獲取呢?請看官方文件的註釋,即 對 appkey,orgid,appsecret這三個引數做一次簽名演算法,那麼還有兩個問題需要解決。第一,這三個引數怎麼獲取?ISV申請 http://tplusdev.chanjet.com/enterprise 官網註冊後會有ISV的申請,點選申請填寫好資料後系統會有人員稽核資質併發放具體的加密金鑰。好了,第一個問題解決了,那麼第二個問題呢?簽名演算法怎麼做。不要著急,官網也有提供,這裡僅標註C#版本,因為使用的環境是.net 的 簽名1的下載地址簽名1下載。
3.OK,我們接著往下看,如果上一步的工作都做完並且正常返回 {"result":true,"access_token":"03e74889-1457-48cd-970a-ba3742ffcdea","sid":""} 的資訊時,不要高興的太早,我當時也以為介面呼叫成功了,沒想到啊,還是太年輕。還有接著的業務呼叫需要用到上一步請求到的access_token。請求方式,如下圖官網給的註釋一樣,只不過在做authInfo的值處理時,需要新增第一步獲取到的access_token的值同時做簽名2的處理。簽名2地址下載。不過官網給的還有對應的winForm demo大家可以下載後,根據自己的引數做出修改,並且可以線上除錯,還是比較方便的,比較容易定位到問題。T+OpenAPI測試工具(包含v2版本).zip(C#) .
4.好了,坑終於來了,下載完demo後,將demo中用到的dll拷貝到自己的專案中去。主要用到的dll 有這麼多
由於官網提供的版本是.NET Framework的版本,但是專案中的環境是.net core2.2,大家都知道,目前.net Framework的好多類庫,在.net core 下是不支援的,比如介面中用到的jose-jwt.dll
遇到這種情況,我的第一反應是反編譯,將dll反編譯為工程檔案,再引用到自己的專案中去。因為之前做金蝶K3Cloud的介面也是,提供的是framework的版本,當時也是搞了好久的介面,最後採用的反編譯專案才搞定的。所以這次也是想著直接反編譯專案試試,結果,自己還是太年輕。反編譯的專案在.net core 下也不能用。怎麼辦呢,當然是問了,在社群釋出問題,加QQ群,問群裡的大佬,有用的回答寥寥無幾,不過還是感謝群裡的一個朋友,指出來是jwt的加密演算法有問題,雖然最後我實在是找不到到底是加密演算法哪的問題,問了他好幾次,他也沒有告訴我。??不過還是謝謝他。
至於加密演算法是哪的問題,最後我也找到了問題,不過解決辦法卻沒有找到。反編譯出來的加密演算法,在執行到num=加密方法的時候,最後返回的num值不是0,所以到這一步總是會報錯,至於為啥會報錯,對不起,我到現在也沒搞清楚,因為加密原始碼這塊,實在是看不太懂。原諒本人經歷太淺,技術太菜。??。就這樣,一個業務呼叫的介面,搞了我差不多一個星期的時間,無奈啊,還是沒搞定,只好求助自己的技術老大了,也是自己的老師,非常感謝感謝。在他努力一天的結果下,終於把介面的第一步調通了,但是夜裡接到他通知我介面搞定的微信後,我就睡不著了。一直在想,在?希望業務呼叫的介面也能正常使用。懷著忐忑的心情,跑起來他給我的專案,哈,果然,控制檯確實返回了結果,只不過是Token的獲取結果。還不能確定第二步是否能用。
後續我將業務呼叫的程式碼新增上後,激動的按下了F5,結果還是不出所料,介面返回 提供的令牌資訊不正確。。。這些天,我看這些個文字已經快看吐了。帶著截圖去群裡問大佬,@大佬,結果沒有人回覆。哎,我也不知道為啥,問個問題也沒回復的。沒辦法,接著除錯唄。將老大給我的新封裝的.net core 環境下的T+專案裡的jose-jwt 新增到官網給的framework的winForm程式裡去,這樣除錯,我就能快速找到問題所在,並且修正問題。皇天不負有心人啊,終於,感謝天,感謝地,再沒出現 令我作嘔的錯誤文字了。不由地心裡好一陣激動。不容易啊,不容易。
5.至此,終於是將T+的介面給搞定了,也不枉自己在這上面耽誤這麼多時間,感覺自己的頭髮又掉了好多。???最後的最後,附上.net core 環境下T+的介面呼叫,給有需要的朋友,也免得大家入坑。Tplus.net core介面下載
總結一下,在處理介面問題的時候,其實最重要的還是要徹底理解介面的定義,然後做起來才能得心應手,不過,也很感謝這次經歷,起碼有了對接T+介面的經驗,下次遇到同樣的專案就可以直接使用了,也免去了後續的麻煩。也希望自己在以後的工作中能更加有經驗。加油。