开启左侧

企微开发- H5运用

[复制链接]
在线会员 9W9 发表于 2022-12-30 15:15:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
因为短期要干企微开辟,可是企微文档有些繁复。过程当中也碰到许多成就,借必须要正在可会见的域名正在企微里面才能够调试。碰到的成就皆只可自己靠猜去向理,借要页里挨断面,alert来调试。。开辟艰难,调试艰难.....
以是写下此文档。给统统的企微开辟职员干个参照。主要用JS-SDK开辟H5使用,合用于创立多个内部群并收收消息等功用开辟。
开辟情况: vite+ vue3 + ts + less
1.SDK引进

1. 需要引进二个sdk文献,正在index.html文献中

<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js "></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
2 . 天生署名

颠末token天生前面。为了宁静思考,开辟者 请勿 将 access_token 前去给前端。需要开辟者保留正在背景。统统会见企业微疑api的恳求由背景倡议需要战后端共同,由天生JS-SDK使用权力署名算法。天生算法参照民间列子https://developer.work.weixin.qq.com/document/path/90506
后端留神:要恳求二次企业微疑交心,别离获得:获得企业的jsapi_ticket战获得使用的jsapi_ticket。
前去字段以下。
  1. {
  2. "code":200,
  3. "msg":"success",
  4.     data:{
  5.     agentId:''// 企微使用的agentId
  6.     appId: '', // 必挖,企业微疑的corpID
  7.     timestamp: , // 必挖,天生署名的时间戳
  8.     nonceStr: '', // 必挖,天生署名的随机串
  9.     signature: '',// 必挖,署名,睹 附录-JS-SDK使用权力署名算法
  10.     }
  11. }
复造代码
2. 企微JS-SDK初初化
  1. // 企微 JSSDK 初初化
  2. export function qywxJssdkInit(params: any) {
  3.   wx.config({
  4.     beta: false,
  5.     debug: false,
  6.     appId: params.appId,
  7.     timestamp: params.timestamp,
  8.     nonceStr: params.nonceStr,
  9.     signature: params.signature,
  10.     jsApiList: ["onMenuShareAppMessage", "onMenuShareWechat"],
  11.   });
  12.   wx.ready(function (err) {
  13.     console.log("微疑sdk根底情况初初化胜利");
  14.     wxReady(params);
  15.   });
  16.   wx.error(function (err) {
  17.     console.log("jWeixin.error:", err);
  18.   });
  19. }
  20. // 企微情况初初化胜利后再挪用,不然权力注进可以失利
  21. // 企微权力注进
  22. function wxReady(config: any) {
  23.   console.log("施行企业微疑初初化操纵!", config);
  24.   wx.agentConfig({
  25.     corpid: config.appId, // 必挖,企业微疑的corpid,必需取目前登录的企业不合
  26.     agentid: config.agentId, // 必挖,企业微疑的使用id (e.g. 1000247)
  27.     timestamp: config.timestamp, // 必挖,天生署名的时间戳
  28.     nonceStr: config.nonceStr, // 必挖,天生署名的随机串
  29.     signature: config.appSignature, // 必挖,署名,睹附录-JS-SDK使用权力署名算法
  30.     jsApiList: [ // 统统用到的企微办法,皆需要正在那里注进权力,不然会没法挪用
  31.       // 必挖
  32.       "openUserProfile",//翻开 用户疑息
  33.       "openEnterpriseChat", //创立 会话
  34.       "openExistedChatWithMsg",// 挨休会话并收收消息
  35.       "updateEnterpriseChat",// 革新会话疑息,改正群成员
  36.       "selectExternalContact",// 挑选内部联系人
  37.       "getContext",// 获得群实质
  38.       "getCurExternalChat",// 获得群id
  39.       "sendChatMessage",// 给目前群收收消息
  40.       "shareToExternalContact",// 分享给内部联系人
  41.       "shareToExternalChat",// 分享实质到内部群
  42.     ],
  43.     success: function (res) {
  44.       console.log("企微使用初初化胜利,相干使用特别API需要正在那以后触收");
  45.     },
  46.     fail: function (err) {
  47.       if (err.errMsg.indexOf("function not exist") > -1) {
  48.         alert("版原太低请升级");
  49.       } else {
  50.         alert(err + JSON.stringify(err));
  51.       }
  52.     },
  53.   });
  54. }
复造代码
3.背景设置-增加受权链交

留神:增加受权,不然会报没有是可托任域名成就。统统交心用到的域名 皆需要加之。第一次增加的时候。需要下载一个文献。让后端把文献搁到域名的根目次下。
企微开辟- H5使用-1.png



