首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
首页标签腾讯电子签

#腾讯电子签

安全,便捷的电子合同签约及证据保全服务

腾讯会议对接腾讯电子签,如何关联绑定?

可以在会中点击应用 - 应用市场,然后搜索腾讯电子签使用

腾讯电子签合同,甲乙方换了之后,怎么设置由对方自行填写身份证信息,而不是由合同发起人填写?

详情可以看此文档哦:https://cloud.tencent.com/document/product/1323/92855

我的企业微信组织架构中有很多员工,如何快速把员工都加入到腾讯电子签当中?

已采纳
请先确保企业员工已经隶属于腾讯电子签应用可见范围内,如何查看或设置可见范围,操作如下: 企业微信管理员登录 企业微信管理后台 ,并在应用管理中打开腾讯电子签应用。 在应用设置页面,选择可见范围,将需要加入腾讯电子签的员工修改纳入到可见范围中。 [img] 若已确认企业员工已经在应用可见范围内,如何快速将企业员工添加到腾讯电子签组织架构中,操作如下: 腾讯电子签超级管理员登录腾讯电子签电脑端,进入到 组织管理 > 组织架构 中。 在组织架构页面单击 同步企微 ,获取已经在应用可见范围内的最新员工列表。 [img]... 展开详请

为什么员工在企业微信工作台中没有腾讯电子签应用?

已采纳
因为该员工不在腾讯电子签应用的可见范围内,请将他纳入应用可见范围中,操作如下: 企业微信管理员登录 企业微信管理后台 ,并在应用管理中打开腾讯电子签应用。 在应用设置页面,选择可见范围,将需要加入腾讯电子签的员工修改纳入到可见范围中。 [img]... 展开详请

当我的企业主体是 A 公司,可以由我司发起合同,然后由 B 公司和 C 公司双方进行签署吗?

已采纳

可以。只需要在发起合同时,添加需要签署的企业或个人为签署方即可,并为上述签署方添加相关控件,如何发起合同请参见 发起合同 文档。

我的企业客户或个人客户没有腾讯电子签账号可以进行签署吗?

已采纳

可以。当贵司发起合同后,您的客户会在手机短信中收到签署合同的通知,系统会引导客户前往实名认证腾讯电子签账号,详情参见 签署合同 文档。

为什么我在企业微信中已经成功添加了腾讯电子签,但是在发起企业认证流程时却一直提示“通知企业微信管理员”呢?我本人和其他同事都没有收到任何通知?

已采纳
是因为刚刚安装的腾讯电子签应用的授权方式为企业成员授权使用,请将应用授权方式更改为企业管理员授权使用。更改完成后,请企业微信管理员前往腾讯电子签应用中发起企业账号认证流程,详情参见 企业微信端账号认证 文档。 [img]... 展开详请

当我的手机上有两个微信账号,该授权哪个账号给腾讯电子签应用呢?如果我已经授权错误该如何操作?

已采纳
部分客户可能存在手机微信中有两个微信账号的情况,当首次打开腾讯电子签应用时,系统会弹出请您确认需要授权哪个微信账号给腾讯电子签使用,请务必选择与企业微信授权一样的微信账号。 <img style="width:300px; max-width: inherit;" src="https://qcloudimg.tencent-cloud.cn/raw/8e992ef0706cd9fe0a70a7e26a884a52.png" /> 授权错误的客户,操作如下: 将企业微信 App 退出程序,也将未绑定企业微信的微信账号退出。然后在微信 App 中,打开 设置 > 个人信息与权限 > 授权管理 功能,将已经授权给企业微信应用的权限进行解除。 前往企业微信中,清理企业微信历史缓存数据,然后退出企业微信 App 应用程序。 再次打开企业微信 App,对应用重新授权。 [img]... 展开详请

为什么在上传营业执照后,系统提示企业名称、法定代表人姓名或所在地址不正确呢?

已采纳
因为贵司的营业执照在7个工作日内有过更新记录,请于7个工作日后再上传营业执照。如有异议,请联系腾讯电子签客服。 <img style="width:300px; max-width: inherit;" src="https://qcloudimg.tencent-cloud.cn/raw/a9c2bce0686bbf3b8a6b2be8614b1970.png" />... 展开详请

会议结束后,可以在哪里找到合同?

