微信自定义分享

1、页面签名

    /**
     * jsapi 签名
     * jsapi_signature
     * 需要页面传递参数:url:所需签名页面的当前页面路径(可以用window.location.href查看)
     */
    @RequestMapping(value="/jsapi_signature")
    @ResponseBody
    public PageData jsapi_signature(){
        PageData pd =this.getPageData();
        logger.info("jsapi 签名");
        PageData pt=new PageData();
        pd = this.getPageData();
        try {
            String ticket = null;
            // 存储凭证和生成时间
            FishingSingle instance = FishingSingle.instance;
            if (null != instance.getJsGenerateTime()) {
                Date currentTime = new Date();
                // 计算时间差
                long time = ((currentTime.getTime() - instance.getJsGenerateTime()
                        .getTime()) / 1000);
                // ticket有效时间7200秒
                if (time >= 7100) {
                    // 获取js凭证
                    ticket = WeixinUtil.jsApi();
                } else {
                    ticket = instance.getJsTicket();
                }
            } else {
                // 获取js凭证
                ticket = WeixinUtil.jsApi();
            }
            //ticket = WeixinUtil.jsApi();
            Map<String, Object> paramsMap = new HashMap<String, Object>();
            paramsMap.put("jsapi_ticket", ticket);
            System.out.println("jsapi_ticket="+ticket);
            paramsMap.put("timestamp", System.currentTimeMillis());
            paramsMap.put("noncestr", "weixin");
            // 调用js的页面完成路径
            String total_url = pd.getString("url");
            paramsMap.put("url",total_url+"&state=1");
            pt.put("total_url", total_url);
            // 排序后的结果
            String listStr = createLinkString(paramsMap);
            logger.info("排序后..." + listStr);
            // SHA-1加密
            String tmpStr = new MySecurity().encode(listStr, MySecurity.SHA_1);
            logger.info("SHA-1加密后:" + tmpStr);
            // 保存js需要的4个参数
            pd.put("appId",WeixinUtil.appId );
            pd.put("timestamp",paramsMap.get("timestamp") );
            pd.put("nonceStr",paramsMap.get("noncestr"));
            pd.put("signature",tmpStr);
        } catch (Exception e) {
            logger.error(e.toString(), e);
        }
        return pd;
    }

    /**
     * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
     *
     * @param params
     *            需要排序并参与字符拼接的参数组
     * @return 拼接后字符串
     */
    public static String createLinkString(Map<String, Object> params) {

        List<String> keys = new ArrayList<String>(params.keySet());
        Collections.sort(keys);

        String prestr = "";

        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            Object value = params.get(key);

            if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
                prestr = prestr + key + "=" + value;
            } else {
                prestr = prestr + key + "=" + value + "&";
            }
        }

        return prestr;
    }

2、分享js

  /*
   * 注意:
   * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
   * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
   * 3. 常见问题及完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
   *
   * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决,如仍未能解决可通过以下渠道反馈:
   * 邮箱地址:weixin-open@qq.com
   * 邮件主题:【微信JS-SDK反馈】具体问题
   * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
   * 
   * 说明:此js用于配置微信公众号js-sdk相关参数
   * =======================本系统所有页面需要用到微信js-sdk相关接口都需要 加入此js即可====================================================
   */
    var server_path = "";//服务器路径
    var basePath = "";//服务器路径

   var debug = true;
   var appId = "wx0dd21a0061759b0c";
   var timestamp = "";
   var nonceStr = "";
   var signature = "";
