文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。

原文链接:http://blog.csdn.net/fansongy/article/details/44680987

width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=2080045857&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Fandroid-game%2F1521.html&dpc=1" style="font-size: 14px; font-weight: bold; border-width: 0px; margin: 0px; padding: 0px; font-family: arial, helvetica, clean, sans-serif; line-height: 16px;">

微信分享

微信上做推广活动一般都是着眼于微信分享,这篇文章介绍如何在页面中加入微信分享的处理。本文使用语言为Java+js。

原理

微信分享功能的难点,在于用户是否真正的分享了推广页面,所以我们要知道用户分享成功的操作。经过查询文档,微信提供了对应的JS接口。对应文档在这里 .

大体流程是这样的:

  • 绑定域名
  • 引入JS文件
  • 通过config接口注入权限验证配置
  • 通过ready接口处理成功验证
  • 通过error接口处理失败验证
  • 编写对应回调

如果你自信满满的完成了上面这些步骤,就可以开始着手测试了。 当点击对应功能时,微信会回调对应的接口。我的需求是当用户分享到自己的朋友圈时,做一些猥琐的操作 ,因此下面以分享朋友圈为例,当然其他功能也很类似,此处按下不表。

实现

上面概括了原理了原理,接下来一步一步看。本文可以结合 官方文档 一起看,毕竟它更新维护的比较勤。

绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注:登录后可在“开发者中心”查看对应的接口权限。

此处要注意了,微信服务号还没验证的程序狗,赶紧催促贵公司的商务人员,申请微信服务号验证,目前没有认证的服务号是没法使用大多数JS接口的

引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):

http://res.wx.qq.com/open/js/jweixin-1.0.0.js

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

这个没啥说的,就是注意要把引入放到其他步骤的上面,JS脚本按顺序加载,大家都懂的。

通过config接口注入权限验证配置

这个最麻烦了,首先说脚本的格式:

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

这部分信息的获取,推荐使用ajax请求一下自己的服务器,毕竟加密这东西没法在客户端搞。所以大体流程是用户打开网页,运行ajax脚本请求服务器一堆信息,成功发下来后,在写到js里面。下面上代码:

var url = location.href.split('#').toString();
$.ajax({type : "POST",url : "yourInterfaceURL",dataType : "html",async : false,data:"url="+url,success : function(dataStr) {var data = $.parseJSON(dataStr);wx.config({debug: true,appId: data.appid,timestamp: data.timestamp,nonceStr: data.nonceStr,signature: data.signature,        jsApiList: ['checkJsApi','onMenuShareTimeline']});},error: function(xhr, status, error) {alert(status);alert(xhr.responseText);},
});

这里有一点要注意,我们需要将请求页面的URL传上去,因为微信会在页面后面加入一些后缀比如&isInstall=0之类的。所以它要求你动态算一个URL地址,而不能硬编码。

然后服务器收到这请求就加密去。要加密要一个jsapi_ticket,而要jsapi_ticket又需要token.

由于原理一样,这里仅以jsapi_ticket为例:

public String jsapi_ticket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";public String getJsapiTicket() {long now = System.currentTimeMillis();if(now - curJSTokenTime > expiresJSToken*1000){String requestUrl = jsapi_ticket.replace("ACCESS_TOKEN", getToken());JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);System.out.println("Getting weixin js_token...URL:"+requestUrl);if (null != jsonObject) {try {curJSToken = jsonObject.getString("ticket");expiresJSToken = jsonObject.getInt("expires_in");curJSTokenTime = System.currentTimeMillis();System.out.println("update weixin token:"+curJSToken+"expires_in is:"+expiresJSToken+" curTime:"+curJSTokenTime);} catch (JSONException e) {System.out.println("Get JS_Token Error! errcode:{} errmsg:{}"+jsonObject.getInt("errcode")+jsonObject.getString("errmsg")+e);}} else {System.out.println("http for weixin return null");curJSToken="";}} return curJSToken;
}

拿到了这个东西就可以算加密串了。当然用这个函数需要先去取Access_Token,这就又要用到appid和appSercet,你必然知道在哪找到这货,啥?不知道?去微信的开发者中心的配置项那边碰碰运气吧。

public Map<String, String> makeWXTicket(String jsapi_ticket, String url) {Map<String, String> ret = new HashMap<String, String>();String nonce_str = create_nonce_str();String timestamp = create_timestamp();String string1;String signature = "";//注意这里参数名必须全部小写,且必须有序string1 = "jsapi_ticket=" + jsapi_ticket +"&noncestr=" + nonce_str +"&timestamp=" + timestamp +"&url=" + url;try{MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(string1.getBytes("UTF-8"));signature = byteToHex(crypt.digest());}catch (NoSuchAlgorithmException e){e.printStackTrace();}catch (UnsupportedEncodingException e){e.printStackTrace();}ret.put("url", url);ret.put("jsapi_ticket", jsapi_ticket);ret.put("nonceStr", nonce_str);ret.put("timestamp", timestamp);ret.put("signature", signature);ret.put("appid", appId);return ret;
}private static String byteToHex(final byte[] hash) {Formatter formatter = new Formatter();for (byte b : hash){formatter.format("%02x", b);}String result = formatter.toString();formatter.close();return result;
}private static String create_nonce_str() {return UUID.randomUUID().toString();
}private static String create_timestamp() {return Long.toString(System.currentTimeMillis() / 1000);
}

makeWXTicket这个函数有俩参数,第一个是上面的jsapi_ticket,第二个是页面传上来的url,返回值是一个Map。后面就看各路大神八仙过海了,大死不灵啥的,总之你肯定有办法把这货传回去的。传回去后,就到wx.config中把内容填充进去了。

