easyopen接口交互詳解

請求參數

easyopen定義了7個固定的參數,用json接收算法

{
	"name":"goods.get",
	"version":"2.0",
	"app_key":"test",
	"data":"%7B%22goods_name%22%3A%22iphone6%22%7D",	
	"format":"json",	
	"timestamp":"2018-01-16 17:02:02",
	"sign":"4CB446DF67DB3637500D4715298CE4A3"
}
  • name:接口名稱
  • version:接口版本號
  • app_key:分配給客戶端的app_key
  • data:業務參數,json格式而且urlencode
  • format:返回格式,json,xml兩種
  • timestamp:時間戳,yyyy-MM-dd HH:mm:ss
  • sign:簽名串

其中sign須要使用雙方約定的簽名算法來生成。json

請求方式

請求數據放在body體中,採用json格式。這裏給出一個POST工具類:數組

public class PostUtil {

    private static final String UTF8 = "UTF-8";
    private static final String CONTENT_TYPE_JSON = "application/json";
    private static final String ACCEPT_LANGUAGE = "Accept-Language";

    
    /**
     * POST請求
     * @param url
     * @param params
     * @param lang 語言zh,en
     * @return
     * @throws Exception
     */
    public static String post(String url, JSONObject params, String lang) throws Exception {
        String encode = UTF8;
        // 使用 POST 方式提交數據
        PostMethod method = new PostMethod(url);
        try {
            String requestBody = params.toJSONString();
            // 請求數據放在body體中,採用json格式
            method.setRequestEntity(new StringRequestEntity(requestBody, CONTENT_TYPE_JSON, encode));
            // 設置請求語言
            method.setRequestHeader(ACCEPT_LANGUAGE, lang);

            HttpClient client = new HttpClient();
            int state = client.executeMethod(method); // 返回的狀態

            if (state != HttpStatus.SC_OK) {
                throw new Exception("HttpStatus is " + state);
            }

            String response = method.getResponseBodyAsString();

            return response; // response就是最後獲得的結果
        } catch (Exception e) {
            throw e;
        } finally {
            method.releaseConnection();
        }
    }

}
  • 請求操做代碼:
@Test
public void testGet() throws Exception {

    Map<String, String> param = new HashMap<String, String>();

    Goods goods = new Goods();
    String data = JSON.toJSONString(goods);
    data = URLEncoder.encode(data, "UTF-8");

    param.put("name", "hello");
    param.put("app_key", appId);
    param.put("data", data);
    param.put("timestamp", getTime());
    param.put("version", "");
    param.put("format", "json");

    String sign = ApiUtil.buildSign(param, secret);

    param.put("sign", sign);

    System.out.println("請求內容:" + JSON.toJSONString(param));

    String resp = PostUtil.post(url, param,"zh");

    System.out.println(resp);
}

public String getTime() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
}

簽名算法

簽名算法描述以下:app

  1. 將請求參數按參數名升序排序;
  2. 按請求參數名及參數值相互鏈接組成一個字符串:<paramName1><paramValue1><paramName2><paramValue2>...;
  3. 將應用密鑰分別添加到以上請求參數串的頭部和尾部:<secret><請求參數字符串><secret>;
  4. 對該字符串進行MD5運算,獲得一個二進制數組;
  5. 將該二進制數組轉換爲十六進制的字符串(所有大寫),該字符串便是這些請求參數對應的簽名;
  6. 該簽名值使用sign參數一塊兒和其它請求參數一塊兒發送給服務開放平臺。

僞代碼:iphone

Map<String,Object> paramsMap = new ...; // 參數

Set<String> keySet = paramsMap.keySet();
List<String> paramNames = new ArrayList<String>(keySet);
// 1. 
Collections.sort(paramNames);

StringBuilder paramNameValue = new StringBuilder();
// 2. 
for (String paramName : paramNames) {
    paramNameValue.append(paramName).append(paramsMap.get(paramName));
}
// 3.
String source = secret + paramNameValue.toString() + secret;
// 4.& 5.
String sign = md5(source);
// 6. 
paramsMap.put("sign",sign);

服務端驗證

服務端拿到請求數據後會sign字段進行驗證,驗證步驟以下:工具

  1. 根據客戶端傳過來的app_key拿到服務端保存的secret
  2. 拿到secret後經過簽名算法生成服務端的serverSign
  3. 比較客戶端sign和serverSign是否相等,若是相等則證實客戶端傳來的數據是合法數據,不然不經過返回錯誤信息。
  4. 處理業務,返回結果
相關文章
相關標籤/搜索