企微开辟- H5使用-2.png



4.企微根本功用开辟

需要:满意能够共时创立多个内部群,并收收消息功用
留神:企微端需要革新到最新版原,最佳4.0.0以上,不然有些功用没法使用。如要要使用企微的根本功用,必须要等企微的树立战权力皆注进战设置完毕。以是,页里初初化的时候,需要增加一个1000ms的按时器。不然可以会挪用失利。
1.创立群聊并挨休会话

    创立内部群-必须要正在联系人增加一个内部客户(树立一个牢固的内部联系人,每一个人皆要增加那个内部联系人账号:假设没有是内部群。来失落便止)
       externalUserIds:  ' '  // 牢固账号
    假设要挨休会话,传进chatId群聊Id便可,留神,联系人战内部联系人也是要选挖一个能够轮回屡次创立群聊会话
今朝:安卓没法间接挨休会话,会间接翻开联系人单聊(兼容性成就),PC端战iphone均可以间接创立
  1. /**
  2. *创立 群聊并挨休会话
  3. * 留神:userIds战externalUserIds最少选挖一个。内部群至多2000人;内部群至多500人;
  4. *假设 有微疑联系人,至多40人
  5. * chatId 会话id
  6. * */
  7. export function creatEnterpriseChat(params: any) {
  8. const { groupName, userList } = params;
  9. const userIds = userList.join(";");
  10. return new Promise((resolve) => {
  11. wx.openEnterpriseChat({
  12. userIds, //到场会话的企业成员列表,格局为userid1;userid2;...,用分号离隔。
  13. externalUserIds: "", // 到场会话的内部联系人列表,格局为userId1;userId2;…,用分号离隔。
  14. groupName, // 会话称呼。单聊时该参数传进空字符串""便可。
  15. chatId: "", // 若要翻开已经有会话,需指定此参数。假设是新修会话,chatId必需为空串
  16. success: function (res: any) {
  17. const result = {
  18. ...params,
  19. chatId: res.chatId,
  20. beCreated: true,
  21. };
  22. resolve(result);
  23. },
  24. fail: function (res: any) {
  25. alert(JSON.stringify(res) + " creatEnterpriseChatfail ");
  26. const result = { ...params, beCreated: false };
  27. resolve(result);
  28. if (res.errMsg.indexOf("function not exist") > -1) {
  29. alert("版原太低请升级");
  30. }
  31. },
  32. });
  33. });
复造代码
参照企微开辟文档:https://developer.work.weixin.qq.com/document/path/92525
2.收收群消息(给内部群收消息,只可用那个openExistedChatWithMsg办法)

留神:假设要收收消息,必须要等创立群完后,再收收。不然会挨断创立群聊的功用。脚机端今朝只可撑持收收一条群消息(因为它会主动跳出页里),PC端收多条消息需要用按时器收收。
  1. //翻开 已经有群聊并收收消息
  2. export function sendMessge(id: any, params: any) {
  3. wx.invoke(
  4. "openExistedChatWithMsg",
  5. {
  6. chatId: id, // 群id
  7. msg: {
  8. msgtype: "link",
  9. link: {
  10. title:‘’, // 必须
  11. desc:'', // 必须
  12. url: ‘’, // 必须
  13. },
  14. },
  15. },
  16. function (res: any) {
  17. console.log(res);
  18. }
  19. );
  20. }
复造代码
挪用方法
  1. // 收收消息交心 data: 数据源 len: 创群胜利的数目
  2. const onSendMessage = (data: any, len: Number) => {
  3. for (let i = 0; i < len; i++) {
  4. if (isMobile) { // 鉴别可否是脚机端 脚机端有些版原可撑持这类方法收收多条消息
  5. sendMessge(data[i].chatId, data[i]);
  6. } else { // PC端需要用按时器创立
  7. state.timer = setTimeout(function timer() {
  8. sendMessge(data[i].chatId, data[i]);
  9. }, i * 2000);
  10. }
  11. }
  12. };
复造代码
参照企微开辟文档:https://developer.work.weixin.qq.com/document/path/94549
3.挨保守讯录列表,获得内部企微用户ID
  1. export function openUserList() {
  2. wx.invoke(
  3. "selectExternalContact",
  4. {
  5. filterType: 0, //0暗示展示局部内部联系人列表,1暗示仅展示未曾挑选过的内部联系人。默认值为0;除0取1,其余值不法。正在企业微疑2.4.22及目前版原撑持该参数
  6. },
  7. function (res: any) {
  8. if (res.err_msg == "selectExternalContact:ok") {
  9. const userIds = res.userIds; //前去这次挑选的内部联系人userId列表,数组范例
  10. alert(userIds);
  11. } else {
  12. //毛病处置
  13. }
  14. }
  15. );
  16. }
复造代码
参照企微开辟文档:https://developer.work.weixin.qq.com/document/path/91797
4.获得群id
  1. // 获得群id
  2. export function getCurExternalChat() {
  3. return new Promise((resolve, reject) => {
  4. wx.invoke("getCurExternalChat", {}, function (res) {
  5. if (res.err_msg === "getCurExternalChat:ok") {
  6. resolve(res);
  7. } else {
  8. // 毛病处置
  9. reject(res);
  10. }
  11. });
  12. });
  13. }
复造代码
参照企微开辟文档:https://developer.work.weixin.qq.com/document/path/92095
5.设置网页受权路子

用于获得企微的用户code,颠末code能够获得企微的用户相信疑息。因为token,秘钥皆是正在后端获得。前端建立受权链交后,前去code给后端,由后端颠末code来获得用户疑息便可。
  1. /**
  2. * 获得沉定位的 OAuth 路子
  3. * url 需要沉定背的页里路子 可传可没有传
  4. * @returns {string}
  5. */
  6. export const generateOAuthUrl = (url?: any) => {
  7. const redirectUri = url || window.location.href;
  8. const searchObj = {
  9. appid: Config.APP_ID,
  10. redirect_uri: encodeURIComponent(redirectUri),
  11. response_type: "code",
  12. scope: "snsapi_base",
  13. agentid: import.meta.env.VITE_APP_AGENT_ID,
  14. state: "A",
  15. };
  16. const search = Object.entries(searchObj)
  17. .map((entry) => {
  18. const [key, value] = entry;
  19. return `${key}=${value}`;
  20. })
  21. .join("&");
  22. return `https://open.weixin.qq.com/connect/oauth2/authorize?${search}#wechat_redirect`;
  23. };
  24. /**
  25. * 鉴别目前网页可否需要沉定背
  26. */
  27. export const checkRedirect = async (getUserId: any) => {
  28. const userId = localStorage.getItem("userId");
  29. const unAuth = !userId || userId === "undefined" || userId === "null";
  30. const codeExist = window.location.search.includes("code");
  31. // 鉴别可否需要沉定背
  32. if (!codeExist) {
  33. window.location.replace(generateOAuthUrl());
  34. }
  35. // 鉴别可否需要从头获得 userId
  36. if (unAuth) {
  37. const code = qs.parse(window.location.search.slice(1)).code as string;
  38. const newUserId = await getUserId(code);
  39. localStorage.setItem("userId", newUserId);
  40. }
  41. };
复造代码
参照企微开辟文档:https://developer.work.weixin.qq.com/document/path/91335
6.封闭目前页里窗心(脚机端会主动跳出页里,PC端没有会主动封闭)

留神:脚机端没有需要封闭页里,不然会招致没法施行回调。PC端需要正在统统操纵皆结束后,能够施行封闭窗心。
  1. export function onCloseWindow() {
  2. wx.closeWindow();
  3. }
  4. // 页里界说办法
  5. function closeWindow(time: number) {
  6. if (!isMobile) { // 脚机端没有需要封闭
  7. state.timer = setTimeout(() => {
  8. onCloseWindow();
  9. }, time);
  10. }
  11. }
复造代码
参照企微开辟文档:https://developer.work.weixin.qq.com/document/path/90491
5.调试东西

Windows 版原调试

    把 devtools_resources.pak 搁到企业微疑的装置目次下(复造的文献名,要包管为 devtools_resources.pak),留神装置目次戴有版原号(4.0.1304.400是浏览器内乱核的版原号);
    企微开辟- H5使用-3.png


    封闭企业微疑,从头启用;按快速键 ctrl + alt + shift + D,加入调试情势;正在需要调试的页里上面打左键,面“开辟者东西”,加入调试情势。
    企微开辟- H5使用-4.png


Mac 版原调试

    按下 co妹妹and + shift + control + D 加入调试情势
    企微开辟- H5使用-5.png


    辅佐 -> 开辟调试选项 -> 启开webView元艳检查
    企微开辟- H5使用-6.png


    内乱置浏览器左键 ->反省 元艳
    企微开辟- H5使用-7.png


您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )