网站的运行与维护成都设计院待遇
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:11
当前位置: 首页 > news >正文
网站的运行与维护,成都设计院待遇,品牌策划书范文,个人网站 做导航官方的STREAM回调推送的方式#xff0c;试了几次都认证不过#xff0c;就放弃了还是用HTTP的模式吧。 /// summary/// 应用回调/// /summary/// param namemodel/param/// returns/returnspublic static Dictio…官方的STREAM回调推送的方式试了几次都认证不过就放弃了还是用HTTP的模式吧。 /// summary/// 应用回调/// /summary/// param namemodel/param/// returns/returnspublic static Dictionarystring, string CallBack(DingCallBackModel model){WriteLogHelper.WriteLogsAsync(JsonHelper.SerializeObject(model), 实例回调日志);var timeStamp GetTimestamp(DateTime.Now).ToString();// 2. 使用加解密类型DingTalkEncryptor callbackCrypto new DingTalkEncryptor(AppsettingsConfig.DingDingConfig.Token, AppsettingsConfig.DingDingConfig.AesKey, AppsettingsConfig.DingDingConfig.AppKey);string decryptMsg callbackCrypto.getDecryptMsg(model.Msg_signature, model.TimeStamp, model.Nonce, model.Encrypt);string msg success;// 3. 反序列化回调事件json数据var approveModel JsonHelper.DeserializeObjectApprovalInstanceModel(decryptMsg);WriteLogHelper.WriteLogsAsync(JsonHelper.SerializeObject(approveModel), 实例回调日志-解密);var type approveModel.EventType;switch (type){case check_url:WriteLogHelper.WriteLogsAsync(审批回调 JsonHelper.SerializeObject(model), 实例回调日志);// 测试回调break;case bpms_instance_change:// 实例改变break;}var rspMsg callbackCrypto.getEncryptedMap(msg);return rspMsg;} check_url就是钉应用后台设置回调URL时传入数据的类型。拿到数据 public string Msg_signature { set; get; } ; public string TimeStamp { set; get; } public string Nonce { set; get; } 123456; /// summary /// 加密后的结果 /// /summary public string Encrypt { set; get; } 分为几部分前面几项用来解密Encrypt密文的参数。 通过提供的DingTalkEncryptor 的 getDecryptMsg方法来进行解密 得到解密后的内容序列化成对象。 /*** 钉钉开放平台加解密方法/public class DingTalkEncryptor{//private static readonly Charset CHARSET Charset.forName(utf-8);//private static readonly Base64 base64 new Base64();private byte[] aesKey;private String token;private String corpId;/ask getPaddingBytes key固定长度/private static readonly int AES_ENCODE_KEY_LENGTH 43;/加密随机字符串字节长度/private static readonly int RANDOM_LENGTH 16;/** 构造函数* param token 钉钉开放平台上开发者设置的token* param encodingAesKey 钉钉开放台上开发者设置的EncodingAESKey* param corpId 企业自建应用-事件订阅, 使用appKey* 企业自建应用-注册回调地址, 使用corpId* 第三方企业应用, 使用suiteKey** throws DingTalkEncryptException 执行失败请查看该异常的错误码和具体的错误信息/public DingTalkEncryptor(String token, String encodingAesKey, String corpId){if (null encodingAesKey || encodingAesKey.Length ! AES_ENCODE_KEY_LENGTH){throw new DingTalkEncryptException(DingTalkEncryptException.AES_KEY_ILLEGAL);}this.token token;this.corpId corpId;aesKey Convert.FromBase64String(encodingAesKey );}/** 将和钉钉开放平台同步的消息体加密,返回加密Map/public DictionaryString, String getEncryptedMap(String plaintext){var time DateTime.Now.Millisecond;return getEncryptedMap(plaintext, time);}/** 将和钉钉开放平台同步的消息体加密,返回加密Map* param plaintext 传递的消息体明文* param timeStamp 时间戳* param nonce 随机字符串* return* throws DingTalkEncryptException/public DictionaryString, String getEncryptedMap(String plaintext, long timeStamp){if (null plaintext){throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_PLAINTEXT_ILLEGAL);}var nonce Utils.getRandomStr(RANDOM_LENGTH);if (null nonce){throw new DingTalkEncryptException(DingTalkEncryptException.ENCRYPTION_NONCE_ILLEGAL);}String encrypt this.encrypt(nonce, plaintext);String signature getSignature(token, timeStamp.ToString(), nonce, encrypt);DictionaryString, String resultMap new DictionaryString, String();resultMap[msg_signature] signature;resultMap[encrypt] encrypt;resultMap[timeStamp] timeStamp.ToString();resultMap[nonce] nonce;return resultMap;}/** 密文解密* param msgSignature 签名串* param timeStamp 时间戳* param nonce 随机串* param encryptMsg 密文* return 解密后的原文* throws DingTalkEncryptException/public String getDecryptMsg(String msgSignature, String timeStamp, String nonce, String encryptMsg){//校验签名String signature getSignature(token, timeStamp, nonce, encryptMsg);if (!signature.Equals(msgSignature)){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);}// 解密String result decrypt(encryptMsg);return result;}/** 对明文加密. param text 需要加密的明文* return 加密后base64编码的字符串/private String encrypt(String random, String plaintext){try{byte[] randomBytes System.Text.Encoding.UTF8.GetBytes(random);// random.getBytes(CHARSET);byte[] plainTextBytes System.Text.Encoding.UTF8.GetBytes(plaintext);// plaintext.getBytes(CHARSET);byte[] lengthByte Utils.int2Bytes(plainTextBytes.Length);byte[] corpidBytes System.Text.Encoding.UTF8.GetBytes(corpId);// corpId.getBytes(CHARSET);//MemoryStream byteStream new MemoryStream();var bytestmp new Listbyte();bytestmp.AddRange(randomBytes);bytestmp.AddRange(lengthByte);bytestmp.AddRange(plainTextBytes);bytestmp.AddRange(corpidBytes);byte[] padBytes PKCS7Padding.getPaddingBytes(bytestmp.Count);bytestmp.AddRange(padBytes);byte[] unencrypted bytestmp.ToArray();RijndaelManaged rDel new RijndaelManaged();rDel.Mode CipherMode.CBC;rDel.Padding PaddingMode.Zeros;rDel.Key aesKey;rDel.IV aesKey.ToList().Take(16).ToArray();ICryptoTransform cTransform rDel.CreateEncryptor();byte[] resultArray cTransform.TransformFinalBlock(unencrypted, 0, unencrypted.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);//Cipher cipher Cipher.getInstance(AES/CBC/NoPadding);//SecretKeySpec keySpec new SecretKeySpec(aesKey, AES);//IvParameterSpec iv new IvParameterSpec(aesKey, 0, 16);//cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);//byte[] encrypted cipher.doFinal(unencrypted);//String result base64.encodeToString(encrypted);//return result;}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_ENCRYPT_TEXT_ERROR);}}/** 对密文进行解密. param text 需要解密的密文* return 解密得到的明文/private String decrypt(String text){byte[] originalArr;try{byte[] toEncryptArray Convert.FromBase64String(text);RijndaelManaged rDel new RijndaelManaged();rDel.Mode CipherMode.CBC;rDel.Padding PaddingMode.Zeros;rDel.Key aesKey;rDel.IV aesKey.ToList().Take(16).ToArray();ICryptoTransform cTransform rDel.CreateDecryptor();originalArr cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);//return System.Text.UTF8Encoding.UTF8.GetString(resultArray);设置解密模式为AES的CBC模式//Cipher cipher Cipher.getInstance(AES/CBC/NoPadding);//SecretKeySpec keySpec new SecretKeySpec(aesKey, AES);//IvParameterSpec iv new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));//cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);使用BASE64对密文进行解码//byte[] encrypted Base64.decodeBase64(text);解密//originalArr cipher.doFinal(encrypted);}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_ERROR);}String plainText;String fromCorpid;try{// 去除补位字符byte[] bytes PKCS7Padding.removePaddingBytes(originalArr);Console.Out.WriteLine(bytes size: bytes.Length);// 分离16位随机字符串,网络字节序和corpIdbyte[] networkOrder bytes.Skip(16).Take(4).ToArray();// Arrays.copyOfRange(bytes, 16, 20);for (int i 0; i 4; i){Console.Out.WriteLine(networkOrder size: (int)networkOrder[i]);}Console.Out.WriteLine(bytes plainText: networkOrder.Length JsonSerializer.Serialize(networkOrder));int plainTextLegth Utils.bytes2int(networkOrder);Console.Out.WriteLine(bytes size: plainTextLegth);plainText System.Text.UTF8Encoding.UTF8.GetString(bytes.Skip(20).Take(plainTextLegth).ToArray()); // new String(Arrays.copyOfRange(bytes, 20, 20 plainTextLegth), CHARSET);fromCorpid System.Text.UTF8Encoding.UTF8.GetString(bytes.Skip(20 plainTextLegth).ToArray()); //new String(Arrays.copyOfRange(bytes, 20 plainTextLegth, bytes.length), CHARSET);Console.Out.WriteLine(bytes plainText: plainText);}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_LENGTH_ERROR);}Console.Out.WriteLine(fromCorpid corpId);// corpid不相同的情况if (!fromCorpid.Equals(corpId)){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_DECRYPT_TEXT_CORPID_ERROR);}return plainText;}/** 数字签名* param token isv token* param timestamp 时间戳* param nonce 随机串* param encrypt 加密文本* return* throws DingTalkEncryptException/public String getSignature(String token, String timestamp, String nonce, String encrypt){try{Console.Out.WriteLine(encrypt);String[] array new String[] { token, timestamp, nonce, encrypt };Array.Sort(array, StringComparer.Ordinal);//var tmparray array.ToList();//tmparray.Sort(new JavaStringComper());//array tmparray.ToArray();Console.Out.WriteLine(array: JsonSerializer.Serialize(array));StringBuilder sb new StringBuilder();for (int i 0; i 4; i){sb.Append(array[i]);}String str sb.ToString();Console.Out.WriteLine(str);//MessageDigest md MessageDigest.getInstance(SHA-1);//md.update(str.getBytes());//byte[] digest md.digest();System.Security.Cryptography.SHA1 hash System.Security.Cryptography.SHA1.Create();System.Text.Encoding encoder System.Text.Encoding.ASCII;byte[] combined encoder.GetBytes(str);byte 转换//sbyte[] myByte new sbyte[]//byte[] mySByte new byte[myByte.Length];//for (int i 0; i myByte.Length; i)//{// if (myByte[i] 127)// mySBytei(myByte[i] - 256);// else// mySByteimyByte[i];//}byte[] digest hash.ComputeHash(combined);StringBuilder hexstr new StringBuilder();String shaHex ;for (int i 0; i digest.Length; i){shaHex ((int)digest[i]).ToString(x);// Integer.toHexString(digest[i] 0xFF);if (shaHex.Length 2){hexstr.Append(0);}hexstr.Append(shaHex);}return hexstr.ToString();}catch (Exception e){throw new DingTalkEncryptException(DingTalkEncryptException.COMPUTE_SIGNATURE_ERROR);}}}/** 钉钉开放平台加解密异常类/public class DingTalkEncryptException : Exception{/成功/public static readonly int SUCCESS 0;/加密明文文本非法/public readonly static int ENCRYPTION_PLAINTEXT_ILLEGAL 900001;/加密时间戳参数非法/public readonly static int ENCRYPTION_TIMESTAMP_ILLEGAL 900002;/加密随机字符串参数非法/public readonly static int ENCRYPTION_NONCE_ILLEGAL 900003;/不合法的aeskey/public readonly static int AES_KEY_ILLEGAL 900004;/签名不匹配/public readonly static int SIGNATURE_NOT_MATCH 900005;/计算签名错误/public readonly static int COMPUTE_SIGNATURE_ERROR 900006;/计算加密文字错误/public readonly static int COMPUTE_ENCRYPT_TEXT_ERROR 900007;/计算解密文字错误/public readonly static int COMPUTE_DECRYPT_TEXT_ERROR 900008;/计算解密文字长度不匹配/public readonly static int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR 900009;/计算解密文字corpid不匹配/public readonly static int COMPUTE_DECRYPT_TEXT_CORPID_ERROR 900010;private static Dictionaryint, String msgMap new Dictionaryint, String();static DingTalkEncryptException(){msgMap[SUCCESS] 成功;msgMap[ENCRYPTION_PLAINTEXT_ILLEGAL] 加密明文文本非法;msgMap[ENCRYPTION_TIMESTAMP_ILLEGAL] 加密时间戳参数非法;msgMap[ENCRYPTION_NONCE_ILLEGAL] 加密随机字符串参数非法;msgMap[SIGNATURE_NOT_MATCH] 签名不匹配;msgMap[COMPUTE_SIGNATURE_ERROR] 签名计算失败;msgMap[AES_KEY_ILLEGAL] 不合法的aes key;msgMap[COMPUTE_ENCRYPT_TEXT_ERROR] 计算加密文字错误;msgMap[COMPUTE_DECRYPT_TEXT_ERROR] 计算解密文字错误;msgMap[COMPUTE_DECRYPT_TEXT_LENGTH_ERROR] 计算解密文字长度不匹配;msgMap[COMPUTE_DECRYPT_TEXT_CORPID_ERROR] 计算解密文字corpid不匹配;}private int code;public DingTalkEncryptException(int exceptionCode) : base(msgMap[exceptionCode]){this.code exceptionCode;}}/** PKCS7算法的加密填充/public class PKCS7Padding{//private readonly static Charset CHARSET Charset.forName(utf-8);private readonly static int BLOCK_SIZE 32;/*** 填充mode字节* param count* return/public static byte[] getPaddingBytes(int count){int amountToPad BLOCK_SIZE - (count % BLOCK_SIZE);if (amountToPad 0){amountToPad BLOCK_SIZE;}char padChr chr(amountToPad);String tmp string.Empty; ;for (int index 0; index amountToPad; index){tmp padChr;}return System.Text.Encoding.UTF8.GetBytes(tmp);}/** 移除mode填充字节* param decrypted* return/public static byte[] removePaddingBytes(byte[] decrypted){int pad (int)decrypted[decrypted.Length - 1];if (pad 1 || pad BLOCK_SIZE){pad 0;}//Array.Copy()var output new byte[decrypted.Length - pad];Array.Copy(decrypted, output, decrypted.Length - pad);return output;}private static char chr(int a){byte target (byte)(a 0xFF);return (char)target;}}/** 加解密工具类/public class Utils{/**** return/public static String getRandomStr(int count){String baset ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;Random random new Random();StringBuilder sb new StringBuilder();for (int i 0; i count; i){int number random.Next(baset.Length);sb.Append(baset[number]);}return sb.ToString();}/** int转byte数组,高位在前/public static byte[] int2Bytes(int count){byte[] byteArr new byte[4];byteArr3(count 0xFF);byteArr2(count 8 0xFF);byteArr1(count 16 0xFF);byteArr0(count 24 0xFF);return byteArr;}/** 高位在前bytes数组转int* param byteArr* return*/public static int bytes2int(byte[] byteArr){int count 0;for (int i 0; i 4; i){count 8;count | byteArr[i] 255;}return count;}}public class JavaStringComper : IComparerstring{public int Compare(string x, string y){return String.Compare(x, y);}}// 测试加解密的正确性public class Program{public static void Main(string[] args){String[] a new String[] { 1, W, t };var ding new DingTalkEncryptor(tokenxxxx, o1w0aum42yaptlz8alnhwikjd3jenzt9cb9wmzptgus, dingxxxxxx);var msg ding.getEncryptedMap(success);Console.Out.WriteLine(msg);//msg_signature, \(data-timeStamp, \)data-nonce, $data-encryptvar text ding.getDecryptMsg(msg[msg_signature], msg[timeStamp], msg[nonce], msg[encrypt]);Console.Out.WriteLine(text);// msg_signature:c01beb7b06384cf416e04930aed794684aae98c1,encrypt:,timeStamp:,nonce://{timeStamp:1605695694141,msg_signature:702c953056613f5c7568b79ed134a27bd2dcd8d0,//encrypt:,nonce:WelUQl6bCqcBa2fMc6eI}text ding.getDecryptMsg(f36f4ba5337d426c7d4bca0dbcb06b3ddc1388fc, 1605695694141, WelUQl6bCqcBa2fM, X1VSe9cTJUMZu60d3kyLYTrBq5578ZRJtteU94wG0Q4Uk6E/wQYeJRIC0/UFW5Wkya1Ihz9oXAdLlyC9TRaqsQ);Console.Out.WriteLine(text);}} public class ApprovalInstanceModel { //public long Id { set; get; } 0; public string EventType { set; get; } public string ProcessInstanceId { set; get; } /// summary /// 企业ID /// /summary public string CorpId { set; get; } public string Title { set; get; } /// summary /// 审批状态类型 /// /summary public string Type { set; get; } /// summary /// 审批详情URL /// /summary public string Url { set; get; } /// summary /// 审批结果 agree refuse 或为空 /// /summary public string Result { set; get; } /// summary /// 员工ID /// /summary public string StaffId { set; get; } /// summary /// 审批模板code /// /summary public string ProcessCode { set; get; } public long FinishTime { set; get; } 0; public long CreateTime { set; get; } 0; public DateTime CreateTimeNormal { set; get; } public DateTime FinishTimeNormal { set; get; } } bpms_instance_change 类型是审批发起与结束时会触发的用来更新我们的微应用单据数据的状态以及更新时有审批进度的URL,可以关联起来。 好了以上就是审批回调URL的接口内容了。
- 上一篇: 网站的元素网站实名认证查询申请表
- 下一篇: 网站的运营管理方案网站建设建设哪家好
相关文章
-
网站的元素网站实名认证查询申请表
网站的元素网站实名认证查询申请表
- 技术栈
- 2026年04月20日
-
网站的域名做邮箱广东建设行业招聘 什么网站
网站的域名做邮箱广东建设行业招聘 什么网站
- 技术栈
- 2026年04月20日
-
网站的优化是什么意思网站开发需求调研
网站的优化是什么意思网站开发需求调研
- 技术栈
- 2026年04月20日
-
网站的运营管理方案网站建设建设哪家好
网站的运营管理方案网站建设建设哪家好
- 技术栈
- 2026年04月20日
-
网站的制作成品做外包装很厉害的网站
网站的制作成品做外包装很厉害的网站
- 技术栈
- 2026年04月20日
-
网站的制作建站人国际教育机构网站建设开发方案
网站的制作建站人国际教育机构网站建设开发方案
- 技术栈
- 2026年04月20日






