怎么使用微信JSSDK的自定义分享功能

JavaScript018

怎么使用微信JSSDK的自定义分享功能,第1张

登录你的微信平台,点击“公众号设置”。

2

点击“功能设置”,然后点击“设置”。

3

设置JS接口安全域名。这里填写的是一级域名,不带www和http。最多可以设置三个域名。设置完后点击确定。(多说一句,相比以前的分享没有任何域名限制,这里设置安全域名,目的是为了当发现此公众平台发现诱导分享行为时,可以根据此域名追溯到所有分享出去的链接,以及通过这些链接增加的粉丝。这样,微信就可以牢牢控制了你的微信平台,一旦发现违规,让分享链接失效,删除掉诱导行为增加的粉丝,是瞬间就可以完成的。因此,微信平台的开发者,一定要合理来使用分享功能,不要因小失大。等到你的微信平台被封,估计哭都来不及)

4

在开发者中心中获取你的AppID和AppSecret,接下来在获取令牌时,需要这两个信息。

5

获取令牌。在服务器端完成,代码如下:

function wx_get_token() {

$token = S('access_token')

if (!$token) {

$res = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.'你的AppID'.'&secret='.'你的AppSecret')

$res = json_decode($res, true)

$token = $res['access_token']

// 注意:这里需要将获取到的token缓存起来(或写到数据库中)

// 不能频繁的访问https://api.weixin.qq.com/cgi-bin/token,每日有次数限制

// 通过此接口返回的token的有效期目前为2小时。令牌失效后,JS-SDK也就不能用了。

// 因此,这里将token值缓存1小时,比2小时小。缓存失效后,再从接口获取新的token,这样

// 就可以避免token失效。

// S()是ThinkPhp的缓存函数,如果使用的是不ThinkPhp框架,可以使用你的缓存函数,或使用数据库来保存。

S('access_token', $token, 3600)

}

return $token

}

注意:返回的access_token长度至少要留够512字节。接口返回值:

{"access_token":"ACCESS_TOKEN","expires_in":7200}

{"access_token":"vdlThyTfyB0N5eMoi3n_aMFMKPuwkE0MgyGf_0h0fpzL8p_hsdUX8VGxz5oSXuq5dM69lxP9wBwN9Yzg-0kVHY33BykRC0YXZZZ-WdxEic4","expires_in":7200}

6

获取jsapi的ticket。jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。

function wx_get_jsapi_ticket(){

$ticket = ""

do{

$ticket = S('wx_ticket')

if (!empty($ticket)) {

break

}

$token = S('access_token')

if (empty($token)){

wx_get_token()

}

$token = S('access_token')

if (empty($token)) {

logErr("get access token error.")

break

}

$url2 = sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi",

$token)

$res = file_get_contents($url2)

$res = json_decode($res, true)

$ticket = $res['ticket']

// 注意:这里需要将获取到的ticket缓存起来(或写到数据库中)

// ticket和token一样,不能频繁的访问接口来获取,在每次获取后,我们把它保存起来。

S('wx_ticket', $ticket, 3600)

}while(0)

return $ticket

}

接口返回值:

{"errcode":0,"errmsg":"ok","ticket":"sM4AOVdWfPE4DxkXGEs8VMKv7FMCPm-I98-klC6SO3Q3AwzxqljYWtzTCxIH9hDOXZCo9cgfHI6kwbe_YWtOQg","expires_in":7200}

7

签名,将jsapi_ticket、noncestr、timestamp、分享的url按字母顺序连接起来,进行sha1签名。

noncestr是你设置的任意字符串。

timestamp为时间戳。

$timestamp = time()

$wxnonceStr = "任意字符串"

$wxticket = wx_get_jsapi_ticket()

$wxOri = sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s",

$wxticket, $wxnonceStr, $timestamp,

'要分享的url(从http开始,如果有参数,包含参数)'

)

$wxSha1 = sha1($wxOri)

END

步骤2 添加JS代码

生成签名后,就可以使用js代码了。在你的html中,进行如下设置即可。

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

<script type="text/javascript">

// 微信配置

wx.config({

debug: false,

appId: "你的AppID",

timestamp: '上一步生成的时间戳',

nonceStr: '上一步中的字符串',

signature: '上一步生成的签名',

jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 功能列表,我们要使用JS-SDK的什么功能

})

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

wx.ready(function(){

// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口

wx.onMenuShareTimeline({

title: '分享标题', // 分享标题

link:"分享的url,以http或https开头",

imgUrl: "分享图标的url,以http或https开头" // 分享图标

})

// 获取“分享给朋友”按钮点击状态及自定义分享内容接口

wx.onMenuShareAppMessage({

title: '分享标题', // 分享标题

desc: "分享描述", // 分享描述

link:"分享的url,以http或https开头",

imgUrl: "分享图标的url,以http或https开头", // 分享图标

type: 'link', // 分享类型,music、video或link,不填默认为link

})

})

</script>

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

备注:登录后可在“开发者中心”查看对应的接口权限。

步骤二:引入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

如需使用摇一摇周边功能,请引入 jweixin-1.1.0.js

备注:支持使用 AMD/CMD 标准模块加载方法加载

步骤三:通过config接口注入权限验证配置

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: '', // 必填,公众号的唯一标识

timestamp: , // 必填,生成签名的时间戳

nonceStr: '', // 必填,生成签名的随机串

signature: '',// 必填,签名,见附录1

jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

})

步骤四:通过ready接口处理成功验证

wx.ready(function(){

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

})

步骤五:通过error接口处理失败验证

wx.error(function(res){

// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。

})

接口调用说明

所有接口通过wx对象(也可使用jWeixin对象)来调用,参数是一个对象,除了每个接口本身需要传的参数之外,还有以下通用参数:

success:接口调用成功时执行的回调函数。

fail:接口调用失败时执行的回调函数。

complete:接口调用完成时执行的回调函数,无论成功或失败都会执行。

cancel:用户点击取消时的回调函数,仅部分有用户取消操作的api才会用到。

trigger: 监听Menu中的按钮点击时触发的方法,该方法仅支持Menu中的相关接口。

备注:不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回。

以上几个函数都带有一个参数,类型为对象,其中除了每个接口本身返回的数据之外,还有一个通用属性errMsg,其值格式如下:

调用成功时:"xxx:ok" ,其中xxx为调用的接口名

用户取消时:"xxx:cancel",其中xxx为调用的接口名

调用失败时:其值为具体错误信息

基础接口判断当前客户端版本是否支持指定JS接口

wx.checkJsApi({

jsApiList: ['chooseImage'], // 需要检测的JS接口列表,所有JS接口列表见附录2,

success: function(res) {

// 以键值对的形式返回,可用的api值true,不可用为false

// 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}

}

})

备注:checkJsApi接口是客户端6.0.2新引入的一个预留接口,第一期开放的接口均可不使用checkJsApi来检测。

分享接口

请注意不要有诱导分享等违规行为,对于诱导分享行为将永久回收公众号接口权限,详细规则请查看:朋友圈管理常见问题 。

获取“分享到朋友圈”按钮点击状态及自定义分享内容接口

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 () {

// 用户取消分享后执行的回调函数

}

})

获取“分享到QQ”按钮点击状态及自定义分享内容接口

wx.onMenuShareQQ({

title: '', // 分享标题

desc: '', // 分享描述

link: '', // 分享链接

imgUrl: '', // 分享图标

success: function () {

// 用户确认分享后执行的回调函数

},

cancel: function () {

// 用户取消分享后执行的回调函数

}

})

作者:李岩

链接:https://www.zhihu.com/question/23532498/answer/87259296

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。