更新记录
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>