zoukankan      html  css  js  c++  java
  • 微信开发(2):微信js sdk分享朋友圈,朋友,获取config接口注入权限验证(转)

    进行微信开发已经一阵子了,从最初的什么也不懂,到微信授权登录,分享,更改底部菜单,素材管理,等。
    今天记录一下微信jssdk 的分享给朋友的功能,获取config接口注入。
    官方文档走一下
    简单说:四步走
    1.绑定域名 (注意:设置js安全域名的时候,需要设置微信ip白名单,ip白名单新出来的,非白名单内的ip无法获取access_token 更无法获取jsapi)
    2.引入js文件
    3.通过config接口注入权限验证配置
    4.通过ready接口处理成功验证

    来 开始分步走
    1.绑定域名 绑定白名单ip 同时拿到AppID AppSecret
    设置js 安全域名在 设置–>公众号设置–>功能设置里边 appid appSercret 在开发–>基本配置里

    2.引入js文件 发送请求获取wx.config
    我创建了一个页面,引入了开发者文档中给的js文件,使用ajax 在页面初始化的时候 发送请求 获得config权限接口配置 注入
    这里只是做了分享给朋友,和分享到朋友圈 如果需要另外别的 需要在下面js代码中 wx.config中jsApiList 增加需要的接口信息
    并在 wx.ready 中写入你自己定义的参数 数据

    下面代码 解释: 在页面初始化的时候,调用ajaxconfig();将当前页面的url 替换处理,传递给后台,写好的方法获取wx config.收到ajax返回后,开始初始化接口信息,通过ready 接口处理成功验证

     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实现)

    首先 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 接口注入验证,自定义分享内容,后来,与群友交流得知,微信已经把分享获取点击状态禁用到了,原因应该跟诱导用户分享内容有关,只能设置好自定义分享内容,引导用户点击右上角 用微信自带的分享。。不知道是我使用接口有问题,还是说微信确实禁用了这个功能。希望,懂这个的朋友能够指导交流下。

  • 相关阅读:
    观察者模式
    Java中关于HashMap源码的研究
    抽象工厂模式
    适配器模式
    oracle创建表空间并赋予权限
    外观模式
    oracle中循环读出一个表的信息插入到另外一个表中
    javaScript对金额处理的方式
    装饰器模式
    建造者模式
  • 原文地址:https://www.cnblogs.com/haw2106/p/10345081.html
Copyright © 2011-2022 走看看