API接口最近经常碰到,协调几个乙方来回对接,把我折腾晕了,索性自己写一个小的工具,导入历史数据。
获取平台免登录token
接口说明
URL Path:gateweb/bigm-dm/openApi/ologin/openLogin
说明:第三方免登录跳转到大会员平台前,要先根据用户的手机号获取对应的大会员平台的授权Token :第三方免登录,统一用一个固定账号(生产环境用户管理中配置,提供给第三方)。关掉大会员系统的账号单点登录,保证多点登录时不冲突。
请求头HEADER | ||||
参数名称 | 参数说明 | 参数类型 | 是否必须 | 备注 |
appId | 接入方 | String | 是 | 线下给 |
timeStamp | 调起时间 | String | 是 | 如2022-01-01 11:11:11 |
sign | 签名 | String | 是 | 通过入参结构获取签名 |
请求报文
格式:JSON | |||||
参数名称 | 参数说明 | 参数类型 | 是否必须 | 长度 | 备注 |
account | 平台用户账户 | String | 是 | 070301 |
返回报文
格式:JSON | |||||
参数名称 | 参数说明 | 参数类型 | 是否必须 | 长度 | 备注 |
token | 返回登录token | String | 是 | 有效用户时返回 |
返回示例:
单个会员注册接口
接口说明
API名称:gateweb/bigm-member/openApi/memInfo/regist
接口名:单个会员注册接口
说明: 用户在第三方系统中注册后,同时调大会员接口,该接口需要配置appid等数据,进行授权(会员在大会员侧注销过账号之后,第三方接口同步注册会员数据会失败,“注册失败,会员已注销!”)
请求头HEADER | ||||
参数名称 | 参数说明 | 参数类型 | 是否必须 | 备注 |
appId | 接入方 | String | 是 | 线下给 |
timeStamp | 调起时间 | String | 是 | 如2022-01-01 11:11:11 |
sign | 签名 | String | 是 | 通过入参结构获取签名 |
token | 登录token | String | 是 | 平台账户获取的token |
请求报文
格式:JSON | |||||
参数名称 | 参数说明 | 参数类型 | 是否必须 | 长度 | 备注 |
mobileNo | 手机号码 | String | 是 | ||
thirdUserId | 第三方平台的用户ID | String | 是 | ||
sex | 会员性别 | Integer | 否 | 0-未知 1-男 2-女 | |
province | 省 | String | 否 | ||
city | 市 | String | 否 | ||
area | 区 | String | 否 | ||
address | 详细住址 | String | 否 | ||
company | 工作单位 | String | 否 | ||
idType | 证件类型 | Integer | 否 | 1:身份证; 只能存这一个证件类型 | |
idNo | 证件号码 | String | 否 | ||
birthday | 生日 | String | 否 | yyyy-MM-dd | |
realName | 会员姓名 | String | 否 | ||
labelCodes | 会员标签 | List<String> | 否 | code编码列表 | |
branCode | 机构编码 | String | 是 | 不填默认请求用户机构 |
返回报文
格式:JSON | |||||
参数名称 | 参数说明 | 参数类型 | 是否必须 | 长度 | 备注 |
model | 操作成功 | True 成功 |
返回示例
{
"model": true,
"success": true,
"emptyModel": false
}
获取token代码
@Overridepublic String getToken(){String token = "";SignDemoVo vo = new SignDemoVo();vo.setAccount( "zcl");String appKey = "37A64759A88374BF8B14F29CE279D598F0B092AC56A34DF173F4D77ACA3CB9D1";String js = JSON.toJSONString(vo);String sign = signWithSha256(js, appKey);String appId = "wxa1c28fd0e15047";System.out.println(" appId:" +appId + " timeStamp:" + DateUtils.getTime() + " sign:"+ sign + " data:" + js);String apiUrl = "https://dhys.youhubei.cn/gateweb/bigm-dm/openApi/ologin/openLogin";String res = HttpUtils.sendPostWithHeard(apiUrl,appId,sign,"","account=zcl");token = JSONObject.parseObject(JSONObject.parseObject(res).getString("model")).getString("token");return token;}
调用网络请求第一个方式:
public static String sendPostWithHeard(String url, String appId,String sign,String token,String param){PrintWriter out = null;BufferedReader in = null;StringBuilder result = new StringBuilder();try{log.info("sendPost - {}", url);URL realUrl = new URL(url);URLConnection conn = realUrl.openConnection();conn.setRequestProperty("accept", "application/json");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");conn.setRequestProperty("Accept-Charset", "utf-8");conn.setRequestProperty("contentType", "utf-8");conn.setRequestProperty("appId",appId);conn.setRequestProperty("timeStamp",DateUtils.getTime());conn.setRequestProperty("sign",sign);if (StringUtils.isNotEmpty(token)){conn.setRequestProperty("token",token);log.info("token - {}", token);}conn.setDoOutput(true);conn.setDoInput(true);out = new PrintWriter(conn.getOutputStream());out.print(param);out.flush();in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));String line;while ((line = in.readLine()) != null){result.append(line);}log.info("recv - {}", result);}catch (ConnectException e){log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);}catch (SocketTimeoutException e){log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);}catch (IOException e){log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);}catch (Exception e){log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);}finally{try{if (out != null){out.close();}if (in != null){in.close();}}catch (IOException ex){log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);}}return result.toString();}
通用函数
@Datapublic class SignDemoVo {private String account;public void setAccount(String account) {this.account =account;}}public static String signWithSha256(String paramJson, String shaKey) {String signPreStr = buildSignStr(paramJson);return signWithSha256(signPreStr, shaKey, "UTF-8");}public static String signWithSha256(String originStr, String shaKey, String charset) {String text = originStr + shaKey;return DigestUtils.sha256Hex(getContentBytes(text, charset)).toUpperCase();}public static byte[] getContentBytes(String content, String charset) {if (charset == null || "".equals(charset)) {return content.getBytes();}try {return content.getBytes(charset);} catch (UnsupportedEncodingException e) {throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:"+ charset);}}public static String buildSignStr(String paramJson) {if (StringUtils.isBlank(paramJson)) {return "";}com.alibaba.fastjson.JSONObject json = com.alibaba.fastjson.JSONObject.parseObject(paramJson, Feature.OrderedField);//Feature.OrderedField实现解析后保存不乱序Map<String, Object> params = jsonToMap(json);StringBuilder buf = new StringBuilder();Iterator<String> keys = params.keySet().iterator();while (keys.hasNext()) {String key = keys.next();Object value = params.get(key);// 判断传入kay-value中是否含有""或nullif (value != null && value.toString().length() != 0) {//当JSON字符串存在null时,不将该kay-value放入Map中,即显示的结果不包括该kay-valuebuf.append(key + "=" + value + "&");}}String sfStr = buf.toString();if (sfStr.length() > 1) {return sfStr.substring(0, sfStr.length() - 1);}return sfStr;}/*** JSON转顺序排序的Map** @return 响应的TreeMap*/public static Map<String, Object> jsonToMap(com.alibaba.fastjson.JSONObject json) {Map<String, Object> treeMap = new TreeMap();Iterator<String> keys = json.keySet().iterator();while (keys.hasNext()) {String key = keys.next();Object value = json.get(key);// value为空丢弃if (value == null || StringUtils.isBlank(value.toString())) {continue;}// 判断是否为JSONArray(json数组)if (value instanceof JSONArray) {JSONArray jsonArray = (JSONArray) value;List<Object> arrayList = new ArrayList<>();for (Object object : jsonArray) {// 判断是否为JSONObject,如果是 转化成TreeMapif (object instanceof com.alibaba.fastjson.JSONObject) {object = jsonToMap((com.alibaba.fastjson.JSONObject) object);}arrayList.add(object);}treeMap.put(key, arrayList);} else {//判断该JSON中是否嵌套JSONboolean flag = isJSONValid(value.toString());if (flag) {//若嵌套json了,通过递归再对嵌套的json(即子json)进行排序value = jsonToMap((com.alibaba.fastjson.JSONObject) value);}// 其他基础类型直接放入treeMap// JSONObject可进行再次解析转换treeMap.put(key, value);}}return treeMap;}/*** 校验是否是JSON字符串** @param json 传入数据* @return 是JSON返回true, 否则false*/public final static boolean isJSONValid(String json) {try {com.alibaba.fastjson.JSONObject jo = com.alibaba.fastjson.JSONObject.parseObject(json);if (jo != null) {return true;}} catch (JSONException ex) {return false;}return false;}
第二种调用http+heard的方式(JSON)
public int synchronizeHistoricalData(String token,TRegistrationPersonVo sendData){int ret = 1;String appKey = "37A64759A88374BF8B14F29CE279D598F0B092AC56A34DF173F4D77ACA3CB9D1";String js = JSON.toJSONString(sendData);String sign = signWithSha256(js, appKey);String appId = "wxa1c28fd0e15047";System.out.println(" appId:" +appId + " timeStamp:" + DateUtils.getTime() + " sign:"+ sign);System.out.println(" token:" + token);System.out.println(" data:" + js);String apiUrlregist = "https://dhys.youhubei.cn/gateweb/bigm-member/openApi/memInfo/regist";String dataRes = sendJsonRequest(apiUrlregist,appId,sign,token,js);ret = JSONObject.parseObject(dataRes).getInteger("success");return ret;}
网络请求核心函数
/*** 发送 JSON 格式的 POST 请求并获取响应数据** @param stringurl 目标 URL* @param requestParameter JSON 格式的请求参数字符串* @return 响应数据字符串*/public static String sendJsonRequest(String stringurl, String appId,String sign,String token,String requestParameter) {try {// 创建 URL 对象URL url = new URL(stringurl);// 打开 HTTP 连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置请求方法为 POSTconn.setRequestMethod("POST");// 设置请求头部为 JSON 格式conn.setRequestProperty("Content-Type", "application/json");conn.setRequestProperty("appId",appId);conn.setRequestProperty("timeStamp",DateUtils.getTime());conn.setRequestProperty("sign",sign);if (StringUtils.isNotEmpty(token)){conn.setRequestProperty("token",token);System.out.println("token - {}"+ token);}// 允许向服务器发送数据conn.setDoOutput(true);// 向服务器发送 JSON 数据OutputStream outputStream = conn.getOutputStream();outputStream.write(requestParameter.getBytes());outputStream.flush();// 获取响应结果int responseCode = conn.getResponseCode();BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;StringBuffer response = new StringBuffer();// 读取响应数据while ((line = reader.readLine()) != null) {response.append(line);}reader.close();return response.toString();} catch (Exception e) {e.printStackTrace();}return null;}