平臺技術-SPI服務接入文檔
什么是SPI
- 服務商提供接口(Service Provider Interface)
- API:平臺提供接口并實現(xiàn),您來調(diào)用
- SPI:平臺提供標準,您來實現(xiàn),可以有多個實現(xiàn)方
SPI入駐流程
您需要做的是第三個方塊中的工作。
申請業(yè)務場景
首先,您得有一個擁有“三方應用”標簽的APP。點這里進行申請。
申請成功后,進入這個應用的控制臺,就能看見“API服務提供”菜單
注意:在概覽里可以看見當前應用的AppKey和AppSecret。
- AppKey:有兩個作用.
- 場景Owner(就是引見您接入SPI的人)將此AppKey與場景綁定后,您就擁有了某場景的開發(fā)權,在此頁面就能看見這個場景。
- SPI調(diào)用方需要在TargetAppkey填寫這個AppKey,才能調(diào)到您實現(xiàn)的服務;
- AppSecret:開放平臺(TOP)在調(diào)用您實現(xiàn)的服務時,會對報文進行簽名(詳見簽名相關章節(jié))。簽名時就是使用這個密鑰。您需要使用這個密鑰進行驗簽。
我們拿“氣象”場景舉例。當場景Owner將此場景與您的AppKey綁定以后,在這個頁面就能看見“氣象”場景。
此時的場景狀態(tài)是“開發(fā)中”。除了這個狀態(tài),場景還有“上線運行中”、“升級中”等幾個狀態(tài)。
- “開發(fā)中”至“上線運行中”:申請發(fā)布審核通過;
- “上線運行中”至“升級中”:點擊進入升級后,對任何一個API點擊升級版本。點擊“取消升級”或申請發(fā)布并通過審核會重新回到“上線運行中”。
進入場景后可見到場景中的所有待實現(xiàn)的API,見下圖。
與此同時,場景旁邊是它的當前狀態(tài)。
閱讀文檔
開發(fā)前一定要先仔細閱讀文檔,點擊“開發(fā)文檔”后可見到下圖。
請嚴格按照文檔進行開發(fā),具體關注:
- 請求方法:POST 或 GET;
- 請求編碼:UTF-8 或 GBK;
- 公共請求參數(shù)、業(yè)務請求參數(shù)以及響應參數(shù)要與文檔完全一致。返回值可參考返回示例;
- 異常處理:按照這里的規(guī)范返回指定的字段,開放平臺藉此判斷您的返回是成功或失敗;
- 請求示例:可使用這里的示例替換上您的參數(shù),測試您實現(xiàn)的服務。注意,這個方法對排查錯誤非常有用。
服務開發(fā)
服務開發(fā)完成是您自主研發(fā)的過程,您只需要嚴格按照文檔中的協(xié)議進行開發(fā)即可。開發(fā)語言、部署環(huán)境都沒有特別的要求。
為了安全,我們強烈建議您的服務要驗證簽名以及驗證請求方的IP。為了方便您的開發(fā),我們有SDK提供給你,SDK下載頁面請看下圖。
簽名校驗
必選!驗簽的目的是防止黑客惡意調(diào)用你的服務,確保服務發(fā)起來源是阿里平臺。
目前驗簽方法只提供了JAVA、PHP、.NET三個版本的SDK,其它語言需要自行實現(xiàn)。
簽名方法生成規(guī)則是:
- 將query參數(shù)、header參數(shù)存入一個map中備用。為了方便說明,這個map取名為params。注意:query中的sign參數(shù)不能放入params;
- 如果body中的類型是form-data,將body中的所以除文件以外的參數(shù)放入params。因為一些技術原因,通過form-data傳遞的文件不進行簽名;
- 如果body中的類型是json或xml,暫時將body保存起來后面?zhèn)溆?。為了方便說明 ,這段內(nèi)容取名為body;
- 將params進行按key的字母先后順序排序,然后遍歷它,按key1+value2+key2+value2……的方式形成一個字符串,為了方便說明,后續(xù)稱之為簽名串。如果value為空,則用””來代替。如果body不為空,則在簽名串最后增加body的所有內(nèi)容;
- 在簽名串的頭和尾加上secret。這個secret是sp申請應用時獲得的。至此,簽名串生成好了;
- 對簽名串進行md5以及hex,最后得到sign。總結一下,生成sign的公式是:
hex(md5(secret+sorted(header_params+url_params+form_params)+body)+secret) - 最后,將生成的sign與從query中獲取到的sign進行對比,即可校驗簽名的正確性。
驗簽示例代碼如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.taobao.api.internal.spi.CheckResult;
import com.taobao.api.internal.spi.SpiUtils;
public class TestHttpServlet extends HttpServlet {
private static final long serialVersionUID = -7841738585932624564L;
protected void doPost(HttpServletRequest req, HttpServletResponse rsp) throws ServletException, IOException {
CheckResult result = SpiUtils.checkSign(req, "fb821bc8785f2409a942eec601e6071d");
System.out.println(result.isSuccess());
System.out.println(result.getRequestBody());
}
}
IP來源校驗
必選!防止黑客截取到開放平臺發(fā)起的HTTP請求,拿到別的地方進行重放攻擊。
淘寶開放平臺網(wǎng)關的出口IP段可以通過taobao.top.ipout.get來獲取,不定期更新,需要定時調(diào)用API獲取最新數(shù)據(jù)。
IP來源校驗示例代碼如下:
private static final long serialVersionUID = -7841738585932624564L;
protected void doPost(HttpServletRequest req, HttpServletResponse rsp) throws ServletException, IOException {
// 最新IP段列表可通過taobao.top.ipout.get獲得
List<String> ipList = new ArrayList<String>();
ipList.add("140.205.144.0/24");
ipList.add("140.205.145.0/24");
ipList.add("140.205.40.0/24");
ipList.add("140.205.39.0/24");
ipList.add("140.205.51.0/24");
ipList.add("140.205.56.0/24");
boolean isSuccess = SpiUtils.checkRemoteIp(req, ipList);
if (!isSuccess) {
rsp.getWriter().write("access denied");
rsp.getWriter().flush();
}
}
}
另外一種做法是在HTTP Server上配置IP訪問規(guī)則,如在Nginx上配置只允許TOP的IP訪問/taobao目錄:
allow 140.205.144.0/24;
allow 140.205.145.0/24;
allow 140.205.39.0/24;
allow 140.205.40.0/24;
allow 140.205.51.0/24;
allow 140.205.56.0/24;
deny all;
}
配置服務
點擊“開發(fā)測試”進行下圖的頁面:
這里有兩個地址輸入框:
- 測試環(huán)境地址:此地址僅供測試使用。下一節(jié)詳細討論。
- 線上環(huán)境地址:當此SPI服務發(fā)布上線后,線上環(huán)境調(diào)用的地址就是此URL。
測試服務
共有兩個地方或以發(fā)起測試,
1) SPI測試工具。點擊本頁面的“進入測試”即可進入此工具。請見下圖:
默認情況下,只有一個測試用例:冒煙測試。這個測試僅僅是由SPI測試工具按照協(xié)議拼裝一個HTTP請求發(fā)送給測試環(huán)境地址。
如果希望增加測試用例,請聯(lián)系SPI平臺負責人。
測試結束后,可以在測試詳情中查看這次HTTP請求的所有參數(shù)。您尤其要關注“響應信息”中的內(nèi)容,它可能初步檢查你的服務是否正常。
2) API測試工具日常、沙箱環(huán)境:這里的測試是對SPI完整流程進行的測試,是您的服務發(fā)布上線前必不可少的步驟,只有這個步驟通過,才能證明您的服務運行正常。
調(diào)用一個TOP API,TOP把請求路由到您的測試環(huán)境地址,您需要把AppKey告訴API調(diào)用者,后者將在它前面加上“10"填入?yún)?shù)targetAppkey。
您也可以親自客串a(chǎn)pi調(diào)用者,前提條件是場景owner先將此API加入沙箱,然后您申請調(diào)用此api的權限。要注意的是,沙箱測試的targetAppkey也是您的appkey前面加上“10”;還有,簽名密鑰是沙箱密鑰。
API的調(diào)用方法可以去這里看文檔。
申請發(fā)布
測試結束后,點擊“完成測試”回到圖5的場景列表頁。如果您覺得可以將新配置的URL發(fā)布生效,點擊“申請發(fā)布”。如果此場景配置成“需要審核”,則需要SPI平臺負責人審核通過方可發(fā)布生效;否則,可立即生效。
FAQ
- 關于此文檔暫時還沒有FAQ