ready & error & 功能调用

最恶心的部分搞过去,其他就一马平川了。

wx.ready(function () {wx.onMenuShareTimeline({title: '互联网之子?',link: 'http://movie.douban.com/subject/25785114/',imgUrl: 'http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg',trigger: function (res) {// 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回.alert('click shared');},success: function (res) {alert('shared success');//some thing you should do},cancel: function (res) {alert('shared cancle');},fail: function (res) {alert(JSON.stringify(res));}});wx.error(function (res) {alert(res.errMsg);});
});

在网页中添加以上内容,用户点击对应的操作就会弹出提示对话框啦 如果没有回调,签名又没有问题,去开发者中心检查一下接口是否开通了吧。

总结

接入过程很纠结,测试比较麻烦,微信服务器的回调只认有备案的域名。验签可以使用这个网址 做测试。总之,祝你好运~

如果你觉得这篇文章对你有帮助,可以顺手点个顶,不但不会喜当爹,还能让更多人能看到它... 

微信开发(六)微信分享接入相关推荐

  1. 微信开发:微信js_sdk 分享,前端部分(二)

    微信开发:微信js-sdk前端分享,代码如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> ...

  2. 微信鉴权服务器地址,微信开发之微信授权登录

    本篇教程探讨了微信开发之微信授权登录,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 应用场景是:用Hbuilder打包app,在app中点击微信授权登录或者某一操作, ...

  3. php 微信 语音,PHP语言微信开发:微信录音临时转永久存储

    本文主要向大家介绍了PHP语言微信开发:微信录音临时转永久存储,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 最近做开发的时候碰到了这个问题,甲方希望用户在微信端的录音能够一直有效.就 ...

  4. 微信开发 --- 调用微信上传图片接口,并保存到自己的服务器

    微信开发 - 调用微信上传图片接口,并保存到自己的服务器 整体思路是这样的: 1.先把手机上的图片上传到微信服务器,然后返回一个图片ID 2.在通过后台根据ID从微信后台拿到流,保存到服务器 前几个步 ...

  5. 微信开发,微信开发者平台

    微信小程序 小程序介绍 微信小程序是一种全新的连接用户端与服务端的方式. 小程序可以在微信内被便捷地获取和传播. 小程序具有出色的用户体验. ###为什么要学习小程序 微信小程序开发成本低.使用方便. ...

  6. 微信开发(微信公众号)

    一. 准备工作 a) 账号 在SAE上面注册一个账号. 在微信公众号开发平台地址 https://mp.weixin.qq.com  注册一个微信公众号. 注意:1.个人只能申请到个人类型的订阅号. ...

  7. 微信开发之微信公众号

    [b]订阅号和服务号的区别?[/b] 微信将公众号分为两类:订阅号和服务号,这两类公众号有着体验上的区别.订阅号用于媒体.政府等新闻发布平台,时下非常流行的自媒体概念一般都是使用订阅号. 订阅号和服务 ...

  8. 微信jsapi支付获取code_微信开发之微信公众平台开发之JSAPI公众号支付

    本文将带你了解微信开发微信公众平台开发之JSAPI公众号支付,希望本文对大家学微信有所帮助. 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.co ...

  9. 【微信开发】微信公众号开发 之 编辑模式使用

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/20306735 . . 本人 微信公众账号(订阅号) : ...

  10. 【坑爹微信】微信开发基础 --- 微信快捷登陆问题解决

    目录 List 那一抹淡淡的忧伤-–微信开发基础 用纯js是不可能用纯js了,这辈子都不用纯js了 -– 微信JSSDK开发以及问题解答 要你命3000 -- 微信支付开发系列问题解决 导语 微信快捷 ...

最新文章

  1. 1、cocos2dx开发学习第一篇-项目工程的创建
  2. J-Link 输出供电问题
  3. C++ I/O语法及其用法
  4. 使用secure CRT的SFTP在LINUX与WINDOWS下交换文件
  5. 大三下学期十四周总结
  6. [Bugku][Web][CTF] 16-29 write up
  7. debian9.8无法切换中文输入法
  8. [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择
  9. Oracle注入点信息基本检测
  10. 【优化算法】先导粘菌算法(LSMA)【含Matlab源码 1436期】
  11. BP神经网络算法推导过程
  12. 模电_热敏PTC电阻_NTC电阻-区别与作用-20190507
  13. python编程基础-类的使用
  14. 计算机防火墙服务不能启动不了,Windows防火墙不能启动 服务也不能启动,怎么回事?...
  15. 嵌入式操作系统风云录:历史演进与物联网未来第2章 Chapter2
  16. 薛定谔 | 小分子叠合
  17. iframe下的excel导出以及ckeditor的非空校验
  18. 奥维地图中加载天地图方法
  19. 中国石油大学《钢结构》第一阶段在线作业
  20. 软考-信息管理——学习笔记_证

热门文章

  1. 服务器并发C10K/C100k/C10M问题(重制版)
  2. 《流浪地球》登顶IMAX国产片历史最高票房
  3. 实用软件/浏览器插件/网站合集(个人向,更新中)
  4. vue 点击打开小窗口
  5. Docker容器时间不正确 差八个时区
  6. 招投标舞弊的22种方式及案例
  7. 矩阵模板 51nod 算法马拉松分解问题
  8. Scala语言第一章
  9. python 的魔方方法__getattribute__ 和__getattr__方法介绍
  10. 农场渲染文件服务器搭建,【渲染农场】如何搭建工作室小规模gpu渲染农场