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{ Map maps=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{ Map maps=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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。