# PC 小程序插件接入指南 Beta

# 一、功能介绍

PC 小程序插件,是微信团队开发的支持外部桌面应用运行微信小程序的能力。用户不需安装或登录 PC 微信客户端,即可在开发者的桌面应用内通过微信身份登录直接唤起小程序。当前仅支持 64 位 Windows 版本。

QQ 桌面端运行 PC 小程序的体验

# 二、准备工作

  • 申请开通「PC 小程序插件」能力:开发者需前往 微信开发者平台 绑定网站应用后,前往「网站应用 - 开放能力 - PC 小程序插件」申请开通此能力,详细操作步骤可查看 申请 PC 小程序插件
  • 开发环境要求:Windows 操作系统,且已安装 PC 小程序插件版,拥有有效的网站应用 AppID 和 AppSecret。

# 三、名词解释

  1. 宿主应用:要接入 OpenSDK 和 PC 小程序插件的微信外桌面应用。
  2. OpenSDK:本文用到的 OpenSDK 特指「网站应用 OpenSDK」。
  3. PC 小程序插件:为用户提供在宿主应用中使用 PC 小程序的能力。

# 四、初始化

首先通过文末的链接下载最新版 PC 小程序插件压缩包。先校验 md5,再解压。注意:压缩包仅包含「PC 小程序插件」,不包含「网站应用 OpenSDK」,请自行接入。

开发阶段主要关注 includeprotohost 目录中文件:

  • 动态库:wmpf_host_export_x64.dll
  • protobuf 定义:wmpf_host.proto
  • 头文件:wmpf_host_interface.h

初始化主要步骤:

  1. 调用 LoadLibrary() 加载 wmpf_host_export_x64.dll
  2. 调用 GetProcAddress(),获取函数指针
  3. 调用 GetBrowsingService,获得 IBrowsingService 实例
  4. 调用 IBrowsingService::InitilizeBrowsingCore 初始化
  5. 获得 IAppletManagerV3(打开/关闭小程序)
  6. 获得 IILinkAuthManager(登录态管理)

# 五、鉴权

你的应用需要接入 网站应用 OpenSDK,以便向用户申请「使用小程序」的授权。

# 1. OpenSDK 授权

通常,你的应用接入 网站应用 OpenSDK 以便实现「微信授权登录」,所需权限(scope)是 snsapi_login。为了使用小程序插件,需额外申请 snsapi_runtime_pcsdk

如同时申请多个权限,以英文半角逗号分割,例如:snsapi_login,snsapi_runtime_pcsdk

# 2. 后台调用 /sns/pcsdk/login

POST https://api.weixin.qq.com/sns/pcsdk/login?access_token=ACCESS_TOKEN

返回 login_buffer 后下发给客户端。

# 3. 客户端调用 IILinkAuthManager::ThirdAppLogin 完成授权

# 4. 检查登录态

每次进程冷启动后,首先调用 IILinkAuthManager::GetUserInfo()

IlinkLoginStatus 说明
kIlinkLoginSuccess 登录成功,可直接打开小程序
kIlinkRequireManualLogin 无登录态,需重新获取 login_buffer
kIlinkRequireAutoLogin 需调用 AutoLogin() 确认

# 5. 监听 SetSessionTimeoutCallback 处理登录态过期

# 六、打开小程序(小游戏)

前置条件:开通 安全鉴权模式,配置 AES256_GCM 密钥。加密流程需在后台进行。

# 1. 加密启动参数(Node.js 示例)

const crypto = require("crypto");

function encode(req, _appid, aes_key) {
  const timestamp = Math.floor(Date.now() / 1000);
  const nonce = crypto.randomBytes(16).toString("base64").replace(/=/g, "");
  const reqex = { _n: nonce, _appid, _timestamp: timestamp };
  const real_req = Object.assign({}, reqex, req);
  const plaintext = JSON.stringify(real_req);
  const aad = `jm_76zerw3f0fxs|${_appid}|${timestamp}|${aes_key.Sn}`;
  const real_key = Buffer.from(aes_key.Key, "base64");
  const real_iv = crypto.randomBytes(12);
  const real_aad = Buffer.from(aad, "utf-8");
  const real_plaintext = Buffer.from(plaintext, "utf-8");
  const cipher = crypto.createCipheriv("aes-256-gcm", real_key, real_iv);
  cipher.setAAD(real_aad);
  const real_ciphertext = Buffer.concat([cipher.update(real_plaintext), cipher.final()]);
  const real_authTag = cipher.getAuthTag();
  return {
    iv: real_iv.toString("base64"),
    data: real_ciphertext.toString("base64"),
    authtag: real_authTag.toString("base64"),
    timestamp,
  };
}

# 2. 启动小程序

调用 IAppletManagerV3::LaunchApplet(),传入加密参数构建 LaunchConfig protobuf。

# 七、问题与反馈

可前往 PC 小程序社区专区 咨询。

# 八、下载