最近對(duì)接的開放平臺(tái)有點(diǎn)多,像淘寶、京東、快手、抖音等電商平臺(tái)的開放平臺(tái)基本對(duì)接了個(gè)遍,什么是CRUD BODY也許就是這樣的吧?。?!
雖然對(duì)接各大開放平臺(tái)沒(méi)啥技術(shù)含量,但咱也得學(xué)點(diǎn)東西不是,不能白對(duì)接哈!下面分享主流電商平臺(tái)開放訂單API接口的接入:
經(jīng)過(guò)這幾天的整理,腦子里大概有了個(gè)開放平臺(tái)接口的設(shè)計(jì)套路,故整理成文章方便有需要的時(shí)間去實(shí)現(xiàn)自己的開放平臺(tái)接口。
開放平臺(tái)比較關(guān)注的幾個(gè)點(diǎn):
? 易用性:接口設(shè)計(jì)要簡(jiǎn)潔,請(qǐng)求參數(shù)要見名知意,使服務(wù)商能快速接收,為用戶提供服務(wù)
? 安全性:開放平臺(tái)接口是暴露在外網(wǎng),必須保證用戶數(shù)據(jù)的安全
? 穩(wěn)定性:開放平臺(tái)接口是給上游的服務(wù)商使用,必須保證穩(wěn)定為服務(wù)商應(yīng)用提供服務(wù)
? ... 服務(wù)商應(yīng)用
開放平臺(tái)可以分為幾大部分:
1. 接入指南:幫助服務(wù)商接入開放平臺(tái)
2. 接口文檔:幫助服務(wù)商的開發(fā)人員,實(shí)現(xiàn)業(yè)務(wù)功能
3. 應(yīng)用:服務(wù)商應(yīng)用在開放平臺(tái)的身份標(biāo)示 服務(wù)商接入開放平臺(tái)的首要步驟就是創(chuàng)建應(yīng)用,有了服務(wù)商應(yīng)用平臺(tái)內(nèi)部就能辨別服務(wù)商的身份,這樣就能很方便的做限流、權(quán)限控制等。 基本屬性 服務(wù)商應(yīng)用一般有appid、appsecret、授權(quán)回調(diào)地址這三個(gè)基本的屬性:
? appid: 服務(wù)商應(yīng)用的唯一標(biāo)識(shí)
? appsecret:服務(wù)商應(yīng)用的密鑰簽名、驗(yàn)證身份時(shí)用到
? 授權(quán)回調(diào)地址:授權(quán)時(shí)會(huì)用到 授權(quán)認(rèn)證 授權(quán)不是開放平臺(tái)對(duì)服務(wù)商應(yīng)用的授權(quán) ,而是需要開放平臺(tái)的客戶(用戶)對(duì)服務(wù)商應(yīng)用的授予,比如ERP應(yīng)用,也就是淘寶的店鋪商家對(duì)應(yīng)用進(jìn)行授權(quán),使其能夠拉取到店鋪的訂單來(lái)完成訂單履約。
淘寶授權(quán)頁(yè) 所以授權(quán)需要三個(gè)角色才能完成:
? 開放平臺(tái)
■ 提供授權(quán)頁(yè)面,引導(dǎo)客戶完成服務(wù)商應(yīng)用的授權(quán)
■ 客戶完成授權(quán)后,跳轉(zhuǎn)到服務(wù)商應(yīng)用提供的授權(quán)回調(diào)地址同時(shí)帶上授權(quán)信息
? 客戶:在開放平臺(tái)提供的授權(quán)頁(yè)面中,完成對(duì)服務(wù)商應(yīng)用的授權(quán)
? 服務(wù)商應(yīng)用:接收開放平臺(tái)回調(diào)的授權(quán)信息,完成務(wù)商應(yīng)用與客戶的綁定關(guān)系、保存授權(quán)信息 當(dāng)然也可以使用appid + appsecret 直接認(rèn)證服務(wù)商應(yīng)用的身份,這種適合沒(méi)有第三方的時(shí)候,數(shù)據(jù)都是屬于開放平臺(tái)的,跟客戶沒(méi)有半點(diǎn)關(guān)系,也就不存在需要客戶授權(quán)的問(wèn)題。 OAuth2授權(quán)機(jī)制 OAuth2是一套授權(quán)標(biāo)準(zhǔn),現(xiàn)在互聯(lián)網(wǎng)做授權(quán)基本都用它,如github登陸 、微信公眾號(hào)授權(quán)等都是基于OAuth2的應(yīng)用。
授權(quán)流程
請(qǐng)求參數(shù) 請(qǐng)求參數(shù)分兩類:系統(tǒng)參數(shù)、業(yè)務(wù)參數(shù):
? 系統(tǒng)參數(shù):每次API調(diào)用都必需攜帶的參數(shù)
? 業(yè)務(wù)參數(shù):開放平臺(tái)根據(jù)不同的業(yè)務(wù),提供的參數(shù)。
業(yè)務(wù)參數(shù)根據(jù)業(yè)務(wù)來(lái)定,先說(shuō)系統(tǒng)參數(shù)一般包含:
? appid:服務(wù)商應(yīng)用唯一標(biāo)識(shí)
? appsecret: 服務(wù)商應(yīng)用密鑰
? timestamp:時(shí)間戳
? sign:請(qǐng)求簽名
系統(tǒng)參數(shù)使用url參數(shù)傳遞 業(yè)務(wù)參數(shù) 業(yè)務(wù)參數(shù)是調(diào)用開放平臺(tái)接口時(shí)傳遞的請(qǐng)求參數(shù),如一次訂單查詢接口,要實(shí)現(xiàn)按訂單狀態(tài)的維度查詢訂單,那么訂單查詢接口就需要接收status參數(shù),然后去查庫(kù)后返回訂單數(shù)據(jù)。 業(yè)務(wù)參數(shù)的載體,常用的如:application/json、application/x-www-form-urlencode等。 業(yè)務(wù)參數(shù)使用post請(qǐng)求參數(shù)的方式傳遞,同時(shí)也需要參與簽名,后面說(shuō)簽名會(huì)提到 請(qǐng)求簽名 對(duì)請(qǐng)求簽名的目的就是防止數(shù)據(jù)被篡改,常見的md5、sha都可以用來(lái)做為簽名算法,理論上只要保證雙方能夠生成簽名和驗(yàn)簽就行,像支付寶這類高安全級(jí)別的應(yīng)用就是使用的非對(duì)稱加密,雙方各生成一對(duì)私鑰和公鑰,然后交換公鑰用于驗(yàn)簽即可。 生成簽名的方式自行定義,這里列舉一個(gè)常見的簽名生成方式: sign = appsecret + appid + timestamp + 業(yè)務(wù)參數(shù)(排序后) + 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);
//轉(zhuǎn)換成json字符串
String jsonBody = JSON.toJSONString(requestBody);
String sign = DigestUtils.md5hex(appsecret + appid + timestamp + jsonBody + appsecret);
驗(yàn)簽 驗(yàn)簽步驟與生成簽名的步驟類似,仿代碼如下:
# 封裝好API供應(yīng)商demo url=o0b.cn/ibrad, wechat id: TaoxiJd
String appid = request.getParameter("appid");
String appsecret = request.getParameter("appsecret");
Long timestamp = request.getParameter("timestamp");
//拿出請(qǐng)求的業(yè)務(wù)參數(shù),轉(zhuǎn)成TreeMap
Map<String, Object> requestBody = new TreeMap<>(JSON.parseObject("post請(qǐng)求參數(shù)"));
//轉(zhuǎn)換成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 )){
//驗(yàn)證簽名成功
}else{
//驗(yàn)證簽名失敗
}
總結(jié) 以上就是開放平臺(tái)接口設(shè)計(jì)的一些思路,其實(shí)也是對(duì)接開放平臺(tái)多了, 對(duì)那些開放平臺(tái)對(duì)接的一些基本的套路的一些整理,希望有朝一日能用上。 對(duì)接開放平臺(tái)的時(shí)候遇到的問(wèn)題不少,有的平臺(tái)有SDK有的是直接是restapi,有SDK的平臺(tái)對(duì)接起來(lái)還是挺幸福的,下期給大家整個(gè)平臺(tái)SDK的設(shè)計(jì)。