企业微信自定义客户画像

news2024/12/28 3:01:02

OpenAPI基本介绍

微伴助手开放接口对接文档

version: 0.4

注1:微伴助手开放接口已经开放公测,进入微伴后台-应用管理-API接入以获取企业标识(corp_id) ,企业API调用凭据(secret

注2:系统内所有的时间相关字段如果没有特别说明都是以 为单位。

注3:目前open api并未提供测试模式,请研发调用的时候注意,测试完成的时候及时删除测试数据。

阅读说明

微伴助手通过开放接口(Open API)为接入企业提供进一步集成和个性化定制的能力。

所有接口都使用 HTTPS 协议,JSON 数据格式和 UTF-8 编码。

接口使用 GET 和 POST 两种操作,其他类型操作(如 PUT)皆不会用到。

GET 类型操作中可能需要 query参数

说明: query参数是放入url中的参数,例如 API 企业微信营销_企业微信会话存档_私域流量运营-微伴助手官网 在添加 query 参数 access_tokenid 后完整请求为:

企业微信营销_企业微信会话存档_私域流量运营-微伴助手官网

另外,POST 类型操作中除了 query参数 外还可能需要提供 body参数。具体会在相应业务 API 文档中介绍。

请求返回值中总是包含 errcodeerrmsg 字段,称为基础返回字段。用于描述请求的成功状态,其定义如下:


https://weibanzhushou.com/dashboard/side_window#tab=clientCustomerInfoManage

node后端接口:

企业微信点击客户画像时,自动调我们配置的卡片链接对应后端接口,并将code传递给后端接口,后端拿到code。前端使用vue开发多页面应用,其中包含一个order.html页面用于显示在这个自定义卡片的位置。后端通过http协议读取order.html页面,并将code或者自定义一个token以响应头的形式返回给企业微信的卡片处。前端拿到code或token后可以和后端的其他接口交互了。

//微伴测试
const toolsGetPage = async (req, res) => {
  const { code } = req.query
  console.log(req.url)
  console.log(code)
  axios({
    url: 'https://test.xxx.com/weiban/order.html'
  }).then(resHtml => {
    //console.log(resHtml.data)
    // const tempPage = fs.readFileSync(
    //   '/source/banxuezhushou_h5/public/weiban/index.html',
    //   'utf-8'
    // )
    if (code === '666') {
      res.setHeader('access_token', Date.now())
      res.setHeader('code', code)
      res.send(resHtml.data)
      //res.redirect('http://localhost:85/#/h5/index/home/recommend')
    } else {
      res.setHeader('access_token', 'no')
      res.setHeader('code', code)
      res.send(resHtml.data)
    }    
  })

}

order.html:

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta
      name="viewport"
      content="width=device-width,initial-scale=1.0,maximum-scale=1.0, user-scalable=0"
    />
    <meta name="format-detection" content="telephone=no" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
    <title>微伴</title>
    <script>
      var _hmt = _hmt || []
      ;(function () {
        var hm = document.createElement('script')
        hm.src = 'https://hm.baidu.com/hm.js?ba026e086390c108e27594beca3eaf83'
        var s = document.getElementsByTagName('script')[0]
        s.parentNode.insertBefore(hm, s)
      })()
    </script>
    <script>
      var req = new XMLHttpRequest()
      req.open('GET', document.location, false)
      req.send(null)
      var headers = req.getAllResponseHeaders().toLowerCase()
      var tempCode = req.getResponseHeader('code')
      var token = req.getResponseHeader('access_token')
      if (token) {
        localStorage.setItem('token-weiban', token)
      } else {
        localStorage.setItem('token-weiban', '123')
      }
      var code = '456'
      if (tempCode) {
        code = tempCode
      }
      console.log(headers)
    </script>
  </head>
  <body>
    <noscript>
      <strong
        >We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work
        properly without JavaScript enabled. Please enable it to
        continue.</strong
      >
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

.vue文件:

<template>
  <div>
    <div class="m-weiban-wrap">
      <div class="m-weiban-nav-wrap">
        <van-tabs v-model="active" class="m-weiban-tabs">
          <van-tab v-for="item in navList" :title="item.title" :key="item.id">
          </van-tab>
        </van-tabs>
      </div>
      <div class="m-weiban-info">
        <div class="m-weiban-grid-wrap">
          <div class="m-weiban-flex">
            <div class="m-weiban-flex-item">
              <div class="m-weiban-grid-item">
                <div class="m-weiban-grid-item-title">消费订单数</div>
                <div class="m-weiban-grid-item-value">{{ num1 }}</div>
              </div>
            </div>
            <div class="m-weiban-flex-item">
              <div class="m-weiban-grid-item">
                <div class="m-weiban-grid-item-title">消费金额</div>
                <div class="m-weiban-grid-item-value">{{ num2 }}</div>
              </div>
            </div>
            <div class="m-weiban-flex-item">
              <div class="m-weiban-grid-item">
                <div class="m-weiban-grid-item-title">客单数</div>
                <div class="m-weiban-grid-item-value">{{ num3 }}</div>
              </div>
            </div>
            <div class="m-weiban-flex-item">
              <div class="m-weiban-grid-item">
                <div class="m-weiban-grid-item-title">退款金额数</div>
                <div class="m-weiban-grid-item-value">{{ num4 }}</div>
              </div>
            </div>
            <div class="m-weiban-flex-item">
              <div class="m-weiban-grid-item">
                <div class="m-weiban-grid-item-title">退款次数数</div>
                <div class="m-weiban-grid-item-value">{{ num5 }}</div>
              </div>
            </div>
          </div>
        </div>

        <div class="m-weiban-info-list-wrap">
          <div class="m-weiban-info-list">
            <van-list
              v-model="loading"
              :finished="finished"
              :finished-text="emptyText"
              @load="onLoad"
            >
              <div
                v-for="(item, index) in course_list"
                :key="index"
                class="m-weiban-list-item"
              >
                <div class="m-weiban-row">
                  <span class="m-weiban-desc-label">订单编号</span>
                  <span class="m-weiban-desc-value">{{ item.order_id }}</span>
                  <span class="m-weiban-copy" @click="handleCopy(item)"
                    >复制</span
                  >
                </div>
                <div class="m-weiban-row">
                  <span class="m-weiban-desc-label">商品名称</span>
                  <span class="m-weiban-desc-value">{{ item.goods_name }}</span>
                </div>
                <div class="m-weiban-row">
                  <span class="m-weiban-desc-label">渠道名称</span>
                  <span class="m-weiban-desc-value">{{
                    item.channel_name
                  }}</span>
                </div>
                <div class="m-weiban-row">
                  <span class="m-weiban-desc-label">订单状态</span>
                  <span class="m-weiban-desc-value">{{
                    item.order_status
                  }}</span>
                </div>
                <div class="m-weiban-row">
                  <span class="m-weiban-desc-label">创建时间</span>
                  <span class="m-weiban-desc-value">{{
                    item.create_time
                  }}</span>
                </div>
                <div class="m-weiban-row">
                  <span class="m-weiban-desc-label">支付时间</span>
                  <span class="m-weiban-desc-value">{{ item.paid_time }}</span>
                </div>
              </div></van-list
            >

            <!-- <van-skeleton v-if="isLoading" title :row="3"></van-skeleton> -->

            <van-empty
              v-if="loading === false && course_list.length === 0"
              description="暂无数据"
            ></van-empty>
            <!-- <div class="m-weiban-loading-wrap" v-show="loading">
            <van-loading></van-loading>
          </div> -->
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import axios from 'axios'
import { getOrderList } from '@/api/weiban'
import { formatNum } from './config'
import * as clipboard from 'clipboard-polyfill/text'
import './index.css'

export default {
  data() {
    return {
      message: 'hello',
      course_list: [],
      isLoading: false,
      finished: false,
      loading: false,
      emptyText: '没有更多了',
      active: 0,
      navList: [],
      num1: '',
      num2: '',
      num3: '',
      num4: '',
      num5: '',
    }
  },
  mounted() {
    //this.handleGetList()
    this.getNavList()
    this.getNum()
  },
  methods: {
    handleGetList() {
      localStorage.setItem('token-weiban', token)
      localStorage.setItem('code-weiban', code)
      this.isLoading = true

      let that = this

      axios({
        url: `${baseUrl}/card/xxx?code=${code}`,
        method: 'get',
        headers: {
          Authorization: token,
        },
      })
        .then((res) => {
          this.isLoading = false
          res.data.code = 404
          if (res.data.code === 200) {
            let tempData = res.data.data
            let tempList = []
            for (let key in tempData) {
              tempList.push(tempData[key])
            }
            this.course_list = tempList
          } else if (res.data.code === 404) {
            let tempData = {
              0: {
                id: 123,
                order_no:
                  '111',
                order_status: 3,
                created_at: '2022-10-14 15:04:02',
                updated_at: '2022-10-14 15:04:02',
              },

            }
            let tempList = []
            for (let key in tempData) {
              tempList.push(tempData[key])
            }
            this.course_list = tempList
          }
        })
        .catch((err) => {
          console.log(err)
        })
    },
    onLoad() {
      this.loading = true

      getOrderList(code).then((res) => {
        let testData = {
          code: 200,
          msg: '成功',
          data: {
            order_list: [
            ],
          },
        }

        res = { data: testData }
        if (res.data.code === 200) {
          let tempData = res.data.data.order_list
          // let tempList = []
          // for (let key in tempData) {
          //   tempList.push(tempData[key])
          // }
          this.course_list = [...this.course_list, ...tempData]
          this.loading = false
          this.finished = true
          if (this.course_list.length === 0) {
            this.emptyText = ''
          }
        }
      })

      return
      axios({
        url: `${baseUrl}/card/xxx?code=${code}`,
        method: 'get',
        headers: {
          Authorization: token,
        },
      })
        .then((res) => {
          let testData = {
            code: 200,
            msg: '成功',
            data: {
              order_list: [
              ],
            },
          }

          res = { data: testData }
          if (res.data.code === 200) {
            let tempData = res.data.data.order_list
            // let tempList = []
            // for (let key in tempData) {
            //   tempList.push(tempData[key])
            // }
            this.course_list = [...this.course_list, ...tempData]
            this.loading = false
            this.finished = true
            if (this.course_list.length === 0) {
              this.emptyText = ''
            }
          }
        })
        .catch((err) => {
          console.log(err)
        })
    },
    getNavList() {
      this.navList = [
        {
          id: 0,
          title: '抖音',
        },
        {
          id: 1,
          title: '快手',
        },
        {
          id: 2,
          title: '小鹅通',
        },
        {
          id: 3,
          title: '京东',
        },
      ]
    },
    getNum() {
      this.num1 = formatNum(364)
      this.num2 = formatNum(64578)
      this.num3 = formatNum(123)
      this.num4 = formatNum(232)
      this.num5 = formatNum(6)
    },
    handleCopy(item) {
      clipboard.writeText(item.order_id).then(() => {
        this.$toast('复制成功')
      })
    },
  },
}
</script>

<style></style>

后端用到的接口:

http://openapi.weibanzhushou.com/api-8233537

 消费code:

http://openapi.weibanzhushou.com/api-8269970

根据external_user_id查询用户详情:

http://openapi.weibanzhushou.com/api-8269960

 如果想查到客户的手机号,需要提前修改客户的资料,添加用户的手机号,通过扫描添加的客户企业微信那不到用户的手机号,通过手机号添加的客户,企业微信可以拿到用户的手机号。

拿到客户的手机号后,如果数据库里客户的其他信息也是和手机号关联的。就可以去数据库了拿客户的其他信息了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视图相关知识的汇总

重点大纲 描述视图创建&#xff0c;改变视图的定义&#xff0c;删除视图通过视图重新找回数据通过视图插入&#xff0c;更新和删除数据创建和使用inline视图执行Top-N 分析什么是视图&#xff1f; 视图是基于一张表或者另一张视图的逻辑表。 视图本身不包含数据。视图被存储在…

[数据结构]什么是树?什么是二叉树?

作者&#xff1a; 华丞臧. 专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 文章目录一、树1.1 树的概念及结构1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用二…

JavaEE——Http请求和响应,https的加密

请求 报头 里面是一系列键值对&#xff0c;有的是标准定义的&#xff0c;有的是自定义的 典型的有以下几个 Host 代表服务器的主机地址和端口 也就是当我们访问浏览器时&#xff0c;可以知道从哪里获取数据 端口号如果省略就代表是默认值&#xff0c;http是80&#xff0c;h…

c++好用的网站

目录 洛谷www.luogu.com.cn 有道小图灵https://oj.youdao.com/csp 维基https://oi-wiki.org/ 1&#xff0c;洛谷 他的网址是www.luogu.com.cn。 这是一个好用的刷题网站&#xff0c;题库里有大约有2000多道题。 洛谷有题里有csp往年的题。 题库&#xff1a; 有题&#x…

怎么把PDF调方向保存?这几个方法值得收藏

小伙伴们在工作的时候&#xff0c;有时候领导会发PDF文件要你查阅重要内容&#xff0c;但不是每次收到的PDF文件都是无损的&#xff0c;有时候打开后发现里面内容杂乱并且页面方向不一致&#xff0c;这个时候有些小伙伴不知道怎么办&#xff0c;那么我们应该怎么把PDF调方向保存…

基于正交投影的实时三维人体姿态估计

王亦洲课题组 ECCV 2022 入选论文解读&#xff1a;基于正交投影的实时三维人体姿态估计 本文是对发表于计算机视觉领域顶级会议 ECCV 2022的论文 Faster VoxelPose: Real-time 3D Human Pose Estimation by Orthographic Projection 的解读。该论文由北京大学王亦洲课题组与微软…

Beam Failure Detection

微信同步更新欢迎关注同名modem协议笔记 正如上篇所述NR中所有的上下行信道的发送和接收都是基于波束。基站通过对信道质量的测量来动态选择UE和基站之间波束的方向和频率&#xff0c;进而完成通信。NR中无线链路检测可以分为两种&#xff0c;一种是4G中常见的radio link mon…

《Linux》day5--ssh——ssh登录与scp传文件

文章目录ssh登录基本用法配置文件密钥登录执行命令scp传文件基本用法使用scp配置其他服务器的vim和tmuxssh登录 基本用法 远程登录服务器。 ssh userhostname其中&#xff1a; user&#xff1a;是用户名hostname&#xff1a;是IP地址或域名 第一次登录会提示&#xff1a; …

城市道路积水识别监测系统

城市道路积水识别监测系统基于机器视觉分析&#xff0c;燧机城市道路积水识别监测系统实时识别街道路面积水情况&#xff0c;对严重积水时立即报警。城市道路积水识别监测系统对低洼区域进行实时监测&#xff0c;一旦城市道路积水识别监测系统监测到街道路面积水时&#xff0c;…

【附源码】Python计算机毕业设计宿舍管理系统设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【雨夜】一次nacos 导致的 CPU 飙高问题

今天下午突然 出现 测试环境 cpu飙高&#xff0c;干到了 60%&#xff0c;其他项目 响应时间明显变长。。。有点吓人&#xff0c;不想背锅 项目背景 出问题的项目是 需要连接各个不同nacos 和不同的 namespace 进行对应操作的 一个项目&#xff0c;对nacos的操作都是httpClien…

OSS(minio使用手册)

minio 官方文档地址:MinIO High Performance Object Storage — MinIO Object Storage for Kubernetes 1.本地客户端下载 1.1 docker 版本&#xff1a; docker pull minio/mc docker run minio/mc ls play docker run -it --entrypoint/bin/sh minio/mc (使用mc客户端操作其他…

2022年数维杯国际大学生数学建模挑战赛C题如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病解题过程

2022年数维杯国际大学生数学建模挑战赛 C题 如何利用大脑结构特征和认知行为特征诊断阿尔茨海默病 原题再现&#xff1a; 阿尔茨海默病&#xff08;AD&#xff09;是一种起病隐匿的进行性神经退行性疾病。临床特征为全谱痴呆&#xff0c;包括记忆障碍、失语、流利不畅、失认、…

Qt QJsonObject初始化列表的使用问题

在VS2013Qt5.9.7上&#xff0c;QJsonObject的初始化列表构造函数有BUG QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)注&#xff1a;使用初始化列表前先要开启编译选项Q_COMPILER_INITIALIZER_LISTS 以下代码Debug异常 QJs…

SpringBoot整合tkMapper的版本问题

文章主旨&#xff1a;有问题首先看官网 昨天新建了个Spring Boot工程&#xff0c;版本为2.6.13 想要整合 tk.mapper&#xff0c;就去官网查找依赖&#xff0c;如下&#xff1a; <dependency><groupId>tk.mybatis</groupId><artifactId>mapper</a…

基于sklearn实现LDA主题模型(附实战案例)

目录 LDA主题模型 1.LDA主题模型原理 2.LDA主题模型推演过程 3.sklearn实现LDA主题模型&#xff08;实战&#xff09; 3.1数据集介绍 3.2导入数据 3.3分词处理 3.4文本向量化 3.5构建LDA模型 3.6LDA模型可视化 3.7困惑度 LDA主题模型 1.LDA主题模型原理 其实说到LDA…

web前端大一实训 HTML+CSS+JavaScript王者荣耀(60页) web课程设计网页规划与设计 HTML期末大作业 HTML网页设计结课作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【附源码】计算机毕业设计JAVA房产客户信息管理系统

【附源码】计算机毕业设计JAVA房产客户信息管理系统【附源码】 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#x…

新唐(nuvoton)MCU软件开发指南—环境搭建设置

新唐MCU软件开发指南—环境搭建设置 1. 下载并安装Arm Keil MDK https://www.nuvoton.com/tool-and-software/ide-and-compiler/keil-download/ 2. 申请免费版的Keil License&#xff0c;并激活 https://www.nuvoton.com/tool-and-software/ide-and-compiler/get-keil-mdk-…

Tableau安装详解及密钥申请

文章目录Tableau介绍下载软件申请密钥安装软件❤️ 作者简介&#xff1a;大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生&#xff0c;蓝桥杯国赛二等奖获得者&#x1f41f; 个人主页 &#xff1a;https://blog.csdn.net/qq_52007481⭐ 个人社区&#xff1a;【小鱼干爱…