夜猫子的知识栈 夜猫子的知识栈
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

夜猫子

前端练习生
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《Web Api》
    • 《ES6教程》
    • 《Vue》
    • 《React》
    • 《TypeScript》
    • 《Git》
    • 《Uniapp》
    • 小程序笔记
    • 《Electron》
    • JS设计模式总结
  • 《前端架构》

    • 《微前端》
    • 《权限控制》
    • monorepo
  • 全栈项目

    • 任务管理日历
    • 无代码平台
    • 图书管理系统
  • HTML
  • CSS
  • Nodejs
  • Midway
  • Nest
  • MySql
  • 其他
  • 技术文档
  • GitHub技巧
  • 博客搭建
  • Ajax
  • Vite
  • Vitest
  • Nuxt
  • UI库文章
  • Docker
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 封装路由跳转
  • 调用微信小程序位置插件
  • Uniapp请求的ts封装
  • I18国际化
  • uniapp路径与base64互相转化
  • 使用webview渲染html字符串
  • 移动端IOS安全区兼容
  • H5调用微信jssdk
    • 准备工作
    • 开发
      • 引入sdk
      • 获取签名信息
      • 初始化
      • 使用
      • 封装
  • 《Uniapp》笔记
夜猫子
2025-09-28
目录

H5调用微信jssdk

# 准备工作

1.网站需要已备案

2.需要认证企业公众号

3.公众号绑定安全域名并授权对应的权限(如扫码)

# 开发

以微信扫一扫功能为例

# 引入sdk

可以通过 meta 或者 npm 引入

 <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
1

或

npm i weixin-js-sdk
1

# 获取签名信息

签名获取流程:

  1. 前端请求签名
    • 向后端发送请求获取签名信息
    • 通常需要传递当前页面URL作为参数(这里有个坑,ios 必须要使用第一次进入时的 url)
  2. 后端生成签名
    • 使用微信公众号的 appid 和 appsecret 获取 access_token
    • 通过 access_token 获取 jsapi_ticket
    • 结合时间戳、随机字符串、URL生成签名
  3. 返回给前端使用

# 初始化

基础示例

// 获取签名的通用方法
async function getWxConfig() {
  try {
    // 获取当前页面URL(需要去除hash部分),为了处理ios的问题可以在页面初始化时记录下当前 url 比如记录到 entryUrl 中
    const url = window.entryUrl||location.href.split('#')[0];
    
    // 请求后端获取签名配置
    const response = await fetch(`/api/wechat/signature?url=${encodeURIComponent(url)}`);
    const config = await response.json();
    
    // 配置微信JS-SDK
    wx.config({
      debug: false,
      appId: config.appId,
      timestamp: config.timestamp,
      nonceStr: config.nonceStr,
      signature: config.signature,
      jsApiList: [
        'updateAppMessageShareData',
        'updateTimelineShareData'
        // 根据需要添加其他接口
      ]
    });
    
    wx.ready(() => {
      console.log('微信JS-SDK配置成功');
      // 在这里调用API
    });
    
    wx.error((res) => {
      console.error('微信JS-SDK配置失败:', res);
    });
    
  } catch (error) {
    console.error('获取微信签名失败:', error);
  }
}

// 调用方法
getWxConfig();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 使用

// 获取签名并调用扫一扫功能
async function initWxScan() {
  try {
    // 先获取微信配置
    await getWxConfig();
    
    // 监听微信SDK准备就绪
    wx.ready(() => {
      console.log('微信JS-SDK配置成功,可以调用API');
      
      // 调用扫一扫功能
      scanQRCode();
    });
    
  } catch (error) {
    console.error('初始化微信SDK失败:', error);
  }
}

// 扫一扫功能
function scanQRCode() {
  wx.scanQRCode({
    needResult: 1, // 0表示直接返回扫描结果,1表示显示扫描结果页面
    desc: 'scanQRCode',
    success: function (res) {
      // 扫描成功的回调
      const result = res.resultStr; // 扫描结果
      console.log('扫描结果:', result);
      
      // 处理扫描结果
      handleScanResult(result);
    },
    fail: function (error) {
      console.error('扫描失败:', error);
      // 可以根据错误码处理不同情况
      if (error.errMsg.includes('cancel')) {
        console.log('用户取消了扫描');
      }
    },
    complete: function () {
      console.log('扫描操作完成');
    }
  });
}

// 处理扫描结果
function handleScanResult(result) {
  // 根据业务需求处理扫描结果
  alert('扫描结果: ' + result);
  
  // 示例:如果是URL则跳转
  if (result.startsWith('http')) {
    if (confirm('检测到链接,是否打开?')) {
      window.location.href = result;
    }
  }
}

// 调用初始化
initWxScan();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

# 封装

class WechatSDKManager {
  constructor() {
    this.isReady = false;
  }
  
  // 初始化微信SDK
  async init() {
    try {
      const url = window.entryUrl||location.href.split('#')[0];
      const response = await fetch(`/api/wechat/signature?url=${encodeURIComponent(url)}`);
      const config = await response.json();
      
      return new Promise((resolve, reject) => {
        wx.config({
          debug: false,
          appId: config.appId,
          timestamp: config.timestamp,
          nonceStr: config.nonceStr,
          signature: config.signature,
          jsApiList: [
            'scanQRCode',
            'chooseImage',
            'uploadImage'
            // 根据需要添加更多接口
          ]
        });
        
        wx.ready(() => {
          this.isReady = true;
          console.log('微信JS-SDK准备就绪');
          resolve();
        });
        
        wx.error((res) => {
          console.error('微信JS-SDK配置失败:', res);
          reject(new Error(res.errMsg));
        });
      });
    } catch (error) {
      throw new Error('初始化微信SDK失败: ' + error.message);
    }
  }
  
  // 调用扫一扫
  scanQRCode(options = {}) {
    return new Promise((resolve, reject) => {
      if (!this.isReady) {
        reject(new Error('微信SDK尚未准备好'));
        return;
      }
      
      wx.scanQRCode({
        needResult: options.needResult !== undefined ? options.needResult : 1,
        scanType: options.scanType || ["qrCode", "barCode"],
        success: (res) => {
          resolve(res.resultStr);
        },
        fail: (error) => {
          reject(error);
        }
      });
    });
  }
}

// 使用示例
const wechatManager = new WechatSDKManager();

function isIOS() {
  return /iPhone|iPad|iPod/i.test(navigator.userAgent)
}
// 页面加载后初始化
document.addEventListener('DOMContentLoaded', async () => {
  try {
    if (isIOS()) {
      if (!window.entryUrl) {
        window.entryUrl = location.href.split('#')[0]
      }
    }
    await wechatManager.init()
    console.log('微信SDK初始化完成')
  } catch (error) {
    console.error('微信SDK初始化失败:', error)
  }
})

// 点击按钮调用扫一扫
document.getElementById('scanBtn').addEventListener('click', async () => {
  try {
    const result = await wechatManager.scanQRCode({
      needResult: 1,
      scanType: ["qrCode"]
    });
    
    console.log('扫描结果:', result);
    // 处理扫描结果
    handleScanResult(result);
  } catch (error) {
    console.error('扫描失败:', error);
    if (error.errMsg && !error.errMsg.includes('cancel')) {
      alert('扫描失败,请重试');
    }
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
编辑 (opens new window)
上次更新: 2025/10/14 17:44:08
移动端IOS安全区兼容

← 移动端IOS安全区兼容

最近更新
01
VueVirtualScroller
09-19
02
如何调试 Nest 项目
03-10
03
IoC 解决了什么痛点问题?
03-10
更多文章>
Copyright © 2019-2025 Study | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式