


The content of this article is about the implementation code of WeChat’s custom sharing function. The content is very detailed. Friends in need can refer to it. I hope it can help you.
Front-end During the time, I developed an information project, but when the sales department promoted WeChat, the shared link was directly a web link plus a sharing symbol, which was ugly and irregular, so I studied the customized sharing function of WeChat
Preparatory work:
1. Certify the appId and appSecret of the public account
2. Various links to obtain WeChat information (look for WeChat custom sharing API in this section, address: https:// mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)
# 獲取access_token請求地址 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 # 獲取用戶基本信息請求地址 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 layer
/** * 微信配置信息實體 */ @Autowired private WeiXinProperties weiXinProperties; //微信參數 private String accessToken; private String jsApiTicket; //獲取參數的時刻 private Long getTiketTime = 0L; private Long getTokenTime = 0L; //參數的有效時間,單位是秒(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) { //當前時間 long now = System.currentTimeMillis(); //判斷accessToken是否已經存在或者token是否過期 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的時間 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是否已經存在或者是否過期 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~"); } } //生成微信權限驗證的參數 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 // 通過acessToken 獲取ticket String requestUrl = String.format(weiXinProperties.getGetTicketUrl(), access_token); String result = send(requestUrl); JSONObject jsonObject = JSON.parseObject(result); return jsonObject; } //生成微信權限驗證的參數 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 = ""; //注意這里參數名必須全部小寫,且必須有序 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ā)送請求 * * @param url * @return * @throws Exception */ String send(String url) { return HttpClientTools.post(url); } //字節(jié)數組轉換為十六進制字符串 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; } //生成隨機字符串 private static String createNonceStr() { return UUID.randomUUID().toString(); } //生成時間戳 private static String createTimestamp() { return Long.toString(System.currentTimeMillis() / 1000); }
4. Introduce share.js. The page to be shared
$(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,////生產環(huán)境需要關閉debug模式 appId: data.appid,//appId通過微信服務號后臺查看 timestamp: data.timestamp,//生成簽名的時間戳 nonceStr: data.nonceStr,//生成簽名的隨機字符串 signature: data.signature,//簽名 jsApiList: [//需要調用的JS接口列表 'checkJsApi',//判斷當前客戶端版本是否支持指定JS接口 'onMenuShareTimeline',//分享給好友 'onMenuShareAppMessage'//分享到朋友圈 ] }); }, error: function(xhr, status, error) { //alert(status); //alert(xhr.responseText); } }) });
5. Introduce the core js and share.js shared by WeChat into the page to be shared
<script type="text/javascript" src="/resources/js/jweixin-1.2.0.js"></script> <script type="text/javascript" src="/resources/js/share.js"></script>
6. In the current page
Undress images for free AI-powered app for creating realistic nude photos Online AI tool for removing clothes from photos. AI clothes remover Swap faces in any video effortlessly with our completely free AI face swap tool! Easy-to-use and free code editor Chinese version, very easy to use Powerful PHP integrated development environment Visual web development tools God-level code editing software (SublimeText3)
Hot AI Tools
Undress AI Tool
Undresser.AI Undress
AI Clothes Remover
Clothoff.io
Video Face Swap
Hot Article
Hot Tools
Notepad++7.3.1
SublimeText3 Chinese version
Zend Studio 13.0.1
Dreamweaver CS6
SublimeText3 Mac version