示例说明

搜物网开放平台提供 HTTP REST调用方式 和 SDK调用方式.

HTTP REST 调用方式

HTTP REST 采用 HTTP POST方式将系统参数和应用参数发送到网关,返回JSON或者XML

SDK 调用方式

SDK是在HTTP REST基础上进行封装,已定义好传入传出模型对象以及枚举,每个模型对象有描述,让开发者更关注与业务,同时客户端和服务端双向加密以保证更安全.

REST 示例

调用者需要配置以下信息

  1. URL: 搜物网开放平台网关
  2. Appkey: 开发者在搜物网申请的 AppKey,用于每次请求的系统参数
  3. AppSecret: 开发者搜物网申请的 AppSecret,用于每次请求的签名

以获取产品为例

1.构建请求请求参数

//申明一个集合用于保存请求参数
var parameters = new SortedDictionary<string, string>();
//系统参数
parameters.Add("appkey", "ABCDEFGHIJ123456");
parameters.Add("timestamp", "1441016201");
parameters.Add("token", "7DAEF0315DDA53E1");
parameters.Add("method", "GetProduct");
parameters.Add("format", "json");
//应用参数
parameters.Add("id", "102082");
            

2.将参数进行签名,注意事项:

  1. 需要对 Key 进行升序排序,排序后使用 KeyValue 的格式构建成字符串
  2. Key 空值不参与签名,Value 空值需要
  3. 参数顺序排序后,将 AppSecret 加入到最后
  4. 对整个字符串进行 MD5 16位 加密
/// <summary>
/// MD5 16位加密
/// </summary>
private static string MD516(string text)
{
    var md5 = new MD5CryptoServiceProvider();
    var temp = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(text)), 4, 8);
    temp = temp.Replace("-", "");
    return temp;
}
/// <summary>
/// 获取签名
/// </summary>
private static string GetSignature(SortedDictionary<string, string> parameters, string appSecret)
{
    parameters.Remove("signature");
    var parametersString = new StringBuilder();
    foreach (var item in parameters)
    {
        if (!string.IsNullOrEmpty(item.Key))
        {
            parametersString.Append(item.Key.ToLower()).Append(item.Value);
        }
    }
    parametersString.Append(appSecret);
    return MD516(parametersString.ToString());
}
            

3.将参数构建成 Key=Value& Url 键值对, 需要对 Value 进行 Url 转码

/// <summary>
/// 获取参数组装成URL字符串
/// </summary>
private string GetParametersString(SortedDictionary<string, string> parameters)
{
    var result = new StringBuilder();
    var isFirstParameter = true;
    var item = parameters.GetEnumerator();
    while (item.MoveNext())
    {
        if (!string.IsNullOrEmpty(item.Current.Key))
        {
            if (!isFirstParameter)
            {
                result.Append("&");
            }
            result.Append(item.Current.Key.ToLower());
            result.Append("=");
            if (!string.IsNullOrEmpty(item.Current.Value))
            {
                result.Append(Uri.EscapeDataString(item.Current.Value));
            }
            isFirstParameter = false;
        }
    }
    return result.ToString();
}
            

4.将参数以HTTP POST 方式发送到网关: http://sop.sowu.com/v4

/// <summary>
/// 发送请求 
/// </summary>
public string SendData(string postDataString)
{
    var url = "http://sop.sowu.com/v4";
    if (HttpMethod == HttpMethod.GET)
    {
        url = url + "?" + postDataString;
    }
    var result = string.Empty;
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.KeepAlive = true;
    request.Timeout = 300000;
    if (HttpMethod == HttpMethod.GET)
    {
        request.Method = "GET";
    }
    else
    {
        var postDataBytes = Encoding.UTF8.GetBytes(postDataString);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
        request.ContentLength = postDataString.Length;
        request.GetRequestStream().Write(postDataBytes, 0, postDataBytes.Length);
    }
    using (var response = (HttpWebResponse)request.GetResponse())
    {
        using (var streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            result = streamReader.ReadToEnd();
        }
    }
    return Regex.Replace(result, @"[\x00-\x08\x0b-\x0c\x0e-\x1f]", "");
}
            
  1. 所有应用参数 [枚举] 可以填写 [名称] 或者 [常数值]
  2. 所有应用参数 [对象] 必须构建成 [JSON] 字符串
  3. 所有应用参数 类型中有 [System.Collections.Generic.List`1] 代表集合 必须构建 [JSON] 字符串
  4. 所有应用参数 类型中有 [System.Nullable`1] 均表示可选参数

SDK 示例

SDK .NET 版本

SDK .NET 版本调用示例(获取令牌):

//引用DLL
using Sowu.Api.Model;
using Sowu.Api.SDK;
//传入参数
var inParameters = new Model.GetProduct.InParameters();
inParameters.ID = 102082;
//传出参数
var message = Service.GetMessage<Model.GetProduct.Outparameters>(inParameters);
if(message.State)
{
    //操作具体业务....
}
            

PHP 示例

调用示例(获取产品):

<?php
header("Content-Type:text/html;charset=UTF-8"); 
//身份配置
$appKey = 'E7223E3B2055AA68';
$appSecret = 'DHJ5B442B976E5KE';
    function (){               
            //参数数组
            $paramArr = array(
                //系统参数,所有接口都需要填写
                'appkey' => $appKey,
                'timestamp' => time(),
                'token' => strtoupper(substr(md5(time().rand(1,99999999)), 0, 16)),
                'method' => 'GetProduct',
                'format' => 'json',
                //应用参数,不同接口参数不一样
                //'id' => 1,
                'isreturnlist'=> 'true',
                'isreturnsql'=> 'false',
                'pageindex' => 1,
                'pagesize' => 20
                //'signature'=>'FD7F90EE7CDED9DE' //参数里不能直接带签名
            );
        
            //生成签名
            $signature = createSign($paramArr, $appSecret);
            //添加签名到参数
            $paramArr['signature'] = $signature;
            //组织参数
            $strParam = http_build_query($paramArr);
            //访问服务,注意:写操作的接口一般只支持POST                
	    $url = 'http://sop.sowu.com/v4';
	    $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
		
		    curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $strParam);
		
		    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //避免data数据过长问题
            $result = curl_exec($ch);
		    curl_close($ch);
		    return $result;
    }
		
    function createSign ($paramArr, $appSecret) {
        $signature = '';
        ksort($paramArr);
        foreach ($paramArr as $key => $val) {
            if ($key !== '') {
                $signature .= $key.$val;
            }
        }
        $signature .= $appSecret;
        return strtoupper(substr(md5($signature), 8,16));
    }
?>