更新记录

1.0.1(2025-09-16)

  • 新增web jsapi 分享到微信示例
  • 新增web jsapi 转发到联系人示例

1.0.0(2025-09-16)

小白也能使用 unicloud 开发企业微信自建应用 的插件


平台兼容性

云函数类插件通用教程

使用云函数类插件的前提是:使用HBuilderX 2.9+


🚀 mr-wecom-internal

下载示例项目跑完后,在把改好的配置信息复制到自己项目中

Mr-wecom-internal 是 unicloud 快速接入企业-自建应用-服务端API的云端插件,示例含Web项目客户端使用jssdk调用企业客户端API部分示例。

✅ 解决了服务端通讯的 IP白名单 问题(小程序 && Web)

  • 企微已拦截(第三方运营商IP)阿里和支付宝云的固定出口IP,导致原请求失败
  • 腾讯云固定IP套餐已升级至199/月起

    ✅ 云对象对企业***服务端API请求进行简单封装

  • 简单封装服务端API请求,含客户端请求示例
  • 服务端自动处理请求的 accsecc token 和 jsapi ticket 凭据缓存

    ✅ 云对象封装服务端回调函数验证处理方法,支持自定义逻辑

  • 服务端加解密签名验证方法
  • 消息回调
  • 通讯录同步回调

    ✅ 项目示例中页面写了Web项目使用jssdk调用企微客户端api的相关示例,

  • 客户端签名和jsapi授权示例
  • 客户端扫码登陆和授权登陆示例
  • 客户端选人,支付,获取用户基本信息和敏感信息示例

✅ 📖 更多内容 请导入示例项目查看 示例为vue3,vue2的朋友自己改造下可以正常使用

📖 每项配置参数 详细的 截图文档,小白也能轻松接入(含本地调试方法)

服务端(云对象部分方法示例)

  • setp1 参考 📖 配置文档 完成config.json参数配置
  • setp2 右键云对象,命令行执行打开所在目录 npm install xml2js --save ,安装xml2js模块
  • setp3 重新上传云对象

1-1、云对象封装请求企业***服务端API的示例


/**
 * @ 调用企业***服务端API的云对象的方法示例
 * 
 * @data.params 企业***接口的其他请求参数
 * @data.method 请求类型,GET || POST 不传默认 GET
 * @data.tokenType  不传默认Agent 指服务端api文档中access_token的类型,Agent = 应用的accsess_token || Book = 通讯录的accsess_token
 * @data.action 服务端api文档的 拼接路径
 * 例如,文档的请求地址:https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID
 * 那么,action = "user/simplelist",即"https//****cgi-bin/"  与  "?" 之间的部分
 * 
 * return res = {code:0,msg:''} 中,成功(code=0),失败(code=其他),msg=错误提示
 * 其他errCode,errMsg或err_code,err_msg或errcode,errmsg是企业***返回的,实际业务根据企微文档自行判断
 */
callService: async function(data) {
    // let { action,method,tokenType,params } = data;// 前端传来的参数
    let utilRes = await util.serviceApi({...data})
    // let resule  = utilRes.result //企业***返回的数据
    return utilRes.utilCode==0?{ code:0,msg:'云对象 callService() => succsess',resule:utilRes.result}:{code:1,msg:"云对象执行callService() => fail",utilRes};
},

1-2、客户端页面调用云对象的示例

<script setup>
import { ref , reactive,onMounted } from 'vue';
// 1 - 引入插件的云对象
const internal = uniCloud.importObject('wecom-internal');
// 2 - 申明接收部门列表的变量
const simpleList = ref(null)
// 3 - 调用云对象的方法 参数说明参考插件云对象上面的注释
async function getSimplelist() {
    const res = await internal.callService({
         action:"department/simplelist",
         method:"GET",
         tokenType:"Book",
         params:{} 
    })
    if(res.code == 0)return simpleList.value = res;
    console.log("getSimplelist",res)
}
// 4 - 执行
onMounted(()=>{
    getSimplelist();
 })
 </script>

1-3、服务端通讯录同步的回调示例

/** 
 * backBook 通讯录同步的回调事件,
 * 
 * handleRes.result @object = xml解析后的数据(你要用的数据在这个对象里,详细内容日志表wecom-internal-back)
 * handleRes.backType @string = '插件自定义的回调类型:backBook,通讯录同步的回调',
 */
