微信小程序打夯之旅(五):分享 & 分享到朋友圈

页面基础分享能力

基本的页面分享,只需要在页面中设置 onShareAppMessage 即可,如果分享的内容各个页面保持一致,建议进行一定的封装,如封装到 Page 的能力中。

App({
  // 获取分享卡片内容
  getShareMessage(path) {
    return {
      title: '分享标题',
      imageUrl: '分享图片',
      path: path || '分享默认路径'
    };
  },
  enhancePage() {
    const oPage = Page;
    Page = config => oPage(Object.assign(config, {
      getShareMessage: this.getShareMessage,
    }));
  },
  onLaunch() {
    this.enhancePage();
  },

})
Page({
  onShareAppMessage() {
    return this.getShareMessage(1);
  }
})

用户点击按钮主动触发分享

只需要设置按钮的 open-typeshare 就可以自动触发页面的 onShareAppMessage 了。

<button open-type="share">分享按钮</button>

获取群聊中的分享信息

限于隐私保护,个人分享的信息已经不再能拿到了,但是我们可以获取分享所在群的信息。

  • 1.需要在分享页设置 ticket 信息
onLoad() {
  // 配置分享,用以区分分享到个人还是群
  wx.showShareMenu({withShareTicket: true});
}
  • 2.在 onShareAppMessage 里获取群信息
onShareAppMessage() {
  return {
    title: '分享',
    path: '/pages/index',
    success: (res) => {
      const tickets = res.shareTickets;
      if (res.shareTickets) {
        wx.getShareInfo({
          shareTicket: tickets[0],
          success: (data) => {
            console.log('分享到群: ', data);
          },
        });
      } else {
        console.log('分享到个人');
      }
    },
  };
}
  • 3.在 APP.onLaunch 或者 App.onShow 里获取群信息
App({
  onShow: (options) => {
    wx.getShareInfo({
      shareTicket: options.shareTicket,
      success: (res) => {
        // 请求微信服务器获取群信息
      }
    })
  }
})

分享到朋友圈

小程序是不支持直接分享到朋友圈的,只能通过保存图片并引导用户主动发送朋友圈。下面的例子是一个分享动态生成的图片。

  1. 第一步:素材预下载,素材不支持远程URL,需要下载到本地(如小程序二维码和书封)
// 获取小程序二维码
downloadAppCode() {
    return new Promise((resolve, rej) => {
      wx.downloadFile({
        url: '后台获取二维码接口',
        success: (res) => { resolve(res.tempFilePath); },
        fail: (res) => { resolve(''); }
      });
    });
},
// 下载文件
downloadFile(url) {
  return new Promise((resolve, rej) => {
    if (url){
      wx.downloadFile({
        url: url,
        success: (res) => { resolve(res.tempFilePath); },
      });
    } else resolve();
  });
},

// 下载所有书封到本地
downloadCovers(books) {
  const urls = books.map((book) => this.getBookCover(book.bookId));
  Promise.all([
    this.downloadFile(urls[0]),
    this.downloadFile(urls[1]),
    this.downloadFile(urls[2]),
    this.downloadFile(urls[3]),
    this.downloadFile(urls[4]),
    this.downloadAppCode(),
  ]).then((res) => {
    const appCode = res[res.length - 1];  // 获取小程序二维码地址
    res = res.splice(0, res.length - 1);  // 所有书封地址
    res = res.filter(item => item);       // 过滤空书封
    this.setData({ localCovers: res, appCode });
    this.drawShareImg();
  });
}
  1. 第二步:通过canvas绘制需要被保存分享的图片
