连接器支持的能力
1、CRM帐号与OA账号的绑定。
2、从OA系统免登到CRM。(不支持CRM免登到OA)
3、CRM提醒、CRM待办推送到OA系统。
一、对接OA流程
1.1 购买集成平台-OA- CRM待办OA连接器
找到对应的产品,下订单进行购买,则配置入口自动开通。 配置入口在 管理->系统对接管理 下面。

1.2 账户绑定
进入 集成平台-OA代办 ->账户绑定 「集成平台管理-连接器- CRM待办OA」,可通过新建或导入将纷享员工与OA员工进行绑定

帐号自动绑定
1.3 发送消息到OA接口配置
确认客户的接口调用方式,webservice和restful两种不同的调用方式在配置上稍微有些不同,下面的配置文档中将会对有区别的地方分别写清楚该如何配置;
二、对接OA配置步骤
2.1 通用参数设置
进入 集成平台-OA代办 「集成平台管理-连接器- CRM待办OA」 ->初始设置 ->通用参数配置,分为Headers参数设置和结果格式设置:

(1)Headers参数设置根据客户需求,自行增加。点击添加一行输入key和value,点击保存即可添加成功;

(2)结果格式设置中key已预置,value需根据客户接口调用的返回结果自行添加;

- codeName:填写返回结果中的code字段名
- msgName:填写返回结果中message信息的字段名
- dataName:默认不填写
- successCode:填写调用成功的code值
- xmlJsonField: webservice接口调用方式默认填写out,restful接口调用方式默认不填写
示例:如下图所示的返回结果,codeName填写code,msgName填写message,successCode填写0

2.2 场景参数设置
(1)进入集成平台-OA代办 「集成平台管理-连接器- CRM待办OA」 ->初始设置 ->场景参数设置,可根据客户需求开启相应场景并进行配置。开启则推送相应的代办消息操作到OA系统,关闭则不会;

(2)下面以新增代办为例来进行配置讲解,点击新增代办的【设置】,进入新增代办设置页面

- 接口地址设置:配置OA系统新增代办的接口调用地址
- 接口类型:配置调用接口的请求方法
- Body参数设置: 配置调用接口需传递的参数,参数值填写对接CRM代办的字段,注意需填写以#开头的占位符,CRM代办字段及占位符可在右侧进行搜索。注意webservice接口调用方式,Body参数需为xml格式;restful接口调用方式,Body参数需为json格式
- 编辑代办、删除代办根据客户接口文档相应更换接口地址、接口类型、Body参数设置
(3)新增代办配置示例:
假设以下为客户给出的接口调用文档
- 请求方式: POST
- 请求地址:http://test.com.cn:909/rest/transmit/fxiaoke/create
- 请求参数:


按照以上给出的接口文档,则接口地址设置填写:http://test.com.cn:909/rest/transmit/fxiaoke/create,接口类型选择POST
Body参数填写给出的Post内容(如果客户接口是webservice调用方式,则需转换为xml格式),左边字段不变,把右边的值填写对应要映射的CRM字段-用占位符,则填写完后如下图所示:

三、验证OA消息推送接口
在纷享系统新增、编辑、删除代办消息后,查看同步记录,并在OA查看代办是否推送成功:

四、免登录对接
CRM的代办消息推送到OA以后,用户从OA点击消息,要能免登录到CRM。
根据不同厂商有不同的操作:
4.1 致远OA
致远OA认证方式选择:应用注册;

产品登记:

在【应用对接】找到对应应用:

配置用户绑定:

待办集成:

