微信jssdk用法汇总


Posted in Javascript onJuly 16, 2016

本文针对微信jssdk用法进行了详细汇总,分享给大家,供大家参考,具体内容如下

1.绑定域名

2.引入js文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js
请注意,如果你的页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixin-1.0.0.js ,否则将无法在iOS9.0以上系统中成功使用JSSDK

3.通过config接口注入权限验证配置
这一步是通过用当前的url向后台发请求拿到一系列参数。即后台会拿我的url去向微信进行认证。这里需要注意的事用于验证的当前的url写法,
let url = location.href.split(‘#')[0];
务必写成以上形势。否则会在进行config时报invalid signature,

确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。
确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
注意这里的动态,不要随便自己拼接,同时encodeURIComponent。

$.ajax({
 type:'GET', 
 url: url,
 dataType: 'jsonp'
})
.then((data)=> {
 wx.config({
 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
 appId: '', // 必填,公众号的唯一标识
 timestamp: , // 必填,生成签名的时间戳
 nonceStr: '', // 必填,生成签名的随机串
 signature: '',// 必填,签名,见附录1
 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
})

 4.通过ready接口处理成功验证
config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

wx.ready (()=> {
  // alert('ready');
  //$('#onMenuShareAppMessage').on('click', ()=> {
  // 分享给朋友
  wx.onMenuShareAppMessage({
   title: '',
   desc: '',
   link: shareUrl,
   imgUrl: '',
   trigger: function (res) {
   // alert('用户点击发送给朋友');
   },
   success: function (res) {
   alert('已分享');
   },
   cancel: function (res) {
   alert('已取消');
   },
   fail: function (res) {
   alert(JSON.stringify(res));
   }
  });
  //});
  //分享到朋友圈
  wx.onMenuShareTimeline({
  title: '', // 分享标题
  link: shareUrl, // 分享链接
  imgUrl: '', // 分享图标
  success: function () { 
   alert('已分享');
   // alert($('.no-num').html());
  },
  cancel: function () { 
   alert('已取消');
   // 用户取消分享后执行的回调函数
   // alert('取消');
  }
  });
 });

5.通过error接口处理失败验证
config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看

wx.error((res)=> {
 alert(res.errMsg);
})

6.基础接口
 •分享到朋友圈接口

wx.onMenuShareTimeline({
 title: '', // 分享标题
 link: '', // 分享链接
 imgUrl: '', // 分享图标
 success: function () { 
 // 用户确认分享后执行的回调函数
 },
 cancel: function () { 
 // 用户取消分享后执行的回调函数
 }
});

 •分享给好友的接口

wx.onMenuShareAppMessage({
 title: '', // 分享标题
 desc: '', // 分享描述
 link: '', // 分享链接
 imgUrl: '', // 分享图标
 type: '', // 分享类型,music、video或link,不填默认为link
 dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
 success: function () { 
 // 用户确认分享后执行的回调函数
 },
 cancel: function () { 
 // 用户取消分享后执行的回调函数
 }
});

如果这里需要在分享的内容中加入用ajax异步请求拿到的内容,必须在ajax请求返回后的成功函数中再调用一次该分享接口,但是必须将分享接口放在wx.ready函数中,不能单独调用。因为客户端分享操作是一个同步操作,这时候使用 ajax的数据还没有返回。
7. 这些步骤看起来似乎比较简单,但是调试的过程中难免会遇到很多问题,因为jssdk接口还是有很多的限制的。一不小心就踩到了坑。

8. 最后,我将这个接口进行了一下封装

'use strict';
let wxDefaultOptions = {
 debug: true,
 appId: '',
 timestamp: 0,
 nonceStr: '',
 signature: '',
 jsApiList: [
 'checkJsApi',
 'onMenuShareTimeline',
 'onMenuShareAppMessage',
 'onMenuShareQQ',
 'onMenuShareWeibo',
 'hideMenuItems',
 'showMenuItems',
 'hideAllNonBaseMenuItem',
 'showAllNonBaseMenuItem',
 'translateVoice',
 'startRecord',
 'stopRecord',
 'onRecordEnd',
 'playVoice',
 'pauseVoice',
 'stopVoice',
 'uploadVoice',
 'downloadVoice',
 'chooseImage',
 'previewImage',
 'uploadImage',
 'downloadImage',
 'getNetworkType',
 'openLocation',
 'getLocation',
 'hideOptionMenu',
 'showOptionMenu',
 'closeWindow',
 'scanQRCode',
 'chooseWXPay',
 'openProductSpecificView',
 'addCard',
 'chooseCard',
 'openCard'
 ]
};
//let shareUrl = 'http://xxx' + location.pathname;

let getWxParam = (url, wxOptions) => {
 let url = location.href.split('#')[0];
 url = encodeURIComponent(url);
 let promise = new Promise((resolve, reject)=> {
 $.ajax({
  type:'GET',
  url: 'http://xxx/xxx?param='+url,
  dataType: 'jsonp'
 })
 .then((data)=> {
  let wxParam = data;
  console.log(wxParam);
  wxOptions.appId = 'wxeb5c3f4a03b880f0';
  wxOptions.timestamp = wxParam.timestamp;
  wxOptions.nonceStr = wxParam.nonceStr;
  wxOptions.signature = wxParam.signature;
  wx.config(wxOptions);
  wx.error((res)=> {
  alert(res.errMsg);
  })
  resolve();
 }, (error)=> {
  console.log(error);
 })
 });
 return promise;
}

//分享到朋友圈
let shareSocial = (param)=> {
 wx.onMenuShareTimeline({
  title: param.title, // 分享标题
  link: param.link, // 分享链接
  imgUrl: param.imgUrl, // 分享图标
  success: function () { 
  // 用户确认分享后执行的回调函数
  param.suCallback();
  },
  cancel: function () { 
  // 用户取消分享后执行的回调函数
  param.failCalback();
  }
 });
}
//分享给好友
let shareToFriends = (param) => {

 wx.onMenuShareAppMessage({
  title: param.title,
  desc: param.desc,
  link: param.link,
  imgUrl: param.imgUrl,
  trigger: function (res) {

  },
  success: function (res) {
  param.suCallback();
  },
  cancel: function (res) {
  },
  fail: function (res) {
  param.failCalback();
  console.alert(JSON.stringify(res));
  }
 });
}
//title,desc,link,imgUrl,suCallback, failCalback
let jssdk = (param) => {
 wx.ready(()=> {
 //分享到朋友圈
 shareSocial(param);
 shareToFriends(param);

 })
}

function callWx(param, wxoptions) {
 getWxParam(param.url, wxOptions).then(()=> {
 jssdk(param);
 })
}
//param = {url: '', title:'',desc:'',link:'',imgUrl:'',suCallback:func, failCalback: func}
module.exports = {
 wxDefaultOptions,//更改配置
 callWx, //默认配置,进行config配置 和ready后定制微信分享内容,
}

本文已被整理到了《JavaScript微信开发技巧汇总》,欢迎大家学习阅读。

为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js资料prototype 属性
Mar 13 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
May 16 Javascript
js中的caller和callee属性介绍和例子
Jun 07 Javascript
JavaScript实现点击自动选择TextArea文本的方法
Jul 02 Javascript
微信小程序对接七牛云存储的方法
Jul 30 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
Oct 28 Javascript
20个必会的JavaScript面试题(小结)
Jul 02 Javascript
微信小程序绘制图片发送朋友圈
Jul 25 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
Aug 07 Javascript
基于Vue中使用节流Lodash throttle详解
Oct 30 Javascript
angular组件间传值测试的方法详解
May 07 Javascript
详解JavaScript节流函数中的Throttle
Jul 16 #Javascript
很棒的js选项卡切换效果
Jul 15 #Javascript
轻松5句话解决JavaScript的作用域
Jul 15 #Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 #Javascript
IE下JS保存图片的简单实例
Jul 15 #Javascript
jQuery 3.0中存在问题及解决办法
Jul 15 #Javascript
JavaScript6 let 新语法优势介绍
Jul 15 #Javascript
You might like
php常见的魔术方法详解
2014/12/25 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
2019/05/27 PHP
js汉字转拼音实现代码
2013/02/06 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
详解Vue.js——60分钟组件快速入门(上篇)
2016/12/05 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
浅谈React之状态(State)
2018/09/19 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
基于python实现学生信息管理系统
2019/11/22 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
简述数组与指针的区别
2014/01/02 面试题
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
中学生学雷锋演讲稿
2014/04/26 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
幸福终点站观后感
2015/06/04 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
护士业务学习心得体会
2016/01/25 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
浅谈redis缓存在项目中的使用
2021/05/20 Redis
Python实现机器学习算法的分类
2021/06/03 Python
CSS极坐标的实例代码
2021/06/03 HTML / CSS