Skip to content

WeCom MiniApp SKILL (wecom-miniapp)

企业微信小程序接入 SKILL:覆盖小程序登录鉴权(wx.qy.login + code2Session)、55+ 客户端 API(通讯录/客户联系/会话/NFC/分享/直播/会议/日程/文档/微盘等)、开发指南。 与 wecom-jssdk 为并列关系:JS-SDK 面向 H5 网页应用,小程序 API 面向微信小程序。


1. Prerequisites

1.1 小程序关联企业微信

  1. 企业微信管理后台 → 应用管理 → 小程序 → 关联小程序
  2. 填写小程序 AppID 完成关联
  3. 设置小程序的可见范围

1.2 开发环境

  • 开发者工具:微信开发者工具 + 企业微信插件
  • npm 包:无需额外安装,wx.qy 全局可用
  • 调试:可在企业微信客户端中打开小程序调试面板

1.3 与 JS-SDK 的区别

维度JS-SDK (wecom-jssdk)小程序 (wecom-miniapp)
运行环境企业微信内嵌 H5 页面微信小程序 (关联企业微信)
SDK 引入npm/CDN @wecom/jssdk全局 wx.qy
鉴权方式jsapi_ticket + SHA1 签名wx.qy.login + code2Session
全局对象ww (新版) / wx (旧版)wx.qy
适用场景网页应用小程序应用

2. Core Concepts

2.1 登录流程

小程序端                                    服务端
┌───────────┐                           ┌──────────────┐
│ wx.qy.login()                         │              │
│ → 获得 code  ──────── code ──────────→ │ code2Session │
│                                       │ → session_key │
│                                       │ → userid      │
│ ← session_key + userid ←───────────── │ → corpid      │
│                                       │              │
│ wx.qy.checkSession()                  │              │
│ → 检查登录态是否过期                     │              │
└───────────┘                           └──────────────┘

2.2 API 分类

前缀权限要求典型 API
wx.qy.*企业微信专有login, getContext, selectExternalContact
wx.*微信通用getSystemInfo, navigateTo

3. API Quick Reference

3.1 登录

#API类型说明
L1wx.qy.login客户端获取登录 code
L2code2Session服务端code 换取 session
L3wx.qy.checkSession客户端检查登录态

3.2 基础接口

#API说明
B1wx.qy.getContext获取上下文(entry 场景)
B2wx.qy.canIUse检查 API 可用性
B3wx.qy.getSystemInfo获取系统信息

3.3 企业通讯录

#API说明
U1wx.qy.getEnterpriseUserInfo获取企业用户信息
U2wx.qy.selectEnterpriseContact选择通讯录成员
U3wx.qy.openUserProfile打开个人资料页
U4wx.qy.getAvatar获取头像
U5wx.qy.getMobile获取手机号
U6wx.qy.getEmail获取邮箱
U7wx.qy.getQrCode获取二维码

3.4 客户联系

#API说明
C1wx.qy.selectExternalContact选择外部联系人
C2wx.qy.getCurExternalContact获取当前外部联系人
C3wx.qy.getCurExternalChat获取当前客户群
C4wx.qy.shareToExternalContact分享到外部联系人
C5wx.qy.shareToExternalChat分享到客户群
C6wx.qy.navigateToAddCustomer跳转添加客户
C7wx.qy.shareToExternalMoments分享到客户朋友圈

3.5 会话

#API说明
S1wx.qy.openEnterpriseChat打开会话
S2wx.qy.updateEnterpriseChat变更群成员
S3wx.qy.sendChatMessage发送消息
S4wx.qy.createCorpGroupChat创建企业互联群

3.6 NFC

#API说明
N1wx.qy.getNFCReaderState获取 NFC 状态
N2wx.qy.startNFCReader开始 NFC 读取
N3wx.qy.stopNFCReader停止 NFC 读取
N4onNFCReadMessageNFC 读取消息回调

4. API Details

L1. wx.qy.login — 登录

javascript
wx.qy.login({
    success(res) {
        const code = res.code  // 登录 code,发送到服务端换取 session
        wx.request({
            url: 'https://your-server.com/api/login',
            data: { code },
            success(resp) {
                // resp.data = { userid, session_key, corpid }
            },
        })
    },
})

L2. code2Session — 服务端

GET https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=ACCESS_TOKEN&js_code=CODE&grant_type=authorization_code

返回参数

参数类型说明
useridstring成员 userid
session_keystring会话密钥
corpidstring企业 ID

B1. wx.qy.getContext — 获取上下文

javascript
wx.qy.getContext({
    success(res) {
        console.log(res.entry)        // 'normal' | 'contact_profile' | 'single_chat_tools' | ...
        console.log(res.shareTicket)  // 如果从分享进入
    },
})

