java调用微信接口实现网页分享小功能
本文实例为大家分享了java调用微信接口实现网页分享小功能的具体代码,供大家参考,具体内容如下
//获取access_token *注意*经过实际开发测试,微信分享不支持跨域请求,因此获取access_token的请求必须从服务器发起,否则无法获取到access_token所以以下都是服务端操作
微信接口说明参考地址
参考文章:Java微信分享接口开发详解
一、微信util类
publicclassShareConstants{
//微信获取ticket的接口
publicstaticfinalStringTICKET_URL_TEST="https://api.weixin.qq.com/cgi-bin/ticket/getticket";
publicstaticfinalStringtype="jsapi";
//微信获取token的接口
publicstaticfinalStringGET_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token";
publicstaticfinalStringgrant_type="client_credential";
}
publicclassWeixinUtil{
privatestaticLoggerlogger=LoggerFactory.getLogger(WeixinUtil.class);
publicstaticbooleansignatureCheck(Stringtoken,StringtimeStamp,Stringnonce,Stringsignature)throwsException{
Listlist=newArrayList(3){
publicStringtoString(){
returnthis.get(0)+this.get(1)+this.get(2);
}
};
list.add(token);
list.add(timeStamp);
list.add(nonce);
Collections.sort(list);
MessageDigestmd=MessageDigest.getInstance("SHA-1");
byte[]digest=md.digest(list.toString().getBytes());
StringtestStr=WeixinUtil.byteArrayToHexString(digest);
logger.info("token:{},timestamp:{},nonce:{},testStr:{}");
if(testStr.equalsIgnoreCase(signature.toUpperCase())){
returntrue;
}else{
returnfalse;
}
}
publicstaticStringsignature(StringjsapiTicket,StringnonceStr,Longtimestamp,Stringurl)throwsException{
Stringstr=String.format("jsapi_ticket=%s&noncestr=%s×tamp=%d&url=%s",
jsapiTicket,nonceStr,timestamp,url);
logger.info("signatureurl:{}",str);
MessageDigestmd=MessageDigest.getInstance("SHA-1");
byte[]digest=md.digest(str.getBytes());
StringsigStr=WeixinUtil.byteArrayToHexString(digest);
returnsigStr;
}
publicstaticStringbyteArrayToHexString(byte[]array){
StringstrDigest="";
for(inti=0;i>>4)&0X0F];
ob[1]=Digit[ib&0X0F];
Strings=newString(ob);
returns;
}
publicstaticStringgetWeiXinShareToken(StringappId,Stringsecret)throwsException{
Mapmaps=newHashMap();
maps.put("grant_type",ShareConstants.grant_type);
maps.put("appid",appId);
maps.put("secret",secret);
try{
Stringresult=HttpInvokeUtil.httpGet(ShareConstants.GET_TOKEN_URL,maps);
JSONObjectjsonObject=JSONObject.parseObject(result);
Stringaccess_token=(String)jsonObject.get("access_token");
Integerexpires_in=(Integer)jsonObject.get("expires_in");
logger.debug("getTokenaccess_token:{},expires_in:{}",access_token,expires_in);
if(access_token!=null&&expires_in!=null&&expires_in==7200)
returnaccess_token;
else
returnnull;
}catch(Exceptionex){
logger.error("ex:stack:{}",ex.getStackTrace().toString());
thrownewException("getTokenfailed");
}
}
publicstaticStringgetJsApiTicket(Stringtoken)throwsException{
Mapmaps=newHashMap();
maps.put("access_token",token);
maps.put("type",ShareConstants.type);
try{
Stringresult=HttpInvokeUtil.httpGet(ShareConstants.TICKET_URL_TEST,maps);
JSONObjectjsonObject=JSONObject.parseObject(result);
Integererrcode=(Integer)jsonObject.get("errcode");
if(errcode==null||(errcode!=null&&errcode!=0)){
logger.error("getjsapiTicketisfailed,errcode:{}",errcode);
returnnull;
}else{
Stringticket=(String)jsonObject.get("ticket");
returnticket;
}
}catch(Exceptionex){
logger.error("ex.stack:{}",ex.getStackTrace().toString());
thrownewException("getJsApiTicketisfailed");
}
}
}
注意上面HttpInvokeUtil.httpGet()是httpclint这个可以自己去写,只要能发请求就行,
二、controller层
//currUrl==前端想要分享的网页地址
@RequestMapping(value="/getWConfig",method=RequestMethod.GET)
@ResponseBody
//@RequiredLogin
publicFrameRespgetWConfig(@Param("currUrl")StringcurrUrl)throwsUserException,Exception{
if(currUrl==null){
returnbuildErrorResp(ErrorCodeConst.ERROR_PARAM_ERROR);
}
logger.info("gettheencodecurrUrl{}",currUrl);
StringurlTmp=URLDecoder.decode(currUrl,"UTF-8");
logger.info("decodecurrUrl{}",currUrl);
Longtimestamp=newDate().getTime()/1000;
Stringurl=urlTmp.split("#")[0];
WConfigRespwConfigResp=newWConfigResp();
//修改为本地加载分享
//shareConfig.getAppId()==自己的appid
//shareConfig.getUxinAppSecret()==自己的AppSecret
Stringtoken=WeixinUtil.getWeiXinShareToken(shareConfig.getAppId(),shareConfig.getUxinAppSecret());
Stringticket=WeixinUtil.getJsApiTicket(token);
if(ticket==null){
logger.error("getjsApiTicketSecisfailed");
thrownewException("getjsApiisfailed");
}
wConfigResp.setAppid(shareConfig.getAppId());
wConfigResp.setTimestamp(timestamp);
wConfigResp.setNonceStr(RandomStringUtils.random(10,true,true));
logger.info("appid:{},ticket:{},timestamp:{},nonceStr:{},url:{}",shareConfig.getAppId(),ticket,timestamp,wConfigResp.getNonceStr(),url);
Stringsignature=WeixinUtil.signature(ticket,wConfigResp.getNonceStr(),wConfigResp.getTimestamp(),url);
if(signature!=null){
wConfigResp.setSignature(signature);
returnbuildSuccessResp(wConfigResp);
}else{
logger.error("getWcConfigisfailed");
thrownewException("errorgetWConfig");
}
}
三、自定义的返回值类-WConfigResp
@Data
publicclassWConfigRespextendsBaseModel{
privateStringappid;
privateLongtimestamp;
privateStringnonceStr;
privateStringsignature;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。