java開(kāi)發(fā)微信分享接口的步驟
更新時(shí)間:2017年11月22日 09:43:56 作者:admingy
這篇文章主要為大家詳細(xì)介紹了java開(kāi)發(fā)微信分享接口的步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
微信分享接口的java開(kāi)發(fā)的一些小步驟,具體內(nèi)容如下
1.配置接口信息進(jìn)行驗(yàn)證

代碼如下:
/**
* 訪問(wèn)沒(méi)認(rèn)證的地址跳轉(zhuǎn)
*
* @param request
* @return 登錄頁(yè)面
* @throws Exception
*/
@RequestMapping(value = "/checkWxDomainUrl", method = RequestMethod.GET)
public void checkWxDomainUrl(HttpServletRequest request) throws Exception {
try {
// 開(kāi)發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫(xiě)的服務(wù)器地址URL上,GET請(qǐng)求攜帶參數(shù)
String signature = request.getParameter("signature");// 微信加密簽名(token、timestamp、nonce。)
String timestamp = request.getParameter("timestamp");// 時(shí)間戳
String nonce = request.getParameter("nonce");// 隨機(jī)數(shù)
String echostr = request.getParameter("echostr");// 隨機(jī)字符串
// 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
String[] params = new String[] { TOKEN, timestamp, nonce };
Arrays.sort(params);
// 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
String clearText = params[0] + params[1] + params[2];
String algorithm = "SHA-1";
String sign = new String(Hex.encodeHex(
MessageDigest.getInstance(algorithm).digest((clearText).getBytes()), true));
// 開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信
if (signature.equals(sign)) {
response.getWriter().print(echostr);
}
} catch (Exception e) {
e.printStackTrace();
}
}
2.js配置

