微信 jssdk 逻辑在 vue 中的运用

本文介绍在Vue项目中如何封装和使用微信JSSDK,通过实例演示了初始化配置、分享接口的封装及在路由守卫中的应用,以实现SPA应用中的微信分享功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信 jssdk 在 vue 中的简单使用

import wx from 'weixin-js-sdk';

wx.config({
  debug: true,
  appId: '',
  timestamp: ,
  nonceStr: '',
  signature: '',
  jsApiList: []
});

wx.ready(() => {
  // do something...
});

wx.error((err) => {
  // do something...
});

以上是微信官方给出的示例代码,但是对于实际项目使用,还需要进一步对代码进行封装。本文基于 vue 进行示范,其余类框架同理。

在微信公众平台的官方文档中已经指出,由于安全性考虑,需要将签名逻辑放在后端处理,所以签名原理不在此赘述,主要讲讲如何使用后端返回后的签名调用 jssdk。在逻辑层面,由于 wx.config 方法是调用任何接口前所必须的,所以我们可以尽可能将其抽离出来单独放置。

# utils/
.
├── common.js            # 通用函数
└── lib
    └── wechat           # 微信相关代码
        ├── auth         # 微信用户登陆获取信息相关代码
        │   ├── auth.js
        │   └── index.js
        ├── config       # jssdk 初始化相关代码
        │   └── index.js
        ├── helper.js    # 微信相关操作
        └── share        # 分享接口相关代码
            └── index.js
import sdk from 'weixin-js-sdk';

export function initSdk({ appid, timestamp, noncestr, signature, jsApiList }) { // 从后端获取
  sdk.config({
    debug: process.env.VUE_APP_ENV !== 'production',
    appId: appid,
    timestamp: timestamp,
    nonceStr: noncestr,
    signature: signature,
    jsApiList: jsApiList
  });
}

这样就可以完成对 jssdk 的初始化,之后可以进行分享接口的初始化。最初的时候我想分享接口既然是可能对应每一个 url 页面(SPA 应用中的 view),那么就应该在 view 中使用 mixin 混入来书写,所以产生了第一版实现。

// example.vue
export default {
  name: 'example',

  wechatShareConfig() {
    return {
      title: 'example',
      desc: 'example desc',
      imgUrl: 'http://xxx/example.png',
      link: window.location.href.split('#')[0]
    };
  }
}
// wechatMixin.js
import { share } from '@/utils/lib/wechat/share';

// 获取 wechat 分享接口配置
function getWechatShareConfig(vm) {
  const { wechatShareConfig } = vm.$options;
  if (wechatShareConfig) {
    return typeof wechatShareConfig === 'function'
      ? wechatShareConfig.call(vm)
      : wechatShareConfig;
  }
}

const wechatShareMixin = {
  created() {
    const wechatShareConfig = getWechatShareConfig(this);
    if (wechatShareConfig) {
      share({ ...wechatShareConfig });
    }
  }
};

export default wechatShareMixin;
// utils/lib/wechat/share
import { getTicket } from '@/utils/lib/wechat/helper'; // 签名接口
import { initSdk } from '@/utils/lib/wechat/config';
import sdk from 'weixin-js-sdk';

// 接口清单
const JS_API_LIST = ['onMenuShareAppMessage', 'onMenuShareTimeline'];

// 消息分享
function onMenuShareAppMessage(config) {
  const { title, desc, link, imgUrl } = config;
  sdk.onMenuShareAppMessage({ title, desc, link, imgUrl });
}

// 朋友圈分享
function onMenuShareTimeline(config) {
  const { title, link, imgUrl } = config;
  sdk.onMenuShareTimeline({ title, link, imgUrl });
}

