1. 联合登录
森树未来OpenAPI
  • 服务端API
    • 登录接口
      • 登录签名算法
      • 应用登录
    • 套餐卡接口
      • 绑定新卡
    • 订单接口
      • 服务订单分页
      • 问诊订单分页
  • 联合登录
    • 联合登录技术对接文档
  1. 联合登录

联合登录技术对接文档

森树未来联合登录技术对接文档(AES‑256版)#

1、联合登录#

目前森树未来支持多种联合登录的实现方式,根据本次需求特点,决定采用约定URL接入的方式。本文档将针对“约定 URL 接入”方式进行详细介绍。
首先,森树未来会为合作方分配域名、appKey(合作方标识,用于生成签名)和密钥(用于参数对称加解密),请妥善保存,不要泄露。

1.1 H5 接入#

流程:H5接入,森树未来提供接入URL,合作方直接跳转到该URL,并在URL上传入用户信息。
形式如下:(链接中的四级域名xxx 在联调时由微医提供)
测试:https://test-api.foresttreefuture.cn/open_api/partners/entrance?token=&nonce=&signature=&timestamp=
线上:https://api.foresttreefuture.cn/open_api/partners/entrance?token=&nonce=&signature=&timestamp=
参数说明:
参数名称类型是否必须描述
tokenString是合作方用户信息加密生成 token ,详见【1.2 生成 token】
appKeyString是合作方标识,森树未来提供
timestampString是时间戳(10位),必传,详见【附3. 签名生成示例】
nonceString是随机数,必传,详见【附3. 签名生成示例】
signatureString是签名,必传,详见【附3. 签名生成示例】

1.2 生成token#

合作方需要把用户相关信息放到map中转成json字符串,再利用森树未来提供的密钥进行AES加密(可参考下文中的【附1. AES加密示例】代码),将加密后生成的字符串经过UrlEncode编码后生成token值。
⚠️ 请注意:
1.
为保证网络信息安全,我们强烈建议由合作方的服务端来生成token,请不要把密钥直接保存在客户端。
2.
为防止部分服务不可用,请不要禁止 localStorage、sessionStorage 等。
token中包含的相关信息:
字段是否必填类型(长度)说明
userId是String(32)外部用户ID,标识用户唯一性,关联森树未来用户
mobile是String(20)手机号码,用于注册森树未来用户账号
name否String(30)姓名
idCard否String(20)证件号码
idCardType否String(2)证件类型,详见【附4. 证件类型】,目前只支持身份证
exchangeCode否String(30)套餐卡兑换码,。森树未来提供

附1. AES 加密示例#

附2. AES 解密示例#

 /**
 * 解密十六进制字符串为字符串
 * @param encodedHex
 * @param password
 * @return
 * @throws Exception
 */
public static String decryptHex(String encodedHex, String password) throws Exception {
    String hex = URLDecoder.decode(encodedHex, StandardCharsets.UTF_8.name())
            .replaceAll("\\s+", "");
    if (hex.length() == 0 || (hex.length() & 1) != 0 || !hex.matches("[0-9A-Fa-f]+")) {
        throw new IllegalArgumentException("密文必须是偶数长度的十六进制字符串");
    }

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, legacyAesKey(password));
    byte[] plaintext = cipher.doFinal(hexToBytes(hex));
    return new String(plaintext, StandardCharsets.UTF_8);
}

/**
 * 将十六进制字符串转换为字节数组
 * @param hex
 * @return
 */
public static byte[] hexToBytes(String hex) {
    byte[] bytes = new byte[hex.length() / 2];
    for (int i = 0; i < bytes.length; i++) {
        int high = Character.digit(hex.charAt(i * 2), 16);
        int low = Character.digit(hex.charAt(i * 2 + 1), 16);
        bytes[i] = (byte) ((high << 4) + low);
    }
    return bytes;
}

public static void main(String[] args) throws Exception {
    String token = "7262ba75aa32339ba5893797b6351dfc3dd72c3fcc6928c70443cf5502a2f69820b86edd5ac9bf51c73d99bdf25d572b7e4b87d801db111cf1e56ffb4af1bd9e705c6837d7e4f1fd1f6a288e16be4229";
    String encryptResultStr = URLEncoder.encode(token, "UTF-8");
    // 合作方密钥,由微医分配
    String key = "ZAinz^ƒ8SFb6FNj9bCQ7FxMnQc";
    String decryptResult = OpenApiUtil.decryptHex(encryptResultStr, key);
    System.out.println("解密后:" + decryptResult);
}

附3. 签名生成示例#

接入时需要验证签名,参数 timestamp、nonce、signature 必传。
签名生成步骤如下:
利用java原生的类实现SHA256加密

附4. 证件类型#

证件类型身份证户口本军官证护照台胞证出生证港澳通行证回乡证港澳台居民居住证其他
取值12345710111399
注:若没有匹配到上述类型,请使用 “99‑其他” 类型。
修改于 2026-08-25 03:15:50
上一页
问诊订单分页
Built with