前言
该解决方案旨在合作客户通过简单的接入几个接口,即可快速将小蓝本的拓客页面内嵌到已有的系统中。
在接入前,需要联系客户经理开通相应的功能权限。
系统接入时必须接入的有:1、获取跳转登录系统的完整URL;2、接收系统回调的数据
API接口
前置说明
以下所有接口均是由你的服务端发起的http调用,接口响应按标准的restful风格,请求体与响应体如有的,均为json格式
所有的请求头需要包含accessId及accessToken
accessId即系统分配给你的标识ID
accessToken即系统分配给你的访问授权密钥
请求的基础URL为: https://api.xiaolanben.com
标准curl示例
curl -X PUT --header 'Content-Type: application/json' --header 'accessToken: 你的token' --header 'accessId: 你的id' -d '{ \
"dailyLimit": 100, \
"monthlyLimit": 900, \
"totalLimit": 5000, \
"confirmAdd": true,
}' 'https://api.xiaolanben.com/blue-crm/api/v1/open/oem/customer/unlockLimit'
系统使用标准的restful风格;所有的错误均以>=400的http状态码返回;具体的错误内容会在响应体中返回
{"trackingId":"我是问题反馈的跟踪ID","errors":[{"code":我是int错误码,"message":"我是错误原因"}]}
如:
{"trackingId":"55fbef73-2cd2-4a13-ad4a-73ba78879a29","errors":[{"code":400,"message":"请输入正确的时间"}]}
获取跳转登录系统的完整URL
POST /blue-crm/api/v1/open/oem/customer/getLoginUrl
入参
参数名 | 数据类型 | 数据域 | 备注 |
createAccount | STRING | body | 登录同是否自动创建账号 1为当手机号未创建过账号时自动创建 0不创建,如果不存在则报错 |
accountMobile | STRING | body | 账号手机号 |
accountName | STRING | body | 账号名称-一般用人姓名; 当未输入并且自动创建账号时,取手机号末尾4位 |
returnUrl | STRING | body | 非必传。在拓客系统用户免登登录超时或失败时,系统会自动回跳转回该URL(需要符合URL标准格式) |
customDomain | STRING | body | 非必传。如果在小蓝本配置过自定义域名的,则可以传入该域名(需要符合URL标准格式)。如:https://leads.pi51.cn |
appCategory | INT | body | 非必传,在未传入customDomain有效。如果您开通了多个版本的拓客,则可以通过该值控制想要的版本路径。0通过版/2金融版/3财税版/4会展版/5招商版 |
routing | STRING | body | 非必传。页面路由,不能带#符,具体参考小蓝本官方拓客页路由。如:/newUser/search/companySearch |
noHead | BOOL | body | 非必传。有路由时有效。如果传入true,则不显示拓客页面头部信息 |
noMenu | BOOL | body | 非必传。有路由时有效。如果传入true,则不显示页面左侧菜单信息 |
出参
参数名 | 数据类型 | 备注 |
accountId | INT | 当前登录员工的账号标识ID,用于数据回调接口时使用 |
url | STRING | 终端获客用户操作的平台URL;用于在前端跳转到使用,链接有效期为30秒 |
获取我的企业详细信息
GET /blue-crm/api/v1/open/oem/customer/myInfo
入参
无
出参
参数名 | 数据类型 | 备注 |
customerId | INT | 我的企业标识 |
customerName | STRING | 我的企业名称 |
accountNum | INT | 有效账号数 |
unlockNum | INT | 总解锁量 |
availableUnlockNum | INT | 可用解锁量 |
dailyLimit | INT | 每日每人可解锁企业数量限制 |
monthlyLimit | INT | 每月每人可解锁企业数量限制 |
totalLimit | INT | 总的每人可解锁企业数量限制 |
enableDate | STRING | 启用时间yyyy-MM-dd |
expireDate | STRING | 有效期至yyyy-MM-dd |
gmt51Create | STRING | 创建时间yyyy-MM-dd HH:mm:ss |
status | INT | 状态,0未生效/1有效/2已过期/10已删除 |
statusDesc | STRING | 状态描述 |
设置默认的解锁量限制配置
PUT /blue-crm/api/v1/open/oem/customer/unlockLimit
入参
参数名 | 数据类型 | 数据域 | 备注 |
dailyLimit | INT | body | 单个员工每日解锁企业数上限 |
monthlyLimit | INT | body | 单个员工每月解锁企业数上限 |
totalLimit | INT | body | 单个员工总解锁企业数据上限 |
出参
无,响应http码204
获取员工的解锁量限制配置
GET /blue-crm/api/v1/open/oem/customer/account/unlockLimit
入参
无
出参
参数名 | 数据类型 | 备注 |
该响应体为数据 | 数组 | |
–id | LONG | 记录标识 |
–accounts | {accountId:accountName} | 员工账号与账号名称对照表,如{123:”张三”,456:”李四”} |
–dailyLimit | INT | 每日解锁企业数上限 |
–monthlyLimit | INT | 每月解锁企业数上限 |
–totalLimit | INT | 总解锁企业数上限 |
–gmt51Modify | STRING | 最后修改时间如2022-01-02 14:23:32 |
添加员工的解锁量配置限制
POST /blue-crm/api/v1/open/oem/customer/account/unlockLimit
入参
参数名 | 数据类型 | 数据域 | 备注 |
accountIds | ARRAY<INT> | body | 设置的账号ID集合 |
dailyLimit | INT | body | 每日解锁企业数上限 |
monthlyLimit | INT | body | 每月解锁企业数上限 |
totalLimit | INT | body | 总解锁企业数上限 |
confirmAdd | BOOLEAN | body | 如果未传或为false时,当指定的员工在其它规则中已经存在,系统则会响应409;如果为true,则会强制更新其它规则 |
出参
参数名 | 数据类型 | 备注 |
id | LONG | 记录标识 |
accounts | {accountId:accountName} | 员工账号与账号名称对照表,如{123:”张三”,456:”李四”} |
dailyLimit | INT | 每日解锁企业数上限 |
monthlyLimit | INT | 每月解锁企业数上限 |
totalLimit | INT | 总解锁企业数上限 |
gmt51Modify | STRING | 最后修改时间如2022-01-02 14:23:32 |
修改指定的员工解锁量配置限制
PUT /blue-crm/api/v1/open/oem/customer/account/unlockLimit/{id}
入参
参数名 | 数据类型 | 数据域 | 备注 |
id | LONG | path | 要修改的具体记录标识ID |
accountIds | ARRAY<INT> | body | 设置的账号ID集合 |
dailyLimit | INT | body | 每日解锁企业数上限 |
monthlyLimit | INT | body | 每月解锁企业数上限 |
totalLimit | INT | body | 总解锁企业数上限 |
confirmAdd | BOOLEAN | body | 如果未传或为false时,当指定的员工在其它规则中已经存在,系统则会响应409;如果为true,则会强制更新其它规则 |
出参
参数名 | 数据类型 | 备注 |
id | LONG | 记录标识 |
accounts | {accountId:accountName} | 员工账号与账号名称对照表,如{123:”张三”,456:”李四”} |
dailyLimit | INT | 每日解锁企业数上限 |
monthlyLimit | INT | 每月解锁企业数上限 |
totalLimit | INT | 总解锁企业数上限 |
gmt51Modify | STRING | 最后修改时间如2022-01-02 14:23:32 |
删除指定的员工解锁量配置限制
DELETE /blue-crm/api/v1/open/oem/customer/account/unlockLimit/{id}
入参
参数名 | 数据类型 | 数据域 | 备注 |
id | LONG | path | 要删除的具体记录标识ID |
出参
无,响应http码204
获取生效中及待生效的账号数记录
GET GET /blue-crm/api/v1/open/oem/customer/authLimit
入参
无
出参
参数 名 | 数据类型 | 备注 |
该响应体为数组 | 数组 | |
id | LONG | 数据ID |
effectiveTime | STRING | 生效时间 |
expireTime | STRING | 有效截止时间 |
limitValue | STRING | 账号数 |
status | STRING | 状态 |
获取所有的账号列表
GET /blue-crm/api/v1/open/oem/customer/validAccounts
入参
参数名 | 数据类型 | 数据域 | 备注 |
keyword | STRING | query | 可空。搜索的关键字 |
pageIndex | INT | query | 页面索引,从1开始 |
pageSize | INT | query | 页面大小,最小2,最大100 |
出参
参数名 | 数据类型 | 备注 |
pageIndex | INT | 页面索引 |
pageSize | INT | 页面大小 |
totalCount | INT | 总记录数 |
data | ARRAY | 具体的数据数组 |
–accountId | INT | 账号标识ID |
–accountName | STRING | 账号名称 |
–accountMobile | STRING | 账号手机号 |
新建账号
POST/blue-crm/api/v1/open/oem/customer/account
入参
参数名 | 数据类型 | 数据域 | 备注 |
accountName | STRING | body | 账号名称(姓名),最少1个字,最多10个字 |
accountMobile | STRING | body | 账号手机号, |
出参
参数名 | 数据类型 | 备注 |
accountId | INT | 账号标识 |
编辑账号
PUT /blue-crm/api/v1/open/oem/customer/account/{accountId}
入参
参数名 | 数据类型 | 数据域 | 备注 |
accountId | INT | path | 要编辑的账号标识 |
accountName | STRING | body | 账号名称(姓名),最少1个字,最多10个字 |
accountMobile | STRING | body | 账号手机号,如果不传该值,则是不更新;如果传了,仅可更新还没有登录过或创建过账号的记录 |
出参
无,响应http码204
删除账号
DELETE /blue-crm/api/v1/open/oem/customer/account/{accountId}
入参
参数名 | 数据类型 | 数据域 | 备注 |
accountId | INT | path | 要编辑的账号标识 |
出参
无,响应http码204
设置数据回调地址
PUT /blue-crm/api/v1/open/oem/customer/callbackUrl
入参
参数名 | 数据类型 | 数据域 | 备注 |
url | STRING | body | 要设置的完整地址,仅支持域名格式 |
出参
无,响应http码204
获取页面按钮配置列表
GET /blue-crm/api/v1/open/oem/customer/buttons
入参
无
出参
参数名 | 数据类型 | 备注 |
数据列表 | [] | 按钮列表 |
–id | LONG | 记录标识 |
–buttonId | STRING | 按钮回传标识,唯一 |
–buttonText | STRING | 按钮显示文本 |
–viewPages | ARRAY<STRING> | 显示页面标识代码数组,码列表如下: searchCompany 找企业列表 advanceSearch 高级搜索列表 exhibitorSearch 找展商 batchQuery 批量查询 companyHome 企业主页 unlockList 解锁列表 mapCompany 地图拓客 |
增加页面按钮配置
POST/blue-crm/api/v1/open/oem/customer/button
入参
参数名 | 数据类型 | 数据域 | 备注 |
buttonId | STRING | body | 按钮回传标识,需要唯一;2~16个字府 |
buttonText | STRING | body | 按钮显示名称,2~8个字符 |
viewPages | ARRAY<STRING> | body | 显示页面的标识码,码列表如下: searchCompany 找企业列表 advanceSearch 高级搜索列表 exhibitorSearch 找展商 batchQuery 批量查询 companyHome 企业主页 unlockList 解锁列表 mapCompany 地图拓客 |
出参
参数名 | 数据类型 | 备注 |
id | LONG | 记录标识 |
buttonId | STRING | 按钮回传标识,唯一 |
buttonText | STRING | 按钮显示文本 |
viewPages | ARRAY<STRING> | 显示页面标识代码数组 |
编辑页面按钮配置
PUT /blue-crm/api/v1/open/oem/customer/button/{id}
入参
参数名 | 数据类型 | 数据域 | 备注 |
id | LONG | path | 记录标识 |
buttonId | STRING | body | 按钮回传标识,需要唯一;2~16个字府 |
buttonText | STRING | body | 按钮显示名称,2~8个字符 |
viewPages | ARRAY<STRING> | body | 显示页面的标识码,码列表如下: searchCompany 找企业列表 advanceSearch 高级搜索列表 exhibitorSearch 找展商 batchQuery 批量查询 companyHome 企业主页 unlockList 解锁列表 mapCompany 地图拓客 |
出参
参数名 | 数据类型 | 备注 |
id | LONG | 记录标识 |
buttonId | STRING | 按钮回传标识,唯一 |
buttonText | STRING | 按钮显示文本 |
viewPages | ARRAY<STRING> | 显示页面标识代码数组 |
删除页面按钮配置
DELETE /blue-crm/api/v1/open/oem/customer/button/{id}
入参
参数名 | 数据类型 | 数据域 | 备注 |
id | LONG | path | 记录标识 |
出参
无,响应http码204
获取解锁分组标签
GET /blue-crm/api/v1/open/oem/customer/unlockTags
入参
无
出参
参数名 | 数据类型 | 备注 |
数据列表 | ARRAY | 数据数组 |
–id | LONG | 记录标识 |
–dictKey | STRING | 分组的key标识 |
–dictName | STRING | 分组的名称 |
–dictDesc | STRING | 分组的描述 |
–orderNo | STRING | 排序序号 |
添加解锁分组标签
POST /blue-crm/api/v1/open/oem/customer/unlockTag
入参
参数名 | 数据类型 | 数据域 | 备注 |
dictName | STRING | body | 分组的名称 1~20字符 |
dictDesc | STRING | body | 分组的描述 1~50字符 |
出参
无,响应http码204
编辑解锁分组标签
PUT /blue-crm/api/v1/open/oem/customer/unlockTag/{id}
入参
参数名 | 数据类型 | 数据域 | 备注 |
id | LONG | path | 记录标识 |
dictName | STRING | body | 分组的名称 1~20字符 |
dictDesc | STRING | body | 分组的描述 1~50字符 |
出参
无,响应http码204
删除解锁分组标签
DELETE/blue-crm/api/v1/open/oem/customer/unlockTag/{id}
入参
参数名 | 数据类型 | 数据域 | 备注 |
id | LONG | path | 记录标识 |
出参
无,响应http码204
接口回调
该系列接口用于当操作员操作数据后,小蓝本以POST JSON方式向该URL发送业务数据,你方在收到并处理成功后响应结果JSON
所有接口调用超时时长固定为3秒,如果超过3秒未响应,拓客系统则会当成默认处理
数据签名
由小蓝本发送来的数据,在请求的url路径后,会自动追加签名参数data_sign
该签名参数是直接对发送请求的body块字符串进行RSA加签,收到后可以通过RSA的公钥进行验证
RSA签名算法为SHA1WithRSA
RSA签名验证公钥base64编码为
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrYYOJGFKnXyILiSlXdD2vLGbwfEZz3nynNe066y1SCLI1MTDzRRgfdgMVTmPr95uu4nE3iE5O145RzeNF47UUMuYqBsKP9kjc+0qHdM2d90S3NBuL4U1nSkWnxb4Nq/nGpnQ/ItglSJaf4ejLQEEsImPPCyXDDrHqEuIltffkzwIDAQAB
JAVA代码
import java.security.Signature;
import java.security.SignatureException;
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import org.apache.commons.codec.binary.Base64;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.security.KeyFactory;
public class RSAUtils {
private static final String RSA_SIGNATURE_ALGORITHM = "SHA1WithRSA";
private static final String RSA_ALGORITHM = "RSA";
/**
* RSA验签
*
* @param content 待验签的内容-取自body块原文
* @param base64Sign base64待验的签名
* @param publicKey 验签使用的base公钥
* @param charset 字符集 固定UTF-8
* @return 返回验签结果
*/
public static boolean rsaCheck(String content, String base64Sign, String base64Key, Charset charset)
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
byte[] keyBytes = Base64.decodeBase64(base64Key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(RSA_SIGNATURE_ALGORITHM);
signature.initVerify(publicKey);
signature.update(content.getBytes(charset));
return signature.verify(Base64.decodeBase64(base64Sign.getBytes(charset)));
}
}
PHP示例
<?php
function rsaCheck($content, $base64Sign, $base64Key) {
$base64Key="-----BEGIN PUBLIC KEY-----\n".$base64Key."\n-----END PUBLIC KEY-----\n";
$res = openssl_pkey_get_public($base64Key);
$detail = openssl_pkey_get_details($res);
$pkey= $detail['key'];
$sign=base64_decode($base64Sign);
return openssl_verify($content, $sign, $pkey);
}
?>
自定义按钮点击回调接口
当终端操作用户在 找企业、地图拓客 等模块,点击自定义的按钮后,则立即触发该接口回调逻辑
如果回调失败,则会直接提示终端操作用户错误信息
当一次圈选大批次数据时,系统内部自动分成400条记录一个子批次进行回调,因此,终端用户点击一次,你可能会收到很多次回调数据
请求参数
参数名 | 数据类型 | 数据域 | 备注 |
data_sign | STRING | query | 数据信息体的签名 |
batchNo | STRING | body | 批次号,如果一个点击拆分成多次回调,则批次号会是xxxxx-123样式 |
customerId | INT | body | 你的企业ID |
accountId | INT | body | 操作者的账号ID |
buttonId | STRING | body | 点击按键的标识ID,由自定义按键处定义 |
entList | 数组 | body | 回调的企业列表 |
remark | STRNG | body | 添加到OEM弹层用户输入的备注字段 |
–eid | STRING | body | 企业唯一标识 |
–name | STRING | body | 企业名称 |
–brand | STRING | body | 企业品牌 |
–logo | STRING | body | 企业logo |
–contactWayNum | INT | body | 联系人数 |
–shortName | STRING | body | 企业简称 |
–companyFrName | STRING | body | 法人名称 |
–rank | DOUBLE | body | 实力值(小蓝本自有算法值) |
–esdate | STRING | body | 成立日期 |
–companyStatusName | STRING | body | 企业状态名称 |
–phoneCnt | STRING | body | 活跃手机号数目, 可能会显示为12个,如果没有可能为– |
–kpPhoneCnt | STRING | body | 活跃KP手机号数 |
–companyFrPid | STRING | body | 公司法人pid |
–stockCode | STRING | body | 股票代码 |
–stockShortname | STRING | body | 股票简称 |
–regcap | DOUBLE | body | 注册资本 |
–ssNum | INT | body | 参保人数 |
–status | INT | body | 状态 |
–regArea | STRING | body | 注册地 |
–capTypeName | STRING | body | 资本类型 |
–regGroupName | STRING | body | 所属集团,小蓝本算法值 |
–acConam | DOUBLE | body | 实缴资本 |
–areas | 字符串数组 | body | 所属省市区 如 [“浙江”, “杭州市”, “西湖区”] |
–industryphyName | STRING | body | 所属行业 |
–esage | INT | body | 成立年限 |
–investAmount | DOUBLE | body | 对外投资 |
–listingDateLatest | STRING | body | 上市日期 yyyy-MM-dd |
–opscope | STRING | body | 经营范围 |
–roundStage | STRING | body | 融资阶段 |
–regDes | STRING | body | 企业简介 |
–emails | 字符串数组 | body | 邮箱 如 [“12345@qq.com”, “12343@163.com”] |
–regCapCurName | STRING | body | 注册资本币别 |
–website | STRING | body | 网站, 多个时仅返回第一个 |
–orgTypeName1 | STRING | body | 机构类型 二级分类第1层 |
–orgTypeName2 | STRING | body | 机构类型 二级分类第2层 |
–ecoTypeName1 | STRING | body | 经济类型 二级分类第1层 |
–ecoTypeName2 | STRING | body | 经济类型 二级分类第2层 |
–contactList | 数组 | body | 联系人列表 |
—-pid | STRING | body | 联系人标识ID |
—-name | STRING | body | 联系人名称 |
—-dept | STRING | body | 部门 |
—-position | STRING | body | 职位 |
—-phone | STRING | body | 手机 |
—-tel | STRING | body | 固话 |
STRING | body | ||
—-logo | STRING | body | logo |
—-source | STRING | body | 号码来源字段,注该字段为一个复杂的JSON结构[{“groupName”:”B2B”,”sources”:[{“name”:”xxx”,”url”:”url”}]}] |
—-isKp | BOOL | body | 是否是KP |
—-eidCount | INT | body | 同一个联系方式的企业数 |
响应体格式
响应体仅支持JSON格式
字段名 | 数据类型 | 备注 |
success | BOOL | 如果处理成功则返回true;如果处理失败则返回false; 如果返回的是false,在分批次时,则会中断后续的任务 |
successNum | INT | 处理成功的企业记录数 |
failedNum | INT | 处理时过滤忽略处理的企业记录数,如该企业已经被另外一个员工占有时 |
successContactNum | INT | 处理成功的联系人数 |
message | STRING | 处理成功或失败的提示消息 |
页面内嵌方案
在用户获取到的免登链接打开的拓客页面,系统支持增加参数方式,嵌入到内部系统中
nohead=1 则会不显示页面头
nomenu=1 则不会显示页面菜单
该两个参数以&nohead=1&nomenu=1方式追加至免登链接中
如果想直接跳转至指定页时,需要在获取到的免登链接中,将目标页面的路由添加到URL中
如:高级搜索页,则是https://leads.pi51.cn/#/newUser/advancedSearch?login_id=xxx&login_key=xxxx&login_sign=xxxx&return_url=xxxx