1.云之家accesstoken获取有三种授权级别,根据不同业务需求,需要不同的secret
云之家oauth2.0授权协议地址:https://open.yunzhijia.com/openplatform/resourceCenter/doc#/gitbook-wiki/server-api/accessToken.html
开发文档:https://yunzhijia.com/cloudflow-openplatform/before/1001
2.表单提交方式以multipart/form-data上传,可以采用HttpClient,不过之前调试的时候遇到第一条的坑,以为是请求方式的问题,就改成了HttpWebRequest,实际上,没啥区别,可自行修改;另外就是表单参数类型需要不同的数据格式,算是一个小坑,尤其是文件数据,表单提交时,文件字段数量和图片字段数量问题字行添加,因为业务问题,本文只做了单个字段的提交。
3.由于XX原因,表单模板以字段名称解析表单对应的key,嗯,采用了取巧的方法,直接以正则取codeId和title,实际上表单应该在确定的情况下,直接以添加控件时的codeId定好表单需要提交的数据,不过目前这样有个好处就是表单内容的解析可以通用以及可以随时增删字段(虽然依旧需要修改代码,嗯,这到底算不算好处??)。
4.审批结果那个方法,因为业务需求只需要审批中,驳回,审核通过,所以,嗯,相当取巧的直接以returned判断,可自行根据实际业务需求做复杂处理,还有就是节点回调接口,如果是webApi写的,得获取post的body。
5.另外一点就是云之家好像没有获取所有节点的接口,只能获取已审批的以及下一个未审批的节点,可能是我没仔细看文档,如果有知道的大佬,可以告诉我下,不然想做节点步骤条就比较麻烦;还有就是,云之家的回调补偿机制,好像如果没有回调成功以及补偿机制回调没结束,下次提交表单会失败(具体没深究是因为哪个ID被占用的原因,或者其他原因)。
6.云直接的回调数据的AES解密不带IV
AES解密:
/// <summary>
/// 不含iv的带Key的AES解密
/// </summary>
/// <param name="toDecrypt"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string Decrypt(string toDecrypt, string key)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
//处理乱码
List<byte> ary = resultArray.ToList(); //转换为List
byte compare = 0;
ary.RemoveAll(m => m == compare);
resultArray = ary.ToArray();
return UTF8Encoding.UTF8.GetString(resultArray);
}
节点回调接口
[HttpPost]
public HttpResponseMessage Callback()
{
//获取post的body
string content = Request.Content.ReadAsStringAsync().Result;
string dataStr = CloudHub.CloudHubUtil.Returned(content);
if (!string.IsNullOrEmpty(dataStr))
{
Dictionary<string, string> dic = new Dictionary<string, string>();
var data = dataStr.Split(',');
dic.Add("flowInstId", data[1]);
dic.Add("statusStr", data[0]);
var http = new HttpHelp(Encoding.UTF8);
var b = Task.Run(() => http.Post("XXX",JsonProvider.Serialize(dic))).Result;
var result = b.GetHttpBackResult<dynamic>();
if (b.Code == HttpStatusCode.OK)
{
if (result.Status == 2)
{
return this.CreateResponseMessage(HttpBackCode.Success, "发送成功");
}
else
{
return this.CreateResponseMessage(HttpBackCode.Fail, result.Msg);
}
}
}
return this.CreateResponseMessage(HttpBackCode.Fail, "失败");
}
公共类
/// <summary>
/// 云之家公共类
/// </summary>
public class CloudHub
{
private static string APPID = "XXXXXXXXX";
private static string EID = "XXXXXXXXX";//企业Id
private static string BIZKEY = "cloudflow";
private static string KEY = "XXXXXXXXX";//开发者key
private static string SCRECT = "XXXXXXXXX";//开发者screct(轻应用)
private static string File_SCRECT = "XXXXXXXXX";//文件服务上传下载screct
private static string UPLOADFILE_PAT