export function share(wechatShareConfig) {
  if (!wechatShareConfig.link) return false;

  // 签名验证
  getTicket(wechatShareConfig.link).then(res => {
    // 初始化 `jssdk`
    initSdk({
      appid: res.appid,
      timestamp: res.timestamp,
      noncestr: res.noncestr,
      signature: res.signature,
      jsApiList: JS_API_LIST
    });

    sdk.ready(() => {
      // 初始化目标接口
      onMenuShareAppMessage(wechatShareConfig);
      onMenuShareTimeline(wechatShareConfig);
    });
  });
}

写完之后乍一看似乎没什么毛病,但是每个 view 文件夹下的 .vue 都有一份微信配置显得很是臃肿,所以第二版实现则是将 jssdk 初始化放在 vue-routerbeforeEach 钩子中进行,这样可以实现分享配置的统一配置,更加直观一些。

// router.js

//...
routes: [
  {
    path: '/',
    component: Example,
    meta: {
      wechat: {
        share: {
          title: 'example',
          desc: 'example desc',
          imgUrl: 'https://xxx/example.png'
        }
      }
    }
  }
]
//...

// 初始化分享接口
function initWechatShare (config) {
  if (config) {
    share(config);
  }
}

router.beforeEach((to, from, next) => {
  const { shareConfig } = to.meta && to.meta.wechat;
  const link = window.location.href;

  if (!shareConfig) next();

  initWechatShare({ ...shareConfig, link });
  switchTitle(shareConfig.title); // 切换标题
  next();
});

这样一来,会显得 .vue 清爽很多,不会有太多业务逻辑之外的代码。

### 集成微信JS-SDK 来实现支付功能涉及多个方面的工作,括但不限于服务器端的支持以及前端的具体实现。 #### 准备工作 为了能够正常使用微信 JS-SDK 的支付能力,首先需要确保已经在微信公众平台上完成了必要的准备工作。这主要括登录微信公众平台并进入“公众号设置”的“功能设置”,在此处填写用于调用微信 JS 接口的安全域名[^2]。需要注意的是,只有经过认证的服务号才具备发起微信支付的能力。 #### 获取支付参数 当准备就绪之后,在实际开发过程中,客户端(即 Vue 应用)通常会向自己的服务器发送请求来获取支付所需的各项参数。这些参数由服务器通过调用微信提供的统一订单 API 获得,并返回给前端以便后续处理。此过程中的具体字段可能含 `appId`、`timeStamp`、`nonceStr`、`package` 和 `signType` 等信息,还有最重要的 `paySign` —— 它是基于上述其他几个参数按照特定规则计算出来的签名字符串[^1]。 #### 前端代码示例 下面是一个简单的例子展示了如何利用微信 JS-SDK 发起一次支付操作: ```javascript import { onMounted } from 'vue'; // 假设这里有一个函数可以从后端获取到支付所需的数据 async function getPayParams() { const response = await fetch('/api/getWeChatPayParameters'); return await response.json(); } export default { setup() { async function payWithWechat() { try { let params = await getPayParams(); WeixinJSBridge.invoke( 'getBrandWCPayRequest', Object.assign({}, params, {}), // 将从后台拿到的参数传递进去 (res) => { if(res.err_msg === "get_brand_wcpay_request:ok") { console.log('Payment successful!'); } else { console.error(`Failed to complete payment:${res.err_code}`); } } ); } catch(error){ console.error("Error occurred while trying to initiate wechat pay:", error); } } onMounted(() => { document.addEventListener('WeixinJSBridgeReady', () => { payWithWechat(); }, false); if(typeof WeixinJSBridge == "undefined"){ if(document.addEventListener){ document.addEventListener('WeixinJSBridgeReady', payWithWechat , false); }else if(document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', payWithWechat ); document.attachEvent('onWeixinJSBridgeReady', payWithWechat ); } }else{ payWithWechat(); } }); return {}; }, }; ``` 这段代码片段定义了一个名为 `payWithWechat()` 的异步方法,它负责执行整个支付流程;同时监听了 `WeixinJSBridgeReady` 事件以确保仅当微信浏览器环境准备好后再尝试启动支付逻辑。此外还含了错误处理机制用来捕获可能出现的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值