精华内容
下载资源
问答
  • } 获取文件流并写入到指定文件,方法: import org.apache.commons.io.FileUtils; import java.net.URL; //获取文件流并写入到指定文件 String url = ...

    仅获取文件流并转换为字节数组:

    import java.net.URL;
    //仅获取文件流并转换为字节数组:
    String url = "https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=xxxxxxxxxxxxxxxxxxx&media_id=xxxxxxxx";
    InputStream in;
    byte[] image = new byte[0];
    try {
    	URL uri = new URL(url);
    	in = uri.openStream();
    	byte[] buf = new byte[1024];
    	while (in.read(buf) > 0) {
    		image = Utils.byteMerger(image, buf);
    	}
    	in.close();
    } catch (IOException e) {
    	e.printStackTrace();
    }
    

    获取文件流并写入到指定文件,方法一:

    import java.net.URL;
    //获取文件流并写入到指定文件
    String url = "https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=xxxxxxxxxxxxxxxxxxx&media_id=xxxxxxxx";
    String filePathName = "C:\\Users\\Administrator\\Desktop\\827667.png";
    try {
    	URL uri = new URL(url);
        InputStream in = uri.openStream();
        File file =new File(filePathName);
    	 //判断文件或文件夹是否存在
        if(file.exists()){
            //不存在则创建改文件
            file.createNewFile();
        }
        FileOutputStream fo = new FileOutputStream(file);
        //byte[] image = new byte[0];
        byte[] buf = new byte[1024];
        int length = 0;
        while ((length = in.read(buf)) > 0) {
            fo.write(buf, 0, length);
            //image = Utils.byteMerger(image, buf);
        }
        in.close();
        fo.close();
    	
        //FileUtils.writeByteArrayToFile(new File(filePathName),image);  
    } catch (IOException e) {
    	// TODO Auto-generated catch block
    	e.printStackTrace();
    }
    

    获取文件流并写入到指定文件,方法二:

    import org.apache.commons.io.FileUtils;
    import java.net.URL;
    //获取文件流并写入到指定文件
    String url = "https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=xxxxxxxxxxxxxxxxxxx&media_id=xxxxxxxx";
    String filePathName = "C:\\Users\\Administrator\\Desktop\\827667.png";
    try {
    	URL uri = new URL(url);
        InputStream in = uri.openStream();
        File file =new File(filePathName);
    	 //判断文件或文件夹是否存在
        if(file.exists()){
            //不存在则创建改文件
            file.createNewFile();
        }
        byte[] image = new byte[0];
        byte[] buf = new byte[1024];
        while (in.read(buf) > 0) {
            image = Utils.byteMerger(image, buf);
        }
        in.close();
        FileUtils.writeByteArrayToFile(file,image);  
    } catch (IOException e) {
    	e.printStackTrace();
    }
    

    所用工具类:

    //java 合并两个byte数组
    public static byte[] byteMerger(byte[] byte_1, byte[] byte_2){
        byte[] newbyte = new byte[byte_1.length+byte_2.length];
        System.arraycopy(byte_1, 0, newbyte, 0, byte_1.length);
        System.arraycopy(byte_2, 0, newbyte, byte_1.length, byte_2.length);
        return newbyte;
    }
    
    展开全文
  • 如果可以看到这些数据,就可以做进一步的针对性营销,比如打开过文章的我肯定知道他起码已经简单了解过活动或者说对活动有兴趣,多点开的很可能就是购买意向比较大的客户,我们肯定要重点关注下。再比如,双11我们...

    一直以来,这些问题一直困扰着我们,比如公众号发了双11的活动文章,我们再转发给客户,最终只能看到总阅读量,而到底哪些客户看了这篇文章,每个客户的点击情况如何这些都无法看到。如果可以看到这些数据,就可以做进一步的针对性营销,比如打开过文章的我肯定知道他起码已经简单了解过活动或者说对活动有兴趣,多次点开的很可能就是购买意向比较大的客户,我们肯定要重点关注下。再比如,双11我们还做了一个活动专题页,正常情况下发给客户之后就没下文了,而实际上我们非常想知道到底哪些客户打开了我们的活动页面,具体什么时间打开的,打开了多少次。再比如,某个客户有京东店铺或者自己微商城产品,传统操作中把店铺或者某个商品链接发给客户之后,也是很难知道这个客户的打开情况,最终只能是干着急。等等,类似的场景太多了。

    随着B2B业务的大军渐渐将至,很多企业都开始选择启用企业微信来联系客户,并且大多数使用企业微信的企业都会配备一个客户销售管理系统,也就是SCRM。

    不过很多人不知道如何去选,不知道什么样SCRM工具最适合自己的企业,是在当前背景下企业普遍关注的重点问题

    一、主流厂商综合情况

    微伴,2019年11月上线SCRM,真格基金投资,服务行业众多,一开始是免费使用,现在部分功能收费了。

    二、主流产品优势对比

    其实市面上的SCRM产品都是大同小异,精细化管理、群运营群SOP、会话质检、客户画像等等这些基本上都是标配,所以就不再赘述。以下的优势对比只针对于产品本身,如果有理解不同的还请大家指正。

    微伴

    之所以把微伴第一个来说,实在是觉得微伴的功能实在是没什么特色,在市场大环境下也没有什么竞争力,那为什么微伴这么多人在用呢?就是因为它免费,加上目前企业对于SCRM的行业认知不深,所以先选择一个免费的看自己的企业到底适合不适合使用,也很make sense了。

    除了企微SCRM通有的功能之外,企鲸客有几点功能亮点。

    企鲸客助手是一款基于企业微信SCRM管理系统,基于企业微信开放的接口,已合规开发60余项高级营销功能,帮助企业更快链接客户、更高效实现增长

    企鲸客助手多渠道触达引流

    批量加好友

    给员工分配添加好友任务,员工批量添加客户手机号; [2]  

    员工每添加一个客户,系统就会自动给客户发短信提醒,提高好友通过率; [2]  

    企业可查看员工的添加数据和客户通过状态。 [2]  

    渠道活码:

    可以统计不同渠道的引流数据,帮助企业掌握每个渠道的引流效果; [2]  

    多个账号接待分流,避免一个账号添加的客户过多,导致被限制加好友。 [2]  

    区域扫码:

    基于地理位置进行引流,客户扫码后添加距离最近的店主,或加入最近的门店客户群,方便企业将线下门店的客户转移到线上来,聚合运营,刺激到店消费 [2]  。

    网页在线客服:

    提供在线客服便捷聊天功能,客户在web网页即可随时发起聊天,无需添加企业账号; [2]  

    还可以将在线聊天记录完整同步至企业微信,让企业发现更多的客户线索。 [2]  

    企鲸客助手客户管理

    客户画像:

    可以自动详细记录客户来源、对话时长、是否打开文件资料、观看直播、打开朋友圈、历史订单等信息,帮助企业更准确地判断客户意向,从而开展精细化营销,打造优质客户服务。 [2]  

    快捷回复:

    在聊天对话框,可一键发送文字、图片、文件、图文链接、视频等多类型的话术,提高消息回复速度; [2]  

    话术库支持关键词查找和分享,以及根据聊天关键词智能推荐对应话术。 [2]  

    个人sop:

    帮助企业规范客户的消息推送流程,适合用作新客教育、冷客户激活、老客户续费。系统到点自动提醒员工推送消息,帮助企业提高新客户的留存率,做好客户的维护跟进工作。 [2]  

    客户阶段管理:

    帮助企业建立客户营销漏斗,制定完整的客户跟进流程,减少客户流失,提高客户转化。自定义客户阶段后,系统到时间自动提醒员工跟进客户,避免遗漏。 [2]  

    标签管理-自动打标签:

    无需手动打标签,减少员工打标签的工作量。根据聊天关键词自动打标签,客户从渠道活码扫码进来、填写表单、参加打卡抽奖活动、打开朋友圈,系统都会自动打上标签。

    三、产品迭代、扩展及服务能力

    企鲸客除了产品功能优势之外,厂商的公司实力、产品迭代能力和服务能力也同样重要。我有问过身边一些朋友,他们对正在使用的供应商态度不一,对品牌评价的好坏更强调一种综合因素的感知,包括与公司使用场景沟通的契合度、实际部门的习惯、迭代速度与公司的需求的匹配度,售后响应速度等诸多因素,大家可根据自己的实际情况,擦亮眼睛去认真辨别。

    综上,各大厂商其实各有所长,企业需要结合自身需求去选择一个适合自己的系统。采购前,除做好公司规模、技术能力、解决方案完整度、项目经验等行业调研,应该认真梳理出服务全景及业务场景,确定使用工具的定位和目标,对公司内部涉及部门及相关领导做好需求调查研究,经过认真比对,选择真正适合自身需求的供应商。在采购签约前,充分了解厂商的实力、价格及服务能力,做好商务谈判。

    以上就是企鲸客功能的使用方法了,企鲸客助手还有企业微信会话存档、自动打标签、批量加好友、群SOP等高级功能,可以提升员工的工作效率,帮助员工进行客户运营、社群运营,提升企业微信营销效果

    展开全文
  • 前端wx-jssdk的使用及企微和微信下分享等功能自定处理 一、前端wx-jssdk的使用 wx-jssdk使用需要微信公众平台内进行设置(绑定域名等操作)及后端配合才能真正使用,下文是讲述前端如何使用。 wx-jssdk的接口文档 1...

    前端wx-jssdk的使用及企微和微信下分享等功能自定义处理

    一、前端wx-jssdk的使用

    wx-jssdk使用需要微信公众平台内进行设置(进入公众号设置的“功能设置”里填写“JS接口安全域名“的操作)及后端配合才能真正使用,下文是讲述前端如何使用。
    wx-jssdk的接口文档

    1、导包

    在main.ts中(以vite+react项目中为例),为什么在main.ts中进行使用呢?其实在index.html文件中调用也是可以的,因为我要用到一些公共方法,并且保证要完成加载在线wx-jssdk包完后,再进行挂载等步,实现异步变同步处理更方便,就放在main.ts中。放在index.html 并保证异步变同步完全加载完wx-jssdk包就行,即:支持使用 AMD/CMD 标准模块加载方法加载

    import React from 'react';
    import ReactDOM from 'react-dom';
    import { BrowserRouter } from 'react-router-dom';
    import App from './app';
    import { getEnv,WECHAT_ENV  } from '@/utils';
    //import '@/utils/setup.ts';
    //import '@/assets/css/reset.less';
    //import '@/assets/css/base.less';
    //import '@/assets/font/iconfont.css';
    
    const script = document.createElement('script');
    // @ts-ignore
    script.crossorigin = 'anonymous';
    const sdkVerion = getEnv() === WECHAT_ENV.qyWechat ? 'jweixin-1.2.0.js' : 'jweixin-1.6.0.js';
    // 开发环境和线上环境的wxsdk的路径有所区别
    // script.src = process.env.NODE_ENV === 'development' ? `./public/lib/${sdkVerion}` : `./lib/${sdkVerion}`;
    script.src = `https://res.wx.qq.com/open/js/${sdkVerion}`;
    script.onerror = () => {
      console.log('qy-wx-sdk:loadError');
    };
    
    script.onload = () => {
      console.log({ wx });
      // 必须等wxsdk 加载完之后,才能渲染页面
      ReactDOM.render(
        <BrowserRouter basename={`/${import.meta.env.VITE_APP_NAME}`}>
          <App />
        </BrowserRouter>,
        document.getElementById('root')
      );
    };
    
    document.head.appendChild(script);
    

    2、使用

    wx-jssdk提供了企微和微信环境下的一些方法进行使用:(wx-jssdk的接口文档企业微信-wxjssdk

    • wx.config(obj):config接口注入权限验证配置
    • wx.ready():config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    • wx.error():通过error接口处理失败验证
    • wx.checkJsApi({ jsApiList: [],success(res) {console.log(res);},}):判断当前客户端版本是否支持指定JS接口,jsApiList: 需要检测的JS接口列表,所有JS接口列表,见JS接口列表;企业微信-wxjssdk
    • wx.agentConfig():
      config注入的是企业的身份与权限,而agentConfig注入的是应用的身份与权限。尤其是当调用者为第三方服务商时,通过config无法准确区分出调用者是哪个第三方应用,而在部分场景下,又必须严谨区分出第三方应用的身份,此时即需要通过agentConfig来注入应用的身份信息。企业微信-wxjssdk内有详细讲解
    • wx.invoke():获取进入H5页面的入口环境,企业微信-wxjssdk

    封装的getTicket

    import ajax from '@/utils/ajax';
    import { ConfigOptions, JSApiList } from 'wx-jssdk';
    import { getEnv,WECHAT_ENV  } from '@/utils';
    
    // 普通签名
    export const getTicket = async (jsApiList, callback, isShowError = true, maxRequestCount = 3) => {
      // 开发+真机调试模式,要初始化JS_SDK 
      if (process.env.NODE_ENV === 'development' && !process.env.WX_JS_SDK_ENABLED) return;
      let url = '';
      // 如果是 iOS 设备,则使用第一次进入App时的 URL 去请求 wxConfig,不然的话会导致 iOS 中分享的链接描述信息或者图标不对
      if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent) && env === 2) {
        url = encodeURIComponent(localStorage.getItem('entryUrl'));// 有保存在localstorage中的页面路径
      } else {
        // console.log('签名地址=======================', window.location.href)
        url = encodeURIComponent(window.location.href);
      }
      const params = {
        appId: newAppId || appId,
        corpId: env === 2 ? authCorpId : currentCorpId,
        wechatType: env,
        jsUrl: url,
        agentId,
      };
      console.log('getTicket', `path=${location.pathname}  url=${decodeURIComponent(params.jsUrl)}`);
      try {
        const res = await ajax('getTicket', params, isShowError); // 后端定义的接口  这里的ajax是自定义的
        const { retdata = {} } = res;
        const { appId, noncestr, signature, timestamp, nextUpdateTime } = retdata;
        const obj = {
          debug: false, // 是否开启调试模式
          appId, // appid
          timestamp, // 时间戳
          nonceStr: noncestr, // 随机字符串
          signature, // 签名
          jsApiList,
          openTagList: ['wx-open-launch-weapp'],
        };
        if (env === 1) {
          obj.beta = true;
          obj.appId = currentCorpId;
        }
        wx.config(obj);
        wx.ready(function () {
          if (typeof callback === 'function') callback(jsApiList);
        });
        wx.error((res) => {
          console.log('%c zjs wx.error res:', 'color: #0e93e0;background: #aaefe5;', res);
          if (typeof callback === 'function' && maxRequestCount > 0) callback(new Error('error'));
        });
      } catch (e) {
        console.log('%c zjs getTicket err:', 'color: #0e93e0;background: #aaefe5;', e);
        setTimeout(() => {
          maxRequestCount > 0 && getTicket(jsApiList, callback, isShowError, --maxRequestCount);
        }, 1000);
      }
    };
    
    // 企业微信下一些自建应用签名
    export const agentConfig = async (
      jsApiList: JSApiList[],
      callback: Function,
      shareUrl = '',
      isShowError = true,
      maxRequestCount = 3
    ) => {
      getTicket(
        [...jsApiList, 'agentConfig'],
        async (error: string) => {
          if (error === 'error') {
            // 过期或者签名错误 重新获取
            setTimeout(() => {
              maxRequestCount > 0 && agentConfig(jsApiList, callback, shareUrl, isShowError, --maxRequestCount);
            }, 1000);
          } else {
            const params = {
              type: WECHAT_ENV.qyWechat,
              jsUrl: window.location.href,
            };
            const res = await ajax({ api: 'getTicket', params });
    
            const { retdata = {} } = res;
            const { corpId: corpid, noncestr: nonceStr, agentid, signature, timestamp }: any = retdata;
    
            wx.checkJsApi({
              jsApiList: ['agentConfig'],
              success(res) {
                console.log(res);
              },
            });
            const obj = {
              corpid, // 必填,企业微信的corpid,必须与当前登录的企业一致
              agentid, // 必填,企业微信的应用id
              timestamp, // 必填,生成签名的时间戳
              nonceStr, // 必填,生成签名的随机串
              signature, // 必填,签名,见附录1
              jsApiList,
              // openTagList: ['wx-open-launch-weapp'],
              success: (res: ILooseStrObj) => {
                console.log('agentConfig ok', res);
                if (typeof callback === 'function') callback(jsApiList);
              },
              fail(res: ILooseStrObj) {
                console.log('agentConfig fail', res);
                if (typeof callback === 'function') callback('error');
              },
            };
            console.log('agentConfig obj', obj);
            wx.agentConfig(obj);
          }
        },
        shareUrl
      );
    };
    

    上面公用的一些方法

    export const WECHAT_ENV = {
      qyWechat: 1, // 企业微信
      wechat: 2, // 微信
    };
    
    // 判断当前是微信环境还是企业微信环境
    export const getEnv = () => {
      const ua = window.navigator.userAgent.toLowerCase();
      // eslint-disable-next-line
      if (Boolean(ua.match(/MicroMessenger/i)) && Boolean(ua.match(/wxwork/i))) {
        // 企业微信
        // console.log('企业微信环境-1')
        return WECHAT_ENV.qyWechat;
        // eslint-disable-next-line
      } else if (Boolean(ua.match(/micromessenger/i))) {
        // 微信
        // console.log('微信环境-2')
        return WECHAT_ENV.wechat;
      }
    };
    
    // 判断是pc端还是移动端
    export const isPC = !/Android|webOS|iPhone|iPod|BlackBerry|SymbianOS|Windows Phone/i.test(navigator.userAgent);
    
    /**
     * [changeSearch description]
     * @param  {[type]} oldName 需要修改的search字段
     * @param  {[type]} newStr 替换的新串
     * @param  {[type]} url 当前要替换的link地址  不传默认是  window.location.search
     * @return {[type]}         [description]
     */
    export const changeSearch = (oldName: string, newStr: string, url: string) => {
      const jsonObj: any = searchToJson(url || window.location.search);
      if (!oldName) {
        return url;
      }
      jsonObj[oldName] = newStr;
      const linkUrl = url.split('?')[0] + jsonToSearch(jsonObj);
      return linkUrl;
    };
    
    /** 将url的search部分转化为json
     *  @param url:String -- url地址
     *  @param codeURI:Boolean -- 是否解码
     */
    export const searchToJson = (url = window.location.href, codeURI = false) => {
      let setUrl: string = url || '';
      const search = setUrl.split('?');
      let result = {};
      search.forEach((item, index) => {
        if (index !== 0) {
          result = item.split('&').reduce((obj, item) => {
            const arr = item.split('=');
            return { ...obj, [arr[0]]: codeURI ? decodeURIComponent(arr[1]) : arr[1] };
          }, result);
        }
      });
      return result;
    };
    
    // 获取url参数
    export const getUrlQueryString = (search: string, name: string) => {
      const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
      const r = search.substr(1).match(reg);
      if (r !== null) {
        return r[2];
      }
      return '';
    };
    
    

    注意bug

    背景:在使用到这个ssdk过程中(我使用js-weixin的包是1.2.0版本),我遇到了一个兼容Android和ios的问题,就是在调用jssdk无论是ios还是Android都可以调用,但是当在企业微信中使用到分享相关的api时,在ios是无法调用,在Android是没有问题的,
    处理方案:更改调用的js-weixin包,将js-weixin包改为1.0.0的包 ,两个包地址是不一样的:
    https://res.wx.qq.com/wwopen/js/jsapi/jweixin-1.0.0.js
    https://res.wx.qq.com/open/js/jweixin-1.2.0.js

    二、 处理系统分享出去自定标题、描述、背景及相关系统功能禁用等

    场景一:使用系统携带的分享等功能,但自定义分享的标题、描述等内容

    在使用系统带的分享功能时,需要自定义分享出去的背景、背景图、描述及分享的链接时,可以将下面的shareFuc导入,初始化(放componentDidMount或useEffect中)携带对应的参数即可。

     const shareObj = {
        title: '客户认证',
        desc: '客户自己完成认证',
        imgUrl: '',
        linkUrl: ``,//分享的链接,可携带一些参数
      };
       useEffect(() => {
        shareFuc(shareObj);// 下面封装已给出
      }, [userId]);
    

    场景二:弃用系统自带的分享,自己写弹框,触发分享API

    出现这个场景,一方面可能可客户需要,另一方面,可能是分享要进行埋点,记录分享出去的次数。
    实现:写一个弹框(如下),将下面每个分享或转发调用相应的API
    在这里插入图片描述

    1. 转发:shareAppMessage,微信好友:shareWechatMessage,微信朋友圈:shareTimeline,这几个直接使用wx.invoke即可
    // 微信好友
      const forwardWeChat = () => {
        const shareConfig = {
          title, // 分享标题
          desc, // 分享描述
          link: "linkUrl", // 分享链接
          imgUrl: "imgUrl" , // 分享封面
        };
        console.log('企微-微信好友 shareConfig', shareConfig);
        wx.invoke('shareWechatMessage', shareConfig, (res: any) => {
          console.log('企微分享微信好友-分享回调', res);
          if (res.err_msg === 'shareWechatMessage:ok') {
            //
          }
         });
     	};
    
    
    1. 企微朋友圈:shareToExternalMoments,群发客户:shareToExternalContact;群发客户群:shareToExternalChat,比微信下多了agentConfig处理,是因为这三个api需要配置客户联系功能与版本
    import { JSApiList } from 'wx-jssdk';
    import { agentConfig } from '@/utils/getTicket';// 上面有封装
    
    // 群发客户群
      const groupShareGroup = async (e: any) => {
        const arrAgent: JSApiList[] = ['shareToExternalChat'];
        agentConfig(
          arrAgent,
          () => {
            wxInvokeShare('shareToExternalChat', {
              title, // 分享标题
              desc,
              link: "linkUrl", // 分享链接
              imgUrl:"imgUrl", // 分享封面
            });
          },
          linkUrl
        );
      };
    
    • 注意
      问题:在我处理分享的时候踩到了一个坑,就是设置分享的imgUrl参数的时候写的是相对路径(…/…/…/images/common/shareIconImg.png),分享出去的图标无法显示
      原因:官方似乎没有给出解释,我觉得是不是图片是本地内,分享出去后,显示的这个内容并没有加载整个项目代码,只是作为参数传过去,由于是图片是相对路径,这样导致加载不到图片,
      处理方案:使用base64方法得到图片作为imgUrl参数

    场景三:禁用个人微信或企微右上角分享等功能

    见下列方法:

    • 企微:hiddenWxQyShareOption,使用API:wx.hideOptionMenu(), wx.showMenuItems(
    • 微信:hiddenWxShareOption ,使用:WeixinJSBridge.call(‘hideToolbar’); WeixinJSBridge.call(‘hideOptionMenu’);

    函数封装shareFuc、企微和个人微信系统分享等功能禁用封装

    // @ts-nocheck
    import globalData from '@/config/globalData';
    import keyDict from '@/config/keyDict';
    import point from '@/config/point';
    import { changeSearch, getEnv, searchToJson, getUrlQueryString, isPC, WECHAT_ENV  } from '@/utils';//上面公用方法
    import ajax from '@/utils/ajax';
    import { getTicket } from '@/utils/getTicket';// 上面定义封装处理
    import { JSApiList } from 'wx-jssdk';
    
    interface IShareProps {
      title: string;
      desc: string;
      linkUrl: string;
      imgUrl: string;
      userId: string;
      cb?: () => void;
    }
    
    interface IShareFunProps {
      shareObj: IShareProps;
      jsApiList: JSApiList[];
      maxRequestCount: number;
    }
    
    /**
     * [shareFuc description]
     * @param  {[type]}  shareObj { title: 标题, desc: 描述, linkUrl: 分享地址(会对地址做拼接,默认不传为当前url), imgUrl: 分享icon, staffId: 经理id,拼接给分享地址}
     * @param  {Array}   [jsApiList=[微信api]]
     * @return {Promise}                [description]
     * @param  {type}   maxRequestCount 最大失败请求次数,默认 为 3次
     */
    
    export const shareFuc = async (shareObj: IShareProps, jsApiList = [], maxRequestCount = 3) => {
      // console.log('shareObj===》', shareObj);
    
      const defaultJsApi: JSApiList[] = ['onMenuShareAppMessage', 'onMenuShareTimeline', 'getLocation', 'previewImage'];
    
      // 不支持在PC端微信使用js-sdk功能
      if (isPC) return;
    
      const ua = navigator.userAgent.match(/MicroMessenger\/([\d\\.]+)/i);
      const lowerWeChat = ua ? ua[1] < '6.7.2' : true;
      // 微信
      if (getEnv() === 2) {
        defaultJsApi.push('updateAppMessageShareData', 'updateTimelineShareData');
      }
      getTicket(
        [...defaultJsApi, ...jsApiList],
        async (error: string) => {
          if (error === 'error') {
            // 过期或者签名错误   重新获取
            setTimeout(() => {
              if (maxRequestCount > 0) {
                maxRequestCount = --maxRequestCount;
                shareFuc(shareObj, jsApiList, maxRequestCount);
              }
            }, 1000);
          } else {
            // 企业微信(微信)下隐藏部分不需要的菜单功能--如分享到同事吧,收藏,转发,微信,朋友圈
            if (getEnv() === 2) {
              wx.hideOptionMenu();
              wx.showMenuItems({
                menuList: [
                  'menuItem:copyUrl', // 复制链接
                ],
                // wx.hideMenuItems({
                //   menuList: [
                //     // 'menuItem:setFont', // 字体
                //     // 'menuItem:openWithSafari', // Safari
                //     // 'menuItem:share:email', // 邮件
                //     // 'menuItem:openWithQQBrowser', // QQBrowser
                //     // 'menuItem:share:appMessage', // 转发
                //     // 'menuItem:share:timeline', // 朋友圈
                //     // 'menuItem:share:wechat', // 微信
                //   ], // 要隐藏的菜单项
                // });
              });
            }
            const { title = '', desc = '', imgUrl = '', linkUrl, cb } = shareObj;
            // 个人微信处理
            if (getEnv() === 2) {
              // 分享给朋友
              if (wx.updateAppMessageShareData && !lowerWeChat) {
                wx.updateAppMessageShareData({
                  title, // 分享标题
                  desc, // 分享描述
                  link: linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                  imgUrl, // 分享图标
                  success: () => {
                    console.log('微信分享给朋友,新Api,没有成功回调');
                  },
                });
              } else {
                wx.onMenuShareAppMessage({
                  title, // 分享标题
                  desc, // 分享描述
                  link: linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                  imgUrl, // 分享图标
                  type: undefined, // 分享类型,music、video或link,不填默认为link
                  dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                  success: () => {
                    // 用户点击了分享后执行的回调函数
                    console.log('微信分享给朋友,旧Api');
                  },
                });
              }
              // 分享给朋友圈
              if (wx.updateTimelineShareData && !lowerWeChat) {
                wx.updateTimelineShareData({
                  title, // 分享标题
                  link: linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                  imgUrl, // 分享图标
                  success: () => {
                    // 设置成功
                    console.log('微信分享给朋友圈,新Api');
                  },
                });
              } else {
                wx.onMenuShareTimeline({
                  title, // 分享标题
                  link: linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                  imgUrl, // 分享图标
                  success: () => {
                    // 设置成功
                    console.log('微信分享给朋友圈,旧Api');
                  },
                });
              }
            } else {
              // 企业微信
              wx.onMenuShareAppMessage({
                title, // 分享标题
                desc, // 分享描述
                link: linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl, // 分享图标
                success: () => {},
                cancel: () => {},
              });
              wx.onMenuShareTimeline({
                title, // 分享标题
                link: linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl, // 分享图标
                success: () => {
                  // 设置成功
                  console.log('企业微信分享给朋友圈,旧Api');
                },
                cancel: () => {
                  // 用户取消分享后执行的回调函数
                  console.log('企业微信分享给朋友圈,旧Api,cancel');
                },
              });
            }
    
            // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
            cb && cb();
          }
        },
        shareObj.linkUrl,
        false,
        maxRequestCount
      );
    };
    
    /**
     * 禁止企业微信右上角分享(新版本企微是下方)
     * **/
    let wxConfigTimer: number;
    export const hiddenWxQyShareOption = () => {
      if (getEnv() === WECHAT_ENV.qyWechat) {
        wxConfigTimer && clearTimeout(wxConfigTimer);
        wxConfigTimer = window.setTimeout(() => {
          getTicket([], () => {
            console.log('企业微信环境屏蔽右上角分享');
            wx.hideOptionMenu();
            wx.showMenuItems({
              menuList: ['menuItem:copyUrl'], //保留复制链接
            });
          });
        }, 200);
      }
    };
    
    /** 禁止微信右上角分享按钮 */
    export const hiddenWxShareOption = () => {
      if (getEnv() === WECHAT_ENV.wechat) {
        console.log('禁用微信右上角分享和状态栏');
        if (typeof WeixinJSBridge === 'undefined') {
          // 这个可以禁用安卓系统的右上角分享     (只针对微信端)
          document.addEventListener(
            'WeixinJSBridgeReady',
            function () {
              WeixinJSBridge.call('hideToolbar');
              WeixinJSBridge.call('hideOptionMenu');
            },
            false
          );
        } else {
          // 这个可以禁用ios系统的右上角分享      (只针对微信端)
          WeixinJSBridge.call('hideToolbar');
          WeixinJSBridge.call('hideOptionMenu');
        }
      }
    };
    
    

    JS接口列表

    type JSApiList =
        | 'agentConfig'
        | 'updateAppMessageShareData'
        | 'updateTimelineShareData'
        | 'onMenuShareTimeline'
        | 'onMenuShareAppMessage'
        | 'onMenuShareQQ'
        | 'onMenuShareWeibo'
        | 'onMenuShareQZone'
        | 'startRecord'
        | 'stopRecord'
        | 'onVoiceRecordEnd'
        | 'playVoice'
        | 'pauseVoice'
        | 'stopVoice'
        | 'onVoicePlayEnd'
        | 'uploadVoice'
        | 'downloadVoice'
        | 'chooseImage'
        | 'previewImage'
        | 'uploadImage'
        | 'downloadImage'
        | 'translateVoice'
        | 'getNetworkType'
        | 'openLocation'
        | 'getLocation'
        | 'hideOptionMenu'
        | 'showOptionMenu'
        | 'hideMenuItems'
        | 'showMenuItems'
        | 'hideAllNonBaseMenuItem'
        | 'showAllNonBaseMenuItem'
        | 'closeWindow'
        | 'scanQRCode'
        | 'chooseWXPay'
        | 'openProductSpecificView'
        | 'addCard'
        | 'chooseCard'
        | 'openCard'
        | 'shareToExternalContact'
        | 'shareToExternalChat'
        | 'selectExternalContact'
        | 'navigateToAddCustomer';
    
    展开全文
  • 一、什么是企微裂变宝 企微裂变宝是基于企业微信开发的社会化客户关系管理系统。该系统主要包含引流获客、客户管理、群运营、会话存档、应用管理、账号管理等模块,帮助企业精准触达用户,开启精细化私域流量运营!...

    2020年,越来越多的企业开始重视私域流量了。

    之前统一宽泛的运营方式,已经远远跟不上这个时代了,它区分不了用户属性,即便手握大量用户,也很难达成实际成交。反观精细化的私域运营,思路完全不同,它需要把心思放在用户画像上,越精准越好,以便增强用户的信任感,达到高效成交和转介绍的目的。

    而私域流量的运营,离不开个人微信,以便一对一地触达用户。

    但是,小新在与运营小伙伴沟通的过程中,发现80%以上的企业在私域流量的运营过程中都遇到过以下问题:

    好友管理混乱:因好友上限问题,企业不得不注册多个微信号添加客户,管理混乱;

    客户流失严重:员工离职,重要微信客户被员工带走或删除,导致无法联系和跟进客户;

    封号风险较大:个人微信号过度营销,一旦封号,客户瞬间归零;

    精细化管理难:难以对微信好友进行统一管理,导致无法个性化精准营销;

    企业形象不统一:个人微信形象展示混乱,客户对企业品牌无认知,遭到同行冒充被截流;

    好友添加受限:个人号每日添加有限制,并且难以统计渠道来源数据;

    数据统计繁琐:个人微信难以统计员工跟进沟通数据,无法量化工作任务;

    转化率极低:难以区分客户跟进状态,对客户进行销售转化十分麻烦;

    随着运营工作的开展,这些问题会越滚越大,变得越来越难调和,后续即使付出极大的运营成本也很难解决。

    如果想要尽快从这些矛盾点中脱离出来,唯一的办法就是:布局企业微信。

    企业微信是目前唯一获得官方认可的最好用的私域流量工具,没有之一!

    企业微信正处于早期红利期,存在大量的机会,越早布局越能抢占更多流量。目前,保洁、恰恰、屈臣氏、中国电信等各行业的top品牌,都已经开始了企业微信裂变获客。

    天虹让全国5万导购连接500万顾客,3月6日,天虹X欧莱雅实现208万的在线销售,3月7日,天虹与兰蔻联手,10分钟销售额突破96.79万,最终销售额达到232万。

    屈臣氏用企业微信让2万+导购,连接300多万的消费者。三八节期间,屈臣氏的小程序创下单日GMV破千万的记录。

    2月1日至2月7日,歌莉娅每天在企业微信上的销售过100万,2月7日当天高达300万。

    企业微信的趋势已经势不可挡,在可见的未来里,99%的企业一定会逐渐往企业微信上布局,只是时间早晚的问题!

    与其自己摸索观望,不如跟着行业高手,站在前人的肩膀上进步!学习他们已经试验过的成功方法,给自己的运营能力加buff。

    由于企业微信本身只有一个简单的聊天对话接口,核心功能跟个人微信没有大差别。想要实现更强大的功能,离不开专业的第三方工具。

    我们基于企业微信的接口,提供了一套强大的企业微信SCRM管理系统——企微裂变宝。

    可以高效打造引流——留存——转化——转介的私域流量闭环。全程以用户增长为核心,包含对每一个用户心理的深刻洞察,更能方便管理,极大提高运营效率。

    一、什么是企微裂变宝

    企微裂变宝是基于企业微信开发的社会化客户关系管理系统。该系统主要包含引流获客、客户管理、群运营、会话存档、应用管理、账号管理等模块,帮助企业精准触达用户,开启精细化私域流量运营!

    二、企业裂变宝包含哪些功能

    1、好友裂变

    跟公众号拉新涨粉不同的是,企业微信的拉新是直接增加好友人数。

    设置一个吸引力强的奖品,邀请达到一定人数(比如3个人)可以免费领取。想要奖品的用户会把海报发给好友或者发到朋友圈,好友识别二维码会直接添加上企业微信,达到目标人数即完成任务。

    这是行业内普遍公认好用的裂变拉新玩法,涨粉效果非常好,屡试不爽。

    2、互动雷达

    企业可以将自己的图文、视频等推广素材以链接的形式,推送给用户。用户每点击一次即可获得记录,并自动统计该用户画像,打上标签。

    3、渠道活码

    渠道活码是非常实用的一个功能,可以实现同一个二维码(永不过期),扫码后添加不同的客服人员。

    分享几个具体的应用场景。

    ①同一个二维码,扫码后添加不同的销售人员,随机分配,公平获客;

    ②不同渠道,分开放置。例如在宣传渠道大家看到的可能都是同样的一张二维码,但扫码后对应的销售团队可能完全不一样,可以直观统计不同渠道的推广效果。

    ③自动验证,也就是加好友自动通过,无缝隙触达客户;

    ④自动发送欢迎语。加完好友后自动推送提示语,比如一条文字回复+公众号二维码。能更好地塑造专业统一的企业形象,也能间接给公众号引流。

    ⑤自动打标签,更精细化地描绘用户画像,方便后续跟进。

    4、企微朋友圈

    企微裂变宝增加了朋友圈的功能。员工可以单独发朋友圈,展示公司产品信息,让公司形象更加统一、专业。

    功能太多了,鉴于篇幅限制,先介绍以上几个。

    下图是常用的功能列表,如果对其他功能感兴趣,可以+运营vx:bensu58,详细了解。

    三、企业裂变宝功能亮点
    在这里插入图片描述
    批量导入客户手机号,一键复制手机号,高效添加好友。

    渠道活码投放,多渠道引流,渠道数据精准统计。

    设置任务目标人数,裂变拉新,快速引流获客。

    根据渠道来源自动打标签,帮助商家精细化管理客户。

    导入统一话术,规范销售用语,快捷回复,提高销售效率。

    链接小程序、公众号、企业微信粉丝,轻松打造私域流量。

    多维度客户画像,降低运营推送难度。

    互动雷达,追踪客户行为轨迹,洞察客户真实需求。

    一客一码,通过该码邀请好友后,可追踪邀请数据。

    聊天会话存档,企业内控高效管理,建立服务标准提升满意度。

    我们为什么要用企业微信,核心目的只有一个,就是——连接用户。

    一方面降低用户的认知成本,让他们更好地认知、认同你;另一方面,可以尽可能地降低用户的行动成本,走到离消费者更近的地方,让他们更快地找到你。

    还有什么比这种方法,更能促进成交和转化的吗?希望2021年,你不要再错过企业微信了。

    展开全文
  • 一、写好接口程序在你的服务器上上传好一个接口程序文件,如http://www.yourdomain.com/weixin.php 内容如下:复制代码 代码如下:
  • JS-SDK与二次分享问题

    2021-05-11 14:08:37
    鉴权的时候需要签名,签名需要票据,随机字符串,时间戳,网址,票据需要调用微信的一个接口生成,比较麻烦的参数票据,票据的生成,需要调用另外一个接口,需要appId和serect。每天只能调用2000,每次调用的有效...
  • 我们在6月份做了通讯录转译,后面一直忙没机会分享,我们B端开发群里(加我微信li570467731拉你入群)做企业微信第三方应用的朋友们也一直有讨论。 一转眼就8月了, 现在分享补上吧。解决不返回姓名和部门名有两个...
  • 通过企业微信服务端API接口进行群发应用消息一.基本术语介绍说明1.corpid2.userid3.部门id4.tagid 最近项目上需要用到企业微信应用进行消息的群发功能,用来将系统产生的告警消息通过企业微信群发的方式通知客户方...
  • 背景介绍:我们公司采用第三方应用的形式进行的开发所以获取的外部联系人ID也是使用第三方应用token获取的,但是的第三方应用开发没有提供关于客户群分配的接口。 解决方案一:经过测试第三方应用获取的外部联系人...
  • 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、...
  • 企业微信接口错误代码汇总

    万次阅读 2020-08-25 15:29:56
    企业微信接口错误代码汇总排查方法错误码:40003错误码:40007错误码:40014错误码:40029错误码:40032错误码:40035错误码:40054 40055错误码:40056错误码:40063错误码:40070错误码:40082错误码:40084错误码...
  • 大家都知道,正常情况下,电脑企业...他就不让再打开第个了。如果没找到,就打开一个新微信,就是这个原理实现的。 在OD中(如下图),用快捷键Ctrl+G ,弹出搜:CreateMuteW(微信是宽字符) ,搜索之后,下断点,
  • 手把手教你springboot企业微信开发(四)js-sdk结语 js-sdk 按照企业微信官方给的做法来链接是...
  • 首先,要明确两个概念,就是微信和企业微信不是一个东西(虽然有些信息互通)、企业微信应用和服务商的第三方应用也不是一个东西(虽然也有些接口可以调用),企业内部开发指的是开发某个企业自己用的应用,而第三方...
  • 企业微信三方开发(一):回调验证及重要参数获取

    千次阅读 热门讨论 2020-06-16 17:25:22
    微信接口开发无非就是通过一些带token的http请求来实现相关功能,而获取这些token往往需要先获取一些重要参数,这里有两个参数需要先获取:suite_ticket 和 auth_code 技术栈及工具 开发框架:spring-boot 开发...
  • 整理了一下我们做企业微信应用的群里经常有人问的问题 一般产生这些问题的原因就是没看文档,如果还有其它理由就是没仔细看文档 当然还有没有看demo。 demo地址点此demo ...这个接口要求:“在1秒内响应GET...
  • 企业微信开发

    万次阅读 多人点赞 2018-05-10 15:19:32
    与微信一致的沟通体验,为企业员工提供最基础和最实用的办公服务,并加入贴合办公场景的特色功能、轻OA工具,提供了通讯录管理、应用管理、消息推送、身份验证、移动端SDK、素材、OA数据接口、企业支付、电子发票等...
  • 一来我不知道怎么搞(Java开发不会Android囧),来也是打算直接在PC端实现这个抓取过程.于是就从研究微信的网页客户端.其实这个key非常好获取,转发一个公众号的文章到网页客户端,从客户端打开就可以在链接里看到这个...
  • (1)需要用一个企业微信任务宝工具 这个功能是需要在公众号和企业微信接口上进行二次开发的,公众号自身不带这个功能,必须借助第三方工具来实现。目前这个功能刚兴起,提供的服务商不算多,我自己用的最多的是铸...
  • python全栈开发学习 01

    2020-12-11 13:45:35
    它的应用领域从最初的军事科研应用扩展到社会的各个领域,已形成了规模巨大的计算机产业,带动了全球范围的技术进步,由此引发了深刻的社会变革,计算机已遍及一般学校、事业单位,进入寻常百姓家,成为信息社会中...
  • ​ “TO B急不得,它更需要你能沉得住气,慢下来,去打磨好的产品和服务。它从本质看,更像是一个长跑。” ...过去几个月里,SCRM赛道迅速破圈,以服领域乃至资本市场“头号红牌”的身份出现在..
  • 最近有个业务需求是制作一个H5,把用户提交的退费申请发送到企业微信审核中心,让企业内部直接审核,大致看了下开发文档,也比较简单。感叹腾讯企业微信功能太强大了,就是一个企业OA 第一步 创建应用 ...
  • 当用户点击应用跳转到我们设定的URL时,其实并没有带上用户的任何信息,为了获取用户信息,我们需要借助微信提供的OAuth2.0接口。获取用户信息分两步:构造URL获取code根据code获取成员信息一、构造URL获取code企业...
  • 一、前言 1、基于企业微信第三方应用开发API文档,做了一个企业微信开发说明...作为第三方服务商的开发者,在开始开发之前,需要先了解各种接口凭证的差别,以更好的理解第三方的开放体系 1、应用授权的suite_access_to
  • 基于数字化的多元业务是不是房的第增长曲线…… 基于这些地产行业数字化中普遍遇到的问题,腾讯云、腾讯安全、钛媒体、ITValue跨界联合主办了一场特殊的“小饭桌”企业沙龙,20余位地产行业CIO齐聚一堂。...
  • 微信企业号OAuth2接口40029错误解决方案
  • 100个最热门的国人开发开源软件

    千次阅读 2017-03-18 22:33:13
    JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有 ruby、python、php 等动态语言的开发效率...
  • 灵活创建模型控制器,易于扩展开发 配置文件可分离,方便管理 重写的自动验证和完成 简化扩展机制,提升开发速度 API支持完善,方便二次开发 内置WeChat微信开发框架,微信接入更加快捷,简单 使用ORM自动创建表结构...
  •  根据油门和档位模拟出小车行驶的速度,然后结合前几做过的七段数码管内在结构和外在特性,在七段数码管显示显示速度,由并行接口 8255 控制。    2.MFC界面  关于界面,由于之前有些 MFC 编程经验,...
  • 一,三方应用的开发设置 https://work.weixin.qq.com/api/doc#90001/90142/90595 应用主页,可信域名只有三方应用为网页时需要设置 数据回调url,如果你不需要处理用户消息(比如企业成员在企业微信应用里发送...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 879
精华内容 351
关键字:

企微二次开发接口

友情链接: test_mouse.rar