快速入门

甩手掌柜开放平台OpenAPI是睿博数据提供给系统集成服务商和第三方合作伙伴的一种技术接入方式。

申请接入

  1. 填写品牌和应用资料,提交申请
  2. 申请成功后,邮件分配应用接入配置信息
appid 应用ID,由睿博开放平台统一发放
appkey 应用密钥,由睿博开放平台统一发放

如有任何对接疑问,请发邮件至 openapi@weipos.com

警告

此版本为初稿,仅供参考。应以正式对接开始后的版本为准。每个对接厂商开放的接口权限和接口地址可能会有所不同。

请求方式

数据对接采用http请求,默认为post方式。返回的数据结果封装为json格式。

请求地址请按照 请求url + ? + appid= + 甩手掌柜分配的appid + &sign= + 签名计算后的字符串 格式

http://xxx.xxx.com/center/gateway?appid={ 甩手掌柜分配的appid }&sign={ 签名计算后的字符串 }

URL参数说明:

参数名 类型 描述
appid string 应用ID,由睿博开放平台统一发放
sign string 进行接口调用时,输入参数计算后的签名结果,详见 签名计算

注解

不论接口是GET、POST还是PUT等HTTP方法,系统级参数都是以URL参数(即Query String)的方式传递的

全局请求参数

在没有特别说明的一般情况下, 全局参数是调用API时所必须传递的参数。

参数名 类型 是否必须 示例值 描述
cmd string XXXXXXX 请求的命令,即接口名称
seq string eb46ce74-dffa-4108-87bc-4809144ca33c 序列号,采用全局唯一标识符,简称GUID

注解

  • 请求数据编码为UTF-8,请勿使用其它字符编码
  • 提交和返回的数据格式为JSON
  • JSON中所有的键全为小写字符,引号全部为双引号

全局返回参数

参数名 类型 是否必须 示例值 描述
code int 0 返回状态码,详见 业务错误码说明
seq string eb46ce74-dffa-4108-87bc-4809144ca33c 序列号,采用全局唯一标识符,简称GUID
msg string   返回状态码解释,详见 业务错误码说明

请求流程

针对每个接口的请求流程如下:

  1. 根据功能需求确认接口
  2. 确认请求参数
  3. 计算签名
  4. 拼接请求地址

签名计算

签名计算规则

  1. 对参数进行拼接生成 字符串A

对所有传入的数据JSON串jsonString 的后面拼接上 &key=appkey (接入应用秘钥) 得到 stringSignTemp 字符串A:

{"cmd":"getStoreInfo","seq":"eb46ce74-dffa-4108-87bc-4809144ca33c"}&key=wx1234567
  1. 计算签名

对``字符串A`` 进行 SHA1运算,再将得到的字符串所有字符转换为大写,得到签名:

DB1330A67002A82B24573CC7DB2E621F544FCC2B

注解

计算 sign 时需要注意的以下几点:

  • 提交的数据都需要验证签名
  • 签名算法,默认是SHA1
  1. 拼接请求URL

将得到的签名赋给sign作为HTTP请求的URL参数:

http://xxx.xxx.com/center/gateway?appid=7284397484&sign=DB1330A67002A82B24573CC7DB2E621F544FCC2B

JAVA签名示例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.SSLContext;

public class HttpRequest {
	
	private static final HttpRequest instance = new HttpRequest();
	
	public static HttpRequest getInstance() {
        return instance;  
    }	

	public String post(String json) {
		try {
			json = json.replace("'", "\"");
			String sign=this.SHA1(json+"&key=a7211dbd5696ee48");
			String SERVER_URL="http://weipostest.weipos.com:8080/datacenter/dc?appid=00001&sign="+sign;
			SSLContext sslcontext = SSLContext.getInstance("TLS");
			HttpURLConnection httpsConn = HttpRequest.getHttpURLConnection(SERVER_URL);
			httpsConn.setConnectTimeout(5*60*1000);
			httpsConn.setRequestMethod("POST");
			httpsConn.setDoOutput(true);
			if (json != null && json.toString().length() > 0) {
				httpsConn.getOutputStream().write(json.toString().getBytes("UTF-8"));
			}
			httpsConn.getOutputStream().flush();
			httpsConn.getOutputStream().close();
			System.out.println("status:\t" + httpsConn.getResponseCode());
			if (httpsConn.getResponseCode() == 200) {
				BufferedReader br = new BufferedReader(new InputStreamReader(httpsConn.getInputStream(), "UTF-8"));
				String line;
				String result = "";
				while ((line = br.readLine()) != null) {
					result += line;
				}
				br.close();
				System.out.println("返回:"+result);
				return result;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
	}
	
	/**
	 * get HttpURLConnection
	 * @param strUrl url地址
	 * @return HttpURLConnection
	 * @throws IOException
	 */
	public static HttpURLConnection getHttpURLConnection(String strUrl)
			throws IOException {
		URL url = new URL(strUrl);
		HttpURLConnection httpURLConnection = (HttpURLConnection) url
				.openConnection();
		return httpURLConnection;
	}
	
	public static String SHA1(String decript) {
		try {
			MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
			try {
				digest.update(decript.getBytes("UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			byte messageDigest[] = digest.digest();
			// Create Hex String
			StringBuffer hexString = new StringBuffer();
			// 字节数组转换为 十六进制 数
			for (int i = 0; i < messageDigest.length; i++) {
				String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
				if (shaHex.length() < 2) {
					hexString.append(0);
				}
				hexString.append(shaHex);
			}
			return hexString.toString().toUpperCase();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return "";
	}
}

主动推送/回调通知

主动推送/回调通知是开放平台主动调用第三方服务的一个通道,用于向第三方应用推送订单状态变更、第三方数据实时查询等。目前平台只支持http的推送方式。 获取主动推送功能的AppId须预先开通相关主动推送接口,目前由平台管理人工进行配置

  1. 开放平台以HTTP POST 的方式进行消息推送请求。
  2. 开放平台消息推送请求的HTTP Header中的Content-Type:application/json; charset=utf-8
  3. 推送请求的HTTP Body为JSON格式,具体数据格式参见文档中定义的主动推送接口说明。
  4. 为了防止推送消息被篡改,开放平台进行推送的时候会有简单签名,签名规则与被动接口相同,应用需要自行校验消息数据。
  5. 应用在消息处理完成后,需要回复HTTP Response的code 200,并按照接口说明,全局返回参数中code返回为0以及msg为”OK”,表示此次推送消息接收成功。
  6. 推送请求如果5s内没有收到响应头为200响应,平台认为此次推送不成功,不管因为什么原因,平台都会在一分钟后重新发起推送(总推送次数不超过3次(<=3))。
  7. 应用收到推送HTTP请求后,必须在5s内完成响应,否则平台认为超时响应,会重复推送,造成双方资源浪费。
  8. 应用需要自行处理重复推送造成的消息重复,每个消息请求参数中都有一个唯一的seq,方便消息去重。
  9. 为了方便未来的消息内容升级,应用需要兼容处理当前消息中不存在的字段。