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
+ "×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;
}
}