微信開發(2):微信js sdk分享朋友圈,朋友,獲取config接口注入權限驗證(轉)

進行微信開發已經一陣子了,從最初的什麼也不懂,到微信受權登陸,分享,更改底部菜單,素材管理,等。
今天記錄一下微信jssdk 的分享給朋友的功能,獲取config接口注入。
官方文檔走一下
簡單說:四步走
1.綁定域名 (注意:設置js安全域名的時候,須要設置微信ip白名單,ip白名單新出來的,非白名單內的ip沒法獲取access_token 更沒法獲取jsapi)
2.引入js文件
3.經過config接口注入權限驗證配置
4.經過ready接口處理成功驗證html

來 開始分步走
1.綁定域名 綁定白名單ip 同時拿到AppID AppSecret
設置js 安全域名在 設置–>公衆號設置–>功能設置裏邊 appid appSercret 在開發–>基本配置裏 java

 

2.引入js文件 發送請求獲取wx.config
我建立了一個頁面,引入了開發者文檔中給的js文件,使用ajax 在頁面初始化的時候 發送請求 得到config權限接口配置 注入
這裏只是作了分享給朋友,和分享到朋友圈 若是須要另外別的 須要在下面js代碼中 wx.config中jsApiList 增長鬚要的接口信息
並在 wx.ready 中寫入你本身定義的參數 數據ajax

下面代碼 解釋: 在頁面初始化的時候,調用ajaxconfig();將當前頁面的url 替換處理,傳遞給後臺,寫好的方法獲取wx config.收到ajax返回後,開始初始化接口信息,經過ready 接口處理成功驗證json

 1 <script >
 2 $(function(){
 3 ajaxConfig();
 4 }); 
 5 function ajaxConfig(){
 6 var url=window.location.href.split('#')[0]; 
 7 url = url.replace(/&/g, '%26'); 
 8 $.ajax({
 9 type:"post",
10 dataType: "json",
11 data:{
12 url:url
13 },
14 url: "getconfig.html",
15 success: function(obj){
16 //微信注入權限接口
17 wx.config({
18 debug: false,
19 appId: obj.appId,
20 timestamp: obj.timestamp,
21 nonceStr: obj.nonceStr,
22 signature: obj.signature,
23 jsApiList: [
24 'onMenuShareAppMessage','onMenuShareTimeline' 
25 ]
26 });
27 wx.ready(function(){
28 wx.onMenuShareAppMessage({
29 title: '${pro.wxtitle}', // 分享標題
30 desc: "${pro.wxdesc}", // 分享描述
31 imgUrl: 'http://www.yaoshihang.cn/${pro.imgurl}', 
32 link: window.location.href.split('#')[0],
33 type: 'link' // 分享類型,music、video或link,不填默認爲link
34 
35 });
36 
37 wx.onMenuShareTimeline({
38 title: '${pro.wxtitle}', // 分享標題
39 link: window.location.href.split('#')[0], // 分享連接,該連接域名或路徑必須與當前頁面對應的公衆號JS安全域名一致
40 imgUrl: 'http://www.yaoshihang.cn/${pro.imgurl}' 
41 });
42 
43 
44 wx.checkJsApi({ 
45 jsApiList: [ 
46 'onMenuShareAppMessage','onMenuShareTimeline'
47 
48 ], 
49 success: function (res) { 
50 //alert(res.errMsg); 
51 } 
52 }); 
53 }); 
54 wx.error(function(res){
55 // config信息驗證失敗會執行error函數,如簽名過時致使驗證失敗,具體錯誤信息能夠打開config的debug模式查看,也能夠在返回的res參數中查看,對於SPA能夠在這裏更新簽名。
56 // alert("errorMSG:"+res);
57 });
58 },
59 error:function(){
60 //alert("系統請求異常!");
61 }
62 });
63 }
64 </script>

 

3.後臺得到 wxconfig 的方法(Java實現)api

