jsapi-java初步接入,信jsapi-java接入
【公眾號對於開發人員來說】
接觸應該比大部分人都早,
記得那會開了號,大多數人還不知道什麼東東,
發展如此迅速,著實很強大。
很多次要開發一些公眾號的東西,
但是都卡在了“認證”上,
個人不能認證。
【發送給朋友的連結】
今天又遇到問題,想做一個自訂的發送給朋友的連結,
這麼簡單的功能,耗費了一下午,最後發現原來分享是需要認證的,
坑啊,做下記錄,希望對有同樣問題的人有協助。
【java代碼】
至於api什麼的自己去看吧,雖然比較費勁,但是也不是很難,直接上封裝了一部分的代碼:
package com.uikoo9.util.external;import java.util.Arrays;import java.util.HashMap;import java.util.Map;import java.util.UUID;import javax.servlet.http.HttpServletRequest;import org.json.JSONObject;import com.uikoo9.util.core.data.QStringUtil;import com.uikoo9.util.core.file.QPropertiesUtil;import com.uikoo9.util.core.http.QHttpClientUtil;import com.uikoo9.util.function.QCacheUtil;import com.uikoo9.util.function.QEncodeUtil;import com.uikoo9.util.function.QThreadUtil;/** * 工具類 * 1.校正合法性<br> * 2.擷取accesstoken<br> * 3.擷取jsticket<br> * 4.執行線程<br> * 5.擷取jsapi相關參數map<br> * @author qiaowenbin * @version 0.0.2.20150617 * @history * 0.0.2.20150617<br> * 0.0.1.20150206<br> */public class QWeixinUtil { /** * token校正 * @param request * @param token * @return */ public static String checkToken(HttpServletRequest request, String token){ String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); return checkToken(signature, timestamp, nonce, echostr, token); } /** * token校正 * @param signature * @param timestamp * @param nonce * @param echostr * @param token * @return */ public static String checkToken(String signature, String timestamp, String nonce, String echostr, String token){ if(QStringUtil.allNotEmpty(signature, timestamp, nonce, echostr, token)){ StringBuilder sb = new StringBuilder(); String[] tmp = {token, timestamp, nonce}; Arrays.sort(tmp); for(String s : tmp){ sb.append(s); } String pwd = QEncodeUtil.sha1(sb.toString()); if(signature.equals(pwd)) return echostr; } return QStringUtil.emptyStr; } /** * 擷取access_token * @return */ public static String getAccessToken(){ try { String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + QPropertiesUtil.get("weixin.appid") + "&secret=" + QPropertiesUtil.get("weixin.appsecret"); JSONObject json = new JSONObject(QHttpClientUtil.get(url)); return json.getString("access_token"); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 擷取jsticket * @return */ public static String getJsTicket(String token){ try { String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi"; JSONObject json = new JSONObject(QHttpClientUtil.get(url)); return json.getString("ticket"); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 執行線程 */ public static void runWeixinThread(){ QThreadUtil.runScheduledBySeconds(new Runnable() { public void run() { String token = getAccessToken(); QCacheUtil.putToEHCache("weixintoken", token); QCacheUtil.putToEHCache("weixinjsticket", getJsTicket(token)); } }, 1, 7100); } /** * 擷取jsapi相關參數map * @param jsapi_ticket * @param url * @return */ public static Map<String, String> getJsSignMap(String jsapi_ticket, String url) { Map<String, String> map = new HashMap<String, String>(); String nonce_str = UUID.randomUUID().toString(); String timestamp = Long.toString(System.currentTimeMillis() / 1000); String s = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + url; String signature = QEncodeUtil.sha1(s); map.put("url", url); map.put("jsapi_ticket", jsapi_ticket); map.put("nonceStr", nonce_str); map.put("timestamp", timestamp); map.put("signature", signature); return map; }}
主要分為三塊:
1.token的驗證
2.緩衝accesstoken和jsticket
3.擷取js相關參數
對應的設定檔:
# weixin propertiesweixin.debug=falseweixin.token=yweixin.appid=yweixin.appsecret=y
另外在服務啟動的時候需要調用:QWeixinUtil.runWeixinThread();
【頁面】
跳轉到頁面的後台代碼:
private void initWeixinInfo(BlogArticleModel blog){ String jsTicket = (String) QCacheUtil.getFromEHCache("weixinjsticket"); String url = "http://uikoo9.com/blog/detail/" + blog.getStr("blog_article_code"); Map<String, String> map = QWeixinUtil.getJsSignMap(jsTicket, url); setAttr("wxdebug", QPropertiesUtil.get("weixin.debug")); setAttr("wxappid", QPropertiesUtil.get("weixin.appid")); setAttr("wxtime", map.get("timestamp")); setAttr("wxrandom", map.get("nonceStr")); setAttr("wxsign", map.get("signature")); setAttr("wxtitle", blog.getStr("blog_article_title")); setAttr("wxurl", map.get("url")); }
對應頁面代碼:
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> wx.config({ debug: ${wxdebug}, appId: '${wxappid}', timestamp: ${wxtime}, nonceStr: '${wxrandom}', signature: '${wxsign}', jsApiList: ['onMenuShareAppMessage'] }); wx.ready(function(){ wx.onMenuShareAppMessage({ title: '${wxtitle}', desc: '${wxtitle}', link: '${wxurl}', imgUrl: 'http://uikoo9.qiniudn.com/@/img/logo.png' }); }); /* trigger: function (res) { alert('使用者點擊發送給朋友'); }, success: function () { alert(1); }, cancel: function () { alert(2); }, fail: function (res) { alert(JSON.stringify(res)); } wx.error(function(res){ alert(JSON.stringify(res)); }); */ </script>
【幾點注意】
按上面的配置基本就可以了,需要注意幾點:
1.善用wx.error,這個可以用來調試錯誤
2.善用wx.config中的debug:true,也是調試,感覺沒有上面的有用
【坑爹的認證】
開啟wx.error如果這個時候你看到的是:
那麼恭喜你,你成功了,
但是如果,點擊發送給朋友還是沒有自訂,那麼恭喜你,
這個問題會糾結很久,
最後的最後我告訴你,因為沒有進行認證,所以和“分享”有關的你都沒有許可權。
而的認證個人是不能認證的,去註冊個公司吧~~
【更多】
更多精彩內容:uikoo9.com