微信分享接口开发

首次接触微信开发,这里用来备份

上篇文章  微信JS-SDK 微信分享接口开发(介绍版)    初步介绍了微信分享的流程以及通过前端js快速的模拟出实际效果,但很遗憾以上介绍并不适用于实战,因此本文将重点介绍用Java开发的微信分享功能,并用于实战。

本次功能开发将介绍版中的js代码转为实际的java代码,分为两部分:

1.后台通过java代码请求微信接口获取access-token参数,以此access-token参数再次请求微信接口获取jsapi-ticket,并将获取的jsapi-ticket进行加密、校验与其他的参数封装成json格式的数据传送到前台JS页面

2.前台获取json数据后,并提供给参数给微信分享接口调用,具体接口为js.confige,js.ready;

   获取微信分享页面的标题和描述,以及分享地址、缩略图地址

首先看看前台代码:

jq.wxShare.js 主要供微信分享接口调用:

[javascript]  view plain  copy
  1. // 微信分享默认调用接口  
  2.   
  3.  var $wx_account = wxdata.wx_account,  
  4.  $wx_share = wxdata.wx_share;  
  5.   
  6. //配置微信信息  
  7. wx.config ({  
  8.     debug : false,  
  9.     appId : $wx_account[0],  
  10.     timestamp : $wx_account[1],  
  11.     nonceStr : $wx_account[2],  
  12.     signature : $wx_account[3],  
  13.     jsApiList : [  
  14.         // 所有要调用的 API 都要加到这个列表中  
  15.         'onMenuShareTimeline',  
  16.         'onMenuShareAppMessage',  
  17.         'onMenuShareQQ',  
  18.         'onMenuShareWeibo'  
  19.     ]  
  20. });  
  21. wx.ready (function () {  
  22.     // 微信分享的数据  
  23.     var shareData = {  
  24.         "imgUrl" : $wx_share[0],  
  25.         "link" : $wx_share[1],  
  26.         "desc" : $wx_share[2],  
  27.         "title" : $wx_share[3],  
  28.         success : function () {    
  29.             // 分享成功可以做相应的数据处理  
  30.         }  
  31.     };  
  32.     wx.onMenuShareTimeline (shareData);  
  33.     wx.onMenuShareAppMessage (shareData);  
  34.     wx.onMenuShareQQ (shareData);  
  35.     wx.onMenuShareWeibo (shareData);  
  36. });  


jq.wxShare_data.js 提供微信分享接口所用的参数数据

[javascript]  view plain  copy
  1. // 提供微信分享接口所需的参数  
  2. var wxdata = {  
  3.     wx_account : new Array(4),  
  4.     wx_share : new Array(4),  
  5.       
  6.     get_wxshare_data : function(ctx){  
  7.         var url = ctx + "/weixinShareAction.do?method=getWxShareData";  
  8.         $.ajax({  
  9.             type : "GET",  
  10.             url : url,  
  11.             dataType : "json",  
  12.             cache : false,  
  13.             async : false,  
  14.             success : function(msg) {   
  15.                 if(msg.errcode == 0){  
  16.                     wxdata.wx_account[0] = msg.wxuser;  // appid  
  17.                     wxdata.wx_account[1] = msg.timestamp;   // timestamp  
  18.                     wxdata.wx_account[2] = msg.noncestr; // noncestr  
  19.                     wxdata.wx_account[3] = msg.signature;  // signature  
  20.   
  21.                     wxdata.wx_share[0] = msg.shareimg;  // share_img 分享缩略图图片  
  22.                     wxdata.wx_share[1] = msg.shareurl;// share_link  分享页面的url地址,如果地址无效,则分享失败  
  23.                       
  24.                     var description = $("meta[name='description']").attr("content");  
  25.                     if ($.trim(description) != "") {  
  26.                         wxdata.wx_share[2] = $.trim(description); // share_desc  
  27.                     }  
  28.                     var title1 = document.title;  
  29.                     if ($.trim(title1) != "") {  
  30.                         wxdata.wx_share[3] = title1;// share_title  
  31.                     }  
  32.                 }  
  33.             },  
  34.             error : function(msg){  
  35.                   
  36.             }  
  37.         });  
  38.     }  
  39.       
  40. }  
  41.   
  42. var host = "http://" + window.location.host;  
  43. wxdata.get_wxshare_data(host);  

