企业微信从自建h5应用=>推送

973 阅读3分钟

企业微信从自建h5应用=>推送

前言

xxxxx

1. 创建企业

官网链接:企业微信 (qq.com)

image.png

image.png

创建成功后,扫码登录管理页面

image.png

2. 创建自建应用

1.进入应用管理

image.png

2.点击创建应用

image.png image.png

3. 应用配置

#1. 点击设置应用主页

#2. 网页网址:如果需要在打开的网页里面携带用户的身份信息,需要构造链接来获取code image.png

官方文档:构造网页授权链接 - 文档 - 企业微信开发者中心 (qq.com)

https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE&agentid=AGENTID#wechat_redirect

REDIRECT_URI:授权后重定向的回调链接地址,请使用urlencode对链接进行处理

CORPID:企业的CorpID

image.png

image.png

image.png

tip: 如果没有企业id,可以去通讯录里设置一下部门

4. 添加可信域名与企业可信ip

image.png

#1 可信域名

image.png

域名输入完成后,点击申请校验域名

image.png

根据提示,将下载的文件放到域名的根目录下(我用的是win+iis部署的)

image.png

#2 可信ip

image.png

不填可信ip,完成不了获取用户信息之类的操作

5. 从进入应用~推送信息(demo)

前端用的vue3,写接口用的node.js

前端路由:

router

import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: '/',
      name: 'home',
      component: ()=>import('@/views/home/index.vue')
    },
  ]
})

export default router

接口:

node

pnpm i aixos
pnpm i express

// 允许跨域
app.use(function (req, res, next) {
  res.header('Access-Control-Allow-Origin', '*') 
  res.header('Access-Control-Allow-Methods', '*')
  res.header('Access-Control-Allow-Headers', '*')
  res.header('Access-Control-Allow-Credentials', true)
  next()
})

5.1 获取code

应用配置-网页网址填写好之后,选择了始终进入主页,点击工作台里的应用,就可以跳转到准备好的前端页面,在该页面,我们就能获取到code

官方文档:构造网页授权链接 - 文档 - 企业微信开发者中心 (qq.com)

@/views/home/index.vue

<template>
  code: {{ query?.code }} 
</template>

<script setup>
import { onMounted, ref } from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const query = ref();
onMounted(() => {
  query.value = route.query;
});


</script>

<style scoped>
button {
  margin: 10px;
  height: 30px;
}
</style>

5.2 获取accessToken

获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。

官方文档:获取access_token - 文档 - 企业微信开发者中心 (qq.com)

CORPID 我的企业 => 企业信息 => 企业id

CORPSECRET

image.png

接口代码

// corpid 我的企业 => 企业信息 => 企业id
const CORPID = 'wwd-------946'
const CORPSECRET = 'nj7WPBsRQ---------2Qlwmn2aBWM'

// 获取accessToken
app.get('/qywx/getAccessToken', async (req, res) => {
  try {
    const response = await axios.get(
      `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${CORPID}&corpsecret=${CORPSECRET}`
    )
    if (response.data.errcode === 0) {
      // 成功获取到access_token
      res.json({
        success: true,
        accessToken: response.data.access_token,
      })
    } else {
      // 处理错误情况
      res.status(500).json({
        success: false,
        message: `Failed to get access token: ${response.data.errmsg}`,
      })
    }
  } catch (error) {
    console.error(error)
    res.status(500).json({
      success: false,
      message: 'An error occurred while fetching access token',
    })
  }
})

5.3 获取访问用户身份

5.4 推送消息(全体)

官方文档:发送应用消息 - 文档 - 企业微信开发者中心 (qq.com)

这边就发一个最简单的全体的文字消息

app.use(express.json()); // post需要的设置
// 发送文本消息的接口
app.post('/qywx/sendTextMessage', async (req, res) => {
  try {
    // 从请求体中获取参数
    console.log(req.body);
    console.log(1111111111111111111111);
    const { touser, content,accessToken, } = req.body
    console.log('accessToken', accessToken, 'touser', touser, 'content', content);

    // 构建请求体
    const requestBody = { 
      touser: touser || '@all', //指定接收消息的成员。 
      toparty: '@all',
      totag: '@all',
      msgtype: 'text',
      agentid: 1000002, // 应用详情里获得
      text: {
        content: content,// 推送的消息
      },
      safe: 0,
      enable_id_trans: 0,
      enable_duplicate_check: 0,
      duplicate_check_interval: 1800,
    }

    // 发送POST请求到企业微信API
    const response = await axios.post(
      `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accessToken}`,
      requestBody
    )

    // 检查响应状态
    if (response.data.errcode === 0) {
      res.json({ success: true, message: '消息发送成功' })
    } else {
      res.status(500).json({ success: false, error: response.data.errmsg })
    }
  } catch (error) {
    console.error(error)
    res.json({ success: false, error })
  }
})

vue3

<script setup>
import axios from 'axios';
import { onMounted, ref } from 'vue';
import { useRoute } from 'vue-router';

const route = useRoute();
const query = ref();// 参数

onMounted(() => {
  query.value = route.query;
});

const accessToken = ref();
const userInfo = ref();

// 获取accessToken
const getAccessTokenFn = async () => {
  const res = await axios.get('http://xxx/qywx/getAccessToken');
  console.log(res.data);
  accessToken.value = res.data.accessToken;
};

// 根据code/access_token获取用户身份
const getUserInfoFn = async () => {
  const res = await axios.get('http://xxx/qywx/getUserInfo', {
    params: {
      access_token: accessToken.value,
      code: query.value.code,
    },
  });
  console.log(res);
  userInfo.value = res.data.userInfo.user_ticket;
};

// 发送消息
const sendMsgFn = async (val) => {
  const res = await axios.post('http://xxx/qywx/sendTextMessage', {
    accessToken: accessToken.value,
    touser: val,
    content: 'hello',
  });
  console.log(res);
};
</script>