uni-app接入JSSDK小白指南(前端+后端)
发布日期:2021-05-06 19:50:32 浏览次数:36 分类:原创文章

本文共 4854 字,大约阅读时间需要 16 分钟。

参考文档

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#54

前提说明

对于很多人来讲如何记入jssdk是困难的,这里讲一下uniapp接入jssdk的过程,并给出一个简单实例。

后端提供JS-SDK使用权限签名

下面代码基于附录1做成:

注:getAccessToken就是获取公众号的AccessToken,代码是一样的,我不贴出来了。

    /**     * 获取微信JS-SDK调用唯一凭证jsapi_ticket,有效期2小时。     * @return     */    public  String getJsapiTicket() {        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+getAccessToken()+"&type=jsapi";        String jsapiTicket=null;        String ticket = (String) redisTemplate.opsForValue().get(appid+"jsapi_ticket");        if(!StringUtils.isEmpty(ticket)){            jsapiTicket =ticket; //redis获取token        }else {            JSONObject jsonObject = restTemplate.getForObject(url,JSONObject.class);            // 如果请求成功            if (null != jsonObject && jsonObject.containsKey("ticket")) {                jsapiTicket = jsonObject.getString("ticket"); //从微信客户端获取token                redisTemplate.opsForValue().set(appid+"jsapi_ticket",jsapiTicket,jsonObject.getInteger("expires_in"), TimeUnit.SECONDS);            }else {                logger.error(jsonObject.toJSONString());                throw new CommonException(999,"jsapi_ticket获取失败");            }        }        logger.info("获取wx jsapiTicket 结果",jsapiTicket);        return jsapiTicket;    }

获取签名,并返回给前端

@Overridepublic AjaxResult authJSSDK() {    String jsapi_ticket = getJsapiTicket();    String noncestr = WXPayUtil.generateNonceStr();    Long timestamp = WXPayUtil.getCurrentTimestamp();    String url="https://xxx.xxx.com/index.html/";    String signature = genSignatureJSSDK( noncestr,jsapi_ticket,timestamp, url);    Map <String,Object> map = new HashMap();    map.put("noncestr",noncestr);    map.put("timestamp",timestamp);    map.put("signature",signature);    return AjaxResult.success(map);}private String genSignatureJSSDK(String noncestr,String jsapi_ticket,Long timestamp,String url) {    StringBuffer sb = new StringBuffer();    sb.append("jsapi_ticket=" +jsapi_ticket)      .append("&noncestr=" + noncestr)      .append("&timestamp=" + timestamp)      .append("&url=" + "1558626281");      logger.info("genSignatureJSSDK:" + sb.toString());    return WXPayUtil.sha1(sb.toString().trim());}    /**     * sha1签名算法     * @param decript     * @return     */    public static String sha1(String decript) {        try {            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");            digest.update(decript.getBytes());            byte messageDigest[] = digest.digest();            // Create Hex String            StringBuffer hexString = new StringBuffer();            // 字节数组转换为 十六进制 数            for (int i = 0; i < messageDigest.length; i++) {                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);                if (shaHex.length() < 2) {                    hexString.append(0);                }                hexString.append(shaHex);            }            return hexString.toString();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        }        return "";    }

Uni-app接入

上面接口返回样式

{"signature":"385b44e0fdbb4e6850dc0ecf96252005fb579bf0","noncestr":"ePBnez5SEPrqKalrNGtTu9KNmBWWzauZ","timestamp":1572066612}

安装npm包

  1. npm init 生成package.json文件
  2. npm install jweixin-module --save 导入jssdk包
    在这里插入图片描述

main.js中引入

Vue.prototype.$wx 设置全局变量,在VUE的任何地方可以通过 $wx直接引入wx实例。

let jweixin = require('jweixin-module')  Vue.prototype.$wx = jweixinconst app = new Vue({    ...App})app.$mount()

页面使用

this.$wx.config 用来接收后端接口的签名,如果成功调用 wx.ready方法,失败调用wx.error方法。
如果控制台打印“验证通过”说明接口通过。

<template>	<view>		<button type="primary" @tap="sharetoWx">分享按钮</button>	</view></template><script>	export default {		onLoad() {		 this.$http.get('wxaccount/portal/authJSSDK').then(e => {			console.log("e: " + JSON.stringify(e));			this.init(e);		 }) 		},		data() {			return {				wxconfig:''			}		},		methods: {			init(e){				let _this = this;				this.$wx.config({				   debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。				   appId: 'xxxx', // 必填,公众号的唯一标识				   timestamp: e.timestamp, // 必填,生成签名的时间戳				   nonceStr: e.nonceStr, // 必填,生成签名的随机串				   signature: e.signature,// 必填,签名				   jsApiList: ["chooseImage"] // 必填,需要使用的JS接口列表				 });				this.$wx.ready(function(){					console.log("验证通过")				  _this.$wx.checkJsApi({					  jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,					  success: function(res) {						console.log("res: " + res);					  }					});				});				this.$wx.error(function(res){					console.log("验证失败")				});			},			sharetoWx(){				 this.$wx.updateAppMessageShareData({ 					title: '我的分享测试', // 分享标题					desc: '分享的内容', // 分享描述					link: 'www.baidu.com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致					imgUrl: '', // 分享图标					success: function () {						toast("分享成功")					}				  })			}		}	}</script><style></style>
上一篇:前端图片处理的基本知识补充篇(url,blog,base64之间的关系)
下一篇:H5页面授权获取微信授权(openId,微信nickname等信息)

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月21日 13时55分31秒