调用微信分享接口,自定义分享内容(2)-调用分享接口(java开发)

   在上一篇文章中我们已经绑定好域名了,接下来最主要的任务就是第三个步骤:通过config接口注入权限验证配置

    下图是微信公众平台

     wx.config({

       debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

      appId: '', // 必填,公众号的唯一标识

      timestamp: , // 必填,生成签名的时间戳

      nonceStr: '', // 必填,生成签名的随机串

      signature: '',// 必填,签名,见附录1

      jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

  这几个值主要就是生成签名复杂一点,其他的参数都好取,我们主要讲解如何获取签名(示例中获取的 AccessToken并没有进行缓存):

   底层dao方法:

   //获取签名需要用到的一系列方法
//获取AccessToken
public static String getAccessToken() {  // runBatch(){
   String access_token = "";  
   String grant_type = "client_credential";//获取access_token填写client_credential   
   //这个url链接地址和参数皆不能变  
   String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+Constants.APP_ID+"&secret="+Constants.APPSECRET;  
      
   try {  
       URL urlGet = new URL(url);  
       HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
       http.setRequestMethod("GET"); // 必须是get方式请求  
       http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
       http.setDoOutput(true);  
       http.setDoInput(true);  
       System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒  
       System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒  
       http.connect();  
       InputStream is = http.getInputStream();  
       int size = is.available();  
       byte[] jsonBytes = new byte[size];  
       is.read(jsonBytes);  
       String message = new String(jsonBytes, "UTF-8");  
       JSONObject demoJson = JSONObject.fromObject(message);  
       System.out.println("JSON字符串:"+demoJson);  
       access_token = demoJson.getString("access_token");  
       
   } catch (Exception e) {  
           e.printStackTrace();  
   }  
   return access_token;  
}  

//获取Ticket
public static String getTicket(String access_token) {  
   String ticket = null;  
   String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token +"&type=jsapi";//这个url链接和参数不能变  
   try {  
       URL urlGet = new URL(url);  
       HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
       http.setRequestMethod("GET"); // 必须是get方式请求  
       http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
       http.setDoOutput(true);  
       http.setDoInput(true);  
       System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒  
       System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒  
       http.connect();  
       InputStream is = http.getInputStream();  
       int size = is.available();  
       byte[] jsonBytes = new byte[size];  
       is.read(jsonBytes);  
       String message = new String(jsonBytes, "UTF-8");  
       JSONObject demoJson = JSONObject.fromObject(message);  
       System.out.println("JSON字符串:"+demoJson);  
       ticket = demoJson.getString("ticket");  
       is.close();  
   } catch (Exception e) {  
           e.printStackTrace();  
   }  
   return ticket;  
}  


//拿到了jsapi_ticket之后就要参数名排序和拼接字符串,并加密了。以下为sha1的加密算法
public static String SHA1(String decript) {  
   try {  
       MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");  
       digest.update(decript.getBytes());  
       byte messageDigest[] = digest.digest();  
       // Create Hex String  
       StringBuffer hexString = new StringBuffer();  
       // 字节数组转换为 十六进制 数  
           for (int i = 0; i < messageDigest.length; i++) {  
               String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);  
               if (shaHex.length() < 2) {  
                   hexString.append(0);  
               }  
               hexString.append(shaHex);  
           }  
           return hexString.toString();  
  
       } catch (NoSuchAlgorithmException e) {  
           e.printStackTrace();  
       }  
       return "";  
}  


//获取签名
public  static String getQianMing(String accessToken,String jsapi_ticket,String noncestr,String timestamp,String url){
String str= "jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;  
   System.out.println("str"+str); 
   //6、将字符串进行sha1加密  
   String signature =SHA1(str);  
   System.out.println("参数:"+str+"\n签名:"+signature);  
return signature;
}


control层写的方法:

// 调用微信接口 需要用到的配置参数 
@SuppressWarnings({ "rawtypes", "unchecked" })
@RequestMapping("pageConfig.jspx")
public void pageConfig(String url, HttpServletRequest request,
HttpServletResponse response, ModelMap model) {
Map map = new HashMap();
String appId=Constants.APP_ID;
String accessToken=WeixinUtil.getAccessToken();           //access_token
String jsapi_ticket=WeixinUtil.getTicket(accessToken);    //jsapi_ticket
   String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);  //随机字符串  
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);  //时间戳  
String signature=WeixinUtil.getQianMing(accessToken, jsapi_ticket, noncestr, timestamp, url); //生成签名
try {
    map.put("appId", appId);
    map.put("timestamp", timestamp);
    map.put("nonceStr", noncestr);
    map.put("signature", signature);
map.put("success", Boolean.valueOf(true));
map.put("message", "正确");

} catch (Exception e) {
e.printStackTrace();
map.put("message", "错误");
}
ResponseUtils.renderJson(response, StrUtils.toJsonStr(map));
}


html页面上调用的部分关键代码:


  

分享到朋友圈方法要注意两点:

 link中的redirect_uri中的值必须进行转义,类似:&  //都是不认的,必须进行转义才能用;还有一点,链接中带的参数只能有一个,有两个以上的话转发之后也会丢失的,只会携带一个参数,建议需要用多个参数的话,可以把值拼串,用到的时候在分解。

后台方法都写好以后,我们就开始进行测试了,要调用微信分享接口的链接必须是用域名进行访问,微信客户端访问的时候会弹出提示信息的,如果看到 config:ok 的提示的时候,说明配置已经成功了,分享到朋友圈也就成功了一大半,点击分享到朋友圈接口,看一下分享的内容是不是自定义的方法。



  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值