3.獲取分享頁(yè)面js需要參數(shù) 其中獲取token、ticket加入緩存
/**
* 方法名:getWxConfig</br>
* 詳述:獲取微信的配置信息 </br>
* 開(kāi)發(fā)人員:gy
* @param request
* @return 說(shuō)明返回值含義
* @throws 說(shuō)明發(fā)生此異常的條件
*/
@Override
public Map<String, Object> getWxConfig(HttpServletRequest request) {
Map<String, Object> ret = new HashMap<String, Object>();
String appId = wXConfigure.getAppId(); // 必填,公眾號(hào)的唯一標(biāo)識(shí)
String requestUrl = request.getRequestURL().toString();
String accessToken = null;
String jsapiTicket = null;
String url = "";
String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成簽名的時(shí)間戳
String nonceStr = UUID.randomUUID().toString(); // 必填,生成簽名的隨機(jī)串
//此處先在緩存中查詢,查詢不到在調(diào)用接口查詢 緩存中需要設(shè)置access-token的有效時(shí)間
// redisTemplate.opsForValue().getOperations().delete(prefix);
// accessToken = (String) redisTemplate.opsForValue().get(prefix);
Token accessTokenFromRedis = getAccessTokenFromRedis();
accessToken = accessTokenFromRedis.getAccessToken();
if (accessTokenFromRedis.getAccessToken() != null) {
jsapiTicket = (String) redisTemplate.opsForValue().get(prefixTicket);
if (jsapiTicket==null) {
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken
+ "&type=jsapi";
JSONObject json = httpRequest(url, "GET", null);
if (json != null) {
jsapiTicket = json.getString("ticket");
redisTemplate.opsForValue().set(prefixTicket, jsapiTicket);
redisTemplate.expire(prefixTicket, Integer.parseInt(wXConfigure.getExpireTime()),
TimeUnit.SECONDS);
}
}
}
String signature = "";
// 注意這里參數(shù)名必須全部小寫(xiě),且必須有序
String sign = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp="
+ timestamp + "&url=" + requestUrl;
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(sign.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
ret.put("appId", appId);
ret.put("timestamp", timestamp);
ret.put("nonceStr", nonceStr);
ret.put("signature", signature);
return ret;
}
/**
* 方法名:byteToHex</br>
* 詳述:字符串加密輔助方法 </br>
* 開(kāi)發(fā)人員:gy </br>
* @param hash
* @return 說(shuō)明返回值含義
* @throws 說(shuō)明發(fā)生此異常的條件
*/
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;
}
/**
* 從redis中獲取accessToken,指定key的String值,過(guò)期時(shí)間7200s
*
* @param key
* @return
*/
public Token getAccessTokenFromRedis() {
Token token = null;
String assesstoken = (String) redisTemplate.opsForValue().get(wXConfigure.getTokenKey());
if (null != assesstoken && !"".equals(assesstoken)) {
token = new Token();
token.setAccessToken(assesstoken);
return token;
} else {
token = CommonWxUtil.getToken(wXConfigure.getAppId(), wXConfigure.getSecret());
redisTemplate.opsForValue().set(wXConfigure.getTokenKey(), token.getAccessToken());
redisTemplate.expire(wXConfigure.getTokenKey(), Integer.parseInt(wXConfigure.getExpireTime()),
TimeUnit.SECONDS);
return token;
}
}
4.頁(yè)面的相關(guān)js的引入
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
// 微信信息的以及調(diào)用的配置
// 微信信息的以及調(diào)用的配置
var signature=$("#signature").val();
var appId=$("#appId").val();
var timestamp=$("#timestamp").val();
var nonceStr=$("#nonceStr").val();
var userId=$("#userId").val();
var productName=1;
alert(signature);
wx.config({
debug: false,
appId:appId ,
timestamp:timestamp,
nonceStr: nonceStr,
signature:signature,
jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone']
});
wx.ready(function(){
var isOk = true;
wx.checkJsApi({
jsApiList: ['onMenuShareTimeline'],
fail: function (res) {
alert("微信版本太低,不支持分享給朋友的功能!");
isOk = false;
},
success: function (res) {
alert("支持QQ分享。");
}
});
// 獲取“分享到朋友圈”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
wx.onMenuShareTimeline({
title: '第六篇 :微信公眾平臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)Java版之如何自定義微信公眾號(hào)菜單',
desc: '第六篇 :微信公眾平臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)Java版之如何自定義微信公眾號(hào)菜單',
link: 'http://4d536256.ngrok.io/login',
imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png',
success: function (res) {
alert(JSON.stringify(res));
if (res.errMsg=='shareTimeline:ok') {
/* $.ajax({
type:"get",
url:'insertCollectShare',
data:{
userId:userId,
},
dataType:"json",
async: false,
success:function(data){
alert(200);
},
error:function(data){
var rUrl = xhr.getResponseHeader('CONTENTPATH');
window.location.href = rUrl;
}
}); */
// 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
/* window.location.href = contextRoot + 'insertCollectShare?userId=' + userId; */
}
},
cancel: function (res) {
// 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
alert(res);
}
});
// 獲取“分享給朋友”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
wx.onMenuShareAppMessage({
title: '第七篇 :微信公眾平臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)Java版之如何獲取微信用戶基本信息', // 分享標(biāo)題
desc: "第七篇 :微信公眾平臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)Java版之如何獲取微信用戶基本信息", // 分享描述
link:'http://4d536256.ngrok.io/login',
imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo)
type: 'link', // 分享類型,music、video或link,不填默認(rèn)為link
});
//獲取“分享到QQ”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
wx.onMenuShareQQ({
title: '第六篇 :微信公眾平臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)Java版之如何自定義微信公眾號(hào)菜單', // 分享標(biāo)題
desc: '第六篇 :微信公眾平臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)Java版之如何自定義微信公眾號(hào)菜單', // 分享描述
link: 'http://4d536256.ngrok.io/login', // 分享鏈接
imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo)
success: function () {
// 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
},
cancel: function () {
// 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
}
});
//獲取“分享到騰訊微博”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
wx.onMenuShareWeibo({
title: '分享到騰訊微博標(biāo)題', // 分享標(biāo)題
desc: '分享到騰訊微博描述', // 分享描述
link: 'http://4d536256.ngrok.io/login', // 分享鏈接
imgUrl: 'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo)
success: function () {
// 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
},
cancel: function () {
// 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
}
});
//獲取“分享到QQ空間”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
wx.onMenuShareQZone({
title: '分享到QQ空間標(biāo)題11111111111111111', // 分享標(biāo)題
desc: '分享到QQ空間描述2222222222222222222', // 分享描述
link: 'http://4d536256.ngrok.io/login',
imgUrl:'http://busc.4ggogo.com/media/media/img/home-show-a.png', // 分享圖標(biāo)
success: function () {
// 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
},
cancel: function () {
// 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
}
});
});
</script>
備注:調(diào)轉(zhuǎn)的路徑為配置的域名路徑,不然無(wú)法調(diào)用,圖片大小不可以大于300k
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)上傳圖片進(jìn)行切割的方法
這篇文章主要介紹了java實(shí)現(xiàn)上傳圖片進(jìn)行切割的方法,以完整實(shí)例形式分析了Java針對(duì)上傳圖片進(jìn)行切割的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
java自定義驗(yàn)證器的實(shí)現(xiàn)示例
在對(duì)外暴露接口中,我們通常會(huì)對(duì)入?yún)⑦M(jìn)行驗(yàn)證,比如一些字符串非空判斷等,本文主要介紹了java自定義驗(yàn)證器的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

