微信开发(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

相关文章
相关标签/搜索