泛微OA待办集成免登的说明
1、待办集成的实现效果
当CRM中用户提交流程至审批人节点时,会同步推送一条待办流程至审批人OA系统待办列表,审批人在OA系统中点击该流程时,会自动跳转至CRM流程审批界面。
2、需要OA侧提供的支持
需要OA提前开通OAuth2.0认证模块,并开通流程待办集成模块,均为OA非标准模块,需客户方联系OA增购相关模块。
3、对接环境要求
客户OA系统需开放外网访问权限,并可提供测试系统供集成开发测试。
泛微OAuth2.0配置
1、后端应用中心->集成中心->统一认证中心->认证服务管理->OAuth2认证, 设置启用
2、后端应用中心->集成中心->统一认证中心->认证服务管理->认证应用管理
点击注册,认证方式选择OAUTH2,应用名称自行设置,业务系统URL地址
设置为https://wwww.fxiaoke.com,账号映射规则选择工号,保存生效
3、后端应用中心->集成中心->功能集成->统一代办中心设置
点击注册,输入集成应用信息,PC地址设置规则为OA统一认证鉴权接口+client_id+response_type+redirect_url=CRM鉴权接口,示例:
http://www.yumin.ltd:9090/sso/oauth2.0/authorize?client_id=39b2e3359e&response_type=code&redirect_uri=https://www.fxiaoke.com/erp/syncdata/open/oa/authorize/common
client_id为上一步操作中创建认证应用的应用标识,人员转换规则设置为工号,打开自动创建流程类型,编辑流程类型,接收流程数据,显示到PC端,显示到移动端这几个开关,在第二页流程类型中添加需要集成的流程类型并接收流程即可。
CRM端OA待办连接器配置
1、进入连接器设置,参考集成平台OA连接器手册进行初始设置,填写参数设置
https://help.fxiaoke.com/9bfb/c68f/c553/f900
2、进行场景参数设置,设置待办流程消息参数,按实际需要设置,其中syscode为OA待办接口要求传递的待办集成系统标识,在第三步操作中设置,其他参数按照CRM的占位符设置即可,待办消息推送地址由OA侧提供
3、待办自定义函数,可用于动态设置流程待办消息参数,当预设CRM占位符不满足使用需求时使用,可用于转换流程名称,时间参数处理等逻辑,写法可参考集成平台手册。
4、进入连接器设置,参考集成平台OA连接器手册进行账户绑定,OA侧转换规则设置的为工号,故此处使用人员工号进行账号绑定
OA免登集成介绍
1、免登鉴权函数,在账号绑定页面新建按钮旁边的扩展按钮中设置,用于在OA侧点击流程跳转至CRM时实现免登陆
2. 免登实现原理说明,用户在用于在OA侧点击待办流程跳转至CRM鉴权地址时,会携带OA的ticket临时码作为免登函数入参,获取到这个值后,作为入参调用OA统一认证中心的accesstoken接口获取token,然后用token作为入参去调用OA统一认证中心的profile用户接口获取员工信息,然后在函数中返回员工信息的工号,与账户绑定中的工号正确匹配后即可成功免登。
代码示例:
//泛微OA接口地址前缀-必填
private static String PREFIX_URL="http://www.yumin.ltd:43410/"
//应用ID-必填 OA认证应用标识
private static String CLIENTID="39b2e3be-b4ca-4e7a259e"
//应用密钥-必填 OA认证应用密钥
private static String CLIENTSECRET="slatwgyHoIGWRd36p"
//纷享回调地址-必填
private static String redirect_uri = "https://www.fxiaoke.com/oauth/sp/callback"
accessToken获取方式(可作为工具类封装)
public static Map accessToken(String code){
log.info("----------获取access_token接口---------------------------------")
String final_url=PREFIX_URL+"sso/oauth2.0/accessToken?client_id="+CLIENTID+"&client_secret="+CLIENTSECRET+"&code="+code+"&grant_type=authorization_code&redirect_uri="+redirect_uri
log.info("登录授权接口:"+final_url)
Map returnMap= OAuthUtils.post(final_url,[:],[:])
return returnMap
}
public static String getAccessToken(String code ) {
log.info("code:"+code)
log.info("-----------OAuth授权-----------------------------")
Map accessTokenMap=accessToken(code)
if(accessTokenMap.containsKey("access_token")){
return accessTokenMap.access_token as String
}
return null
}
第三方OA用户信息获取方式(可作为工具类封装)
public static Integer openId2userId(String accessToken) {
HttpResult o = (HttpResult) http.get(PREFIX_URL+"sso/oauth2.0/profile?access_token="+accessToken, ["access_token": accessToken]).getData();
String user = o.content["attributes"]["loginid"].toString();
//从第三方用户信息里,查询人员对象获取绑定信息,建议用自定义字段
QueryResult data = (QueryResult) object.find("PersonnelObj",
[["employee_number": user]],2,0).getData()
List<Map> dataList = data.dataList
//如果用户信息查找失败,返回错误
//也可以在此根据信息,进行新建人员并且设置绑定字段的内容
if (dataList.size() <= 0) {
message.throwErrorMessage("找不到对应的用户, user:" + user)
}
if (dataList.size() > 1) {
message.throwErrorMessage("找到多个对应的用户, user:" + user)
}
//返回员工对象中的employee_number字段,用于后续登录时使用
return dataList[0]["employee_number"].toString() as Integer
}
免登鉴权函数
String url = syncArg["oaConnectParam"]["ssoAuthUrl"] as String;
log.info("url:"+url)
String ticket = syncArg["params"]["requestParams"]["ticket"] as String;
log.info("ticket:"+ticket);
//租户临时授权模式,如果有其他模式,请阅读第三方文档
String token = Tools.getAccessToken(ticket);
log.info(token);
//从人员对象,获取纷享用户userId
Integer userId = Tools.openId2userId(token);
log.info(userId);
syncArg.put("oaUser",userId);//固定返回oaUser为key的第三方账号
log.info("syncArg:"+Fx.json.toJson(syncArg));
return syncArg;