/**    初始化微信接口配置    */
   function init_weixin_config(web_title,web_url,web_logo_small,web_description){
       console.log("url11:"+window.location.href);
       /** 先通过本系统服务端的一个接口,获取该签名等信息 */
        $.ajax({
               url:"weixin/jsapi_signature",
               data:"url="+window.location.href,
                success:function(json){
                  timestamp = json.timestamp; 
                  nonceStr = json.nonceStr; 
                  signature = json.signature;
                  
                  console.log("timestamp:"+timestamp);
                  console.log("nonceStr:"+nonceStr);
                  console.log("signature:"+signature);
                  console.log("url22:"+window.location.href);
        /** 获取签名等数据后再设置本地微信js配置参数 ,设置完下面的配置之后,别的页面就可以用 js-sdk的jsApiList中的功能了 */
                      wx.config({
                          debug: false,
                          appId: appId,
                          timestamp: timestamp,
                          nonceStr: nonceStr,
                          signature: signature,
                          jsApiList: [
                            'checkJsApi',
                            'onMenuShareTimeline',
                            'onMenuShareAppMessage',
                            'onMenuShareQQ',
                            'onMenuShareWeibo',
                            'onMenuShareQZone',
                            'hideMenuItems',
                            'showMenuItems',
                            'hideAllNonBaseMenuItem',
                            'showAllNonBaseMenuItem',
                            'translateVoice',
                            'startRecord',
                            'stopRecord',
                            'onVoiceRecordEnd',
                            'playVoice',
                            'onVoicePlayEnd',
                            'pauseVoice',
                            'stopVoice',
                            'uploadVoice',
                            'downloadVoice',
                            'chooseImage',
                            'previewImage',
                            'uploadImage',
                            'downloadImage',
                            'getNetworkType',
                            'openLocation',
                            'getLocation',
                            'hideOptionMenu',
                            'showOptionMenu',
                            'closeWindow',
                            'scanQRCode',
                            'chooseWXPay',
                            'openProductSpecificView',
                            'addCard',
                            'chooseCard',
                            'openCard'
                          ]
                      });
                      wx.ready(function(){
                          //wx.hideMenuItems({menuList: ['menuItem:share:qq','menuItem:share:weiboApp','menuItem:share:facebook','menuItem:share:QZone','menuItem:copyUrl','menuItem:share:email','menuItem:openWithQQBrowser','menuItem:openWithSafari','menuItem:share:brand']});
                          //wx.showMenuItems({menuList: ['menuItem:profile','menuItem:addContact']});
                          wx.showMenuItems({menuList: ['menuItem:share:qq','menuItem:share:weiboApp','menuItem:share:facebook','menuItem:share:QZone','menuItem:copyUrl','menuItem:share:email','menuItem:openWithQQBrowser','menuItem:openWithSafari','menuItem:share:brand']});
                          weixin_share_all_init(web_title,web_url,web_logo_small,web_description,0,0);
                      });
             }
        });
   }
   
   

 /*=//////////////////以下几种分享用于通用的分享,如需个性化,请在自行的页面中编写////////////微信分享相关js   开始///////////////////////////////////////*/
   
/**微信分享统一初始化函数:页面通过此方法=初始化微信相关的所有分享接口*/
   function weixin_share_all_init(title,link,imgUrl,desc,objType,objId){
       desc = desc.substring(0,40);
       weixin_share_friends(title,link,imgUrl,desc,objType,objId);
       weixin_share_circle_of_friends(title,link,imgUrl,objType,objId);
       weixin_share_qq(title,link,imgUrl,desc,objType,objId);
       weixin_share_weibo(title,link,imgUrl,desc,objType,objId);
       weixin_share_QZone(title,link,imgUrl,desc,objType,objId);
   }
   
   /**保存分享成功记录======================客户端分享成功后调用,服务器保存分享记录=======================================*/
   function save_share(link,channel,objType,objId){
       $.ajax({
                type: "get",
                url: basePath+"/share/save",
                data: "share.link="+link+"&share.channel="+channel+"&share.objType="+objType+"&share.objId="+objId,
                success: function(html){
                    /*alert("分享成功");*/
                }
              });
   }
/**
 * 微信分享邀请注册成功后回调此函数
 * @param link
 */
   function share_registe_success(link){
       if(link.indexOf("open_share")>-1){
           $.ajax({
                type: "get",
                url: basePath+"/hongbao/share_registe_success",
                success: function(json){
                    if(json.code=="00"){
                      alert("分享获取奖金成功");
                      window.location.href = basePath+"hongbao/share_registe_success_view?change_score_money="+json.change_score_money;
                    }else{
                        alert("分享成功");
                    }
                }
           });
       }
   }
/**微信分享给朋友===============初始化此方法,用于设置 分享内容及监听事件=======1==========================*/
   function weixin_share_friends(title,link,imgUrl,desc,objType,objId){
     wx.onMenuShareAppMessage({
       title: title,
       desc: desc,
       link: link,
       imgUrl: imgUrl,
       trigger: function (res) {
         // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
         alert('用户点击发送给朋友');
       },
       success: function (res) {
         //save_share(link,1,objType,objId);
         alert('已分享');
         share_registe_success(link);
       },
       cancel: function (res) {
         alert('已取消');
       },
       fail: function (res) {
         alert(JSON.stringify(res));
       }
     });
   }
   
   
