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
原创粉丝点击