已采纳
所有在腾讯会议内发起或签署的合同(包含合同已签署、待签署、已撤销等),均可以在微信小程序腾讯电子签的文件夹中找到。 在腾讯会议客户端首页,单击历史会议,找到发起或签署该合同的会议。单击该场会议的详情,在应用模块下上单击腾讯电子签,即可找到该场会议中发起或签署的所有合同。 [6f43cec1cfa78b2f6f68f093736f1f96.png]... 展开详请

是否支持在腾讯会议 App 或小程序中使用?

已采纳
在发起方进行合同页面的投屏共享后,签署方能在腾讯会议 PC 端、App 或小程序中查看共享页面,并进行扫码签约。 而在腾讯会议 App 中进行合同发起的功能,正在开发中,敬请期待。 <img style="width:300px; max-width: inherit;" src="https://qcloudimg.tencent-cloud.cn/raw/2fef7dccd80aead4471e26d9e155a214.jpg" />... 展开详请

如果签署方通过腾讯会议 App 进会,不方便扫码签约,怎么办?

已采纳
发起方可以在微信扫码签署页,单击二维码下方的发送签约信息,将合同分享给签署方。 [dc697aff0c614108e9c21d124b4fa1a6.png] 签署方在腾讯会议 App 中会收到签约邀请,单击立即查看后,自动打开腾讯电子签微信小程序进行合同签署。 <img style="width:400px; max-width: inherit;" src="https://qcloudimg.tencent-cloud.cn/raw/6970496b96f18c358736e18dfd99891a.png" />... 展开详请

当我上传本地合同文件进行合同发起时,如何设置自己不用签署?

已采纳
在登录电子签企业账号后,选择一份本地文件单击 与签约方投屏共享 后,进入配置签约信息页面。单击第一个签署方信息(默认为发起方信息),在下方弹窗中单击 删除,即可删除自己,此时可重新添加签署方。 [aefa40fa8630482fde83dd325f5c8509.png]... 展开详请

我不知道一起参会的签署人手机号、身份证号等个人信息,可以设置由签署人自行填写吗?

已采纳
可以的。 进入配置签约信息页面时,在签署方信息处默认关闭”由我填“开关,此时可以继续发起合同,后续会中参与人可通过扫码自行补充签署人信息。 如果打开”由我填“开关,则需要由发起人填写签署人的姓名、手机号码等相关信息。 [f1dcbddf26ad327e708db0a448fea76a.png]... 展开详请

我还有未使用的企业版套餐包,是否可于在线签约中使用?

已采纳

不可以。当前企业版套餐与在线签约套餐是两类套餐包,无法使用企业版套餐包发起在线签约合同。

如需购买或查看在线签约合同份数,请参见 购买指南

为什么客户收到 FlowCallbackStatus 为4(已签署)的回调通知后,又收到了 FlowCallbackStatus 为1(待签署)的通知?

已采纳

以单方签署的合同为例,FlowCallbackStatus 状态变化一般是由1变为4。少量回调可能因状态变化间隔比较短、重发、或者网络传输等原因,小几率出现到达顺序不一致,建议开发者从代码层面进行适当控制,例如状态更新为4后不能再更新为1。

回调样例

