微信分享 JSSDK的使用

我现在做过的在微信中运行的项目,基本上都有微信分享功能,所以,会使用JSSDK分享页面是非常重要的。
分享功能的代码一般会放在beforeCreate或mounted钩子中,代码如下:

 1 this.$http.get("group/identity")
 2        .then(({data:{code, content, jssdk, msg}}) => {
 3             if (code == 0) {
 4                  this.group_id = content.group_id;
 5                  if(this.group_id){
 6                       this.isSignUpBtn = false;
 7                       this.isMyBtn = true;
 8 
 9                       // 这里放分享功能的代码 
10 
11                  }
12             } else {
13                  MessageBox('提示', msg)
14            }
15     }, ({data:{msg}}) => {
16           MessageBox('提示', msg);
17 });

假如下面是我们请求接口的数据:

 1 {
 2   "code": 0,
 3   "msg": "请求成功的消息",
 4   "content": "这里放数据",
 5   "is_mobile_user": true,
 6   "jssdk": {
 7     "appId": "wxec4d172a4f73ee6f",
 8     "timestamp": "1487756879",
 9     "nonceStr": "58ad5e4f70226",
10     "signature": "418034b044c61eef9375ada45a1dc373a5e4b7db"
11   }
12 }

一切准备就绪之后,我们来根据不同页面的使用方式一一分解:

先说引入的问题:
// 首先,在index.html页面先引入JSSDK文件

1 <script type="text/javascript">
2     var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
3     document.write(decodeURI("%3Cscript src='" + _bdhmProtocol + "res.wx.qq.com/open/js/jweixin-1.0.0.js' type='text/javascript'%3E%3C/script%3E"));
4 </script>
5 
6 // 当然,你也可以用最简单的方式引入
7 <script src='https://res.wx.qq.com/open/js/jweixin-1.0.0.js'></script>
8 
9 // 我个人比较喜欢第一种。

下面就开始使用了,先来一个代码初级版本的方式:
// 方式一,所有代码直接写在页面里面上,分享出去后,用户直接点击分享的链接就回到当前这个页,不需要拼接 link,有动态参数

 1 // 获取jssdk需要的数据
 2 let jssdk = data.jssdk;
 3 // 配置功能
 4 wx.config({
 5     debug: false,
 6     appId: jssdk.appId,
 7     timestamp: parseInt(jssdk.timestamp),
 8     nonceStr: jssdk.nonceStr,
 9     signature: jssdk.signature,
10     jsApiList: [
11         "onMenuShareTimeline",
12         "onMenuShareAppMessage"
13     ]
14 });
15 wx.ready(function () {
16     wx.onMenuShareTimeline({
17         title: "我们的战场我们的团,快来为" + self.headerData.class + "王者而战!", // 分享标题
18         desc: "哥们儿,咱很久没一起排位了,Hey兄弟们!咱该怒砍一血了!",
19         link: location.href, // 分享链接
20         imgUrl: "https://tup.iheima.com/sport.png", // 分享图标
21         success: function () {
22             // alert("成功");
23         },
24         cancel: function () {
25             // alert("失败")
26         }
27     });
28     wx.onMenuShareAppMessage({
29         title: "我们的战场我们的团,快来为" + self.headerData.class + "王者荣誉而战!", // 分享标题
30         desc: "哥们儿,咱很没一起排位了,Hey兄弟们!咱该怒砍一血了!",
31         link: location.href, // 分享链接
32         imgUrl: "https://tup.iheima.com/sport.png", // 分享图标
33         success: function () {
34             // alert("成功");
35         },
36         cancel: function () {
37             // alert("失败")
38         }
39     });
40 });
41 //  self.headerData.class 为需要动态传入的参数,获取数据的时候直接取出来就行。

// 方式二,所有代码直接写在页面里面上,需要拼接link,一般放在首页或对外分享的主页面,没有动态参数

 1 // 获取jssdk需要的数据
 2 let jssdk = data.jssdk;
 3 // 配置功能
 4 wx.config({
 5     debug: false,
 6     appId: jssdk.appId,
 7     timestamp: parseInt(jssdk.timestamp),
 8     nonceStr: jssdk.nonceStr,
 9     signature: jssdk.signature,
10     jsApiList: [
11         "onMenuShareTimeline",
12         "onMenuShareAppMessage"
13     ]
14 });
15 var hostName = 'https://wx.chuangyejia.com/';
16 var pathName = 'fe-sport/#/home';
17 wx.ready(function() {
18     wx.onMenuShareTimeline({
19         title: "王者荣耀正在招团长,快来一战成名!", // 分享标题
20         desc: "Hey,兄弟,好久不见!11月7日,王者战场见。",
21         link: process.env.NODE_ENV === 'development' ? hostName + 'dev/' + pathName : hostName + pathName, // 分享链接
22         imgUrl: "https://tup.iheima.com/sport.png", // 分享图标
23         success: function() {
24             // alert("成功");
25         },
26         cancel: function() {
27             // alert("失败")
28         }
29     });
30 
31     wx.onMenuShareAppMessage({
32         title: "王者荣耀正在招团长,快来一战成名!", // 分享标题
33         desc: "Hey,兄弟,好久不见!11月7日,王者战场见。",
34         link: process.env.NODE_ENV === 'development' ? hostName + 'dev/' + pathName : hostName + pathName, // 分享链接
35         imgUrl: "https://tup.iheima.com/sport.png", // 分享图标
36         success: function() {
37             // alert("成功");
38         },
39         cancel: function() {
40             // alert("失败")
41         }
42     });
43 });

