本篇文章給大家分享的內(nèi)容是關(guān)于微信自定義分享功能的實(shí)現(xiàn)代碼,內(nèi)容很詳細(xì),有需要的朋友可以參考一下,希望可以幫助到你們.
前端時(shí)間,開發(fā)了一個(gè)資訊類的項(xiàng)目,但銷售部門進(jìn)行微信推廣時(shí),分享的鏈接直接是網(wǎng)頁(yè)鏈接加分享符號(hào),即難看又不正規(guī),于是研究了一下微信自定義的分享功能
前期準(zhǔn)備工作:
1.認(rèn)證公眾號(hào)的appId,appSecret
2.各種獲取微信信息鏈接(此部分查找微信自定義分享API,地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)
# 獲取access_token請(qǐng)求地址 getAccessTokenUrl: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s #獲取accessToken getAccessTokenOAuthUrl: https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code # 獲取用戶基本信息請(qǐng)求地址 getUserInfoUrl: https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN #獲取code getCodeUrl: https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s#wechat_redirect #獲取ticket getTicketUrl: https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi
3.controller層
/** * 微信配置信息實(shí)體 */ @Autowired private WeiXinProperties weiXinProperties; //微信參數(shù) private String accessToken; private String jsApiTicket; //獲取參數(shù)的時(shí)刻 private Long getTiketTime = 0L; private Long getTokenTime = 0L; //參數(shù)的有效時(shí)間,單位是秒(s) private Long tokenExpireTime = 0L; private Long ticketExpireTime = 0L; /** * 微信自定義分享 */ @RequestMapping(value = "/getShareInfo", method = RequestMethod.POST) public Map<String, String> getShareInfo(HttpServletRequest request, HttpServletResponse response, String url) { //當(dāng)前時(shí)間 long now = System.currentTimeMillis(); //判斷accessToken是否已經(jīng)存在或者token是否過(guò)期 if (StringUtils.isBlank(accessToken) || (now - getTokenTime > tokenExpireTime * 1000)) { JSONObject tokenInfo = getAccessToken(); if (tokenInfo != null) { accessToken = tokenInfo.getString("access_token"); tokenExpireTime = tokenInfo.getLongValue("expires_in"); //獲取token的時(shí)間 getTokenTime = System.currentTimeMillis(); log.info("accessToken====>" + accessToken); log.info("tokenExpireTime====>" + tokenExpireTime + "s"); log.info("getTokenTime====>" + getTokenTime + "ms"); } else { log.info("====>tokenInfo is null~"); log.info("====>failure of getting tokenInfo,please do some check~"); } } //判斷jsApiTicket是否已經(jīng)存在或者是否過(guò)期 if (StringUtils.isBlank(jsApiTicket) || (now - getTiketTime > ticketExpireTime * 1000)) { JSONObject ticketInfo = getJsApiTicket(accessToken); if (ticketInfo != null) { log.info("ticketInfo====>" + ticketInfo.toJSONString()); jsApiTicket = ticketInfo.getString("ticket"); ticketExpireTime = ticketInfo.getLongValue("expires_in"); getTiketTime = System.currentTimeMillis(); log.info("jsApiTicket====>" + jsApiTicket); log.info("ticketExpireTime====>" + ticketExpireTime + "s"); log.info("getTiketTime====>" + getTiketTime + "ms"); } else { log.info("====>ticketInfo is null~"); log.info("====>failure of getting tokenInfo,please do some check~"); } } //生成微信權(quán)限驗(yàn)證的參數(shù) Map<String, String> wechatParam = makeWXTicket(jsApiTicket, url); return wechatParam; } //獲取accessToken private JSONObject getAccessToken() { //String accessTokenUrl = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET //獲取微信端的accessToken String requestUrl = String.format(weiXinProperties.getGetAccessTokenUrl(), weiXinProperties.getAppId(), weiXinProperties.getAppSecret()); String result = send(requestUrl); JSONObject jsonObject = JSON.parseObject(result); return jsonObject; } //獲取ticket private JSONObject getJsApiTicket(String access_token) { //String apiTicketUrl = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi // 通過(guò)acessToken 獲取ticket String requestUrl = String.format(weiXinProperties.getGetTicketUrl(), access_token); String result = send(requestUrl); JSONObject jsonObject = JSON.parseObject(result); return jsonObject; } //生成微信權(quán)限驗(yàn)證的參數(shù) public Map<String, String> makeWXTicket(String jsApiTicket, String url) { Map<String, String> ret = new HashMap<String, String>(); String nonceStr = createNonceStr(); String timestamp = createTimestamp(); String string1; String signature = ""; //注意這里參數(shù)名必須全部小寫,且必須有序 string1 = "jsapi_ticket=" + jsApiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; log.info("String1=====>" + string1); try { MessageDigest crypt = MessageDigest.getInstance("SHA-1"); crypt.reset(); crypt.update(string1.getBytes("UTF-8")); signature = byteToHex(crypt.digest()); log.info("signature=====>" + signature); } catch (NoSuchAlgorithmException e) { log.error("WeChatController.makeWXTicket=====Start"); log.error(e.getMessage(), e); log.error("WeChatController.makeWXTicket=====End"); } catch (UnsupportedEncodingException e) { log.error("WeChatController.makeWXTicket=====Start"); log.error(e.getMessage(), e); log.error("WeChatController.makeWXTicket=====End"); } ret.put("url", url); ret.put("jsapi_ticket", jsApiTicket); ret.put("nonceStr", nonceStr); ret.put("timestamp", timestamp); ret.put("signature", signature); ret.put("appid", weiXinProperties.getAppId()); return ret; } /** * 發(fā)送請(qǐng)求 * * @param url * @return * @throws Exception */ String send(String url) { return HttpClientTools.post(url); } //字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串 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; } //生成隨機(jī)字符串 private static String createNonceStr() { return UUID.randomUUID().toString(); } //生成時(shí)間戳 private static String createTimestamp() { return Long.toString(System.currentTimeMillis() / 1000); }
4.引入share.js.要分享的頁(yè)面
$(function(){ var url = location.href.split('#').toString();//url不能寫死 $.ajax({ type : "post", url : "/user/login/getShareInfo", dataType : "json", async : false, data:{url:url}, success : function(data) { wx.config({ debug: false,////生產(chǎn)環(huán)境需要關(guān)閉debug模式 appId: data.appid,//appId通過(guò)微信服務(wù)號(hào)后臺(tái)查看 timestamp: data.timestamp,//生成簽名的時(shí)間戳 nonceStr: data.nonceStr,//生成簽名的隨機(jī)字符串 signature: data.signature,//簽名 jsApiList: [//需要調(diào)用的JS接口列表 'checkJsApi',//判斷當(dāng)前客戶端版本是否支持指定JS接口 'onMenuShareTimeline',//分享給好友 'onMenuShareAppMessage'//分享到朋友圈 ] }); }, error: function(xhr, status, error) { //alert(status); //alert(xhr.responseText); } }) });
5.在要分享的頁(yè)面中引入,微信分享的核心js和share.js
<script type="text/javascript" src="/resources/js/jweixin-1.2.0.js"></script> <script type="text/javascript" src="/resources/js/share.js"></script>
6.在當(dāng)前頁(yè)面
Gambar buka pakaian secara percuma Apl berkuasa AI untuk mencipta foto bogel yang realistik Alat AI dalam talian untuk mengeluarkan pakaian daripada foto. Penyingkiran pakaian AI Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami! Editor kod yang mudah digunakan dan percuma Versi Cina, sangat mudah digunakan Persekitaran pembangunan bersepadu PHP yang berkuasa Alat pembangunan web visual Perisian penyuntingan kod peringkat Tuhan (SublimeText3)
Alat AI Hot
Undress AI Tool
Undresser.AI Undress
AI Clothes Remover
Clothoff.io
Video Face Swap
Artikel Panas
Alat panas
Notepad++7.3.1
SublimeText3 versi Cina
Hantar Studio 13.0.1
Dreamweaver CS6
SublimeText3 versi Mac