【从零开始搭建uniapp开发框架】(十二)—— 微信H5自定义分享和扫码功能封装

框架开源地址:https://gitee.com/yunhaotian/uniapp_mobileFrame

实现微信公众号自定义分享和扫码功能需要引入微信JSSDK

 

npm安装微信JS-SDK

npm install jweixin-module --save

通过网址下载:

https://unpkg.com/browse/jweixin-module@1.6.0/lib/index.js

 

安装完后在 node_modules 文件夹下会出现 jweixin-module 文件夹

 

 

需要用到微信JSSDK页面,引入微信JSSDK

//微信js-sdk引入
var jweixin = require('jweixin-module')

 

页面内调用微信扫码功能示例:

html代码:

<view @click="scan()">扫一扫</view>

 

JS代码:

//调用扫码
scan(){
     let that=this; //如果要把扫码结果赋值给页面定义变量,要使用that.变量名
     jweixin.scanQRCode({
          needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, 
                  scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
              success: function (res) {
                 var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                 if(res.resultStr.indexOf(',') > 0){
                            //条形码时返回的格式类似为【code128,123456789】        
                             var dealserialNumber=res.resultStr.split(',')[1];
                             dealserialNumber = dealserialNumber.replace(/[^a-z\d]/ig, "");//处理条形码扫描的字符
                 alert(dealserialNumber);
                             //location.href='接收结果页面='+dealserialNumber;//扫描结果传递到的处理页面
                  }
           else{
                        //二维码时
                        alert(res.resultStr);
                        //location.href='接收结果页面='+res.resultStr;//扫描结果传递到的处理页面
                        }
                      }
                    
    });    
},

 

接下来封装微信JSSDK调用方法:

在common文件夹下新增一个 sju.weixin.js  文件

 

sju.weixin.js源码:

import ajax from '@/common/sju.ajax.js'

//微信js-sdk引入
var jweixin = require('jweixin-module')

let weixin = {
    apiUrl: ajax.apiUrl,
/**
     * @description  获取微信jsconfig参数
     * <br/>success回调方法的参数就是返回的原始数据
     * @param {string} title   分享标题
     * @param {string} linkUrl 分享页面路径
     * @param {string} imgUrl  图片路径
     * @param {string} desc    分享描述   
     * @param {function} success 成功后回调的方法
     */
    weixinJSConfig: function(title, linkUrl, imgUrl,desc) {
        var url = window.location.href;    //H5当前页面路径
        console.info('------------url--------------');
        console.info(url);
        uni.request({
            url: weixin.apiUrl + '/home/getWeixinJSConfig', //请求后台接口获取权限验证配置参数
            data: {
                url: url
            },
            method: 'POST',
            timeout: 600000,
            success: (res) => {
                console.info('----------------------------jsconfig--------------------------');
                console.info(res.data);
                
                //微信分享权限验证配置参数构造
                var config = {
                    debug: false, //是否启用调试
                    appId: res.data.appId, //微信公众号appID
                    timestamp: res.data.timestamp, //时间戳
                    nonceStr: res.data.nonceStr,    //签名的随机串
                    signature: res.data.signature,    //签名
                    jsApiList: [                    //需要使用的JS接口列表
                        'checkJsApi',
                        'updateTimelineShareData',
                        'updateAppMessageShareData',
                        'hideMenuItems'
                    ]
                };

                console.info('--------------------------jsconfig Value---------------');
                console.info(config);

                //微信注入权限验证配置
                jweixin.config(config);

                //需在用户可能点击分享按钮前就先调用
                jweixin.ready(function() {
                    jweixin.hideMenuItems({// 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
                                           menuList: ['menuItem:originPage','menuItem:openWithSafari','menuItem:openWithQQBrowser','menuItem:editTag','menuItem:copyUrl','menuItem:share:qq', 'menuItem:favorite', 'menuItem:share:QZone','menuItem:openWithSafari']
                    });
                    //分享到朋友圈
                    jweixin.updateTimelineShareData({
                        title: title, // 分享标题
                        link: ajax.appUrl + linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                        imgUrl: imgUrl, // 分享图标
                        success: function() {
                            // alert("updateTimelineShareData");
                        }
                    })

                    //分享给朋友
                    jweixin.updateAppMessageShareData({
                        title: title, // 分享标题
                        desc: desc, // 分享描述
                        link: ajax.appUrl + linkUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                        imgUrl: imgUrl, // 分享图标
                        success: function() {
                            // alert("updateAppMessageShareData");
                        }
                    })
                });
            }
        });
    },
    // 微信H5扫码功能
    scanQRCode: function() {
        var url = window.location.href; //H5当前页面路径
        uni.request({
            url: weixin.apiUrl + '/home/getWeixinJSConfig', //后台接口
            data: {
                url: url
            },
            method: 'POST',
            timeout: 600000,
            success: (res) => {
                // console.info('----------------------------jsconfig--------------------------');
                var config = {
                    debug: false,
                    appId: res.data.appId,
                    timestamp: res.data.timestamp,
                    nonceStr: res.data.nonceStr,
                    signature: res.data.signature,
                    jsApiList: [
                        'checkJsApi',
                        'updateTimelineShareData',
                        'updateAppMessageShareData',
                        'hideMenuItems',
                        'scanQRCode'    //扫码权限
                    ]
                };
    
                // console.info('--------------------------jsconfig Value---------------');
                // console.info(config);
    
                //微信注入权限验证配置
                jweixin.config(config);
                jweixin.scanQRCode({
                  needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                  scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
                  success: function (res) {
                    var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                    if(res.resultStr.indexOf(',') > 0){
                     //条形码时返回的格式类似为【code128,123456789】        
                         var dealserialNumber=res.resultStr.split(',')[1];
                         dealserialNumber = dealserialNumber.replace(/[^a-z\d]/ig, "");//处理条形码扫描的字符
                         dealserialNumber=dealserialNumber.replace('sn','');
                        uni.setStorageSync('dealserialNumber', dealserialNumber);
                         //location.href='接收结果页面='+dealserialNumber;//扫描结果传递到的处理页面
                    }else{
                    //二维码时
                    alert(res.resultStr);
                    //location.href='接收结果页面='+res.resultStr;//扫描结果传递到的处理页面
                    }
                  }
                });
    
                
            }
        });
    }
    
}
export default weixin;

 

main.js引入封装类代码:

// #ifdef H5
import sjuWeixin from './common/sju.weixin.js'
// #endif

// #ifdef H5
Vue.prototype.sjuWeixin = sjuWeixin;
// #endif

 

这里用到了条件编译,只有在H5的环境或者是打包H5时,这段代码才会执行

 

页面中使用自定义分享示例:

onShow() {
	//调用微信配置接口
	// #ifdef H5
		this.sjuWeiXin.weixinJSConfig(this.$title,'linkUrl(分享页面路径(字符串空默认首页))','分享图片路径(网络图片)',this.$desc);
	// #endif
},

 

这里使用到了 this.$title 和 this.$desc 的变量,需要在 main.js 里面定义,因为自定义分享功能是多页面使用,分享标题和分享描述基本上都是固定的,后面改变标题或者描述,只需把mian.js的变量修改一下即可

 

// 设置全局变量
Vue.prototype.$title='分享标题';
Vue.prototype.$desc = '分享描述';
Vue.prototype.$shareImage = '图片路径'; 

 

posted @ 2022-02-17 09:08  编程民工  阅读(391)  评论(0编辑  收藏  举报