C2. wx.qy.getCurExternalContact — 获取当前外部联系人

javascript
wx.qy.getCurExternalContact({
    success(res) {
        console.log(res.userId)  // 外部联系人 external_userid
    },
})

U2. wx.qy.selectEnterpriseContact — 选择通讯录成员

javascript
wx.qy.selectEnterpriseContact({
    fromDepartmentId: 0,
    mode: 'multi',
    type: ['user', 'department'],
    success(res) {
        console.log(res.result.userList)
        console.log(res.result.departmentList)
    },
})

5. Code Templates

5.1 小程序端 — 完整登录 + 上下文判断

javascript
// app.js
App({
    async onLaunch() {
        // 1. 检查登录态
        try {
            await new Promise((resolve, reject) => {
                wx.qy.checkSession({ success: resolve, fail: reject })
            })
        } catch {
            // 登录态过期,重新登录
            await this.login()
        }

        // 2. 判断入口场景
        wx.qy.getContext({
            success(res) {
                console.log('Entry:', res.entry)
                if (res.entry === 'single_chat_tools') {
                    // 聊天工具栏入口
                    wx.qy.getCurExternalContact({
                        success(r) { console.log('External user:', r.userId) },
                    })
                }
            },
        })
    },

    login() {
        return new Promise((resolve, reject) => {
            wx.qy.login({
                success(res) {
                    wx.request({
                        url: 'https://your-server.com/api/login',
                        method: 'POST',
                        data: { code: res.code },
                        success(resp) {
                            wx.setStorageSync('session', resp.data)
                            resolve(resp.data)
                        },
                        fail: reject,
                    })
                },
                fail: reject,
            })
        })
    },
})

5.2 Python — 服务端 code2Session

python
"""WeCom MiniApp Session Service"""
from wecom_core import WeComClient


class MiniAppService:
    def __init__(self, client: WeComClient):
        self.client = client

    def code2session(self, js_code: str) -> dict:
        """L2: code 换取 session"""
        return self.client.get(
            "/miniprogram/jscode2session",
            params={"js_code": js_code, "grant_type": "authorization_code"},
        )

5.3 Java 示例

java
public class WecomMiniappService {
    private final WeComClient client;

    public WecomMiniappService(WeComClient client) {
        this.client = client;
    }

    /**
     * 使用示例:调用 wecom-miniapp 相关 API
     * 请参考本 SKILL 的 API 速查表选择具体接口
     */
    public JsonObject callApi(String path, JsonObject params) throws Exception {
        return client.post(path, params);
    }

    // 更多方法请参考上方 API 详细说明章节,每个接口对应一个方法
    // 关键注意事项请查阅「踩坑指南」章节
}

依赖 (Maven):

xml
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

5.4 PHP 示例

php
<?php
class WecomMiniappService
{
    private WeComClient $client;

    public function __construct(WeComClient $client) { $this->client = $client; }

    /**
     * 使用示例:调用 wecom-miniapp 相关 API
     * 请参考本 SKILL 的 API 速查表选择具体接口
     */
    public function callApi(string $path, array $params = []): array
    {
        return $this->client->post($path, $params);
    }

    // 更多方法请参考上方 API 详细说明章节
    // 关键注意事项请查阅「踩坑指南」章节
}

依赖 (Composer):

bash
composer require guzzlehttp/guzzle

6. Gotcha Guide

G1. wx.qy vs wx

wx.qy 是企业微信专有 API 命名空间。普通微信小程序 API 仍用 wx。两者不冲突。

G2. 小程序必须关联企业微信

在企业微信管理后台关联小程序后,小程序内才能使用 wx.qy.* API。

G3. getCurExternalContact 入口限制

与 JS-SDK 相同,getCurExternalContact 仅在聊天工具栏/联系人详情等特定入口有效。

G4. code 只能使用一次

wx.qy.login 获取的 code 只能调用一次 code2Session,不能重复使用。

G5. 不要在前端存储 session_key

session_key 是敏感信息,应该只存储在服务端。前端只应持有自定义登录态标识。

G6. canIUse 判断兼容性

不同版本的企业微信客户端支持的 API 不同。在调用新 API 前,用 wx.qy.canIUse('apiName') 判断兼容性。


7. References

doc_id 范围说明
16055-16057登录鉴权
16058-34455基础接口
16062-16574通讯录
16061-31847客户联系
16064-29849会话
16077-16080NFC
13409-19704开发指南

依赖 SKILLwecom-core(服务端 code2Session 需要 access_token)

Released under the Apache 2.0 License.