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代码
@Override
public 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();
}
通用函数
@Data
public 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中是否含有""或null
if (value != null && value.toString().length() != 0) {
//当JSON字符串存在null时,不将该kay-value放入Map中,即显示的结果不包括该kay-value
buf.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,如果是 转化成TreeMap
if (object instanceof com.alibaba.fastjson.JSONObject) {
object = jsonToMap((com.alibaba.fastjson.JSONObject) object);
}
arrayList.add(object);
}
treeMap.put(key, arrayList);
} else {
//判断该JSON中是否嵌套JSON
boolean 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();
// 设置请求方法为 POST
conn.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;
}