做完上述操作后,需要客户提供应用账号密码。
4.1.1 待办消息推送
使用致远OA里面的V5auth认证方式:
致远OA系统,推送待办需要先获取他们系统的token。需要让客户在致远OA系统上创建一个纷享的应用,并且提供对应的账号密码。每次调用接口的时候,需要在请求头拼接token。
OA平台有根据脚本生成url的功能,需要编写脚本获取带token的地址。
后续都需要参考这里:1.1 【CRM待办OA】OA函数
脚本模板:
import groovy.json.JsonSlurper
import [sun.net](http: //sun.net/).www.protocol.https.DelegateHttpsURLConnection
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
public String getToken() {
String token = null;
String userName = \"****\"; // 填写客户提供的账号
String password = \"**********************\"; // 填写客户提供的密码
String requestUrl = \"http://**********/seeyon/rest/token/\" + userName + \"/\" + password; // 修改请求地址
HttpURLConnection connection = (HttpURLConnection) new URL(requestUrl).openConnection();
connection.setRequestMethod(\"GET\");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000); connection.setUseCaches(false); connection.setRequestProperty(\"Content-Type\", \"text/xml; charset=UTF-8\");
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000); connection.setDoOutput(true); connection.setDoInput(true); connection.connect(); int code = connection.getResponseCode();
if (code == 200) {
InputStream inputStream = connection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line;
StringBuffer buffer = new StringBuffer();
while ((line = bufferedReader.readLine()) != null) {
buffer.append(line);
}
String str = buffer.toString();
def jsonSlurper = new JsonSlurper()
Map map = jsonSlurper.parseText(str)
token = map.get(\"id\")
}
else {
throw new RuntimeException(\"握手异常(\" + connection.getResponseCode() + \")!\" + connection.getResponseMessage())
}
return url + \"?token=\" + token;
}
url = getToken();
return url;4.1.2 单点登录

单点登录通过致远OA的门户认证机制认证。OA平台对外开放致远OA免登录接口:
https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/login/{ei}/{isApp}e.g: https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/login/89161/true致远登录后续不支持上面url,都需要参考函数统一免登:1.1 【CRM待办OA】OA函数
OA那边通过点击待办,或者纷享应用。会携带token给平台,平台通过拿到的token再去调用OA的门户认证接口,获取当前用户。最后重定向到
这个用户免登录的页面。
4.1.3 致远OA待办跳转CRM待办和跳转CRM主页面
单点登录成功后,可以获取到对应的用户信息。通过CRM的免登录接口,重定向到对应的页面。
跳转CRM待办接口:
https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/{apiName}/{dataId}/{ei}/{isApp}跳转CRM主页面接口:
https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/login/{ei}/{isApp}参考:

{
"registerCode": "3004",
"taskId": "#F012",
"title": "#F054 #F056 #F053",
"senderName": "#F054",
"state": "0",
"thirdSenderId": "#F049",
"thirdReceiverId": "#F001",
"creationDate": "#F009",
"content": "",
"h5url": "[https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/#F037/#F015/714439/true](https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/#F037/#F015/714439/true)",
"url": "[https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/#F037/#F015/714439/false](https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/SeeYon/#F037/#F015/714439/false)",
"noneBindingSender":"",
"noneBindingReceiver":"#F001"
}4.2 泛微OA
泛微OA目前实现上有两种方式:
4.2.1 方案一:通过创建认证提供商实现单点登录
点击链接查看 认证提供商
4.2.2 方案二:OA侧提供身份验证接口,crm做免登

客户在OA系统点击代办的链接的时候,在url携带额外对应的参数,纷享做对应的鉴权,鉴权通过则免登进入对应的详情页面
| 额外参数 | 参数说明 | 备注 |
| loginid | OA员工ID | |
| stamp | 时间戳 | |
| token | sha加密后的结果 | 加密方式参数下列代码 |
| secret | 双方约定的密钥 | 纷享开发提供 |
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Sha1Util {
public static String getSha1(byte[] input) throws NoSuchAlgorithmException {
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
byte[] result = mDigest.digest(input);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < result.length; i++) {
sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
/**
* 示例加密过程
* @param args
*/
public static void main(String[] args) {
String secret = "d73ec6289574d272c9cc2df5ff70488b";
String loginid = "0001";
String stamp = "1634128095994";
String encryptValue = secret + loginid + stamp;
try {
String getData = Sha1Util.getSha1(encryptValue.getBytes());
System.out.println(getData);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}4.3 蓝凌OA
联系技术顾问沟通获取身份接口;
4.4 云之家OA
依赖云之家的openapi接口,erp-oa可以针对云之家的客户统一做免登的操作:
1.客户需要在云之家的应用中心,进行创建应用。详情参看
https://open.yunzhijia.com/opendocs/docs.html#/guide/lightapp/create2.配置页面:

api设置页面:

https://www.yunzhijia.com/gateway/newtodo/open/generatetodo.json?accessToken=
{
"content": "提交人:#F054",
"title": "#F055",
"itemtitle":"#F056",
"headImg": "https://yunzhijia.com/space/c/photo/load?id=5a2f7ad750f8dd7810e79981",
"appId": "500723908",
"senderId": "#F049",
"params":[
{
"openId":"#F001"
}
],
"url": "https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/webhook/#F037/#F015/#F028",
"sourceId": "#F012",
"sync": true
} 3.在推送云之家中需要填写url的参数:可以参考:
https://www.fxiaoke.com/erp/syncdata/open/oa/authorizeWeb/webhook/{占位符:流程apiname}/{占位符:发起流程数据ID}/{占位符 tenantId}4.配置应用的免登的地址:
https://www.fxiaoke.com/erp/syncdata/open/oa/authorizePortalWebhook/webhook/{ei}
//后面的ei需要替换为真实企业的账号id。www.fxiaoke.com域名也需要替换为真实的域名。5.从第一步创建的应用,可以拿到云之家应用的appid,appsecret,在已经登录的纷享企业的浏览器,重新开一个浏览器窗口,在地址栏上输入:
https://www.fxiaoke.com/erp/syncdata/oa/permit/webhook/addInfo?appId={替换成真实appid}&secret={替换成真实secret}多个OA连接器的,需要补充dataCenterId的参数。

4.5 华为WeLink
4.6其它OA
联系技术顾问沟通获取身份接口;
五、对接多个OA帐套
可以通过新建连接,再新建一个OA连接器,完全独立的配置,可以对接其他OA帐套

六、重试规则设置
异常时重试
默认开启异常时重试,可设置什么数据同步异常/失败时重试
可关闭重试

异常时通知
通过「集成平台」企信服务号推送,默认推送给CRM管理员和集成管理员。
聚合通知:按10分钟聚合,当异常(包括所有业务类型)数量大于0时推;如果设置了重试规则,则重试完成后再通知;
七、消息提醒配置(文本 / 卡片 / @me)
CRM 消息提醒通过「场景参数设置」中的消息场景推送到 OA。文本提醒、普通卡片和 @me 消息共用消息模板;@me 消息需要额外读取原始消息中的 feedId,才能打开对应的 CRM 动态。
7.1 支持的消息类型
- 文本提醒:显示消息内容,点击后按原有配置进入 CRM 首页。
- 卡片消息:显示标题和内容,点击后进入业务对象详情。
- @me 消息:显示“有人@了你”等内容;按本节配置后进入对应的动态详情。
- 审批待办:不属于消息提醒,仍按本文第四、五章配置。
7.2 配置前准备
- 已完成 OA 账号与 CRM 账号绑定(见 1.2 账户绑定)。
- 已获取 OA 消息接口地址、请求方式、请求头和请求体格式。
- 已确认 OA 打开消息时会追加 ticket 参数(致远为 v5ticket)。
- 消息模板编辑页的可用占位符中能看到 #H010(原始消息);如果没有,请联系纷享销客支持。
- 测试用户的 OA 账号和 CRM 账号已绑定。
7.3 消息模板配置
进入「集成平台 → OA 待办 → CRM待办OA → 初始设置 → 场景参数设置 → 消息提醒 → 设置」。左侧字段名保持 OA 接口要求不变,右侧填写 CRM 占位符。
常用占位符:#H001 接收人、#H002 标题、#H003 业务对象 API 名称、#H004 审批实例 ID、#H005 业务对象 ID、#H006 消息内容、#H007 消息类型、#H008 企业账号、#H009 企业 ID、#H010 原始消息、#H011 应用 ID。
@me 消息没有业务对象和审批实例,使用 #H003、#H004 拼出的地址不完整。处理方式:在模板末尾增加 "origin": #H010,让消息函数读取原始消息中的 generateUrlType 和 feedId。
7.4 双 URL 模板(致远)
致远同时提供手机和 PC 地址时,模板示例如下(字段名按致远接口文档调整):
{
"thirdpartyRegisterCode": "{{消息注册码}}",
"thirdpartyMessageId": "#H004",
"messageContent": "#H006",
"thirdpartySenderId": "#H001",
"thirdpartyReceiverId": "#H001",
"messageH5URL": "https://www.fxiaoke.com/erp/syncdata/open/oa/authorize/common/#H009/#H003/#H005/true",
"messageURL": "https://www.fxiaoke.com/erp/syncdata/open/oa/authorize/common/#H009/#H003/#H005/false",
"noneBindingSender": "#H001",
"noneBindingReceiver": "#H001",
"origin": #H010
}注意:#H010 不要加引号;最后一行前面要有逗号;只改消息提醒模板,不要改审批待办模板。
7.5 URL 模板(云之家等)
OA 只有一个 url 字段时,模板示例如下:
{
"msgType": "#H007",
"content": "#H006",
"title": "#H002",
"url": "https://www.fxiaoke.com/erp/syncdata/open/oa/authorize/common/#H009/#H003/#H005/true",
"origin": #H010
}如果 OA 接口不接受未知字段,消息函数会在发送前删除 origin,不会把它传给 OA。
7.6 消息函数配置
在「集成平台 → 函数管理」中打开消息函数,找到解析请求体 requestData 的位置,在发送给 OA 之前插入下面的处理。发送和返回逻辑保持原函数不变,不需要整体替换。
// ============================================================
// @me 消息处理:从 #H010 原始消息中识别 feedId,改写 OA 登录链接
// 1. 取出并删除 origin,避免透传给 OA
// 2. 读取 generateUrlType、feedId、ei
// 3. 仅当类型为 6(ATME)且参数合法时改写 URL
// 4. CXGDFEED 是自定义回调标识,不是平台预置值
// 注意:模板中的 #H010 必须是结构值,不能加引号
// ============================================================
Map feedOrigin = requestData.remove("origin") as Map
if (feedOrigin != null) {
// generateUrlType 统一转成 int 比较,避免数字类型差异
int feedUrlType = feedOrigin["generateUrlType"] == null ? 0 : (feedOrigin["generateUrlType"] as int)
Map feedExtraData = feedOrigin["extraDataMap"] as Map ?: [:]
String feedId = feedExtraData["feedId"] as String
String feedEi = feedOrigin["ei"] as String
// generateUrlType=6 表示 @me 消息
boolean isAtMeFeed = feedUrlType == 6
// feedId、ei 会拼进 URL,只允许字母、数字、下划线和短横线
boolean isFeedIdValid = feedId != null && feedId ==~ /^[A-Za-z0-9_-]{1,64}$/
boolean isFeedEiValid = feedEi != null && feedEi ==~ /^[A-Za-z0-9_-]{1,32}$/
boolean canRewriteFeedUrl = isAtMeFeed && isFeedIdValid && isFeedEiValid
if (canRewriteFeedUrl) {
// 路径结构:/authorize/common/{ei}/{apiName}/{dataId}/{isApp}
// CXGDFEED 是消息函数和免登函数约定的 apiName,feedId 作为 dataId
// 它不是 CRM 对象 API 名称;两处必须保持一致
String feedCallbackApiName = "CXGDFEED"
String callbackBase = "https://www.fxiaoke.com/erp/syncdata/open/oa/authorize/common/"
String feedLoginUrl = callbackBase + feedEi + "/" + feedCallbackApiName + "/" + feedId
// 双 URL 模板:messageH5URL 为手机端,messageURL 为 PC 端
if (requestData.containsKey("messageH5URL")) {
requestData["messageH5URL"] = feedLoginUrl + "/true"
}
if (requestData.containsKey("messageURL")) {
requestData["messageURL"] = feedLoginUrl + "/false"
}
// 单 URL 模板
if (requestData.containsKey("url")) {
requestData["url"] = feedLoginUrl + "/true"
}
log.info("[OA] @me 消息改写登录链接, feedId=" + feedId + ", ei=" + feedEi)
} else if (isAtMeFeed) {
log.info("[OA] @me 消息参数不合法,跳过改写, feedId=" + feedId + ", ei=" + feedEi)
}
}
// ===== @me 消息处理结束 =====处理规则:只有 generateUrlType=6 且 extraDataMap.feedId 有效时才改写地址;企业 ID 直接从原始消息 origin.ei 读取,函数里不需要写死企业信息;其他消息和待办不受影响;origin 必须在发送前删除。路径中的 CXGDFEED 是消息函数和免登函数约定的回调标识,不是平台预置值,也不是 CRM 对象 API 名称;平台会把它作为 apiName、feedId 作为 dataId 传给免登函数,免登函数据此进入 feed 分支。两处必须保持一致,不要改成真实对象 API 名称,否则容易和默认对象详情逻辑混淆。
这段代码同时兼容双 URL 和单 URL 模板:存在 messageH5URL、messageURL 时分别改写,存在 url 时改写 url,不需要为不同 OA 维护两份函数。
7.7 免登函数配置
在免登函数中加入 CXGDFEED 分支,并放在原有 if (oaticket) 提前返回之前。只需要新增分支,oaUser 的获取沿用当前函数已有写法:
// ===== @me feed 支持开始 =====
// 必须放在原有 if (oaticket) 提前返回之前
// CXGDFEED 是消息函数与免登函数约定的回调标识
// 平台会把它作为 apiName、feedId 作为 dataId 传进来
String feedCallbackApiName = "CXGDFEED"
boolean isFeedCallback = apiName == feedCallbackApiName
// dataId 是 feedId,会拼进页面地址,只允许字母、数字、下划线和短横线
boolean isFeedIdValid = dataId != null && dataId ==~ /^[A-Za-z0-9_-]{1,64}$/
if (isFeedCallback && isFeedIdValid) {
// 替换为 CRM 企业账号(EA),不是数字企业 ID
String feedEa = "请替换为企业账号"
String feedRedirectUrl
if (isApp) {
feedRedirectUrl = "https://www.fxiaoke.com/hcrm/avah5?feedId=" + dataId + "#/feed/detail"
} else {
feedRedirectUrl = "https://www.fxiaoke.com/salelog?feedId=" + dataId + "&ea=" + feedEa
}
syncArg.put("redirectUrl", feedRedirectUrl)
// 沿用当前函数获取 OA 用户的方式
if (oaticket) {
syncArg.put("oaUser", oaticket)
} else {
syncArg.put("oaUser", OABPMUtils.ticket(ticket))
}
log.info("[OA] feed 免登, feedId=" + dataId + ", isApp=" + isApp)
return syncArg
}
// ===== @me feed 支持结束 =====如果原函数在 if (oaticket) 之后还有对象详情逻辑,请原样保留;CXGDFEED 只处理 @me 消息,不影响其他入口。
7.8 验证
- 在 CRM 动态中让同事 @ 测试用户,确认 OA 能收到消息。
- 在集成平台运行记录中查看消息:内容中不应有 origin,地址应包含 /CXGDFEED/{feedId}/true 和 /false。
- OA PC 端点击消息,应打开 https://www.fxiaoke.com/salelog?feedId={feedId}&ea={ea}。
- OA 手机端点击消息,应打开 https://www.fxiaoke.com/hcrm/avah5?feedId={feedId}#/feed/detail;需在对应客户端实测。
- 回归普通卡片、文本提醒和审批待办。
7.9 常见问题
- 点击 @me 仍进入首页:确认两个函数已发布,且 CXGDFEED 分支在 if (oaticket) 之前。
- 提示无法获取用户身份:OA 用户未绑定 CRM 用户。
- OA 返回格式错误:模板 JSON 不合法,或 origin 未在函数中删除。
- 手机端空白:客户端不支持当前 H5 页面,可先用 PC 链接并联系支持。
- 企业有多条 OA 连接:先联系纷享支持确认,避免免登时选错连接。