// 方式三,将分享的代码单独剥离出来成一个js文件,然后在需要的地方引入这个js文件。(推荐)
// utils.js文件中有如下代码

 1 const shareJs = function(jssdk, options) {
 2     wx.config({
 3         debug: false,
 4         appId: jssdk.appId,
 5         timestamp: parseInt(jssdk.timestamp),
 6         nonceStr: jssdk.nonceStr,
 7         signature: jssdk.signature,
 8         jsApiList: [
 9             "onMenuShareTimeline",
10             "onMenuShareAppMessage"
11         ]
12     });
13     var defaults = {
14         title: "分享的标题",
15         desc: "分享的描述",
16         link: location.href, //分享页面地址,不能为空
17         imgUrl: 'https://tup.iheima.com/sport.png', //分享是封面图片,不能为空
18         success: function() {}, //分享成功触发
19         cancel: function() {} //分享取消触发,需要时可以调用
20     }
21     options = Object.assign({}, defaults, options);
22     wx.ready(function() {
23         var thatopts = options;
24         wx.onMenuShareTimeline({
25             title: thatopts.title, // 分享标题
26             desc: thatopts.desc, // 分享描述
27             link: thatopts.link, // 分享链接
28             imgUrl: thatopts.imgUrl, // 分享图标
29             success: function() {
30                 // alert("成功");
31             },
32             cancel: function() {
33                 // alert("失败")
34             }
35         });
36         wx.onMenuShareAppMessage({
37             title: thatopts.title, // 分享标题
38             desc: thatopts.desc, // 分享描述
39             link: thatopts.link, // 分享链接
40             imgUrl: thatopts.imgUrl, // 分享图标
41             success: function() {
42                 // alert("成功");
43             },
44             cancel: function() {
45                 // alert("失败")
46             }
47         });
48     });
49 }
50 
51 
52 module.exports = {
53     shareJs
54 };

// 在home.vue页面中使用

 1 <script type="text/ecmascript-6">
 2 import { shareJs } from './../utils';  // 引入分享功能的js文件
 3 // 需要拼接地址的地方
 4 let jssdk = data.jssdk;
 5 var hostName = 'https://wx.chuangyejia.com/';
 6 var pathName = 'fe-sport/#/home';
 7 let optionData = {
 8     title: "王者荣耀正在招团长,快来一战成名!",
 9     desc: "Hey,兄弟,好久不见!11月7日,王者战场见。",
10     link: process.env.NODE_ENV === 'development' ? hostName + 'dev/' + pathName : hostName + pathName,
11     imgUrl: "https://tup.iheima.com/sport.png"
12 };
13 shareJs(jssdk, optionData);
14 
15 
16 // 不需要拼接地址的地方
17 let jssdk = data.jssdk;
18 // 准备好要传入到utils.js文件中的参数。
19 let optionData = {
20     title: "我们的战场我们的团,快来为" + self.headerData.class + "王者荣誉而战!",
21     desc: "哥们儿,咱很久没一起排位了,Hey兄弟们!咱该怒砍一血了!",
22     link: location.href,
23     imgUrl: "https://tup.iheima.com/sport.png"
24 };
25 // 将jssdk和分享后展示的参数传入
26 shareJs(jssdk, optionData);
27 
28 //  self.headerData.class 为需要动态传入的参数,获取数据的时候直接取出来就行。

// 或者还可以像下面这样写,先将分享的内容准备后,然后以更简洁的方式赋值给专入到utils.js中

1 <script>
2 let fromPath = '';
3 beforeRouteEnter (to, from, next) {
4       fromPath = from.path;
5       next();
6 },
7 // 获取fromPath
8 </script>
 1 let toLink = location.href;
 2 let titleDetail = "我们的战场我们的团,快来为" + self.headerData.class + "王者荣誉而战!";
 3 let destDetail = "哥们儿,咱很久没一起排位了,Hey兄弟们!咱该怒砍一血了!";
 4 // 根据不同的情况来修改分享后显示的文案。
 5 if(fromPath.substr(-1) == "/"){
 6       toLink = "http://wx.chuangyejia.com/mobile/sport/whoami";
 7       titleDetail = "商场王者,快来测试你是王者荣耀里的谁?";
 8       destDetail = "王者荣耀开幕在即,众多神装大佬已整装待发,速来测试你的王者基因,你更适合加入哪支王者战队?"
 9 }
10 
11 let myJssdk = jssdk;
12 let optionData = {
13       title: titleDetail,
14       desc: destDetail,
15       link: toLink,
16       imgUrl: "https://tup.iheima.com/sport.png"
17 };
18 shareJs(myJssdk, optionData);

有了上面的这些代码之后,下一次再遇到这类需求时,我就更得心应手了。

原文地址:https://www.cnblogs.com/sebastian-tyd/p/7800919.html