/**微信分享朋友圈===================页面需要初始化此方法==============2=================*/
    function weixin_share_circle_of_friends(title,link,imgUrl,objType,objId){
        wx.onMenuShareTimeline({
          title: title,
          link: link,
          imgUrl: imgUrl,
          trigger: function (res) {
            // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
//            alert('用户点击分享到朋友圈');
          },
          success: function (res) {
//            save_share(link,2,objType,objId);
            alert('已分享');
            share_registe_success(link);
          },
          cancel: function (res) {
//            alert('已取消');
          },
          fail: function (res) {
//            alert(JSON.stringify(res));
          }
        });
    }
    /**
     * 微信分享QQ===================页面需要初始化此方法==============3=================
     */
    function weixin_share_qq(title,link,imgUrl,desc,objType,objId){
        wx.onMenuShareQQ({
            title: title,
            desc: desc,
            link: link,
            imgUrl: imgUrl,
            trigger: function (res) {
//                alert('用户点击分享到QQ');
              },
              complete: function (res) {
//                alert(JSON.stringify(res));
              },
              success: function (res) {
//                  save_share(link,3,objType,objId);
                alert('已分享');
                share_registe_success(link);
              },
              cancel: function (res) {
//                alert('已取消');
              },
              fail: function (res) {
//                alert(JSON.stringify(res));
              }
            });
    }
/**微信分享到微博====================页面需要分享微博    需初始化此方法============4==================*/
function weixin_share_weibo(title,link,imgUrl,desc,objType,objId){
     wx.onMenuShareWeibo({
          title: title,
          desc: desc,
          link: link,
          imgUrl: imgUrl,
          trigger: function (res) {
//            alert('用户点击分享到微博');
          },
          complete: function (res) {
//            alert(JSON.stringify(res));
          },
          success: function (res) {
//            save_share(link,4,objType,objId);
            alert('已分享');
            share_registe_success(link);
          },
          cancel: function (res) {
//            alert('已取消');
          },
          fail: function (res) {
//            alert(JSON.stringify(res));
          }
        });
}

/**微信分享到QQ空间==============页面需要分享到QQ空间========5==========*/
function weixin_share_QZone(title,link,imgUrl,desc,objType,objId){
    wx.onMenuShareQZone({
        title: title,
          desc: desc,
          link: link,
          imgUrl: imgUrl,
        trigger: function (res) {
//          alert('用户点击分享到QZone');
        },
        complete: function (res) {
//          alert(JSON.stringify(res));
        },
        success: function (res) {
//          save_share(link,5,objType,objId);
          alert('已分享');
          share_registe_success(link);
        },
        cancel: function (res) {
//          alert('已取消');
        },
        fail: function (res) {
//          alert(JSON.stringify(res));
        }
      });
}


/**微信分享到QQ空间==============页面需要分享到QQ空间========5==========*/
function weixin_copyUrl(title,link,imgUrl,desc,objType,objId){
    wx.onMenuShareQZone({
        title: title,
        desc: desc,
        link: link,
        imgUrl: imgUrl,
        trigger: function (res) {
//          alert('用户点击分享到QZone');
        },
        complete: function (res) {
//          alert(JSON.stringify(res));
        },
        success: function (res) {
//            save_share(link,5,objType,objId);
          alert('已分享');
          share_registe_success(link);
        },
        cancel: function (res) {
//          alert('已取消');
        },
        fail: function (res) {
//          alert(JSON.stringify(res));
        }
    });
}
/*=/////////////////////////////////////////////////////微信分享相关js   结束////////////////////////////////////////////////////////////////////*/

 3、页面代码

     $(function(){
        var web_title = '要分享的标题';          //标题
        var web_url = '要分享的地址';           //路径
        var web_logo_small = '分享图标的地址';    //图标
        var web_description = '分享描述的内容';   //描述
        init_weixin_config(web_title,web_url,web_logo_small,web_description);    
     });
原文地址:https://www.cnblogs.com/xyt-0412/p/6490067.html