2015-11-9 java 微信端JSSDK分享实现

5 篇文章 0 订阅
3 篇文章 0 订阅

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'],// 必填,签名,见附录1
						jsApiList : [ '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
				+ "&timestamp=" + 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;
	}
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值