import Taro from '@tarojs/taro'; export type WecomCsSessionContext = { orderId?: string; orderNo?: string; from?: string; }; type OpenCsChatOption = { extInfo: { url: string }; corpId: string; showMessageCard?: boolean; sendMessageTitle?: string; sendMessagePath?: string; }; type OpenCsChatFn = (option: OpenCsChatOption) => Promise; function getTaroOpenCsChat(): OpenCsChatFn | null { const api = (Taro as unknown as { openCustomerServiceChat?: OpenCsChatFn }).openCustomerServiceChat; return typeof api === 'function' ? api : null; } function getWxOpenCsChat(): ((option: OpenCsChatOption & { success?: () => void; fail?: (err: { errMsg?: string }) => void; }) => void) | null { const wxApi = ( globalThis as { wx?: { openCustomerServiceChat?: (option: OpenCsChatOption & { success?: () => void; fail?: (err: { errMsg?: string }) => void; }) => void; }; } ).wx?.openCustomerServiceChat; return typeof wxApi === 'function' ? wxApi : null; } /** 小程序调起企业微信「微信客服」会话 */ export async function openWecomCustomerServiceChat(params: { url: string; corpId: string; session?: WecomCsSessionContext; }): Promise { const url = params.url.trim(); const corpId = params.corpId.trim(); if (!url || !corpId) { throw new Error('企微客服未配置'); } const option: OpenCsChatOption = { extInfo: { url }, corpId, }; if (params.session?.orderNo || params.session?.orderId) { option.showMessageCard = true; option.sendMessageTitle = params.session.orderNo ? `订单 ${params.session.orderNo}` : '订单咨询'; if (params.session.orderId) { option.sendMessagePath = `pages/order-detail/index?id=${params.session.orderId}`; } } const taroApi = getTaroOpenCsChat(); if (taroApi) { await taroApi(option); return; } const wxApi = getWxOpenCsChat(); if (!wxApi) { throw new Error('当前微信版本不支持企业微信客服'); } await new Promise((resolve, reject) => { wxApi({ ...option, success: () => resolve(), fail: (err) => reject(new Error(err?.errMsg || '无法打开企业微信客服')), }); }); }