uni-app微信公众号web JS-SDK开发之一接入

uni-app H5接入微信JS-SDK

目标

完成基于uni-app H5平台上微信公众号JS-SDK的接入

uni-appH5接入JS-SDK

接入说明

1,环境说明

  1. vue版的uni-app环境,使用npm来管理uni-app具备更好的灵活性,不用限制在HBuilder上开发,如果不是用npm管理,那么需要在html中导入js
  2. (可选)微信公众号账号,这不是必需的,因为微信提供有测试号的沙盒环境,因此,具有个人微信号在开发阶段也是可行的
  3. (可选)公网web地址方便公网测试,但基于内网调试,可以形成调试闭环,但需要能够访问外网的能力,因为要访问微信。

2,JS-SDK接入说明

先说一下整体的接入概要,让整个框架有个思路

  1. JS-SDK本质是通过js注入完成的,为web页面提供一些基于微信客户端运行时的便捷功能,比如:图片上传、微信登录、分享、地理位置、扫一扫、支付等,总的来说就是面向手机底层的一些应用。我们接入JS-SDK的目的就是为了让H5网页,具有像"App"一样的功能。
  2. JS-SDK中的功能是受微信限制的,这里JS-SDK的功能方法,就是微信文档中的“接口”,所有接口都是受微信管控的,这也能理解,比如像支付这类,肯定就需要与微信产生通讯联系。这里的“限制”是广义的,也包含一些无限制的接口
  3. 微信“限制”了接口,那是为了考虑用户安全,需要在微信公众账号配置“JS安全域名”,配置了此域名,H5页面才能接入JS-SDK,作为微信服务商也就知道了你是谁,所以当H5被打开时,微信服务商知道“页面的提供者是谁(这里的主体是公众号)”,同时也知道是谁打开的H5页面(微信用户)。基于这点原理,微信端的H5页面打通了用户与服务商标识的通道,极大提升了便捷性。
  4. 微信公众号的登录逻辑,登录是基于OAuth2的第三方授权登录逻辑来实现的。,至于原理稍后再说,这里只需要注意一点,第三方授权登录会重定向到公众号H5页面,不支持基于ajax的方式

3,资源准备

本文只是辅助教程,所以还是需要一些资源

开始接入

前面说了那么多废话,终于要看是实干了。

本人前后端开发框架

  • 前端uni-app
  • 后端maven、Spring Boot

第一步,下载web开发者工具

在上面的连接地址中,下载web开发者工具,方便预览

第二步,uni-app安装JS-SDK并初始化(前端)

  1. 安装
npm install weixin-js-sdk --save # --save将依赖保存到package.json中
  1. 初始化(这里是指初始化JS环境,不是初始化配置)
import wx from 'weixin-js-sdk';
//这里将wx重命名为wxmp的全局变量,目的是防止与uni-app等发生变量冲突。
window.wxmp = wx

这里说明一下wxmp.config方法是JS-SDK的功能初始化,其中涉及到AppId、加密算法、签名等,所有config方法中的参数我们是通过服务端获取的

第三步,初始化微信公众账号沙盒

点击上面的微信公众平台接口测试帐号申请进入沙盒申请

授权登录后如下:
在这里插入图片描述

配置JS安全域名(重要、重要、重要)

在这里插入图片描述
由于沙盒环境,可以配置内网、localhost地址

第四步,后端接入微信公众号,实现wx.config配置参数(后端)

1. 提供jsSdkConfig接口(公共接口)
import me.chanjar.weixin.common.bean.WxJsapiSignature;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
@RestController
@RequestMapping("/openApi/comm")
public class JsSdkRest {
    @Resource
    private WxMpService wxMpService;

    @GetMapping("jsSdkConfig")
    @GetMapping("jsSdkConfig")
    public RestObjectResponse<WxJsapiSignature> jsSdkConfig(@ApiParam("url包含查询参数") @RequestParam("url") String url) throws WxErrorException {
        return RestObjectResponse.ok(wxMpService.createJsapiSignature(url));
    }
}

RestObjectResponse你应该没有,自行替换

2. 引入公众号对接依赖

WxMpService是基于开源的公众号接入库maven依赖如下:

<dependency>
   <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>3.9.0</version>
</dependency>
3.配置WxMpService Bean

我没有用starter版,习惯自行配置bean,这样更灵活

@Configuration
public class WxConfiguration {
    /**
     * 微信公众号配置
     * @return
     */
    @Bean
    public WxMpService wxMpService(){
        WxMpServiceImpl wxMpService = new WxMpServiceImpl();
        WxMpDefaultConfigImpl conf = new WxMpDefaultConfigImpl();
        conf.setAppId(ProjectWxMpConfigBean.INSTANCE.getAppId());
        conf.setSecret(ProjectWxMpConfigBean.INSTANCE.getSecret());
        conf.setToken(ProjectWxMpConfigBean.INSTANCE.getToken());
        conf.setAesKey(ProjectWxMpConfigBean.INSTANCE.getAesKey());
        wxMpService.setWxMpConfigStorage(conf);
        return wxMpService;
    }
}

