H5 接入指南

最近更新:2024年10月24日

接入流程图

pic244

在开放平台创建应用后,获取appId、appSecret、salt

一、header公共参数

参数名参数类型是否必须示例参数说明
appIdString开放平台申请的Id
appSecretString开放平台申请的secret
signString见下方sign签名方法经过加密生成的sign
timestampString2020-05-21 11:07:50请求时间戳,yyyy-MM-dd HH:mm:ss,误差不超过15分钟
nonceStringSUzI1NiIsIn唯一的随机字符串(15分钟内)

二、生成sign(前后端公用)

1. 按照请求参数名的字母升序排列非空请求参数(包含appId),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;
2. stringA最后拼接上`salt`得到字符串`stringSignTemp`;(md5)
3. 对`stringSignTemp`进行加密运算,并将得到的字符串所有字符转换为大写,得到sign值。
graph TD
	appId --> sign
	接口参数 --> sign
	salt -.参与加密, 但不传输.-> sign
	

代码示例:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.util.StringUtils;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.TreeMap;

/**
 * main方法请求示例
 */
public static void main(String[] args) {
    Map<String, Object> signParams = new HashMap<>(16);
    // 客户端参数
    signParams.put("appId", "系统分配的appId");
    signParams.put("appSecret", "系统分配的appSecret");
    signParams.put("timestamp", "请求时间戳,格式yyyy-MM-dd HH:mm:ss,与服务器时间误差不超过15分钟");
    signParams.put("nonce", "请求唯一凭证,不可重复");
    // 请求体body里必填参数、非空参数都要参与签名
    signParams.put("mobile", "13012345678");
    signParams.put("outUserId", "202410240001");
    signParams.put("alias", "虚空假面");
    signParams.put("sex", "MALE");
    signParams.put("birthday", "1968-01-01");
    String sign = sign(signParams, "系统分配的salt");
    // 计算出的签名值sing放到用户授权注册register接口的http请求头sign字段
}


/**
 * 方法描述:签名字符串
 */
public static String sign(Map<String, Object> params, String salt) {
    StringBuilder sb = new StringBuilder();
    params.put("salt", salt);
    // 将参数以参数名的字典升序排序
    Map<String, Object> sortParams = new TreeMap<>(params);
    // 遍历排序的字典,并拼接a=b&c=d格式
    for (Map.Entry<String, Object> entry : sortParams.entrySet()) {
        String key = entry.getKey();
        if (!StringUtils.isEmpty(entry.getValue())) {
            sb.append("&").append(key).append("=").append(entry.getValue());
        }
    }
    String rawString = sb.toString().replaceFirst("&","");

    log.info("签名前字符串:"+ rawString);
    params.remove("salt");
    String signString = DigestUtils.md5Hex(rawString.getBytes(StandardCharsets.UTF_8)).toUpperCase();
    log.info("签名后字符串:"+signString);
    return signString;
}

三、接口列表

1. 接口名称:用户注册授权

Method:POST

(测试环境)Path:https://stg-open.adahealth.cn/api/user/v2/register

(生产环境)Path:https://open.adahealth.cn/api/user/v2/register

Header

名称类型是否必须备注说明
appIdString应用标识创建应用后自动生成
appSecretString应用秘钥创建应用后自动生成
signString见上方sign签名方法经过加密生成的sign
timestampString2020-05-21 11:07:50请求时间戳,yyyy-MM-dd HH:mm:ss,误差不超过15分钟
nonceStringSUzI1NiIsIn唯一的随机字符串(15分钟内)

请求体 Body

名称类型是否必须备注说明
mobileString用户手机以mobile作为用户标识
outUserIdString第三方平台用户标识第三方平台用户ID
aliasString昵称主档案字段
sexString性别主档案字段 MALE:男 FEMALE:女
birthdayString生日主档案字段 yyyy-MM-dd
heightInteger身高CM
weightInteger体重KG
smokerString是否吸烟Y:是 N:否 NA:不确定(默认)
diabetesString是否高血糖Y:是 N:否 NA:不确定(默认)
hypertensionString是否高血压Y:是 N:否 NA:不确定(默认)
pregnancyString是否怀孕Y:是 N:否 NA:不确定(默认)

返回数据

名称类型是否必须备注说明
codeinteger响应码0-success 非0-error
msgstring响应信息
dataobject业务对象{  openId:"efadkafhfw38994",  channel:"38",  redirectUrl: "第三方跳转H5 URL"  }

2. 接口名称:疾病—挂号科室匹配

注:该接口仅适用产品“AI分诊”

请求体 Body

名称类型是否必须备注说明
userIdString第三方平台用户标识第三方平台用户ID(唯一值)
caseIdString评估编号评估编号
dateDate评估日期时间评估日期时间
diseaseIdString疾病ID疾病ID(ICD-10)
diseaseString疾病名称疾病名称
departmentDepartmentInfo挂号科室名称推荐挂号科室 key=id,value=name

DepartmentInfo

名称类型是否必须备注说明
firstDepartCodeString一级科室code
firstDepartNameString一级科室name
secondDepartCodeString二级科室code
secondDepartNameString二级科室name
thirdDepartCodeString三级科室code
thirdDepartNameString三级科室name

返回数据

名称类型是否必须备注说明
codeinteger响应码0-success 非0-error
messagestring响应信息
dataobject业务对象{  url: "第三方跳转H5 URL"  }

四、接入成功(示意图)

pic123