// 绘制分享图片
drawShareImg() {
    const ctx = wx.createCanvasContext('shareImg');
    const covers = this.data.localCovers;

    // 背景
    ctx.save()
    ctx.setFillStyle('white')
    ctx.fillRect(0, 0, 260, 370);
    ctx.restore()

    // nickname
    ctx.setFillStyle('#111111');
    ctx.setFontSize(14);
    ctx.setTextAlign('center');
    ctx.fillText(this.data.userInfo.nickName, 130, 42, 260);

    // 文案 心愿书屋
    // ctx.drawImage('../assets/images/share/share_icon_xysw.svg', 70, 52, 120, 30);
    ctx.setFillStyle('#111111');
    ctx.setTextAlign('center');
    ctx.font = "30px SourceHanSerifCNMedium";
    ctx.fillText('心愿书屋', 130, 82, 260);

    // 书封边框
    ctx.setStrokeStyle('rgba(0,0,0,0.1)');
    if(covers[3]) ctx.strokeRect(21, 150, 42, 56);
    if(covers[4]) ctx.strokeRect(197, 150, 42, 56);
    if(covers[1]) ctx.strokeRect(51, 126, 60, 80);
    if(covers[2]) ctx.strokeRect(149, 126, 60, 80);
    if(covers[0]) ctx.strokeRect(91, 102, 78, 104);

    // 书封
    if(covers[3]) ctx.drawImage(covers[3], 21, 150, 42, 56);
    if(covers[4]) ctx.drawImage(covers[4], 197, 150, 42, 56);
    if(covers[1]) ctx.drawImage(covers[1], 51, 126, 60, 80);
    if(covers[2]) ctx.drawImage(covers[2], 149, 126, 60, 80);
    if(covers[0]) ctx.drawImage(covers[0], 91, 102, 78, 104);

    // 矩形背景
    ctx.rect(0, 226, 260, 66);
    ctx.setFillStyle('#FFDCE7');
    ctx.fill();

    // 引号
    ctx.drawImage('/assets/images/share/share_icon_left.png', 20, 242, 20, 12);
    ctx.drawImage('/assets/images/share/share_icon_right.png', 220, 264, 20, 12);

    // 二维码
    ctx.drawImage(this.data.appCode, 108, 309, 44, 44);

    // 文案 我已经领了129书币
    ctx.setFillStyle('#773A4D');
    ctx.font = "14px SourceHanSerifCNMedium";
    ctx.setTextAlign('center');
    ctx.fillText('我已经领了129书币', 130, 254, 260);

    // 文案 天天领币,免费看书
    ctx.setFillStyle('#773A4D');
    ctx.font = "14px SourceHanSerifCNMedium";
    ctx.setTextAlign('center');
    ctx.fillText('天天领币,免费看书', 130, 274, 260);

    // 文案 识别小程序码
    ctx.setFillStyle('#9B9B9B');
    ctx.setFontSize(12);
    ctx.setTextAlign('left');
    ctx.fillText('识别小程序码', 30, 337, 260);

    // 文案 进入心愿书屋
    ctx.setFillStyle('#9B9B9B');
    ctx.font = "12px SourceHanSerifCNMedium";
    ctx.setTextAlign('left');
    ctx.fillText('进入心愿书屋', 158, 337, 260);

    ctx.draw();
},
  1. 第三步:通过微信api下载图片到手机相册
canvasToFile() {
    wx.canvasToTempFilePath({
      x: 0,
      y: 0,
      width: 260,             // 画布区域宽度
      height: 370,            // 画布区域高度
      destWidth: 260 * 4,     // 保存图片宽度
      destHeight: 370 * 4,    // 保存图片高度
      canvasId: 'shareImg',
      success: (res) => {
        this.saveImage(res.tempFilePath);
      },
      fail: function (err) {
        console.log('生成图片失败');
      },
    });
},
  // 保存图片
saveImage(filePath) {
    wx.saveImageToPhotosAlbum({
      filePath:filePath,
      success: (res) => {
        this.showSuccess('图片保存成功');
      },
      fail: () => {
        this.showError('图片保存到相册失败', '图片无法保存到相册,请稍后重试');
      },
    });
},
  • 本地图片处理注意事项 模拟器上都是骗人的
1. 不要使用相对路径,只能使用绝对路径
2. 图片不支持svg不支持svg不支持svg
3. 图片不支持base64,只支持本地图片和网络图片两种
* 如果使用了相对路径、svg、base64,模拟器上运行顺畅的毫无破绽,但是在真机上是绘制不出来的!!!
还是老老实实转化成网络图片再下载吧!!!
相关问题:https://developers.weixin.qq.com/community/develop/doc/00048c046f0028e62247f403651800?highLine=drawimage%2520base64
  • 模拟器坑爹二连
明明在模拟器上特殊字体是有效的,为什么到了真机上就又变成了默认字体了???
想要用字体?那就让设计切个图片给你吧

分享参数问题:新用户扫描后处理scene值

生成二维码时会带上scene值,当其他人扫描后可以从scene值中解析出有用的参数

decodeURLParams(str) {
  const result = {}
  const params = str.split('&');
  for (let param of params) {
    const keyValue = param.split('=');
    result[keyValue[0]] = keyValue[1];
  }
  return result;
},
onLoad() {
  let  bookId = '';
  if (options.bookId) bookId = options.bookId;
  else if (options.scene) bookId = this.decodeURLParams(decodeURIComponent(options.scene)).bookId || '';
  this.setData({ bookId: bookId });
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,758评论 0 15
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,094评论 4 62
  • API官网:https://developers.weixin.qq.com/miniprogram/dev/ap...
    谢大见阅读 5,391评论 1 11
  • 给提问的开发者的建议:提问之前先查询 文档、通过社区右上角搜索搜索已经存在的问题。 写一个简明扼要的标题,并且...
    极乐叔阅读 13,430评论 0 3
  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,341评论 0 9