微信端二次分享开发有感(2018-07-28)

微信端H5的相关问题总结

微信端路由(带[#])跳转问题

问题描述:在微信端页面路由跳转成功,但将跳转页分享出去会发现分享出去的链接为初始页面链接,导致与预期不一致的结果。
问题原因:在微信端浏览器中由路由跳转的spa应用,url将不会刷新,尤其体现在ios端
解决方案:不使用路由跳转,改成使用location.href等方式跳转

代码参考如下

this.$router.push({name: 'xxx'}) ->  location.href('xxx') 

微信二次分享问题

  1. 微信二次分享需要使用jssdk,因此需要引用weixin-js-sdk(注:引用方式可以全局引用;也可以使用es6模块的方式引用,使用npm install weixin-js-sdk安装,然后通过import wx from 'weixin-js-sdk'引用)。
  2. 微信 jssdk 中的api wx.config({xxx}) 中需要提供签名(signature字段),签名通过发送请求至 https://xxx/signature?_=new Date().getTime()&url=encodeURIComponent(url) 获取,此处需要注意一个细节url,url必须跟当前页面一致(hash部分不需要),否则获得的签名在wx.config({xxx})的校验中将会报签名不合法的错误。

微信二次分享配置详情

import axios from 'axios'
import wx from 'weixin-js-sdk'

const wex = {
  shareTwo(obj) {
    obj = Object.assign({}, {
      title: 'xxx', // 二次分享标题
      msg: 'xxx',   // 二次分享内容
      imgUrl: 'xxx',// 二次分享图标
      url: window.location.href, // 当前页面地址(注:!!特别重要,要用于获取签名)
      link: '' // 二次分享的链接地址
    }, obj)
    let wxReady = false // 设置wxReady的状态为false
    let wxConfigParam = { // 基本的一些wxConfig的一些配置
      debug: false,
      appId: 'xxx',
      jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo', 'onMenuShareQZone'] // 配置需要调用的jsApi
    }
    axios({
      url: `https://xxx/signature?_=${new Date().getTime()}&url=${encodeURIComponent(obj.url)}`,
      method: 'get'
    }).then(function (res) {
      if (res.status === 200 && res.data) {
        return res.data
      } else {
        return Promise.reject()
      }
    }).then(function (res) {
      if (res.code === 0) {
        // 请求成功后获取签名等信息,并将其写入配置项
        wxConfigParam.timestamp = res.data.timestamp
        wxConfigParam.nonceStr = res.data.nonceStr
        wxConfigParam.signature = res.data.signature
        // wx.config()是所有步骤的前提,这步报错将无法继续后续操作
        wx.config(wxConfigParam) 
        if (wx && !wxReady) {
          wx.ready(function () {
            let commonShareData = {
              title: obj.title,    // 分享标题
              link: obj.link,  // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
              desc: obj.msg,  // 分享描述
              imgUrl: obj.imgUrl,  // 分享图标
              success: function () {
                wxReady = true
              }
            }
            wx.onMenuShareTimeline(commonShareData) //  “分享到朋友圈”
            wx.onMenuShareAppMessage(commonShareData)   // “分享给朋友”
            wx.onMenuShareWeibo(commonShareData)   // “分享到腾讯微博”
            wx.onMenuShareQQ(commonShareData)        // “分享到QQ”
            wx.onMenuShareQZone(commonShareData)  // “分享到QQ空间”
          })
        }
      }
    })
  }
}

export {wex}

工具类总结

下面将提供几个比较实用的工具类

  • 判断是否是ios端
let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/)
  • 判断安卓终端
let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1
  • 判断是否在微信端
let isWeiXin = ua.match(/MicroMessenger/i) == 'micromessenger'
  • 获取想要获取的查询参数
function getQueryString(name) {
  const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
  const w = window.location.search.split('?')
  const r = w.length === 2 && w[1] || ''
  let reStr = ''
  let urlArr = []
  w.length === 2 && w[1].replace("?", '') && w[1].split('&').forEach((v) => {
    let i = v.split('=')
    urlArr[i[0]] = i[1]
  })
  if (name) {
    reStr = r.match(reg) !== null ? r.match(reg)[2] : false
    return reStr
  } else {
    return urlArr
  }
}
  • 获取所有的查询参数
/**
 * 获取URL所有查询参数
 * @return {Object} searchObj
 */
function getParams() {
  let name = '', value = '', searchObj = {};
  let str = location.href; //取得整个地址栏
  let questionMark = str.indexOf('?')
  let hashMark = str.indexOf('#')
  str = questionMark > hashMark ? str.substring(questionMark + 1) : str = str.substring(questionMark + 1, hashMark)
  let arr = str.split("&"); //各个参数放到数组里
  for (var i = 0; i < arr.length; i++) {
    let num = arr[i].indexOf("=");
    if (num > 0) {
      name = arr[i].substring(0, num);
      value = arr[i].substr(num + 1);
      searchObj[name] = value;
    }
  }
  return searchObj
}
  • 将查询参数对象转换为查询参数字符串
/**
 *  将查询参数对象转换为查询参数字符串
 *  @param {Object} searchObj
 *  @return {String} searchOptions
 * */
function ObjToSearchOptions(searchObj, otherSearchObj = {}) {
  searchObj = Object.assign(searchObj, otherSearchObj) // 进行参数的合并(此处为浅拷贝)
  let searchArr = []
  for (let [key, value] of Object.entries(searchObj)) {
    value !== '' && value !== undefined && value !== null && searchArr.push(`${key}=${value}`)
  }
  return `?${searchArr.join('&')}`
}
  • 不同终端(IOS,Android,...)调用起好车主App的方案
/**
 * jumpDownloadView:跳转到好车主app,并打开指定页面
 * @param {String} targetUrl
 * */
let jumpDownloadView = function (targetUrl) {
  // 配置打开app后的跳转地址
  let href = targetUrl || URL.POLICY + '/activities/invite/index.html'
  if (isiOS) {
    // IOS平台
    try {
      // 若支持 carowner 协议(注:也就是安装了好车主APP)
      window.location.href = 'carowner://?url=' + encodeURIComponent(href)
    } catch (e) {
      // 未安装好车主APP的跳转下载
      window.location.href = 'http://a.app.qq.com/o/simple.jsp?pkgname=com.pingan.carowner#rd'
    }
  } else if (isAndroid) {
    // Android平台
    window.location.href = 'http://a.app.qq.com/o/simple.jsp?pkgname=com.pingan.carowner&android_schema=pinganhczapp://com.pingan.carowner?url=web://' + href
  } else {
    // 其他平台
    window.location.href = 'http://a.app.qq.com/o/simple.jsp?pkgname=com.pingan.carowner#rd'
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 先引入JS 文件 this.wxShare() 在created里调用 首先登陆微信公众号 JSSDK使用步骤 步...
    寄鱼予海与你阅读 6,688评论 1 3
  • 1. 准备工作 1.1 查看公众号分享接口权限 要使用微信SDK必须要有经过微信认证的非个人服务号 登陆服务号后,...
    sxplus阅读 6,238评论 0 2
  • 模块就是别人写好你可以直接使用的功能集合 模块的作业就是方便使用别人写好的功能,python内置有一系列的内置模块...
    michaeljacc阅读 141评论 0 0
  • 一家人,包容越多幸福越多;夫妻间,包容越多感情越浓;乡邻间,包容越多相处越好;朋友间,包容越多友谊越长;同事间,包...
    龙清风阅读 320评论 0 2