已采纳
回调请求包: POST /callback HTTP/1.1 Host: www.esstest.com User-Agent: Go-http-client/1.1 Content-Length: 1088 Content-Type: text/plain Accept-Encoding: gzip YyYyLZonMceFMFFi5jRnnOWrOasvzmKtGAvRPq1IzuYma88UvTqyZy8QpNVMKxvJY3Sp+NJW6mgTfU35u7SbUon+QCjul1P9P6mcVRuVvYrM2DoFBDgjLURfX+CWnZ9m967nNqiubw9vj9ToysJDZyr0zo4NN1CCfvsyxnVNKhSNbRAy74x4SlLscZ/wcFwdy55S2rBxbjLCqViIj6llQFo74mLHJ8oumngBD1WJZ5ginDNEScPB7+cIHeKF5w3UvUpDqDIUjAj7KFUmIQM8/zY8EafhgCNhWRaGxuFxGF+iMqwC+HJYosbBmrKZ44+8xwL5WlXLx/Cf8bK7J4mJIWbKyul8PBE9Xh8lL/d0Ufnf4sUB0ypbdy/KIr+XQJgFjR2AQGENXvxxlCfdVY5svGfXYaaSSyDND1u9C8kMxQRfNHJye7ulTprROYTtq4GJ8UJQbJbuHvTcppGyMbGO2AvgXcoSogM0JuZzLK/gcPFIWIf9oFTg47M62sLf9YY7UASVITfA5LnE+/1clN4vn748wjS4tdxCL8wjWanPOONTPCMrwH0wsZ86xEf7aLl0/qBWGF13VYh4C4XgiDLtaOs6DdlzMz5EszWISpRRzfJLxcBnhHL9sQu7YWLZzRL6vmP1qtdWZbUYt4Z/eKff5gfmmDGHOxVjd3XhxhfHSdW3a8LzlMT3n69CPBEiOjXA4abshkiT6+hOlJ8uCws+ja2BSmwruqpUn4tq7Je91cT0AhGHuvq9s1VCB7vw8KsVimRHrC6eOa1rgm6qgQNP0fMgGRe+qu4BtfND1a/j9BBuIHQSjLSn2JB2P/EAvbb5J2iPVZj3SppgzhwVCgYUu+osA3LNC4NsYxm/yMs8mq7nOCIZd6D/BM9py5WKS6//e4mM6sY3/S2wOr8snkUsEuu5M35zyRcrCjIaRzV9OKZjP+aqkk2GcF/Figd3N/zCZ+WjC+L9r/ELHn64qEJxZDvXKXVE3dUOchbUPelCb3YO+Mub+76bnvt8IQ2MRf9NaFO7cWlh9mDWkZMXxmOTlxOxQtOeTrW+QywTkZaDGkP83HRjqXd7bn3YBcdFiOy/ 此处使用 CallbackUrlKey:"TencentEssEncryptTestKey12345678" 解密后可获取以下明文: !该 CallbackUrlKey 仅用于此处测试样例。 { "FlowId": "yDRtrAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DocumentId": "yDRtrBBBBBBBBBBBBBBBBBBBBBBBBBB", "CallbackType": "sign", "FlowName": "测试流程", "FlowDescription": "", "FlowType": "", "FlowCallbackStatus": 4, "Unordered": true, "CreateOn": 1658892449, "UpdatedOn": 1659604019, "DeadLine": 1661615999, "UserId": "", "RecipientId": "yDRtrCCCCCCCCCCCCCCCCCCCCCCCCCCC", "Operate": "sign", "UserData": "", "Approvers": [ { "UserId": "yDRtrDDDDDDDDDDDDDDDDDDDDDDDDDDD", "RecipientId": "yDRtrCCCCCCCCCCCCCCCCCCCCCCCCCCC", "ApproverType": 1, "OrganizationName": "", "Required": true, "ApproverName": "张三", "ApproverMobile": "15912345678", "ApproverIdCardType": "ID_CARD", "ApproverIdCardNumber": "440300200101010001", "ApproveCallbackStatus": 3, "ApproveMessage": "", "ApproveTime": 1659604019, "VerifyChannel": "WEIXINAPP" } ], "CallbackUrl": "https://www.esstest.com" }... 展开详请
回调请求包: POST /callback HTTP/1.1 Host: www.esstest.com User-Agent: Go-http-client/1.1 Content-Length: 1088 Content-Type: text/plain Accept-Encoding: gzip YyYyLZonMceFMFFi5jRnnOWrOasvzmKtGAvRPq1IzuYma88UvTqyZy8QpNVMKxvJY3Sp+NJW6mgTfU35u7SbUon+QCjul1P9P6mcVRuVvYrM2DoFBDgjLURfX+CWnZ9m967nNqiubw9vj9ToysJDZyr0zo4NN1CCfvsyxnVNKhSNbRAy74x4SlLscZ/wcFwdy55S2rBxbjLCqViIj6llQFo74mLHJ8oumngBD1WJZ5ginDNEScPB7+cIHeKF5w3UvUpDqDIUjAj7KFUmIQM8/zY8EafhgCNhWRaGxuFxGF+iMqwC+HJYosbBmrKZ44+8xwL5WlXLx/Cf8bK7J4mJIWbKyul8PBE9Xh8lL/d0Ufnf4sUB0ypbdy/KIr+XQJgFjR2AQGENXvxxlCfdVY5svGfXYaaSSyDND1u9C8kMxQRfNHJye7ulTprROYTtq4GJ8UJQbJbuHvTcppGyMbGO2AvgXcoSogM0JuZzLK/gcPFIWIf9oFTg47M62sLf9YY7UASVITfA5LnE+/1clN4vn748wjS4tdxCL8wjWanPOONTPCMrwH0wsZ86xEf7aLl0/qBWGF13VYh4C4XgiDLtaOs6DdlzMz5EszWISpRRzfJLxcBnhHL9sQu7YWLZzRL6vmP1qtdWZbUYt4Z/eKff5gfmmDGHOxVjd3XhxhfHSdW3a8LzlMT3n69CPBEiOjXA4abshkiT6+hOlJ8uCws+ja2BSmwruqpUn4tq7Je91cT0AhGHuvq9s1VCB7vw8KsVimRHrC6eOa1rgm6qgQNP0fMgGRe+qu4BtfND1a/j9BBuIHQSjLSn2JB2P/EAvbb5J2iPVZj3SppgzhwVCgYUu+osA3LNC4NsYxm/yMs8mq7nOCIZd6D/BM9py5WKS6//e4mM6sY3/S2wOr8snkUsEuu5M35zyRcrCjIaRzV9OKZjP+aqkk2GcF/Figd3N/zCZ+WjC+L9r/ELHn64qEJxZDvXKXVE3dUOchbUPelCb3YO+Mub+76bnvt8IQ2MRf9NaFO7cWlh9mDWkZMXxmOTlxOxQtOeTrW+QywTkZaDGkP83HRjqXd7bn3YBcdFiOy/ 此处使用 CallbackUrlKey:"TencentEssEncryptTestKey12345678" 解密后可获取以下明文: !该 CallbackUrlKey 仅用于此处测试样例。 { "FlowId": "yDRtrAAAAAAAAAAAAAAAAAAAAAAAAAAA", "DocumentId": "yDRtrBBBBBBBBBBBBBBBBBBBBBBBBBB", "CallbackType": "sign", "FlowName": "测试流程", "FlowDescription": "", "FlowType": "", "FlowCallbackStatus": 4, "Unordered": true, "CreateOn": 1658892449, "UpdatedOn": 1659604019, "DeadLine": 1661615999, "UserId": "", "RecipientId": "yDRtrCCCCCCCCCCCCCCCCCCCCCCCCCCC", "Operate": "sign", "UserData": "", "Approvers": [ { "UserId": "yDRtrDDDDDDDDDDDDDDDDDDDDDDDDDDD", "RecipientId": "yDRtrCCCCCCCCCCCCCCCCCCCCCCCCCCC", "ApproverType": 1, "OrganizationName": "", "Required": true, "ApproverName": "张三", "ApproverMobile": "15912345678", "ApproverIdCardType": "ID_CARD", "ApproverIdCardNumber": "440300200101010001", "ApproveCallbackStatus": 3, "ApproveMessage": "", "ApproveTime": 1659604019, "VerifyChannel": "WEIXINAPP" } ], "CallbackUrl": "https://www.esstest.com" }