后台代码 WeiXinShareAction.java

[java]  view plain  copy
  1. // 微信分享入口  
  2. public void getWxShareData() throws Exception {  
  3.     JsonObject jsonObject = new JsonObject();  
  4.       
  5.     String ticket = null;  
  6.     String[] wxInfo = new String[]{"appId","appsecret"};  
  7.       
  8.     String ticketResString = this.getShareJsapiTicket(wxInfo);  
  9.       
  10.     if (StringUtils.isNotEmpty(ticketResString)) {  
  11.         JSONObject ticketJSONObject = JSONObject.fromObject(ticketResString);  
  12.         if (ticketJSONObject.getInt("errcode") == 0) {  
  13.             ticket = JSONObject.fromObject(ticketResString).optString("ticket""");  
  14.         }  
  15.     }  
  16.       
  17.     if (StringUtils.isEmpty(ticket)) {  
  18.         jsonObject.addProperty("errcode"10002);  
  19.         jsonObject.addProperty("errmsg""ticket_error");  
  20.         this.responseWrite(jsonObject.toString());  
  21.         return;  
  22.     }  
  23.       
  24.     String noncestr = this.createNonceStr();  
  25.     int timestamp = this.createTimestamp();  
  26.     String requestRefererURL = this.getRequest().getHeader("referer");  
  27.     logger.warn("requestRefererURL: " + requestRefererURL);  
  28.       
  29.     String signature = this.createSignature(noncestr, ticket, timestamp, requestRefererURL);  
  30.       
  31.     jsonObject.addProperty("errcode"0);  
  32.     jsonObject.addProperty("errmsg""");  
  33.     jsonObject.addProperty("wxuser", wxInfo[0]); // appId  
  34.     jsonObject.addProperty("timestamp", timestamp);  
  35.     jsonObject.addProperty("noncestr", noncestr);  
  36.     jsonObject.addProperty("signature", signature);  
  37.     jsonObject.addProperty("shareimg""http://www.abc.com/123.jpg");  
  38.     jsonObject.addProperty("shareurl""http://www.abc.com/123.html");  
  39.     this.responseWrite(jsonObject.toString());  
  40. }  

[java]  view plain  copy
  1. /** 
  2.  * 微信分享,获取JsapiTicket 
  3.  */  
  4. private String getShareJsapiTicket(String[] wxInfo) throws Exception {  
  5.     String siteId = "mywebSite";  
  6.       
  7.     String jsapiTicket = remoteMemcachedClient.get(siteId + "_jsapiTicket");  
  8.     if (StringUtils.isNotEmpty(jsapiTicket)) {  
  9.         this.logger.warn(siteId + " from memcached jsapiTicket: " + jsapiTicket);  
  10.         return jsapiTicket;  
  11.     }  
  12.       
  13.     String accessToken = this.getWeiXinAccessToken(wxInfo);  
  14.     if (StringUtils.isEmpty(accessToken)) { // 获取 accessToken 失败  
  15.         this.logger.warn(siteId + " accessToken is empty.");  
  16.         JsonObject jsonObject = new JsonObject();  
  17.         jsonObject.addProperty("errcode""10000");  
  18.         jsonObject.addProperty("errmsg""access_error");  
  19.         return jsonObject.toString();  
  20.     }  
  21.       
  22.     String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="  
  23.             + accessToken + "&type=jsapi";  
  24.     jsapiTicket = this.httpReqExecute(url);  
  25.     this.logger.warn(siteId + " from weixin api jsapiTicket is: " + jsapiTicket);  
  26.       
  27.     if(StringUtils.isNotEmpty(jsapiTicket)) {  
  28.         // 向memcached里写内容,第二个参数为过期时间,单位为:秒  
  29.         remoteMemcachedClient.set(siteId + "_jsapiTicket"1 * 60 * 90, jsapiTicket);  
  30.         return jsapiTicket;  
  31.     }  
  32.     return null;  
  33. }  


