公众号网页发开教程
2017-05-17 19:25
92 查看
API
微信公众平台技术文档 ,本教程需要使用该接口文档中如下部分内容:微信网页授权
微信JS-SDK说明文档
公众号配置
资质
配置
功能>公众号设置>功能设置网页授权开发
网页授权,必须在微信中打开如下格式页面(注意:必须是在微信中打开):https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
注意:本教程为授权获取用信息,所以链接中scope参数值必须为snsapi_userinfo
链接中的参数说明及授权后获取用户信息方法,在微信网页授权API描述的很详细不在冗述,基本流程如下:
微信接口全部使用HTTP协议,官网API让使用get方法调用,本人实际全部使用post方法也可以
如果用户同意授权,页面将跳转至 redirect_uri?code=CODE&state=STATE
code换取网页授权access_token、refresh_token和openid,接口如下:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
access_token和openid拉取用户信息,接口如下:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权,微信提供接口如下:
检验授权凭证(access_token)是否有效
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
刷新access_token
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
微信分享开发
引入JS文件
在需要调用微信JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
wx.config
微信配置初始化方法,必须在页面首先调用wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名,见Java生成签名的随机串算法 jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS接口列表 });
注:分享需要使用的JS接口
onMenuShareTimeline //分享到朋友圈 onMenuShareAppMessage //分享给好友 onMenuShareQQ //分享到QQ onMenuShareWeibo //分享到微博 onMenuShareQZone //分享到QQ空间
Java生成签名的随机串算法
/** * 生成wx.config参数 * @param jsapiTicket * @param code * @param state * @param url * @return */ public static Map<String, Object> sign(String jsapiTicket, String code, String state, String url) { Map<String, Object> map = new HashMap<String, Object>(); try { url = url +"?code="+code+"&state="+state; Map<String, String> ret = new HashMap<String, String>(); String nonceStr = createNonceStr(); String timesTamp = createTimesTamp(); StringBuffer params = new StringBuffer(); String signature = ""; //注意这里参数名必须全部小写,且必须有序 params.append("jsapi_ticket=").append(jsapiTicket) .append("&noncestr=").append(nonceStr) .append("×tamp=").append(timesTamp) .append("&url=").append(url); log.info("params@"+params.toString()); MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(params.toString().getBytes("UTF-8")); signature = byteToHex(crypt.digest()); ret.put("nonceStr", nonceStr); ret.put("timestamp", timesTamp); ret.put("signature", signature); ret.put("appId", getPropertiesValue(WX_APP_ID)); map.put("result", "1"); map.put("data", ret); map.put("error_msg", ""); return map; } catch (Exception e) { log.error(e.getMessage(), e); map.put("result", "0"); map.put("data", null); map.put("error_msg", "获取配置参数失败"); return map; } } /** * 生成签名的随机串 * @return */ private static String createNonceStr() { return UUID.randomUUID().toString(); } /** * 生成签名的时间戳 * @return */ private static String createTimesTamp() { return Long.toString(System.currentTimeMillis() / 1000); } /** * sha1签名 * @param hash * @return */ private static String byteToHex(final byte[] hash) { cf9c Formatter formatter = new Formatter(); for (byte b : hash) { formatter.format("%02x", b); } String result = formatter.toString(); formatter.close(); return result; }
微信 JS 接口签名校验工具
wx.ready
wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 });
分享接口的初始化都必须放在wx.ready中
wx.error
wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 });
分享接口
分享到朋友圈
获取“分享到朋友圈”按钮点击状态及自定义分享内容接口wx.onMenuShareTimeline({ title: '', // 分享标题 link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
link:该链接域名或路径必须与当前页面对应的公众号JS安全域名一致,此处需要特别注意,如果域名不对将导致分享接口配置不生效,以下接口同理
分享给朋友
获取“分享给朋友”按钮点击状态及自定义分享内容接口wx.onMenuShareAppMessage({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
分享到QQ
获取“分享到QQ”按钮点击状态及自定义分享内容接口wx.onMenuShareQQ({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
分享到腾讯微博
获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口wx.onMenuShareWeibo({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
分享到QQ空间
获取“分享到QQ空间”按钮点击状态及自定义分享内容接口wx.onMenuShareQZone({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } });
示例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <!-- 省略页面 --> <!--引入微信JS--> <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript"> wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'xxxxxxxxxxx', // 必填,公众号的唯一标识 timestamp: 1495164833, // 必填,生成签名的时间戳 nonceStr: '1c604bf7-b176-4d3c-96df-7ce30285fa0f', // 必填,生成签名的随机串 signature: 'xxxxxxxxxxx',// 必填,签名,见Java生成签名的随机串算法 jsApiList: ['onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }) wx.ready(function(){ wx.onMenuShareTimeline({ title: '', // 自定义分享标题 link: '', // 自定义分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: '', // 自定义分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); }) </script> </body> </html>
PS
理想流程下应该是:(1)打开“网页授权链接”页面>(2)用户授权操作>(3)页面JS接口配置>(4)用户分享操作>再到(1)的循环
这样一个循环过程必须要求,“(3)JS接口配置”中,将link赋值为“网页授权链接”,虽然微信接口中有如下要求:
link:该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
“网页授权链接”格式是:https://open.weixin.qq.com/xxxxxxx,肯定与公众号JS安全域名不一致,但是在之前开发中我一直是这样做的,居然可以配置成功,但是最近在发现分享接口link赋值为“网页授权链接”,在微信开发者工具中调试一切正常,在微信实际环境下会导致分享接口配置不生效,最后的解决办法时,将link赋值为“JS接口安全域名”下的一个页面,该页面直接重定向到“网页授权链接”,这样流程就变为:
(1)打开“重定向页面”>(2)页面直接重定向到“网页授权链接”>(3)打开“网页授权链接”页面>(4)用户授权操作>(5)页面JS接口配置,将link赋值为“重定向页面”>(6)用户分享操作>再到(1)的循环
整体效果和直接分享“网页授权链接”一样,虽然会有一个重定向的过程,但是总体效果和直接打开“网页授权链接”差别不大,至于具体为什么分享接口link赋值为“网页授权链接”以前可以使用,现在不能用了,应该是微信的一个小bug现在修复了。
相关文章推荐
- 公众号第三方平台开发 - 教程五 代公众号发起网页授权源码
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 网页设计基础:Div+CSS布局入门教程
- CSS网页布局入门教程12:纵向导航菜单
- 使用Fireworks 8制作网页效果图2-生成网页[原创教程]
- CSS网页布局入门教程7:二列固定宽度居中
- CSS网页布局入门教程3:一列固定宽度居中
- 初学网页Javascript经典小教程总结[转载+慢慢补充]
- CSS网页布局入门教程6:左列固定,右列宽度自适应
- CSS网页布局入门教程14:纵向下拉及多级弹出式菜单
- CSS网页布局入门教程10:带当前标识的标签式横向导航
- CSS网页布局入门教程8:三列浮动中间列宽度自适应
- 网页教程与代码
- XHTML教程 CSS网页布局中HTML标签的语义(二)
- CSS网页布局入门教程9:用CSS设计网站导航――横向导航
- 重典千枫网页刷新教程(一)
- 用onclick事件实现文章可用大字体中字体小字体显示网页教程