Java微信分享接口开发详解
本文实例为大家分享了Java微信分享接口开发的具体代码,供大家参考,具体内容如下
Java微信分享,步骤是
1、根据当前的url,获取signature,nonceStr,timestamp和appId。
2、通过signature,nonceStr,timestamp和appId来配置微信wx.config。
3、通过wx.ready实现微信分享功能。
1、html端
引入微信JS-SDK.
//分享核心js代码
$(document).ready(function(){
//通过ajax,在页面加载的时候获取微信分享接口signature,nonceStr,timestamp和appId
$.ajax({
type:"post",
url:"/weixin/share",
dataType:"json",
data:"url="+window.location.href,
success:function(data){
wx.config({
debug:false,
appId:data.appId,
timestamp:data.timestamp,
nonceStr:data.nonceStr,
signature:data.signature,
jsApiList:['onMenuShareAppMessage','onMenuShareTimeline','hideAllNonBaseMenuItem','showMenuItems']
//功能列表,我们要使用JS-SDK的什么功能
});
wx.ready(function(){
//获取“分享给朋友”按钮点击状态及自定义分享内容接口
wx.onMenuShareAppMessage({
title:"分享自定义标题",//分享标题
desc:"分享自定义描述",//分享描述
link:"http://localhost/weixin/share?openId=1",//分享点击之后的链接
imgUrl:'/images/photo/1.jpg',//分享图标
type:'link',//分享类型,music、video或link,不填默认为link
success:function(){
//成功之后的回调
}
});
wx.hideAllNonBaseMenuItem();
wx.showMenuItems({
menuList:['menuItem:share:appMessage','menuItem:share:timeline']//要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
});
wx.onMenuShareTimeline({
title:"分享自定义标题",//分享标题
desc:"分享自定义描述",//分享描述
link:"http://localhost/weixin/share?openId=1",//分享点击之后的链接
imgUrl:'/images/photo/1.jpg',//分享图标
type:'link',//分享类型,music、video或link,不填默认为link
success:function(){
//成功之后的回调
}
cancel:function(){
//用户取消分享后执行的回调函数
}
});
});
wx.error(function(res){
//打印错误消息。及把debug:false,设置为debug:ture就可以直接在网页上看到弹出的错误提示
});
}
})
});
2、Java代码,获取signature,nonceStr,timestamp和appId
@RequestMapping(value="/share",method=RequestMethod.POST) @ResponseBody publicMapshare(HttpServletRequestrequest){ StringurlTemp="http://"+request.getServerName()+request.getContextPath(); Stringurlpath="http://"+request.getServerName(); StringappUrl=request.getParameter("url"); if(request.getParameter("code")!=null){ appUrl+="&code="+request.getParameter("code"); } if(request.getParameter("state")!=null){ appUrl+="&state="+request.getParameter("state"); } returnWxConfigUtil.getSignature(appUrl,ContentValues.APPID,ContentValues.SECRET,urlTemp,urlpath); }
工具类我就把整个贴上来了,其中有些方法是没有用到的。
getSignature()整个方法是微信分享中的核心方法,用来获取signature,nonceStr,timestamp和appId这几个核心参数。
packagecom.blog.common.util;
importcom.alibaba.fastjson.JSONObject;
importcom.blog.common.model.Token;
importjavax.net.ssl.HttpsURLConnection;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.SSLSocketFactory;
importjavax.net.ssl.TrustManager;
importjava.io.BufferedReader;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.net.ConnectException;
importjava.net.URL;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.Map;
/**
*公众平台通用接口工具类
*
*@authorjames
*@date2015-02-27
*/
publicclassWxConfigUtil{
//获取access_token的接口地址(GET)限2000(次/天)
publicfinalstaticStringaccess_token_url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
//获取jsapi_ticket的接口地址(GET)限2000(次/天)
publicfinalstaticStringjsapi_ticket_url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
//缓存添加的时间
publicstaticStringcacheAddTime=null;
//token,ticket缓存
publicstaticMapTOKEN_TICKET_CACHE=newHashMap();
//token对应的key
privatestaticfinalStringTOKEN="token";
//ticket对应的key
privatestaticfinalStringTICKET="ticket";
/**
*外部获取签名入口类
*
*@paramappUrl应用的url
*@return
*/
publicstaticMapgetSignature(StringappUrl,StringappId,Stringsecret,Stringurl,Stringurlpath){
//生成签名的随机串
Stringnoncestr=RandomUtil.getStringRandom(4);
if(appUrl==null||"".equals(appUrl)){
returnnull;
}
Stringsignature=null;
TokenaccessTocken=getToken(appId,secret,System.currentTimeMillis()/1000);
TokenaccessTicket=getTicket(accessTocken.getToken(),System.currentTimeMillis()/1000);
signature=signature(accessTicket.getTicket(),cacheAddTime,noncestr,appUrl);
System.out.println("-=-=-=-=-=-=-=-=appUrl:"+appUrl);
System.out.println("-=-=-=-=-=-=-=-=token:"+accessTocken.getToken());
System.out.println("-=-=-=-=-=-=-=-=ticket:"+accessTicket.getTicket());
System.out.println("-=-=-=-=-=-=-=-=signature:"+signature);
System.out.println("-=-=-=-=-=-=-=-=timestamp:"+cacheAddTime);
Mapmap=newHashMap<>();
map.put("appId",appId);
map.put("timestamp",cacheAddTime);
map.put("nonceStr",noncestr);
map.put("appUrl",appUrl);
map.put("signature",signature);
map.put("url",url);
map.put("urlpath",urlpath);
returnmap;
}
/**
*获得Token
*
*@return
*/
publicstaticStringgetToken(StringappId,Stringsecret){
TokenaccessTocken=getToken(appId,secret,System.currentTimeMillis()/1000);
returnaccessTocken.getToken();
}
/**
*签名
*
*@paramtimestamp
*@return
*/
privatestaticStringsignature(Stringjsapi_ticket,Stringtimestamp,Stringnoncestr,Stringurl){
jsapi_ticket="jsapi_ticket="+jsapi_ticket;
timestamp="timestamp="+timestamp;
noncestr="noncestr="+noncestr;
url="url="+url;
String[]arr=newString[]{jsapi_ticket,noncestr,timestamp,url};
//将token、timestamp、nonce,url参数进行字典序排序
Arrays.sort(arr);
StringBuildercontent=newStringBuilder();
for(inti=0;i>>4)&0X0F];
tempArr[1]=Digit[mByte&0X0F];
Strings=newString(tempArr);
returns;
}
/**
*从缓存中读取token或者ticket
*
*@return
*/
privatestaticTokengetTokenTicket(Stringkey){
if(TOKEN_TICKET_CACHE!=null&&TOKEN_TICKET_CACHE.get(key)!=null){
System.out.println("==========从缓存中获取到了"+key+"成功===============");
returnTOKEN_TICKET_CACHE.get(key);
}
returnnull;
}
/**
*更新缓存中token或者ticket
*
*@return
*/
privatestaticvoidupdateToken(Stringkey,TokenaccessTocken){
if(TOKEN_TICKET_CACHE!=null&&TOKEN_TICKET_CACHE.get(key)!=null){
TOKEN_TICKET_CACHE.remove(key);
System.out.println("==========从缓存中删除"+key+"成功===============");
}
TOKEN_TICKET_CACHE.put(key,accessTocken);
cacheAddTime=String.valueOf(accessTocken.getAddTime());//更新缓存修改的时间
System.out.println("==========更新缓存中"+key+"成功===============");
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。