第五步,前端调用配置接口初始化配置

获取配置接口

其实这没啥好说的,但是有一点需要注意,那就是获取配置接口需要传入url并且包含查询参数

参考代码:

let getJsSdkConfig = ()=>{
    let url = escape(window.location.href)
    return PFApi.apiGet(
        {
            uri:'/openApi/comm/jsSdkConfig'
        },{url:url})
}
export const ApiComm = {
    getJsSdkConfig:getJsSdkConfig
}

这里顺便啰嗦一下url组成
在这里插入图片描述
红框中每个属性自行理解,肯定是有差异的。

js配置
wxmp.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

jsApiList,要用到的wx方法都需要配置在这里面,字符串数组,方法名

第六步,确认

刷新页面出现下面的弹框说明配置ok,如果报错,根据错误码在微信文档去找

在这里插入图片描述

### UNI-APP 开发微信公众号 (H5) 并集成微信支付 #### 一、准备工作 为了在 Uni-app开发微信公众号 H5 应用并集成微信支付功能,需先完成如下准备: 1. **注册微信公众平台账号** - 获取 AppID 和 AppSecret。 2. **配置服务器域名** - 在微信公众平台上设置合法的业务域名、JS接口安全域名等必要信息[^1]。 3. **安装必要的插件和库文件** 对于微信支付的支持,在项目中引入 `wx.js` 文件用于调用微信 JS SDK 接口。同时确保已安装最新版本的 Vue CLI 工具以便更好地管理项目资源。 #### 二、实现流程 ##### (一)初始化环境变量 创建 `.env.development` 或者其他适合当前环境下的配置文件来保存敏感数据如 appId, mchId(商户号), key(密钥),这些参数将在后续请求过程中被使用到。 ```bash VUE_APP_WX_APP_ID=your_app_id_here VUE_APP_MCH_ID=your_merchant_id_here VUE_APP_API_KEY=your_api_key_here ``` ##### (二)获取预支付订单编号(prepay_id) 当用户确认付款金额后,前端应向自己的服务端发起 POST 请求传递商品详情给后台处理逻辑;此时后端负责生成交易单据并向 WeChat Pay API 发送 HTTPS 请求以获得 prepay_id 参数作为响应的一部分返回给客户端应用。 注意:此过程涉及敏感操作建议采用 HTTPS 协议传输数据,并且严格按照官方文档说明构建签名字符串防止篡改攻击风险。 ##### (三)调起微信内嵌浏览器中的支付控件 收到有效的 prepay_id 后即可按照下述方式组装所需参数并通过 wx.chooseWXPay 方法启动内置 Webview 支付界面供顾客输入密码验证身份从而完成整个购物流程: ```javascript // 假设已经获得了prepay_id和其他必需的信息 const payParams = { "appId": process.env.VUE_APP_WX_APP_ID, "timeStamp": new Date().getTime(), "nonceStr": Math.random().toString(36).substr(2), "package": 'prepay_id=' + prepay_id_from_server,// 注意这里的拼接规则可能依据实际情况有所变化 "signType": "MD5", }; // 计算 sign 字段的具体方法请参照 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6 let stringA = Object.keys(payParams) .filter(key => payParams[key]) .map(key => `${key}=${encodeURIComponent(payParams[key])}`) .join('&'); stringA += '&key=' + encodeURIComponent(process.env.VUE_APP_API_KEY); payParams.sign = hex_md5(stringA.toUpperCase()); // 调用 chooseWXPay 进行支付 WeixinJSBridge.invoke( 'getBrandWCPayRequest', payParams, function(res){ if(res.err_msg === "get_brand_wcpay_request:ok"){ alert('支付成功!'); }else{ console.error(`支付失败:${res.err_code}`); } }); ``` 上述代码片段展示了如何利用 JavaScript 实现微信支付的核心部分——即通过 WeixinJSBridge 对象访问原生组件进而引导用户至最终结算环节。值得注意的是实际部署之前还需要针对不同场景做充分测试确保兼容性和稳定性。 #### 三、常见问题排查 如果遇到无法正常唤起支付窗口的情况,请检查以下几点: - 是否正确设置了 jsApiList 数组内的权限项; - 检查 URL 地址是否被列入了公众平台的安全白名单之中; - 确认所有参与计算 Sign 的字段都已被正确定义并且顺序无误; - 测试环境中使用的证书是否有效过期等问题也可能会引起异常行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值