2015-11-9 java 微信端JSSDK分享实现
来源:互联网 发布:房价会跌吗2017 知乎 编辑:程序博客网 时间:2024/06/07 03:10
1、设置公众号-JS接口安全域名 (如:baidu.com);
2、获取access_token 和 jsapi_ticket ,
注:access_token 获取连接 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID1&secret=SECRET1;
注:jsapi_ticket 获取连接 http://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=ACCESS_TOKEN1;
3、按WeixinUtils.java 获取signature;代码已经上传,可在下方下载;
4、获取signature使用的url必须与分享页面完全一致,建议通过ajax获取wx.config,然后加载jssdk;
5、jsp页面
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script><script type="text/javascript">$(function() {$.ajax({type : "post",dataType : "json",url : "/shareMsg.html",data : {url : window.location.href},complete : function() {},success : function(msg) {var data = msg['success'];if (data) {wx.config({debug : false, //appId : msg['appId'], // 必填,公众号的唯一标识timestamp : msg['timestamp'], // 必填,生成签名的时间戳nonceStr : msg['nonceStr'], // 必填,生成签名的随机串signature : msg['signature'],// 必填,签名,见附录1jsApiList : [ 'onMenuShareTimeline','onMenuShareAppMessage', 'showOptionMenu' ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2});}},});});var shareTitle = "法国游已经近在咫尺了,是朋友就帮我一把吧!";var shareDesc = "法国游已经近在咫尺了,是朋友就帮我一把吧!";var shareImg = "http://c.csdnimg.cn/jifen/images/xunzhang/xunzhang/bokezhuanjiamiddle.png";var url = window.location.href;wx.ready(function() {share();});function share() {wx.showOptionMenu();wx.onMenuShareTimeline({title : shareTitle, // 分享标题link : url, // 分享链接imgUrl : shareImg,desc : shareDesc, // 分享描述success : function() {}});wx.onMenuShareAppMessage({title : shareTitle, // 分享标题link : url, // 分享链接imgUrl : shareImg,desc : shareDesc, // 分享描述success : function() {}});}</script>
记录开发过程中的点滴!
WeixinUtils.java
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import java.security.MessageDigest;import java.util.Date;import java.util.Formatter;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.UUID;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;import com.uewei.base.utils.DateUtils;public class WeixinUtils {private static final String openIdUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID1&secret=SECRET1&code=CODE1&grant_type=authorization_code";private static final String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID1&secret=SECRET1";private static final String ticketUrl = "http://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=ACCESS_TOKEN1";public static final String appId = "wxc05ade1658398628";public static final String appSecret = "7ba21aff33ccf0e39a351a5082b6e711";public static final int baseLife = 3;public static final String EndTime = "2015-11-31 00:00:01";public static String getOpenId(HttpServletRequest request) throws Exception {String openId = null;String code = request.getParameter("code");if (StringUtils.isNotEmpty(code)) {String url = openIdUrl.replace("APPID1", appId).replace("SECRET1", appSecret).replace("CODE1", code);String result = getURLContent(url);System.out.println(result);openId = result.split("openid")[1].split("scope")[0].replaceAll("\"", "").replaceAll(",", "").replaceAll(" ", "").replaceAll(":", "");System.out.println("openId" + openId);}return openId;}public static Map<String, String> setShareConfig(HttpServletRequest request, String url) throws Exception {ServletContext context = request.getSession().getServletContext();String accessToken = (String) context.getAttribute("accessToken");if (StringUtils.isEmpty(accessToken)) {accessToken = getAccessToken();context.setAttribute("accessToken", accessToken);System.out.println(DateUtils.format(new Date(),DateUtils.DATETIME_FORMAT)+ "-------accessToken 超时,重新获取--------" + accessToken);}String jsapiTicket = (String) context.getAttribute("jsapiTicket");if (StringUtils.isEmpty(jsapiTicket)) {jsapiTicket = getTicket(accessToken);context.setAttribute("jsapiTicket", jsapiTicket);System.out.println(DateUtils.format(new Date(),DateUtils.DATETIME_FORMAT)+ "-------jsapiTicket 超时,重新获取--------" + jsapiTicket);}Map<String, String> ret = sign(jsapiTicket, url);request.setAttribute("url", ret.get("url"));request.setAttribute("jsapi_ticket", ret.get("jsapi_ticket"));request.setAttribute("nonceStr", ret.get("nonceStr"));request.setAttribute("timestamp", ret.get("timestamp"));request.setAttribute("signature", ret.get("signature"));request.setAttribute("appId", appId);return ret;};private static String getTicket(String accessToken) throws Exception {String ticket = null;String url = ticketUrl.replace("ACCESS_TOKEN1", accessToken);String result = getURLContent(url);System.out.println(result);ticket = result.split("ticket")[1].split("expires_in")[0].replaceAll("\"", "").replaceAll(",", "").replaceAll(" ", "").replaceAll(":", "");System.out.println("ticket:" + ticket);return ticket;}private static String getAccessToken() throws Exception {String accessToken = null;String url = accessTokenUrl.replace("APPID1", appId).replace("SECRET1",appSecret);String result = getURLContent(url);System.out.println(result);accessToken = result.split("access_token")[1].split("expires_in")[0].replaceAll("\"", "").replaceAll(",", "").replaceAll(" ", "").replaceAll(":", "");System.out.println("accessToken:" + accessToken);return accessToken;}private static String getURLContent(String url)throws MalformedURLException, IOException {String result = "";BufferedReader in = null;URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}// 使用finally块来关闭输入流if (in != null) {in.close();}return result;}private static Map<String, String> sign(String jsapi_ticket, String url) {Map<String, String> ret = new HashMap<String, String>();String nonce_str = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16).toLowerCase();String timestamp = Long.toString(System.currentTimeMillis() / 1000);String string1;String signature = "";// 注意这里参数名必须全部小写,且必须有序string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str+ "×tamp=" + timestamp + "&url=" + url;try {MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(string1.getBytes("UTF-8"));signature = byteToHex(crypt.digest());System.out.println("key--" + string1);System.out.println("url--" + url);System.out.println("jsapi_ticket--" + jsapi_ticket);System.out.println("nonceStr--" + nonce_str);System.out.println("timestamp--" + timestamp);System.out.println("signature--" + signature);} catch (Exception 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);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;}/** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/** * 将字节转换为十六进制字符串 * * @param mByte * @return */private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}}
2 0
- 2015-11-9 java 微信端JSSDK分享实现
- JSSDK实现微信分享功能
- 微信JSSDK自定义分享Java版
- 微信JSSDK开发JAVA版实现
- 微信JSSDK开发JAVA版实现
- jssdk实现自定义分享到微信好友和微信朋友圈
- JSSDK微信分享功能实现,有坑==||
- 静态html利用ajax实现微信jssdk分享
- JSSDK微信接口 Java接入 转发分享信息
- 微信分享jssdk实例
- 微信分享操作JSSDK
- 微信 jssdk 分享接口
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<一>
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<二>
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<三>
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<四>
- java微信网页授权获取用户信息以及JSSDK自定义分享等功能<五>
- 2015年微信公众平台开发 一键关注;非JSSDK自定义分享
- 第12周 项目1—图基本算法库
- PHP正则表达式屏蔽电话号码中间段
- 第十一周项目1—二叉树算法验证
- 第十周项目3-利用二叉树遍历思想解决问题
- CSS link和@import的区别
- 2015-11-9 java 微信端JSSDK分享实现
- Android中Parcelable接口用法
- 第九周-对称矩阵压缩存储的实现与应用
- 产品经理那些事儿——互动出版网
- 第十周项目2二叉树遍历的递归算法
- 第11周实践项目1验证算法-二叉树构造算法的验证
- MySQL 对日期的天数相加用法
- 手把手教SlidingMenu在Android Studio使用
- c文件如何编译为ko的MAKEFILE文件编写