泛微第三方异构系统调用流程

一、ECOLOGY系统配置


1、配置接口白名单

在ecology系统代码目录中找到以下配置文件:ecology/WEB-INF/prop/weaver_session_filter.properties

checkurl=/api/hrm/emmanager;/api/userPhrase;
uncheckurl=/api/ec/dev/app/getCheckSystemInfo;/api/ec/dev/app/emjoin;
unchecksessionurl=/api/ec/dev/util/accesspage;.../api/loginportal/element/;/api/edc/fillin/;

在unchecksessionurl=后面添加/api/ec/dev/auth/regist;/api/ec/dev/auth/applytoken;

2、发放许可证(appid)

在ecology系统数据库执行以下脚本示例(请不要直接使用示例中的数据):

INSERTINTO ECOLOGY_BIZ_EC(ID,APPID,NAME) VALUES('123456','EEAA5436-7577-4BE0-8C6C-89E9D88805EA','上海泛微网络科技股份有限公司');
COMMIT;

字段描述:

  • ID:数据库主键。保证与其它系统发放的许可证在数据库中的主键标识不冲突即可(对应示例:123456

  • APPID:许可证号码。最终发放给异构系统的许可证号码,多个许可证号码保证唯一(对应示例:EEAA5436-7577-4BE0-8C6C-89E9D88805EA)。可访问 http://www.uuid.online/ UUID在线生成器(保证唯一即可)

  • NAME:许可证名称。用于快速辨识许可证发放系统(对应示例:上海泛微网络科技股份有限公司

3、清除OAsql缓存

chrome浏览器访问 OA地址/commcache/cacheMonitor.jsp界面,点击重启加载配置。这样数据库操作修改的数据可以及时生效。

4、限制许可证使用ip地址

在ecology系统代码目录中找到以下配置文件:ecology/WEB-INF/prop/weaver_rest_token.properties

复制# 限制Rest API Token Invoke注册端IP地址,多个IP地址之间用逗号分隔# 例如:allowIp=127.0.0.1,192.168.0.1,172.10.0.1,10.10.10.01allowIp=

在allowIp=后面添加客户调用方服务器实际的ip地址(不设置将代表不限制任何ip,生产环境建议设置)

二、异构系统编码实现认证


1、引入RSA加密算法工具jar包到异构系统

  • java开发语言的客户可以直接在ecology系统代码目录中找到ecology/WEB-INF/lib/hutool-all-5.3.0.jar文件引入到异构系统项目资源目录下。
    c#参考:RSAConvert.cs
    python参考:auth_token.py

  • 其它开发语言的异构系统请自行查询一下底层库实现的rsa算法。

在线测试rsa算法加解密网站:在线RSA测试

关于RSA算法请参考百度百科:RSA算法

三、postman演示(配置完成后使用postman测试是否能通)


首先向OA系统发送许可证信息进行注册认证

演示如下

然后拿取到的secrt跟spk在RSA中进行加密

加密后的值在放入secret中获取token

四、演示代码


package com.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import weaver.rsa.security.RSA;

import java.util.HashMap;
import java.util.Map;

/**
 * description :
 * author :JHY
 * date : 2020/6/3
 * version : 1.0
 */
public class IdentityVerifyUtil {
    public static final String APPID = "EEAA5436-7577-4BE0-8C6C-89E9D88805EA";
    public static final String HOST = "http://127.0.0.1:8080";
    //系统公钥信息
    private String SPK = null;
    //秘钥信息
    private String SECRET = null;

    private static IdentityVerifyUtil instance;

    public static synchronized IdentityVerifyUtil getInstance() {
        if (instance == null) {
            instance = new IdentityVerifyUtil();
            instance.regist();
        }
        return instance;
    }

    private IdentityVerifyUtil() {
    }


    private void regist() {
        //httpclient的使用请自己封装,可参考ECOLOGY中HttpManager类
        HttpManager http = new HttpManager();
        //请求头信息封装集合
        Map<String, String> heads = new HashMap<String, String>();
        //获取当前异构系统RSA加密的公钥
        String cpk = new RSA().getRSA_PUB();
        //当前异构系统用于向ECOLOGY注册时使用的账号密码通过DES加密后密文进行传输
        //kb1906及以上版本 已废弃账号密码校验
        //封装参数到请求头
        heads.put("appid", APPID);
        heads.put("cpk", cpk);
        //调用ECOLOGY系统接口进行注册
        try {
            String data = http.postDataSSL(HOST + "/api/ec/dev/auth/regist", new HashMap<>(), heads);
            //返回的数据格式为json,具体格式参数格式请参考文末API介绍。
            //注意此时如果注册成功会返回秘钥信息,请根据业务需要进行保存。
            if (data != null) {
                JSONObject result = JSON.parseObject(data);
                if ("true".equals(result.getString("status"))) {
                    this.SPK = result.getString("spk");
                    this.SECRET = result.getString("secrit");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getToken() {
        //httpclient的使用请自己封装,可参考ECOLOGY中HttpManager类
        HttpManager http = new HttpManager();
        //请求头信息封装集合
        Map<String, String> heads = new HashMap<String, String>();
        RSA rsa = new RSA();
        //对秘钥进行加密传输,防止篡改数据
        String secret = rsa.encrypt(null, SECRET, null, "utf-8", SPK, false);
        //封装参数到请求头
        heads.put("appid", APPID);
        heads.put("secret", secret);
        //调用ECOLOGY系统接口进行申请
        try {
            String data = http.postDataSSL(HOST + "/api/ec/dev/auth/applytoken", new HashMap<>(), heads);
            if (data != null) {
                JSONObject res = JSON.parseObject(data);
                if ("true".equals(res.getString("status"))) {
                    return res.getString("token");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取请求头信息
     * @param token
     * @param userid
     * @param spk
     * @return
     */
    public static Map<String, String> getHttpHeads(String token,String userid,String spk){
        Map<String, String> heads = new HashMap<>();
        heads.put("token", token);
        heads.put("appid", IdentityVerifyUtil.APPID);
        RSA rsa = new RSA();
        String secretUserid = rsa.encrypt(null, userid, null, "utf-8", spk, false);
        heads.put("userid", secretUserid);
        return heads;
    }

    public String getSPK() {
        return SPK;
    }

    public String getSECRET() {
        return SECRET;
    }
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
泛微OA的第三方异构系统调用流程通常包括以下步骤: 1. 获取Token:首先需要获取Token,通过以下API接口获取Token ``` http://服务器地址:端口号/weaver/batch/authentication.do ``` 请求方式:POST 请求参数: ``` { "params": { "language": "7", "loginid": "账号", "password": "密码", "useragent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36", "domain": "泛微OA的域名" }, "requestid": "1", "serviceid": "rest", "ticket": "null" } ``` 2. 调用API:获取Token后,就可以调用API接口了。通过以下API接口调用。 ``` http://服务器地址:端口号/rest/workflow/request/create.action ``` 请求方式:POST 请求参数: ``` { "requestname": "测试流程", "workflowid": "流程编号", "operatorid": "操作人编号", "csrftoken": "token", "formdata": [{ "fieldid": "字段ID", "fieldvalue": "字段值" }, { "fieldid": "字段ID", "fieldvalue": "字段值" }], "attachments": [{ "filename": "文件名", "filebody": "文件内容", "filesize": "文件大小" }] } ``` 其中,需要替换的参数有: - 服务器地址:泛微OA服务器地址 - 端口号:泛微OA端口号 - 账号:泛微OA登录账号 - 密码:泛微OA登录密码 - 泛微OA的域名:泛微OA的域名 - 流程编号:泛微OA中指定的流程编号 - 操作人编号:泛微OA中指定的操作人编号 - token:获取到的Token - 字段ID:泛微OA中定义的字段ID - 字段值:需要提交的字段值 - 文件名:需要提交的文件名 - 文件内容:需要提交的文件内容 - 文件大小:需要提交的文件大小 演示代码如下: ```csharp using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // 获取Token string token = GetToken("账号", "密码", "泛微OA的域名"); // 调用API string result = CallAPI(token, "流程编号", "操作人编号", "字段ID", "字段值"); Console.WriteLine(result); } // 获取Token static string GetToken(string loginid, string password, string domain) { string url = "http://服务器地址:端口号/weaver/batch/authentication.do"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json;charset=UTF-8"; string postData = "{\"params\":{\"language\":\"7\",\"loginid\":\"" + loginid + "\",\"password\":\"" + password + "\",\"useragent\":\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36\",\"domain\":\"" + domain + "\"},\"requestid\":\"1\",\"serviceid\":\"rest\",\"ticket\":\"null\"}"; byte[] bytes = Encoding.UTF8.GetBytes(postData); request.ContentLength = bytes.Length; Stream stream = request.GetRequestStream(); stream.Write(bytes, 0, bytes.Length); stream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); string result = reader.ReadToEnd(); reader.Close(); responseStream.Close(); response.Close(); int start = result.IndexOf("csrfToken\":\"") + 12; int end = result.IndexOf("\"", start); string token = result.Substring(start, end - start); return token; } // 调用API static string CallAPI(string token, string workflowid, string operatorid, string fieldid, string fieldvalue) { string url = "http://服务器地址:端口号/rest/workflow/request/create.action"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json;charset=UTF-8"; request.Headers.Add("X-CSRF-TOKEN", token); string postData = "{\"requestname\":\"测试流程\",\"workflowid\":\"" + workflowid + "\",\"operatorid\":\"" + operatorid + "\",\"csrftoken\":\"" + token + "\",\"formdata\":[{\"fieldid\":\"" + fieldid + "\",\"fieldvalue\":\"" + fieldvalue + "\"}],\"attachments\":[]}"; byte[] bytes = Encoding.UTF8.GetBytes(postData); request.ContentLength = bytes.Length; Stream stream = request.GetRequestStream(); stream.Write(bytes, 0, bytes.Length); stream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); string result = reader.ReadToEnd(); reader.Close(); responseStream.Close(); response.Close(); return result; } } } ``` 注意:代码中的参数需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值