回调解密 demo

已采纳
<dx-tabs> ::: Java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class CallbackAes { public static byte[] pkcs7Padding(byte[] ciphertext, int blockSize) { int padding = blockSize - ciphertext.length % blockSize; byte[] padtext = repeat((byte) padding, padding); ciphertext = append(ciphertext, padtext); return ciphertext; } public static byte[] repeat(byte val, int count) { byte[] result = new byte[count]; for (int i = 0; i < count; i++) { result[i] = val; } return result; } public static byte[] append(byte[] a, byte[] b) { byte[] result = new byte[a.length + b.length]; System.arraycopy(a, 0, result, 0, a.length); System.arraycopy(b, 0, result, a.length, b.length); return result; } public static byte[] pkcs7UnPadding(byte[] origData) { int length = origData.length; int unpadding = origData[length - 1]; byte[] result = new byte[length - unpadding]; System.arraycopy(origData, 0, result, 0, result.length); return result; } public static byte[] aesEncrypt(byte[] origData, byte[] key) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize(); origData = pkcs7Padding(origData, blockSize); SecretKeySpec keyspec = new SecretKeySpec(key, "AES"); byte[] iv = new byte[blockSize]; System.arraycopy(key, 0, iv, 0, iv.length); IvParameterSpec ivspec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(origData); return Base64.getEncoder().encode(encrypted); } public static byte[] aesDecrypt(byte[] crypted, byte[] key) throws Exception { byte[] decoded = Base64.getDecoder().decode(crypted); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize(); SecretKeySpec keyspec = new SecretKeySpec(key, "AES"); byte[] iv = new byte[blockSize]; System.arraycopy(key, 0, iv, 0, iv.length); IvParameterSpec ivspec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] origData = cipher.doFinal(decoded); return pkcs7UnPadding(origData); } public static void main(String[] args) throws Exception { // 传入CallbackUrlKey byte[] key = "***************".getBytes(); // 传入密文 byte[] origData = aesDecrypt("****************".getBytes(StandardCharsets.UTF_8), key); // 打印解密后的内容,格式为json System.out.println(new String(origData, StandardCharsets.UTF_8)); } } ::: ::: PHP <?php require_once __DIR__.'/../../../vendor/autoload.php'; class Aes { public $key = ''; public $iv = ''; public function __construct($config) { foreach($config as $k => $v){ $this->$k = $v; } } //解密 public function aesDe($data){ return openssl_decrypt(base64_decode($data), $this->method, $this->key, OPENSSL_RAW_DATA, $this->key); } } $config = [ 'key' => '********************', // 此处填入CallbackUrlKey 'method' => 'AES-256-CBC' //加密方式 ]; $obj = new Aes($config); // 此处填入收到的密文 $data = '*****************************'; echo $obj->aesDe($data);//解密 ::: ::: Golang package v20201111 import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" "testing" ) func AesDecrypt(crypted, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = PKCS7UnPadding(origData) return origData, nil } // PKCS7UnPadding 去除填充 func PKCS7UnPadding(origData []byte) []byte { length := len(origData) unPadding := int(origData[length-1]) return origData[:(length - unPadding)] } func TestDecrypt(t *testing.T) { // 传入CallbackUrlKey key := "***********" // 传入密文 content := "***********" // base64解密 crypted, err := base64.StdEncoding.DecodeString(content) if err != nil { fmt.Printf("base64 DecodeString returned: %s", err) return } origData, err := AesDecrypt(crypted, []byte(key)) if err != nil { fmt.Printf("AesDecrypt returned: %s", err) return } fmt.Printf("%s", string(origData)) } ::: ::: Python # -*- coding: utf-8 -*- import base64 from Cryptodome.Cipher import AES def decode_aes256(data, encryption_key): iv = encryption_key[0:16] aes = AES.new(encryption_key, AES.MODE_CBC, iv) d = aes.decrypt(data) unpad = lambda s: s[0:-ord(d[-1:])] return unpad(d) # 此处传入密文 data = '**************************************************' data = base64.b64decode(data) # 此处传入CallbackUrlKey e = decode_aes256(data, bytes('**************************************************', encoding="utf8")) print(type(e)) print(str(e, encoding="utf8")) ::: ::: C# using System; using System.Security.Cryptography; using System.Text; namespace TencentCloudExamples { class EssCallback { static void Main1(string[] args) { try { // 传入CallbackUrlKey String key = "*************"; // 传入密文 String content = ""*************";"; String plaintext = AESDecrypt(content, Encoding.ASCII.GetBytes(key)); Console.WriteLine(plaintext); } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.Read(); } public static string AESDecrypt(string encryptStr, byte[] key) { byte[] toEncryptArray = Convert.FromBase64String(encryptStr); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = key; byte[] iv = new byte[16]; Array.Copy(key, iv, iv.Length); rDel.IV = iv; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } } } ::: </dx-tabs>... 展开详请
<dx-tabs> ::: Java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class CallbackAes { public static byte[] pkcs7Padding(byte[] ciphertext, int blockSize) { int padding = blockSize - ciphertext.length % blockSize; byte[] padtext = repeat((byte) padding, padding); ciphertext = append(ciphertext, padtext); return ciphertext; } public static byte[] repeat(byte val, int count) { byte[] result = new byte[count]; for (int i = 0; i < count; i++) { result[i] = val; } return result; } public static byte[] append(byte[] a, byte[] b) { byte[] result = new byte[a.length + b.length]; System.arraycopy(a, 0, result, 0, a.length); System.arraycopy(b, 0, result, a.length, b.length); return result; } public static byte[] pkcs7UnPadding(byte[] origData) { int length = origData.length; int unpadding = origData[length - 1]; byte[] result = new byte[length - unpadding]; System.arraycopy(origData, 0, result, 0, result.length); return result; } public static byte[] aesEncrypt(byte[] origData, byte[] key) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize(); origData = pkcs7Padding(origData, blockSize); SecretKeySpec keyspec = new SecretKeySpec(key, "AES"); byte[] iv = new byte[blockSize]; System.arraycopy(key, 0, iv, 0, iv.length); IvParameterSpec ivspec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(origData); return Base64.getEncoder().encode(encrypted); } public static byte[] aesDecrypt(byte[] crypted, byte[] key) throws Exception { byte[] decoded = Base64.getDecoder().decode(crypted); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); int blockSize = cipher.getBlockSize(); SecretKeySpec keyspec = new SecretKeySpec(key, "AES"); byte[] iv = new byte[blockSize]; System.arraycopy(key, 0, iv, 0, iv.length); IvParameterSpec ivspec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] origData = cipher.doFinal(decoded); return pkcs7UnPadding(origData); } public static void main(String[] args) throws Exception { // 传入CallbackUrlKey byte[] key = "***************".getBytes(); // 传入密文 byte[] origData = aesDecrypt("****************".getBytes(StandardCharsets.UTF_8), key); // 打印解密后的内容,格式为json System.out.println(new String(origData, StandardCharsets.UTF_8)); } } ::: ::: PHP <?php require_once __DIR__.'/../../../vendor/autoload.php'; class Aes { public $key = ''; public $iv = ''; public function __construct($config) { foreach($config as $k => $v){ $this->$k = $v; } } //解密 public function aesDe($data){ return openssl_decrypt(base64_decode($data), $this->method, $this->key, OPENSSL_RAW_DATA, $this->key); } } $config = [ 'key' => '********************', // 此处填入CallbackUrlKey 'method' => 'AES-256-CBC' //加密方式 ]; $obj = new Aes($config); // 此处填入收到的密文 $data = '*****************************'; echo $obj->aesDe($data);//解密 ::: ::: Golang package v20201111 import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" "testing" ) func AesDecrypt(crypted, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) origData := make([]byte, len(crypted)) blockMode.CryptBlocks(origData, crypted) origData = PKCS7UnPadding(origData) return origData, nil } // PKCS7UnPadding 去除填充 func PKCS7UnPadding(origData []byte) []byte { length := len(origData) unPadding := int(origData[length-1]) return origData[:(length - unPadding)] } func TestDecrypt(t *testing.T) { // 传入CallbackUrlKey key := "***********" // 传入密文 content := "***********" // base64解密 crypted, err := base64.StdEncoding.DecodeString(content) if err != nil { fmt.Printf("base64 DecodeString returned: %s", err) return } origData, err := AesDecrypt(crypted, []byte(key)) if err != nil { fmt.Printf("AesDecrypt returned: %s", err) return } fmt.Printf("%s", string(origData)) } ::: ::: Python # -*- coding: utf-8 -*- import base64 from Cryptodome.Cipher import AES def decode_aes256(data, encryption_key): iv = encryption_key[0:16] aes = AES.new(encryption_key, AES.MODE_CBC, iv) d = aes.decrypt(data) unpad = lambda s: s[0:-ord(d[-1:])] return unpad(d) # 此处传入密文 data = '**************************************************' data = base64.b64decode(data) # 此处传入CallbackUrlKey e = decode_aes256(data, bytes('**************************************************', encoding="utf8")) print(type(e)) print(str(e, encoding="utf8")) ::: ::: C# using System; using System.Security.Cryptography; using System.Text; namespace TencentCloudExamples { class EssCallback { static void Main1(string[] args) { try { // 传入CallbackUrlKey String key = "*************"; // 传入密文 String content = ""*************";"; String plaintext = AESDecrypt(content, Encoding.ASCII.GetBytes(key)); Console.WriteLine(plaintext); } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.Read(); } public static string AESDecrypt(string encryptStr, byte[] key) { byte[] toEncryptArray = Convert.FromBase64String(encryptStr); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = key; byte[] iv = new byte[16]; Array.Copy(key, iv, iv.Length); rDel.IV = iv; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } } } ::: </dx-tabs>

发起人投屏共享合同后,签署方如何查看合同?

已采纳
当发起方确定开始共享应用画面后,签署方的会议界面将可直接查看到应用内的合同页面,并能跟随发起方视角查看并填写合同信息。 [0ec626326da690f346d1c0c3c5dc0a3b.png]... 展开详请

是否可以在合同页面上进行批注?

已采纳
可以的,发起方或签署方能够通过腾讯会议自带的互动批注功能,针对合同内容进行批注。 [be19560d6c74024e91cf8fba223cee62.png]... 展开详请
领券