首先 controller層
代碼解釋:token 和jsapi 都是須要本地緩存的 下面的代碼是先獲取jsapi 而後利用幫助類 得到config
因爲token和jsapi都是天天都有得到次數限制,因此須要本地緩存,在獲取的時候判斷緩存超時沒有,若是超時就再次獲取進行緩存,緩存

 1 @ResponseBody
 2 @RequestMapping("getconfig.html")
 3 public Map<String, Object> getconf(HttpServletRequest request,String url){
 4 
 5 
 6 String jsapi=getjssdk();
 7 
 8 return WeixinUtil.getWxConfig(request,url,jsapi);
 9 }
10 
11 
12 public String getjssdk(){
13 //token 和jsapi 都是須要本地緩存的
14 Wxtoken token=wxService.selectByKey(1l);
15 Wxtoken jsapi=wxService.selectByKey(2l);
16 
17 Date date = new Date();
18 Date jsdate=jsapi.getAddtime();
19 long between=(date.getTime()-jsdate.getTime())/1000;
20 if(between<6500){
21 return jsapi.getToken();
22 }
23 Date tokendate=token.getAddtime();
24 //判斷時間差 未超時 返回,超時 須要刷新 再次返回 
25 between=(date.getTime()-tokendate.getTime())/1000;
26 String token2="";
27 if(between<6500){
28 token2=token.getToken();
29 }else{
30 String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appid + "&secret=" + secret;
31 JSONObject json = WeixinUtil.httpRequest(url, "GET", null);
32 token2=json.getString("access_token");
33 token.setToken(token2);
34 wxService.updataNotNull(token);
35 }
36 
37 String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ token2 + "&type=jsapi";
38 JSONObject json = WeixinUtil.httpRequest(url, "GET", null);
39 if (json != null) {
40 jsapi.setToken(json.getString("ticket"));
41 wxService.updataNotNull(jsapi);
42 return json.getString("ticket");
43 }
44 return null;
45 }