backBook:async function (data){
    let handleRes = await util.handleCallBack({httpInfo:this.getHttpInfo()})
    if(handleRes.utilCode == 0 ){

        // handleRes.result  = object 里面是本次回调企业***返回的数据,详细内容日志表wecom-internal-back看看
        // 根据handleRes.result的参数进行判断本次回调的事件类型handleRes.result.Event和 handleRes.result.ChangeType或者结合其他参数判断后,

        let { Event,ChangeType } = handleRes.result;

        // ...其他可用的业务判断参数,参考企业***文档https://developer.work.weixin.qq.com/document/path/90970
        // ...其他可用的业务判断参数,参考企业***文档https://developer.work.weixin.qq.com/document/path/90970
        // ...其他可用的业务判断参数,参考企业***文档https://developer.work.weixin.qq.com/document/path/90970

        //----------------------------你自己的业务逻辑开始----------------------------------

        switch(Event){
            case '你的预期值1':
                if(ChangeType == '你的预期值1-1'){
                    // 处理你自己的预期1-1业务逻辑,

                    // 1、直接写unicloud的数据库操作代码如 unicloud.database().collection('collectionName').get()
                    // 2、引入其他云对象,(云函数或云对象内调用)[https://doc.dcloud.net.cn/uniCloud/cloud-obj.html#call-by-cloud] 
                    // 3、写http请求,直接写http请求代码
                    // 4、写vk-router,(方式二)[https://vkdoc.fsq.pub/client/question/question.html#q107]
                }
                // 你的逻辑结束不要return ,保留使用下面的 return success;

                break;
            case '你的预期值2':
                    // 处理你自己的预期2业务逻辑

                    // 1、直接写unicloud的数据库操作代码如 unicloud.database().collection('collectionName').get()
                    // 2、引入其他云对象,(云函数或云对象内调用)[https://doc.dcloud.net.cn/uniCloud/cloud-obj.html#call-by-cloud] 
                    // 3、写http请求,直接写http请求代码
                    // 4、写vk-router,(方式二)[https://vkdoc.fsq.pub/client/question/question.html#q107]

                // 你的逻辑结束不要return ,保留使用下面的 return success;

                break;
            default: break;
        }

        //----------------------------你自己的业务逻辑结束----------------------------------

        return handleRes.success; // 这边不要改动

    }else{
         //出错了看unicloud云对象运行日志
         return {code:1,msg:"backBook-err",backBook:handleRes}
    }
},

客户端(Web项目使用jssdk调用企业***客户端API 页面示例)

  • setp1 项目根目录右键,选择 命令行打开,执行 npm install @wecom/jssdk
  • setp2 页面引入企业**jssdk: import as ww from '@wecom/jssdk';
  • setp3 页面 引入云对象: const internal = uniCloud.importObject('wecom-internal');

2-1、客户端注册jsapi示例

<script setup>

import { ref , reactive,onMounted } from 'vue';
import * as ww from '@wecom/jssdk'; //引入企业***jssdk;
const internal = uniCloud.importObject('wecom-internal'); //引入插件,调用jssdk签名方法要用

// 注册jsapi需要的参数,**ApiList更具你自己需要的填写
const registerConfig = reactive({
    // 1、validUrl :当前页面的 URL,不包含“#”及后面部分,
    validUrl:'https://xxx.com/index.html',
    corpId:"wwad33b3dxxxxx93",//企业id
    agentId:"10xxxxx",//应用id
    jsApiList:["chooseImage","selectEnterpriseContact","scanQRCode","openAppManage","createExternalPayment","refundExternalPayment"],//需要注册的jsapi列表
})

onMounted(()=>{
    // 执行注册(支付的api需要应用的ticket注册api)
    registerAgent()
    // registerCorp();
})

// 定义应用身份注册的方法
async function registerAgent() {
    ww.register({
        corpId: registerConfig.corpId,        // 必填,当前用户企业所属企业ID
        agentId: registerConfig.agentId,                     // 必填,当前应用的AgentID
        jsApiList: registerConfig.jsApiList,        // 必填,需要使用的JSAPI列表,需要什么填什么
        getAgentConfigSignature,          // 必填,根据url生成应用签名的回调函数
        onAgentConfigComplete: (res) => {
            // 执行完成时触发
            // consoleLog.value.unshift({label:"使用应用的Ticket注册api完成的回调",value:res});
        }
    })
}

