怎么从浏览器打开飞书, 并跳到与指定工号人员的聊天框, 并携带订单号 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
LiaoMatt
V2EX    程序员

怎么从浏览器打开飞书, 并跳到与指定工号人员的聊天框, 并携带订单号

  •  
  •   LiaoMatt 211 天前 2051 次点击
    这是一个创建于 211 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景: 公司使用的飞书作为通讯软件, 想增强飞书和我们平台的协作能力; 需求: 假设遇到了客服想咨询操作人员一笔订单, 通过 web 点击对应操作, 打开飞书, 跳到该操作人员的聊天框, 然后把订单号或者订单详情链接带入到聊天框; 这么做的目的是提高沟通效率, 省去沟通环境中的同步上下文动作.

    23 条回复    2025-03-15 12:17:38 +08:00
    Sumzibuyu
        1
    Sumzibuyu  
       211 天前
    针对该需求,我建议通过飞书开放平台的"深度链接"功能实现,以下是具体方案及技术实现步骤:
    一、技术方案选择

    使用飞书提供的 Open Link 协议(类似飞书://open/)生成深度链接
    结合 URL 参数传递订单信息
    支持网页端与客户端自动跳转

    二、具体实现步骤

    用户信息映射准备


    在平台用户系统与飞书账号系统之间建立映射关系(可通过手机号或邮箱关联)
    创建用户信息查询接口:GET /api/lark/user/{orderId} 返回操作人员飞书 user_id


    生成深度链接(前端实现示例)

    // 获取操作人员飞书 ID
    const getLarkUserId = async (orderId) => {
    const res = await fetch(`/api/lark/user/${orderId}`);
    return res.json().user_id;
    };

    // 生成飞书链接
    const generateLarkDeepLink = (userId, orderInfo) => {
    const baseUrl = 'https://applink.feishu.cn/client/chat/chat';
    const params = new URLSearchParams({
    user_id: userId,
    text: `订单咨询:${orderInfo.number}\n 详情链接:${orderInfo.detailUrl}`
    });
    return `${baseUrl}?${params.toString()}`;
    };


    网页跳转逻辑

    <a id="larkChatLink" class="feishu-link" style="display:none;">
    打开飞书沟通
    </a>

    <script>
    document.querySelector('.contact-support').addEventListener('click', async (e) => {
    e.preventDefault();
    const orderId = getCurrentOrderId(); // 获取当前订单 ID
    const { user_id, detail_url } = await fetchOrderDetail(orderId);

    const feishuUrl = generateLarkDeepLink(user_id, {
    number: orderId,
    detailUrl: detail_url
    });

    // 尝试打开客户端
    window.location.href = feishuUrl;

    // 客户端未安装时跳转网页版
    setTimeout(() => {
    document.getElementById('larkChatLink').href = feishuUrl.replace(
    'applink.feishu.cn',
    'www.feishu.cn'
    );
    document.getElementById('larkChatLink').click();
    }, 500);
    });
    </script>

    三、安全增强措施

    信息加密处理

    // 使用 AES 加密订单信息
    const encryptOrderInfo = (orderId) => {
    const cipher = crypto.createCipheriv('aes-256-cbc', SECRET_KEY, IV);
    return cipher.update(orderId, 'utf8', 'base64') + cipher.final('base64');
    };

    // 在生成链接时
    const encryptedId = encryptOrderInfo(orderId);
    params.set('payload', encryptedId);


    服务端验证( Node.js 示例)

    app.get('/api/lark/user/:orderId', async (req, res) => {
    try {
    const decryptedId = decryptOrderInfo(req.params.orderId);
    const user = await UserService.findByOrder(decryptedId);
    res.json({ user_id: user.feishuId });
    } catch (error) {
    res.status(403).json({ error: 'Invalid request' });
    }
    });

    四、兼容性处理方案

    多环境适配逻辑

    function openFeishuChat(feishuUrl, webUrl) {
    const ua = navigator.userAgent;
    cont isMobile = /Mobile|Android|iPhone/i.test(ua);

    if (isMobile) {
    // 移动端直接尝试打开 App
    window.location.href = feishuUrl;
    setTimeout(() => {
    window.location.href = appStoreLink; // 跳转应用商店
    }, 500);
    } else {
    // PC 端打开桌面客户端
    const iframe = document.createElement('iframe');
    iframe.style.display = 'none';
    iframe.src = feishuUrl;
    document.body.appendChild(iframe);

    setTimeout(() => {
    document.body.removeChild(iframe);
    window.open(webUrl); // 降级到网页版
    }, 500);
    }
    }

    五、实施建议

    分阶段上线计划:

    第一阶段:内部测试版(使用测试环境订单数据)
    第二阶段:灰度发布( 20%客服团队试用)
    第三阶段:全量上线+数据监控


    监控指标配置:


    // 埋点示例
    const trackEvent = (eventName, params) => {
    console.log(`[Analytics] ${eventName}`, params);
    // 实际应接入数据分析平台
    };

    document.querySelector('.feishu-link').addEventListener('click', () => {
    trackEvent('FEISHU_CHAT_OPEN', {
    order_type: 'refund',
    user_agent: navigator.userAgent
    });
    });


    异常处理方案:
    添加备选交互流程(当飞书不可用时)

    function fallbackToClipboard(orderInfo) {
    navigator.clipboard.writeText(`订单号:${orderInfo.number}`);
    showToast('已复制订单号到剪贴板');
    }


    设置超时重试机制

    let retryCount = 0;
    function checkFeishuInstalled() {
    return new Promise((resolve) => {
    // 通过客户端 API 检测实现
    });
    }



    该方案的优势在于:

    实现成本低,主要利用现有开放平台能力
    同时支持桌面端和移动端跳转
    通过加密保障订单信息安全
    提供完整的异常降级方案
    支持数据埋点用于后续优化

    需要注意:

    需要申请飞书开放平台开发者权限
    用户首次使用时需要授权账号关联
    建议在消息模板中添加平台 logo 等品牌元素
    需定期更新加密秘钥(推荐使用密钥管理服务)
    Sumzibuyu
        2
    Sumzibuyu  
       211 天前
    这年头问问 deepseek 很难吗?
    chunriyeqiukong
        3
    chunriyeqiukong  
       211 天前
    不会问 ai ,飞书文档多看看也行啊
    LiaoMatt
        4
    LiaoMatt  
    OP
       211 天前
    @Sumzibuyu AI 幻觉很严重哦, 比如说你给的答案就行, 刚刚问了官方技术支持, 明确表示不支持做消息携带跳转
    xiaoqidev
        5
    xiaoqidev  
       211 天前
    既然是公司内部使用,可以客服先点击链接通知操作人员,操作人员此时已有订单和客服人员信息,由操作人员点击链接打开客服聊天框即可

    @Sumzibuyu 1.站内直接回复 AI 生成内容可能会被封号; 2.AI 不一定准确,例如 #1 中的 AppLink 飞书并不支持自定义参数所以无法实现
    LiaoMatt
        6
    LiaoMatt  
    OP
       211 天前
    @chunriyeqiukong 哥们别说和问题无关的话吗, 文档能看的已经看了
    LiaoMatt
        7
    LiaoMatt  
    OP
       211 天前
    @xiaoqidev 想携带上下文信息, 我前司自研的 IM 就可以做到这一点, 看飞书的文档没有看到相关的内容, 想看看有没有人曾经也有这个想法, 或者有这个经验
    xiaoqidev
        8
    xiaoqidev  
       211 天前
    @LiaoMatt 上下文信息已经有了,只是没在聊天中显示
    jworg
        9
    jworg  
       211 天前
    要不再和技术支持聊聊,催他们来实现这一个东西,感觉很有必要的一个场景。
    xiaoming1992
        10
    xiaoming1992  
       211 天前 via Android
    @Sumzibuyu ai 人家自己不会问,要你贴一个又臭又长还行不通的答案( op 在#4 说的)?越来越感觉 ai 警察做得对
    LiaoMatt
        11
    LiaoMatt  
    OP
       211 天前
    @jworg 嗯, 刚刚沟通的结果是让我找专门负责对接我们的技术支持, 提需求去落地, 但是如果要花钱, 肯定不做哈哈
    LiaoMatt
        12
    LiaoMatt  
    OP
       211 天前
    @xiaoming1992 AI 的答案并不一定准确, 还是需要自己思考实践过滤一下
    kingcanfish
        13
    kingcanfish  
       211 天前
    https://open.feishu.cn/document/common-capabilities/applink-protocol/applink-introduction/applink-application
    看看这篇文档 按我的理解只要你能在你自己的系统里拿到对应人员的飞书 openid 就能通过 applink 唤起窗口
    gunner168
        14
    gunner168  
       211 天前 via Android
    @LiaoMatt 这可能就是一本正经胡说八道的 ai
    input2output
        15
    input2output  
       211 天前 via iPhone   1
    jworg
        16
    jworg  
       211 天前
    又想了想,如果是我的话,可能会这样做,包一下 AppLink ,触发点击动作时先去自己系统后台走一道,调用对应操作用户的 api 给目标飞书先发送上下文消息,应该就是 5 楼的思路
    crackidz
        17
    crackidz  
       211 天前
    @kingcanfish 看了一下应该不支持参数吧,只能唤起聊天,还需要走其他的方式进行传输参数,或者使用粘贴板复制
    lepig
        18
    lepig  
       211 天前
    @Sumzibuyu 社区明确规定不让发 AI 生成内容。 这么长一大段
    dango33
        19
    dango33  
       211 天前
    创建群聊 -> 向群聊发送单号 -> 构造并访问群聊的链接

    ================

    刚才看文档想到的方式,没试过,不一定行。
    Livid
        20
    Livid  
    MOD
    PRO
       211 天前
    @input2output 谢谢,那个使用 AI 回复的账号已经被彻底 ban 。
    mingtdlb
        21
    mingtdlb  
       211 天前
    @Livid 一直想有个建议,借位置提一下。

    啥时候整一个,回复的时候能携带上下文,像 GitHub 那种

    > 原文

    回复
    mingtdlb
        22/div>
    mingtdlb  
       211 天前
    @mingtdlb 或者像抖音那种评论,在同一层展开,就更好了 哈哈
    adgfr32
        23
    adgfr32  
       210 天前 via Android
    笑死了,一楼还贴了段又臭又长的 ai 回复。飞书开发相关的训练资料很少,ai 回复的幻觉很严重,这种问题还体现在很多冷门的技术上。
    这种需要把飞书文档作为上下文提供进入,让他总结,但是如果我知道上下问在文档哪部分,我费这劲问 ai 干嘛呢,直接看文档不就行。
    目前很多大模型的产品支持解析 url 中的内容作为上下文带上。但是飞书的文档子页面非常多,不可能所有都提供,即使都提供了,上下文大概率会超。这种时候需要先从工程层面做到"从飞书文档中过滤出和我的问题相关的部分内容",然后带入到上下文中。
    甚至一楼还问一句"这年头问问 deepseek 很难吗" 同样的,这年头发出来之前,验证下自己发的内容很难吗。
    总之,我依然相信,大模型是智商过滤器。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2670 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 02:24 PVG 10:24 LAX 19:24 JFK 22:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86