微信分享後台介面簡單實作
此介面大致的流程是:使用者建立時間戳,隨機字串,目前需要分享的頁面的url三個變量,接著將自己的appid和APPsecret作為請求參數獲取access_token,再根據access_token獲取jsapi_ticket, 並將獲取的jsapi-ticket進行加密、校驗以及自己創建的三個變量進行簽名,注意簽名過程案按照key 值ASCII 碼升序排序封裝成json格式的資料傳送到前台JS頁面,具體程式如下;
public class WeiXinShareAction extends HttpServlet { private static final long serialVersionUID = 1L; private Integer main_count = 888; private String flag = "1"; private Log logger = LogFactory.getLog(this.getClass()); private String filePath = "/B.txt"; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { JsonObject jsonObject = new JsonObject(); String ticket = null; String[] wxInfo = new String[] { "wx007344f87ae48300", "5442edc712b6846bdd1c058b7f2318fe" }; WeiXinUtil wxu = new WeiXinUtil(); String ticketResString; try { ticketResString = wxu.getShareJsapiTicket(wxInfo); if (StringUtils.isNotEmpty(ticketResString)) { JSONObject ticketJSONObject = JSONObject.fromObject(ticketResString); if (ticketJSONObject.getInt("errcode") == 0) { ticket = JSONObject.fromObject(ticketResString).getString("ticket"); } } } catch (Exception e) { e.printStackTrace(); } if (StringUtils.isEmpty(ticket)) { jsonObject.addProperty("errcode", 10002); jsonObject.addProperty("errmsg", "ticket_error"); this.responseWrite(jsonObject.toString(), response); return; } String noncestr = this.createNonceStr(); int timestamp = this.createTimestamp(); String requestRefererURL = request.getHeader("referer"); flag = request.getParameter("temp"); logger.info("flag--------------" + flag); //这里是保存点击次数 //没有数据库的情况下 保证服务重启后点击次数不清零 //利用线程锁 使用IO流 对点击次数进行修改保存 Thread_readFile thf4 = new Thread_readFile(); thf4.start(); logger.warn("requestRefererURL: " + requestRefererURL); String signature = this.createSignature(noncestr, ticket, timestamp, requestRefererURL); jsonObject.addProperty("countNum", main_count);//点击次数 jsonObject.addProperty("errcode", 0);// jsonObject.addProperty("errmsg", "");// jsonObject.addProperty("wxuser", wxInfo[0]); // appId jsonObject.addProperty("timestamp", timestamp);//时间戳 jsonObject.addProperty("noncestr", noncestr);//随机字符串 jsonObject.addProperty("signature", signature);//签名 response.setHeader("Access-Control-Allow-Origin", "*"); this.responseWrite(jsonObject.toString(), response); } private void responseWrite(String content, HttpServletResponse response) { try { response.setCharacterEncoding("utf-8"); response.getWriter().write(content); } catch (Exception e) { logger.error("responseWrite error in WeiXinShareAction", e); } } }
取得access_token;這裡開發過程中要注意微信為了減輕對伺服器的存取壓力限制了access_token每天的生成次數以及使用時長;
由於限制時長為7200s 於是做了一個判斷再生成一個token後的2小時用同一個token ;
這裡僅僅只是一個小接口於是選擇將最近一次的生成時間以及token 存為靜態變量,
/** * 微信分享,获取access_token */ private String getWeiXinAccessToken(String[] wxInfo) throws Exception { //得到当前时间 long current_time = System.currentTimeMillis(); // 每次调用,判断expires_in是否过期,如果token时间超时,重新获取,expires_in有效期为7200 if ((current_time - last_time) / 1000 >= 7200) { logger.info("第一次访问"+current_time); logger.info("(current_time - last_time) / 1000===="+(current_time - last_time) / 1000); String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxInfo[0] + "&secret=" + wxInfo[1]; String result = this.httpReqExecute(url); this.logger.warn("from weixin api accessToken: " + result); try { last_time = current_time; if (StringUtils.isNotEmpty(result)) { // 解析respContent,并获取其中的更新的key, accessToken = JSONObject.fromObject(result).getString("access_token"); // 保存access_token return accessToken; } } catch (Exception e) { logger.error("getAccessToken error in WeiXinShareAction", e); } }else{ logger.info("第二次访问"+last_time); logger.info("(current_time - last_time) / 1000===="+(current_time - last_time) / 1000); logger.info("from weixin api accessToken:"+accessToken); return accessToken; } return null; }
根據access_token獲取jsapiTicket
/** * 微信分享,获取jsapiTicket */ public String getShareJsapiTicket(String[] wxInfo) throws Exception { String access_Token = this.getWeiXinAccessToken(wxInfo); if (StringUtils.isEmpty(access_Token)) { // 获取 accessToken 失败 //this.logger.warn(siteId + " accessToken is empty."); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("errcode", "10000"); jsonObject.addProperty("errmsg", "access_error"); return jsonObject.toString(); } String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_Token + "&type=jsapi"; String jsapiTicket = this.httpReqExecute(url); this.logger.warn(" from weixin api jsapiTicket is: " + jsapiTicket); if (StringUtils.isNotEmpty(jsapiTicket)) { return jsapiTicket; } return null; }
Http遠端呼叫
private String httpReqExecute(String url) { String result = ""; DefaultHttpClient httpclient = null; try { httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); // 执行 HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); if (entity != null && response.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(entity, "UTF-8"); } } catch (Exception e) { logger.error(" WeiXinShareAction 调用微信 API 失败!", e); } finally {// 关闭连接,释放资源 httpclient.getConnectionManager().shutdown(); } return result; }
返回成功
from weixin api accessToken: {"access_token":"12_9UgVn7tFVtvf_7r4Lq4V9W9-pQdZpqWxVjFsPoF3hv3J5_XfwQWqauj4n9-ZMikC1_oCp0IpBxjpZr-Ty8XzG8QMeV2QVukFz5_NP7kjAB05MX9msxRg0FlpAAMjonrrh5wxSEFfKHEc0_BDHFKjAFAXVA","expires_in":7200} from weixin api jsapiTicket is: {"errcode":0,"errmsg":"ok","ticket":"HoagFKDcsGMVCIY2vOjf9j_Us44Qhuo4KdgH5u8ewMjOCTUO44m1hKqgEsJYIyFR9HWrmmz-wrsb9KLdmpATRw","expires_in":7200}
相關文章:
javascript - 手機端的分享至微信 微信朋友圈qq好友的介面位址?
相關影片:
以上是最新整理出的微信分享後端介面實現的大致流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。