最近對接的開放平台有點多,像淘寶、京東、快手、抖音等電商平台的開放平台基本對接了個遍,什么是CRUD BODY
也許就是這樣的吧!!!
雖然對接各大開放平台沒啥技術含量,但咱也得學點東西不是,不能白對接哈!經過這幾天的整理,腦子里大概有了個開放平台接口的設計套路,故整理成文章方便有需要的時間去實現自己的開放平台接口。
開放平台比較關注的幾個點:
- 易用性:接口設計要簡潔,請求參數要見名知意,使服務商能快速接收,為用戶提供服務
- 安全性:開放平台接口是暴露在外網,必須保證用戶數據的安全
- 穩定性:開放平台接口是給上游的服務商使用,必須保證穩定為服務商應用提供服務
- ...
服務商應用
開放平台可以分為幾大部分:
- 接入指南:幫助服務商接入開放平台
- 接口文檔:幫助服務商的開發人員,實現業務功能
- 應用:服務商應用在開放平台的身份標示
服務商接入開放平台的首要步驟就是創建應用,有了服務商應用平台內部就能辨別服務商的身份,這樣就能很方便的做限流、權限控制等。
基本屬性
服務商應用一般有appid、appsecret、授權回調地址這三個基本的屬性:
- appid: 服務商應用的唯一標識
- appsecret:服務商應用的密鑰簽名、驗證身份時用到
- 授權回調地址:授權時會用到
授權認證
授權不是開放平台對服務商應用的授權 ,而是需要開放平台的客戶(用戶)對服務商應用的授予,比如ERP應用,也就是淘寶的店鋪商家對應用進行授權,使其能夠拉取到店鋪的訂單來完成訂單履約。
所以授權需要三個角色才能完成:
- 開放平台
- 提供授權頁面,引導客戶完成服務商應用的授權
- 客戶完成授權后,跳轉到服務商應用提供的
授權回調地址
同時帶上授權信息
- 客戶:在開放平台提供的授權頁面中,完成對服務商應用的授權
- 服務商應用:接收開放平台回調的授權信息,完成務商應用與客戶的綁定關系、保存授權信息
當然也可以使用appid + appsecret 直接認證服務商應用的身份,這種適合沒有第三方的時候,數據都是屬於開放平台的,跟客戶沒有半點關系,也就不存在需要客戶授權的問題。
OAuth2
授權機制
OAuth2
是一套授權標准,現在互聯網做授權基本都用它,如github
登陸 、微信公眾號授權
等都是基於OAuth2
的應用。
如果不了解OAuth2
可以參考我以前的文章:
請求參數
請求參數分兩類:系統參數
、業務參數
:
- 系統參數:每次API調用都必需攜帶的參數
- 業務參數:開放平台根據不同的業務,提供的參數。
業務參數根據業務來定,先說系統參數一般包含:
- appid:服務商應用唯一標識
- appsecret: 服務商應用密鑰
- timestamp:時間戳
- sign:請求簽名
系統參數使用url參數傳遞
業務參數
業務參數是調用開放平台接口時傳遞的請求參數,如一次訂單查詢接口,要實現按訂單狀態的維度
查詢訂單,那么訂單查詢接口就需要接收status
參數,然后去查庫后返回訂單數據。
業務參數的載體,常用的如:application/json
、application/x-www-form-urlencode
等。
業務參數使用post請求參數的方式傳遞,同時也需要參與簽名,后面說簽名會提到
請求簽名
對請求簽名的目的就是防止數據被篡改,常見的md5
、sha
都可以用來做為簽名算法,理論上只要保證雙方能夠生成簽名和驗簽就行,像支付寶這類高安全級別的應用就是使用的非對稱加密
,雙方各生成一對私鑰和公鑰,然后交換公鑰用於驗簽即可。
生成簽名的方式自行定義,這里列舉一個常見的簽名生成方式:
sign = appsecret + appid + timestamp + 業務參數(排序后) + appsecret
偽代碼
String appid = "abcd";
String appsecret = "12345";
Long timestamp = 948758686
//有序map,按key的值排序
Map<String, Object> requestBody = new TreeMap<>();
requestBody.put("a", 1);
requestBody.put("b",21);
requestBody.put("c", 2);
//轉換成json字符串
String jsonBody = JSON.toJSONString(requestBody);
String sign = DigestUtils.md5hex(appsecret + appid + timestamp + jsonBody + appsecret);
驗簽
驗簽步驟與生成簽名的步驟類似,仿代碼如下:
String appid = request.getParameter("appid");
String appsecret = request.getParameter("appsecret");
Long timestamp = request.getParameter("timestamp");
//拿出請求的業務參數,轉成TreeMap
Map<String, Object> requestBody = new TreeMap<>(JSON.parseObject("post請求參數"));
//轉換成json字符串
String jsonBody = JSON.toJSONString(requestBody);
String sign = DigestUtils.md5hex(appsecret + appid + timestamp + jsonBody + appsecret);
String originSign = request.getParameter("sign");
if(Objects.equals(sign ,originSign )){
//驗證簽名成功
}else{
//驗證簽名失敗
}
總結
以上就是開放平台接口設計的一些思路,其實也是對接開放平台多了, 對那些開放平台對接的一些基本的套路的一些整理,希望有朝一日能用上。
對接開放平台的時候遇到的問題不少,有的平台有SDK有的是直接是restapi
,有SDK的平台對接起來還是挺幸福的,下期給大家整個平台SDK的設計。
在下藝名驚天霸戈(驚天bug),一枚喜歡制造bug的Java程序員,目前正在准備出道的路上。。。,記得給我點個贊,鼓勵鼓勵!