从百度上找寻了大量的资料,发现都比较模糊,还有很多PHP版本的,特此写一个Java版本的,比较简单的版本。
步骤一:公众号设置
首先要有个认证的订阅号或者服务号,如果没有,那你可以×掉网页了。在公众号中需要设置:JS安全域名->下载验证txt到服务器根目录验证->知道自己公众号的AppId和AppSecret->设置IP白名单。参考具体操作:自定义微信分享 凡科。友情提示:IP白名单至少两个,一个是服务器IP,一个是当前开发电脑的公网IP。
步骤二:后台代码的搭建
核心步骤为:获取AccessToken->通过AccessToken获取Ticket->通过Ticket和浏览器url进行签名->返回数据到前端。
搞懂之后很简单,只需要看懂一点点代码就行,主要核心代码微信已经提供好了。当前项目时用spring mvc作为控制层,后台只有三个文件HttpRequestUtil.java,Sign.java,Controller.java。
第一个java文件是Java Http请求的方法,第二个是微信官方提供的签名方法,第三个是自己手动写的Controller层。
下面我将会一一贴出来。
Controller.java:
mport com.txbsl.Utils.HttpRequestUtil;
import com.txbsl.Utils.Sign;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Controller
{
public static final String AppI = "*******************";
public static final String AppS = "********************************";
public static final String AccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+AppI+"&secret="+AppS;
public static final String TicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
public static String AccessToken = null;
public static String Ticket = null;
@ResponseBody
@RequestMapping({"/getMsg"})
public Map<String, String> test(HttpServletRequest request, String url)
throws Exception
{
JSONObject jsonObject = HttpRequestUtil.httpRequest(AccessTokenUrl, "GET", "");
AccessToken = (String)jsonObject.get("access_token");
String requestUrl = TicketUrl.replace("ACCESS_TOKEN", AccessToken);
JSONObject jsonObject2 = HttpRequestUtil.httpRequest(requestUrl, "GET", "");
Ticket = (String)jsonObject2.get("ticket");
Map<String, String> map = Sign.sign(Ticket, url);
return map;
}
}
HttpRequestUtil.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import net.sf.json.JSONObject;
public class HttpRequestUtil
{
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr)
{
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
InputStream inputStream = null;
try
{
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection)url.openConnection();
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod)) {
httpUrlConn.connect();
}
if (null != outputStr)
{
OutputStream outputStream = httpUrlConn.getOutputStream();
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
return JSONObject.fromObject(buffer.toString());
}
catch (ConnectException ce)
{
ce.printStackTrace();
System.out.println("Weixin server connection timed out");
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("http request error:{}");
}
finally
{
try
{
if (inputStream != null) {
inputStream.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
Sign.java
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class Sign
{
public static Map<String, String> sign(String jsapi_ticket, String url)
{
Map<String, String> ret = new HashMap();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String signature = "";
String string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + url;
System.out.println(string1);
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);
return ret;
}
private static String byteToHex(byte[] hash)
{
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", new Object[] { Byte.valueOf(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() / 1000L);
}
}
步骤三:前端页面配置
主要就是添加weixin.js , jquery.js ,再自己写一段js,核心代码如下:
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
$.ajax({
type: "post",
dataType: "json",
url: "/getMsg",
data: {
'url': window.location.href
},
complete: function () {
},
success: function (json) {
// alert("url:" + json.url + "\n" + "jsapi_ticket:" + json.jsapi_ticket + "\n" + "nonceStr:" + json.nonceStr + "\n" + "timestamp:" + json.timestamp + "\n" + "signature:" + json.signature);
wx.config({
debug: false, //
appId: 填写自己公众号ID, // 必填,公众号的唯一标识
timestamp: json.timestamp, // 必填,生成签名的时间戳
nonceStr: json.nonceStr, // 必填,生成签名的随机串
signature: json.signature,// 必填,签名,见附录1
jsApiList: ['onMenuShareTimeline',
'onMenuShareAppMessage', 'showOptionMenu']
// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
},
});
});
var shareTitle = "天心·白沙里微售楼部";
var shareDesc = "天心·白沙里-黄金金铺,豪景公寓,不限购,不限贷!!!";
var shareImg = "http://www.txbsl.com/img/logo-1.png";
var url = window.location.href;
wx.ready(function () {
share();
});
function share() {
wx.showOptionMenu();
//微信朋友圈分享
wx.onMenuShareTimeline({
title: shareTitle, // 分享标题
link: url, // 分享链接
imgUrl: shareImg, // 分享图标
success: function() {
},
cancel: function() {
}
});
//微信朋友分享
wx.onMenuShareAppMessage({
title: shareTitle, // 分享标题
desc: shareDesc,
link: url, // 分享链接
imgUrl: shareImg, // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function() {
},
cancel: function() {
}
});
//qq分享
wx.onMenuShareQQ({
title: shareTitle, // 分享标题
desc: shareDesc, // 分享描述
link: url, // 分享链接
imgUrl: shareImg, // 分享图标
success: function() {
},
cancel: function() {
}
});
//腾讯微薄分享
wx.onMenuShareWeibo({
title: shareTitle, // 分享标题
desc: shareDesc, // 分享描述
link: url, // 分享链接
imgUrl: shareImg, // 分享图标
success: function() {
},
cancel: function() {
}
});
//QQ空间分享
wx.onMenuShareQZone({
title: shareTitle, // 分享标题
desc: shareDesc, // 分享描述
link: url, // 分享链接
imgUrl: shareImg, // 分享图标
success: function() {
},
cancel: function() {
}
});
}
</script>