下面是幫助類安全

  1 package com.yc.education.util;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.InputStream;
  5 import java.io.InputStreamReader;
  6 import java.io.OutputStream;
  7 import java.io.UnsupportedEncodingException;
  8 import java.net.ConnectException;
  9 import java.net.URL;
 10 import java.security.MessageDigest;
 11 import java.security.NoSuchAlgorithmException;
 12 import java.util.Formatter;
 13 import java.util.HashMap;
 14 import java.util.Map;
 15 import java.util.UUID;
 16 
 17 import javax.net.ssl.HttpsURLConnection;
 18 import javax.net.ssl.SSLContext;
 19 import javax.net.ssl.SSLSocketFactory;
 20 import javax.net.ssl.TrustManager;
 21 import javax.servlet.http.HttpServletRequest;
 22 import javax.servlet.http.HttpSession;
 23 
 24 import net.sf.json.JSONObject;
 25 
 26 public class WeixinUtil {
 27 
 28 /**
 29 
 30 * 方法名:httpRequest</br>
 31 
 32 * 詳述:發送http請求</br>
 33 
 34 * 開發人員:souvc </br>
 35 
 36 * 建立時間:2016-1-5 </br>
 37 
 38 * @param requestUrl
 39 
 40 * @param requestMethod
 41 
 42 * @param outputStr
 43 
 44 * @return 說明返回值含義
 45 
 46 * @throws 說明發生此異常的條件
 47 
 48 */
 49 public static JSONObject httpRequest(String requestUrl,String requestMethod, String outputStr) {
 50 JSONObject jsonObject = null;
 51 StringBuffer buffer = new StringBuffer();
 52 try {
 53 TrustManager[] tm = { new MyX509TrustManager() };
 54 SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
 55 sslContext.init(null, tm, new java.security.SecureRandom());
 56 SSLSocketFactory ssf = sslContext.getSocketFactory();
 57 URL url = new URL(requestUrl);
 58 HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
 59 httpUrlConn.setSSLSocketFactory(ssf);
 60 httpUrlConn.setDoOutput(true);
 61 httpUrlConn.setDoInput(true);
 62 httpUrlConn.setUseCaches(false);
 63 httpUrlConn.setRequestMethod(requestMethod);
 64 if ("GET".equalsIgnoreCase(requestMethod))
 65 httpUrlConn.connect();
 66 if (null != outputStr) {
 67 OutputStream outputStream = httpUrlConn.getOutputStream();
 68 outputStream.write(outputStr.getBytes("UTF-8"));
 69 outputStream.close();
 70 }
 71 InputStream inputStream = httpUrlConn.getInputStream();
 72 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
 73 BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
 74 String str = null;
 75 while ((str = bufferedReader.readLine()) != null) {
 76 buffer.append(str);
 77 }
 78 bufferedReader.close();
 79 inputStreamReader.close();
 80 inputStream.close();
 81 inputStream = null;
 82 httpUrlConn.disconnect();
 83 jsonObject = JSONObject.fromObject(buffer.toString());
 84 } catch (ConnectException ce) {
 85 ce.printStackTrace();
 86 } catch (Exception e) {
 87 e.printStackTrace();
 88 }
 89 return jsonObject;
 90 }
 91 
 92 
 93 /**
 94 
 95 * 方法名:getWxConfig</br>
 96 
 97 * 詳述:獲取微信的配置信息 </br>
 98 
 99 * 開發人員:souvc </br>
100 
101 * 建立時間:2016-1-5 </br>
102 
103 * @param request
104 
105 * @return 說明返回值含義
106 
107 * @throws 說明發生此異常的條件
108 
109 */
110 public static Map<String, Object> getWxConfig(HttpServletRequest request,String urlx,String jsapi) {
111 Map<String, Object> ret = new HashMap<String, Object>();
112 
113 HttpSession session=request.getSession();
114 String appId = "wx5c939bf5af08d2ea"; // 必填,公衆號的惟一標識
115 
116 String secret = "";
117 
118 String requestUrl = urlx;
119 
120 String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成簽名的時間戳
121 
122 String nonceStr = UUID.randomUUID().toString(); // 必填,生成簽名的隨機串
123 
124 
125 String signature = "";
126 // 注意這裏參數名必須所有小寫,且必須有序
127 
128 String sign = "jsapi_ticket=" + jsapi + "&noncestr=" + nonceStr+ "×tamp=" + timestamp + "&url=" + requestUrl;
129 try {
130 MessageDigest crypt = MessageDigest.getInstance("SHA-1");
131 crypt.reset();
132 crypt.update(sign.getBytes("UTF-8"));
133 signature = byteToHex(crypt.digest());
134 } catch (NoSuchAlgorithmException e) {
135 e.printStackTrace();
136 } catch (UnsupportedEncodingException e) {
137 e.printStackTrace();
138 }
139 ret.put("appId", appId);
140 ret.put("timestamp", timestamp);
141 ret.put("nonceStr", nonceStr);
142 ret.put("signature", signature);
143 return ret;
144 }
145 
146 
147 /**
148 
149 * 方法名:byteToHex</br>
150 
151 * 詳述:字符串加密輔助方法 </br>
152 
153 * 開發人員:souvc </br>
154 
155 * 建立時間:2016-1-5 </br>
156 
157 * @param hash
158 
159 * @return 說明返回值含義
160 
161 * @throws 說明發生此異常的條件
162 
163 */
164 private static String byteToHex(final byte[] hash) {
165 Formatter formatter = new Formatter();
166 for (byte b : hash) {
167 formatter.format("%02x", b);
168 }
169 String result = formatter.toString();
170 formatter.close();
171 return result;
172 
173 }
174 }

 

大概就是這樣 這時候分享出去的連接 就已是你自定義的了,不上效果圖了,有什麼錯誤的 你們指導交流微信

須要值得一提的是,我在開發中,始終不能獲取微信分享到朋友的點擊狀態,僅僅能夠作到獲取config 接口注入驗證,自定義分享內容,後來,與羣友交流得知,微信已經把分享獲取點擊狀態禁用到了,緣由應該跟誘導用戶分享內容有關,只能設置好自定義分享內容,引導用戶點擊右上角 用微信自帶的分享。。不知道是我使用接口有問題,仍是說微信確實禁用了這個功能。但願,懂這個的朋友可以指導交流下。

session

相關文章
相關標籤/搜索