[java]  view plain  copy
  1. /** 
  2.  * 微信分享,获取access_token 
  3.  */  
  4. private String getWeiXinAccessToken(String[] wxInfo) throws Exception {  
  5.     String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="  
  6.             + wxInfo[0] + "&secret=" + wxInfo[1];  
  7.       
  8.     String result = this.httpReqExecute(url);  
  9.     this.logger.warn("from weixin api accessToken: " + result);  
  10.   
  11.     try {  
  12.         if(StringUtils.isNotEmpty(result)) {  
  13.             // 解析respContent,并获取其中的更新的key,  
  14.             String accessToken = JSONObject.fromObject(result).optString("access_token""");  
  15.             return accessToken;  
  16.         }  
  17.     } catch (Exception e) {  
  18.         logger.error("getAccessToken error in WeiXinShareAction", e);  
  19.     }  
  20.     return null;  
  21. }  

组装数据方法

[java]  view plain  copy
  1. // 数据签名   
  2. private String createSignature(String nocestr, String ticket, int timestamp, String url) {  
  3.     // 这里参数的顺序要按照 key 值 ASCII 码升序排序  
  4.     String s = "jsapi_ticket=" + ticket + "&noncestr=" + nocestr   
  5.             + "×tamp=" + timestamp + "&url=" + url;  
  6.     return DigestUtils.shaHex(s);  
  7. }  
  8.   
  9. // 创建随机串 自定义个数0 < ? < 32   
  10. private String createNonceStr() {  
  11.     String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
  12.     String nonceStr = "";  
  13.        for (int i = 0; i < 16; i++) {  
  14.         int beginIndex = (int) Math.round(Math.random() * 10);  
  15.            nonceStr += str.substring(beginIndex, beginIndex + 1);  
  16.        }  
  17.        return nonceStr;  
  18.    }  
  19.   
  20. // 创建时间戳  
  21. private int createTimestamp() {  
  22.        return Calendar.getInstance().get(Calendar.SECOND);  
  23.    }  

http请求接口

[java]  view plain  copy
  1. // HTTP远程调用  
  2. private String httpReqExecute(String url) {  
  3.     String result = "";  
  4.     DefaultHttpClient httpclient = null ;  
  5.     try {  
  6.         httpclient = new DefaultHttpClient();  
  7.         HttpPost httppost = new HttpPost(url);  
  8.         // 执行    
  9.         org.apache.http.HttpResponse response = httpclient.execute(httppost);    
  10.         HttpEntity entity = response.getEntity();   
  11.         if(entity != null && response.getStatusLine().getStatusCode() == 200){  
  12.             result =  EntityUtils.toString(entity, "UTF-8");  
  13.         }  
  14.     } catch (Exception e) {  
  15.         logger.error(" WeiXinShareAction 调用微信 API 失败!", e);  
  16.     } finally { // 关闭连接,释放资源  
  17.         httpclient.getConnectionManager().shutdown();  
  18.     }  
  19.     return result;  
  20. }  
输出帮助信息

[java]  view plain  copy
  1. // 输出信息  
  2. private void responseWrite(String content) {  
  3.     try {  
  4.         getResponse().setCharacterEncoding("utf-8");  
  5.         getResponse().getWriter().write(content);  
  6.     } catch (Exception e) {  
  7.         logger.error("responseWrite error in WeiXinShareAction", e);  
  8.     }  
  9. }  


详细代码见  实用版代码下载

注意:由于所有的js代码最后压缩为core.min.js文件,因此必须在分享页面中添加js文件 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>,且该core.min.js文件必须在分享页面中加载,否则分享失败,


参见微信JS-SDK微信分享接口开发介绍版

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值