// 使用应用的ticket,获得的应用签名,用于注册应用的jsapi
async function getAgentConfigSignature() {
    return await internal.getAgentConfigSignature({validUrl:registerConfig.validUrl})
    // 如果要检查返回签名参数,注释上一行,打开下面三行
    // let res = await internal.getAgentConfigSignature({validUrl:registerConfig.validUrl})
    // consoleLog.value.unshift({label:"getAgentConfigSignature 应用签名注册",value:res})
    // return res
}

// 定义企业身份注册的方法
async function registerCorp() {
    ww.register({
        corpId: registerConfig.corpId,        // 必填,当前用户企业所属企业ID
        agentId: registerConfig.agentId,                     // 必填,当前应用的AgentID
        jsApiList: registerConfig.jsApiList,        // 必填,需要使用的JSAPI列表,需要什么填什么
        getConfigSignature,           // 必填,根据url生成企业签名的回调函数
        onConfigComplete: (data) => {
            // 执行完成时触发
            // consoleLog.value.unshift({label:"企业的Ticket注册api完成的回调",value:data})
        },
    })
}

// 使用企业的ticket,获得的企业签名,用于注册企业的jsapi
async function getConfigSignature() {
    return await internal.getCorpConfigSignature({validUrl:registerConfig.validUrl});
    // 如果要检查返回签名参数,注释上一行,打开下面三行
    // let res = await internal.getCorpConfigSignature({validUrl:registerConfig.validUrl})
    // consoleLog.value.unshift({label:"getConfigSignature 企业签名注册",value:res})
    // return res
}

</script>

2-2、支付示例

<view class="glass" @click="createPayment({paymentType:1,description:'收款码收款示例'})" >
    <view class="glass-title" >
        <text>收款码收款 </text>
        <text>( 手机端打开 )</text>
    </view>
</view>

<view class="glass" @click="createPayment({paymentType:0,description:'聊天窗口发起收款示例'})" >
    <view class="glass-title" >
        <text>聊天窗口发起收款 </text>
    </view>
</view>
//项目根目录右键,选择 命令行打开,执行 npm install @wecom/jssdk ,等待下载完成。
<script setup>
import * as ww from '@wecom/jssdk'; //引入企业***jssdk    
const internal = uniCloud.importObject('wecom-internal'); //引入插件,调用jssdk签名方法要用

// 创建支付
function createPayment({paymentType,description}){
    ww.createExternalPayment({
        paymentType:paymentType,//0 = 在聊天中收款 || 1 = 收款码收款
        totalFee: 300,//收款金额单位分
        description: description,//收款描述
        success(res) {
            // consoleLog.value.unshift({label:"创建支付 成功回调",value:res});
        },
        fail(err) {
            // consoleLog.value.unshift({label:"创建支付 失败回调",value:err});
        },
        cancel(can){
            // consoleLog.value.unshift({label:"创建支付 取消回调",value:can});
        }
    })
}
// 发起退款
function refundPayment(){
    ww.refundExternalPayment({
        paymentId: 'xxxx',
        outTradeNo: 'yyyy',
        refundFee: 100,
        refundComment: '7天无理由退货'
    })
}

// 注册jsapi需要的参数,**ApiList更具你自己需要的填写
const registerConfig = reactive({
    validUrl:'https://xxx.com/index.html',
    corpId:"wwad33xxxxx",//企业id
    agentId:"1xxxxx",//应用id
    agentApiList:["createExternalPayment","refundExternalPayment"],//需要注册的应用api列表
})

onMounted(()=>{
    registerAgent(); //注册权限
})

// 定义应用身份注册的方法
async function registerAgent() {
    ww.register({
        corpId: registerConfig.corpId,        // 必填,当前用户企业所属企业ID
        agentId: registerConfig.agentId,                     // 必填,当前应用的AgentID
        jsApiList: registerConfig.agentApiList,         // 必填,需要使用的JSAPI列表,需要什么填什么
        getAgentConfigSignature,          // 必填,根据url生成应用签名的回调函数
        onAgentConfigComplete: (res) => {
            // consoleLog.value.unshift({label:"使用应用的Ticket注册api完成的回调",value:res});
        },

    })
}

// 使用应用的ticket,获得的应用签名,用于注册应用的jsapi
async function getAgentConfigSignature() {
    return await internal.getAgentConfigSignature({validUrl:registerConfig.validUrl});
}   
</script>   

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。