微信开发 禁用“发送给朋友_后端开发微信发送对普通微信和企业微信的区别 - CSDN
  • 微信分享功能

    微信分享功能开发

    用了一天时间,把微信发送给朋友和分享到朋友圈功能开发出来,在这里给大家分享一下,避免大家走弯路。

    一.服务器端程序

    package com.wiimedia.controller;
    
    
    import java.io.IOException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.google.gson.Gson;
    import com.wiimedia.model.Ticket;
    import com.wiimedia.service.ArticleSolrService;
    import com.wiimedia.service.TicketRepository;
    import com.wiimedia.service.TicketRepositorySolr;
    import com.wiimedia.utils.GetRandomStr;
    import com.wiimedia.utils.SignatureBean;
    import com.wiimedia.utils.weixin.WeixinUtil;
    /**
     * 
     * 
     *<p>Project:mryl_phone_v2</p> 
     * 
     *<p>Package:com.wiimedia.controller</p> 
     * 
     *<p>Description:微信分享Controller</p>
     *
     *<p>Company:Wiimedia</p>
     *
     *@Athor:SongJia
     *
     *@Date:2016-7-15 上午09:34:10
     *
     */
    
    @Controller
    @RequestMapping("/WeixinshareController/Api/Inteface")
    public class WeixinshareController {
        @Autowired
        private TicketRepositorySolr ticketRepositorySolr;
    
        @RequestMapping("/getSignature")
        public String getSignature( HttpServletRequest request,
                HttpServletResponse response) throws IOException, ParseException{
            //获取签名页面链接
            String url = request.getParameter("url");
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //从数据库中获取标签,并检查标签是否过期
            Ticket oldticket = ticketRepositorySolr.getTicketById("20160114wiimediamrylsong1152");
            if(oldticket==null){//第一次访问,标签不存在。
                executeTicket(response,"1",url,format);
                return null;
            }else{//标签存在,判断标签是否超时
                String oldAcquiretime = oldticket.getAcquiretime();
                long difference=format.parse(format.format(new Date())).getTime()-format.parse(oldAcquiretime).getTime();
                if(difference>7100000){//标签超时,重新到微信服务器请求标签超时时间为7200秒(7200000毫秒)
                    executeTicket(response,"2",url,format);
                    return null;    
                }else{//标签未超时
                    /** 
                     * 注意事项                                           
                     * 1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
                     * 2.签名用的url必须是调用JS接口页面的完整URL。                      
                     * 3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。    
                     * 
                     ****根据第1点要求          signature  配置的时候很容易出错,需要把生成  Ticket的  noncestr和 timestamp传给客户端***
                     */
                    String signature = signature(oldticket.getTicket(),oldticket.getTimestamp(),oldticket.getNoncestr(),url);
                    SignatureBean signatureBean = new SignatureBean();
                    signatureBean.setNoncestr(oldticket.getNoncestr());
                    signatureBean.setSignature(signature);
                    signatureBean.setTimestamp(oldticket.getTimestamp());
                    signatureBean.setUrl(url);
                    response.setContentType("text/html;charset=UTF-8");
                    response.getWriter().print(new Gson().toJson(signatureBean));
                    return null;    
                } 
            }
    
    
        }
        /**
         * 
         *<p>Project:mryl_phone_v2</p> 
         * 
         *<p>:mryl_phone_v2</p> 
         * 
         *<p>Description:更新和获取ticket的方法,因为用的solr所以更新和新增是一样的ID无则添加,有责更新</p>
         *
         *<p>Company:Wiimedia</p>
         *
         *@Athor:SongJia
         *
         *@Date:2016-7-15 上午09:45:00 
         *
         */
        public void executeTicket(HttpServletResponse response,String flag,String url,SimpleDateFormat format) throws IOException{
    
            //获取签名随即字符串
            GetRandomStr randomStr = new GetRandomStr();
            String noncestr = randomStr.getRandomString(15);
            //获取签名时间戳
            String timestamp = Long.toString(System.currentTimeMillis());
            //请求accessToken
            String accessTokenUrl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=您的APPID&secret=您的密匙";
            String tokenJson = WeixinUtil.httpRequest(accessTokenUrl, "GET", null);
            Gson gson = new Gson();
            ShareAccess_Token token = gson.fromJson(tokenJson, ShareAccess_Token.class);
            String to= token.getAccess_token();
            //获取标签
            String urlTicket ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+to+"&type=jsapi";
            String ticketJson = WeixinUtil.httpRequest(urlTicket, "GET", null);
            Ticket ticket = gson.fromJson(ticketJson, Ticket.class);
            String t = ticket.getTicket();
            //String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
            //我的Ticket ID是写死的
            String acquiretime = format.format(new Date());
            ticket.setTid("20160114wiimediamrylsong1152");
            ticket.setAcquiretime(acquiretime);
            ticket.setTimestamp(timestamp);
            ticket.setNoncestr(noncestr);
            //因为用的SOLR所以更新和添加的方法是一样的,可以根据自己具体需求进行修改,本文不再贴出代码.
            if(flag.equals("2")){
                ticketRepositorySolr.addTicketToSolr(ticket);   
            }else{
                ticketRepositorySolr.addTicketToSolr(ticket);
            }
            /** 
             * 注意事项                                           
             * 1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
             * 2.签名用的url必须是调用JS接口页面的完整URL。                      
             * 3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。    
             * 
             *根据第1点要求          signature  配置的时候很容易出错,需要把生成  Ticket的  noncestr和 timestamp传给客户端*
             */
            String signature = signature(t,timestamp,noncestr,url);
            SignatureBean signatureBean = new SignatureBean();
            signatureBean.setNoncestr(noncestr);
            signatureBean.setSignature(signature);
            signatureBean.setTimestamp(timestamp);
            signatureBean.setUrl(url);
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().print(new Gson().toJson(signatureBean));
        }
    
        /**
         * 
         *<p>Project:mryl_phone_v2</p> 
         * 
         *<p>:mryl_phone_v2</p> 
         * 
         *<p>Description:根据标签,时间戳,密匙,URL进行签名</p>
         *
         *<p>Company:Wiimedia</p>
         *
         *@Athor:SongJia
         *
         *@Date:2016-7-15 上午09:37:13 
         *
         */
        private String signature(String jsapi_ticket, String timestamp, String noncestr, String url) {
            jsapi_ticket = "jsapi_ticket=" + jsapi_ticket;
            timestamp = "timestamp=" + timestamp;
            noncestr = "noncestr=" + noncestr;
            url = "url=" + url;
            String[] arr = new String[] { jsapi_ticket, timestamp, noncestr, url };
            // 将token、timestamp、nonce,url参数进行字典序排序
            Arrays.sort(arr);
            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                content.append(arr[i]);
                if (i != arr.length - 1) {
                    content.append("&");
                }
            }
            MessageDigest md = null;
            String tmpStr = null;
    
            try {
                md = MessageDigest.getInstance("SHA-1");
                // 将三个参数字符串拼接成一个字符串进行sha1加密
                byte[] digest = md.digest(content.toString().getBytes());
                tmpStr = byteToStr(digest);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
    
            content = null;
            return tmpStr;
        }
        /**
         * 将字节转换为十六进制字符串
         * 
         * @param mByte
         * @return
         */
        private static String byteToHexStr(byte mByte) {
    
            char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
            char[] tempArr = new char[2];
            tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
            tempArr[1] = Digit[mByte & 0X0F];
    
            String s = new String(tempArr);
            return s;
        }
        /**
         * 将字节数组转换为十六进制字符串
         * 
         * @param byteArray
         * @return
         */
        private static String byteToStr(byte[] byteArray) {
            String strDigest = "";
            for (int i = 0; i < byteArray.length; i++) {
                strDigest += byteToHexStr(byteArray[i]);
            }
            return strDigest;
        }
    
    
    
        class ShareAccess_Token{
            private  String access_token;
            private  String expires_in;
            public String getAccess_token() {
                return access_token;
            }
            public void setAccess_token(String accessToken) {
                access_token = accessToken;
            }
            public String getExpires_in() {
                return expires_in;
            }
            public void setExpires_in(String expiresIn) {
                expires_in = expiresIn;
            }
    
        }
    }
    
    

    二.客户端代码.

    <script type="text/javascript">
                var url = window.location.href;
                var articleId = "";
                var shareTitle="明日医疗资讯";
                var shareImgUrl="";
                var userinfo = localStorage.getItem("_userinfo");
                var timestamp;
                var noncestr;
                var signature;
                //获取签名
                 $.ajax({
                         type: "GET",
                         url: "WeixinshareController/Api/Inteface/getSignature",
                         //data:{timestamp:timestamp,noncestr:noncestr,url:url},
                         data:{url:url},
                         success: function(data){
                                    var objData=JSON.parse(data); 
                                    timestamp=objData.timestamp;    
                                    noncestr=objData.noncestr;  
                                    signature=objData.signature;
                                     console.log(objData);
                                     wxShare();
                         }
                     });
                function wxShare(){
                wx.config({
                    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                    appId: '您的appid', // 和获取Ticke的必须一样------必填,公众号的唯一标识
                    timestamp:timestamp, // 必填,生成签名的时间戳
                    nonceStr: noncestr, // 必填,生成签名的随机串
                    signature: signature,// 必填,签名,见附录1
                    jsApiList: [
                    'onMenuShareAppMessage'
                    ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                });
                }
                wx.ready(function(){
                     //config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,
                     //config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关
                     //接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    
                    //----------“分享给朋友”
                    wx.onMenuShareAppMessage({
                        title: "明日医疗资讯", // 分享标题
                        desc: shareTitle, // 分享描述
                        link: url, // 分享链接
                        imgUrl: shareImgUrl, // 分享图标
                        type: '', // 分享类型,music、video或link,不填默认为link
                        dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                        success: function () { 
                            // 用户确认分享后执行的回调函数、
                        },
                        cancel: function () { 
                            // 用户取消分享后执行的回调函数
                        }
                    });
                    //------------"分享到朋友圈"
                    wx.onMenuShareTimeline({
                        title: '明日医疗资讯', // 分享标题
                        link: '', // 分享链接
                        imgUrl: shareImgUrl, // 分享图标
                        success: function () { 
                            // 用户确认分享后执行的回调函数
                        },
                        cancel: function () { 
                            // 用户取消分享后执行的回调函数
                        }
                    });
                    //-------------分享到QQ
                    wx.onMenuShareQQ({
                        title: '明日医疗资讯', // 分享标题
                        desc: shareTitle, // 分享描述
                        link: '', // 分享链接
                        imgUrl: shareImgUrl, // 分享图标
                        success: function () { 
                           // 用户确认分享后执行的回调函数
                        },
                        cancel: function () { 
                           // 用户取消分享后执行的回调函数
                        }
                    });
                    //-------------分享到QQ空间
                    wx.onMenuShareQZone({
                        title: '明日医疗资讯', // 分享标题
                        desc: shareTitle, // 分享描述
                        link: '', // 分享链接
                        imgUrl: shareImgUrl, // 分享图标
                        success: function () { 
                           // 用户确认分享后执行的回调函数
                        },
                        cancel: function () { 
                            // 用户取消分享后执行的回调函数
                        }
                    });
    
                });
    

    三.服务器需要的工具类和Model

    ① Ticket

    package com.wiimedia.model;
    
    
    public class Ticket{
        private String tid;
        private String ticket;   
        private String errcode;
        private String errmsg; 
        private String expires_in;
        private String acquiretime;
        private String noncestr;
        private String timestamp;
    
        public Ticket(String tid, String ticket, String errcode, String errmsg,
                String expiresIn, String acquiretime, String noncestr,
                String timestamp) {
            super();
            this.tid = tid;
            this.ticket = ticket;
            this.errcode = errcode;
            this.errmsg = errmsg;
            expires_in = expiresIn;
            this.acquiretime = acquiretime;
            this.noncestr = noncestr;
            this.timestamp = timestamp;
        }
        public String getTid() {
            return tid;
        }
        public void setTid(String tid) {
            this.tid = tid;
        }
        public String getTicket() {
            return ticket;
        }
        public void setTicket(String ticket) {
            this.ticket = ticket;
        }
        public String getErrcode() {
            return errcode;
        }
        public void setErrcode(String errcode) {
            this.errcode = errcode;
        }
        public String getErrmsg() {
            return errmsg;
        }
        public void setErrmsg(String errmsg) {
            this.errmsg = errmsg;
        }
        public String getExpires_in() {
            return expires_in;
        }
        public void setExpires_in(String expiresIn) {
            expires_in = expiresIn;
        }
        public String getAcquiretime() {
            return acquiretime;
        }
        public void setAcquiretime(String acquiretime) {
            this.acquiretime = acquiretime;
        }
        public String getNoncestr() {
            return noncestr;
        }
        public void setNoncestr(String noncestr) {
            this.noncestr = noncestr;
        }
        public String getTimestamp() {
            return timestamp;
        }
        public void setTimestamp(String timestamp) {
            this.timestamp = timestamp;
        }
    
    
    
    }

    ② 添加到数据库的业务根据自己需要进行实现.
    ③ GetRandomStr

    package com.wiimedia.utils;
    
    import java.util.Random;
    
    public class GetRandomStr {
        /**
         * 
         *<p>Project:mryl_phone_v2</p> 
         * 
         *<p>:mryl_phone_v2</p> 
         * 
         *<p>Description:生成随即字符串 </p>
         *
         *<p>Company:Wiimedia</p>
         *
         *@Athor:SongJia
         *
         *@Date:2016-7-14 上午11:14:46 
         *
         */
        public  String getRandomString(int length) {
            String base = "abcdefghijklmnopqrstuvwxyz0123456789";   
            Random random = new Random();   
            StringBuffer sb = new StringBuffer();   
            for (int i = 0; i < length; i++) {   
                int number = random.nextInt(base.length());   
                sb.append(base.charAt(number));   
            }   
            return sb.toString();   
         }
    }
    

    ④ SignatureBean

    package com.wiimedia.utils;
    
    public class SignatureBean {
        private String noncestr;
        private String url;
        private String timestamp;
        private String signature;
        public String getNoncestr() {
            return noncestr;
        }
        public void setNoncestr(String noncestr) {
            this.noncestr = noncestr;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        public String getTimestamp() {
            return timestamp;
        }
        public void setTimestamp(String timestamp) {
            this.timestamp = timestamp;
        }
        public String getSignature() {
            return signature;
        }
        public void setSignature(String signature) {
            this.signature = signature;
        }
    
    }

    ⑤ WeixinUtil

    package com.wiimedia.utils.weixin;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ConnectException;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    
    /**
         * 
         *<p>Project:mryl_phone_v2</p> 
         * 
         *<p>:mryl_phone_v2</p> 
         * 
         *<p>Description:公众平台接口工具类</p>
         *
         *<p>Company:Wiimedia</p>
         *
         *@Athor:SongJia
         *
         *@Date:2016-7-15 上午09:37:13 
         *
         */
    public class WeixinUtil {
    
        /** 
         * 发起https请求并获取结果 
         *  
         * @param requestUrl 请求地址 
         * @param requestMethod 请求方式(GET、POST) 
         * @param outputStr 提交的数据 
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 
         */  
        public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {  
    
            StringBuffer buffer = new StringBuffer();  
            try {  
                // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
                TrustManager[] tm = { new MyX509TrustManager() };  
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");  
                sslContext.init(null, tm, new java.security.SecureRandom());  
                // 从上述SSLContext对象中得到SSLSocketFactory对象  
                SSLSocketFactory ssf = sslContext.getSocketFactory();  
    
                URL url = new URL(requestUrl);  
                HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();  
                httpUrlConn.setSSLSocketFactory(ssf);  
    
                httpUrlConn.setDoOutput(true);  
                httpUrlConn.setDoInput(true);  
                httpUrlConn.setUseCaches(false);  
                // 设置请求方式(GET/POST)  
                httpUrlConn.setRequestMethod(requestMethod);  
    
                if ("GET".equalsIgnoreCase(requestMethod))  
                    httpUrlConn.connect();  
    
                // 当有数据需要提交时  
                if (null != outputStr) {  
                    OutputStream outputStream = httpUrlConn.getOutputStream();  
                    // 注意编码格式,防止中文乱码  
                    outputStream.write(outputStr.getBytes("UTF-8"));  
                    outputStream.close();  
                }  
    
                // 将返回的输入流转换成字符串  
                InputStream inputStream = httpUrlConn.getInputStream();  
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
    
                String str = null;  
                while ((str = bufferedReader.readLine()) != null) {  
                    buffer.append(str);  
                }  
                bufferedReader.close();  
                inputStreamReader.close();  
                // 释放资源  
                inputStream.close();  
                inputStream = null;  
                httpUrlConn.disconnect();  
                return buffer.toString();  
            } catch (ConnectException ce) {  
                ce.printStackTrace(); 
            } catch (Exception e) {  
                e.printStackTrace();
            }  
            return "";  
        }
    }
    

    四 至此,分享功能已经开发完成,但是,在生成signature的时候会遇到很多问题,这里提供一些wx.config失败的排错方法.

    ① 确认自己的生成的signature是否正确
    在微信提供的http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign进行校验

    ② wx.config中使用的noncestr, timestamp与用以签名中的对应noncestr, timestamp是否一致一致…如上面(一.服务器代码)
    (有可能因为JS页面加载顺序问题,服务器生成的signature,noncestr,timestamp在wx.config中没有获取到)。

    ③ 确认url是页面完整的url,包括GET参数部分
    需要去掉#后面的部分

    ④ config 中的 appid 与用来获取 jsapi_ticket 的 appid 是否一致

    ⑤ 报错{errmsg:config:ok}是debug的正常返回把调试模式关掉就OK
    wx.config debug: false,



    能力有限,希望有问题及时邮箱或留言,谢谢.

    Email:358106209@qq.com

    展开全文
  • 进行微信开发已经一阵子了,从最初的什么也不懂,到微信授权登录,分享,更改底部菜单,素材管理,等。 今天记录一下微信jssdk 的分享给朋友的功能,获取config接口注入。 官方文档走一下 简单说:四步走 1.绑定域名...

    进行微信开发已经一阵子了,从最初的什么也不懂,到微信授权登录,分享,更改底部菜单,素材管理,等。
    今天记录一下微信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 接口注入验证,自定义分享内容,后来,与群友交流得知,微信已经把分享获取点击状态禁用到了,原因应该跟诱导用户分享内容有关,只能设置好自定义分享内容,引导用户点击右上角 用微信自带的分享。。不知道是我使用接口有问题,还是说微信确实禁用了这个功能。希望,懂这个的朋友能够指导交流下。

    转载于:https://www.cnblogs.com/haw2106/p/10345081.html

    展开全文
  • 进行微信开发已经一阵子了,从最初的什么也不懂,到微信授权登录,分享,更改底部菜单,素材管理,等。 今天记录一下微信jssdk 的分享给朋友的功能,获取config接口注入。 官方文档走一下 简单说:四步走 1.绑定...

    进行微信开发已经一阵子了,从最初的什么也不懂,到微信授权登录,分享,更改底部菜单,素材管理,等。
    今天记录一下微信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 接口处理成功验证

    <script >
    $(function(){
            ajaxConfig();
     }); 
        function ajaxConfig(){
            var url=window.location.href.split('#')[0];  
             url = url.replace(/&/g, '%26'); 
        $.ajax({
                type:"post",
                dataType: "json",
                data:{
                    url:url
                },
                url: "getconfig.html",
                success: function(obj){
                        //微信注入权限接口
                        wx.config({
                          debug: false,
                          appId: obj.appId,
                          timestamp: obj.timestamp,
                          nonceStr: obj.nonceStr,
                          signature: obj.signature,
                          jsApiList: [
                            'onMenuShareAppMessage','onMenuShareTimeline'                   
                          ]
                      });
                        wx.ready(function(){
                             wx.onMenuShareAppMessage({
                                title: '${pro.wxtitle}', // 分享标题
                                desc: "${pro.wxdesc}", // 分享描述
                                imgUrl: 'http://www.yaoshihang.cn/${pro.imgurl}', 
                                link: window.location.href.split('#')[0],
                                type: 'link' // 分享类型,music、video或link,不填默认为link
    
                            });
    
                            wx.onMenuShareTimeline({
                                         title: '${pro.wxtitle}', // 分享标题
                                         link: window.location.href.split('#')[0], // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                                         imgUrl: 'http://www.yaoshihang.cn/${pro.imgurl}'   
                            }); 
    
    
                                wx.checkJsApi({  
                                    jsApiList: [   
                                        'onMenuShareAppMessage','onMenuShareTimeline' 
    
                                    ],  
                                    success: function (res) {  
                                    //alert(res.errMsg);  
                                    }  
                                }); 
                });   
                        wx.error(function(res){
                // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
                       // alert("errorMSG:"+res);
                        });
                },
                error:function(){
                    //alert("系统请求异常!");
                }
            });
        }
    </script>

    3.后台获得 wxconfig 的方法(Java实现)

    首先 controller层
    代码解释:token 和jsapi 都是需要本地缓存的 下面的代码是先获取jsapi 然后利用帮助类 获得config
    由于token和jsapi都是每天都有获得次数限制,所以需要本地缓存,在获取的时候判断缓存超时没有,如果超时就再次获取进行缓存,

    @ResponseBody
        @RequestMapping("getconfig.html")
        public Map<String, Object> getconf(HttpServletRequest request,String url){      
    
    
            String jsapi=getjssdk();
    
            return WeixinUtil.getWxConfig(request,url,jsapi);
        }
    
    
        public String getjssdk(){
            //token  和jsapi 都是需要本地缓存的
            Wxtoken token=wxService.selectByKey(1l);
            Wxtoken jsapi=wxService.selectByKey(2l);
    
            Date date  = new Date();
            Date jsdate=jsapi.getAddtime();
            long between=(date.getTime()-jsdate.getTime())/1000;
            if(between<6500){
             return jsapi.getToken();
            }
            Date tokendate=token.getAddtime();
            //判断时间差  未超时 返回,超时 需要刷新 再次返回 
             between=(date.getTime()-tokendate.getTime())/1000;
             String token2="";
             if(between<6500){
                 token2=token.getToken();
            }else{
                  String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appid + "&secret=" + secret;
                  JSONObject json = WeixinUtil.httpRequest(url, "GET", null);
                  token2=json.getString("access_token");
                  token.setToken(token2);
                  wxService.updataNotNull(token);
            }
    
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ token2 + "&type=jsapi";
            JSONObject json = WeixinUtil.httpRequest(url, "GET", null);
            if (json != null) {
                jsapi.setToken(json.getString("ticket"));
                 wxService.updataNotNull(jsapi);
                return  json.getString("ticket");
            }
            return null;
        }

    下面是帮助类

    package com.yc.education.util;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.ConnectException;
    import java.net.URL;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Formatter;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import net.sf.json.JSONObject;
    
    public class WeixinUtil {
    
        /**
    
        * 方法名:httpRequest</br>
    
        * 详述:发送http请求</br>
    
        * 开发人员:souvc </br>
    
        * 创建时间:2016-1-5  </br>
    
        * @param requestUrl
    
        * @param requestMethod
    
        * @param outputStr
    
        * @return 说明返回值含义
    
        * @throws 说明发生此异常的条件
    
         */
        public static JSONObject httpRequest(String requestUrl,String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            StringBuffer buffer = new StringBuffer();
            try {
                TrustManager[] tm = { new MyX509TrustManager() };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                SSLSocketFactory ssf = sslContext.getSocketFactory();
                URL url = new URL(requestUrl);
                HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
                httpUrlConn.setSSLSocketFactory(ssf);
                httpUrlConn.setDoOutput(true);
                httpUrlConn.setDoInput(true);
                httpUrlConn.setUseCaches(false);
                httpUrlConn.setRequestMethod(requestMethod);
                if ("GET".equalsIgnoreCase(requestMethod))
                    httpUrlConn.connect();
                if (null != outputStr) {
                    OutputStream outputStream = httpUrlConn.getOutputStream();
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
                InputStream inputStream = httpUrlConn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                httpUrlConn.disconnect();
                jsonObject = JSONObject.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                ce.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return jsonObject;
        }
    
    
        /**
    
        * 方法名:getWxConfig</br>
    
        * 详述:获取微信的配置信息 </br>
    
        * 开发人员:souvc  </br>
    
        * 创建时间:2016-1-5  </br>
    
        * @param request
    
        * @return 说明返回值含义
    
        * @throws 说明发生此异常的条件
    
         */
        public static Map<String, Object> getWxConfig(HttpServletRequest request,String urlx,String jsapi) {
            Map<String, Object> ret = new HashMap<String, Object>();
    
            HttpSession session=request.getSession();
            String appId = "wx5c939bf5af08d2ea"; // 必填,公众号的唯一标识
    
            String secret = "";
    
            String requestUrl = urlx;
    
            String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成签名的时间戳
    
            String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串
    
    
            String signature = "";
            // 注意这里参数名必须全部小写,且必须有序
    
            String sign = "jsapi_ticket=" + jsapi + "&noncestr=" + nonceStr+ "&timestamp=" + timestamp + "&url=" + requestUrl;
            try {
                MessageDigest crypt = MessageDigest.getInstance("SHA-1");
                crypt.reset();
                crypt.update(sign.getBytes("UTF-8"));
                signature = byteToHex(crypt.digest());
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            ret.put("appId", appId);
            ret.put("timestamp", timestamp);
            ret.put("nonceStr", nonceStr);
            ret.put("signature", signature);
            return ret;
        }
    
    
        /**
    
        * 方法名:byteToHex</br>
    
        * 详述:字符串加密辅助方法 </br>
    
        * 开发人员:souvc  </br>
    
        * 创建时间:2016-1-5  </br>
    
        * @param hash
    
        * @return 说明返回值含义
    
        * @throws 说明发生此异常的条件
    
         */
        private static String byteToHex(final byte[] hash) {
            Formatter formatter = new Formatter();
            for (byte b : hash) {
                formatter.format("%02x", b);
            }
            String result = formatter.toString();
            formatter.close();
            return result;
    
        }
    }

    大概就是这样 这时候分享出去的链接 就已经是你自定义的了,不上效果图了,有什么错误的 大家指导交流

    需要值得一提的是,我在开发中,始终不能获取微信分享到朋友的点击状态,仅仅可以做到获取config 接口注入验证,自定义分享内容,后来,与群友交流得知,微信已经把分享获取点击状态禁用到了,原因应该跟诱导用户分享内容有关,只能设置好自定义分享内容,引导用户点击右上角 用微信自带的分享。。不知道是我使用接口有问题,还是说微信确实禁用了这个功能。希望,懂这个的朋友能够指导交流下。

    展开全文
  • 今天在做隐藏微信右上角的分享按钮 百度查到的一串代码,挺好用的 function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu'); } if (typeof WeixinJSBridge == "undefined") {

    今天在做隐藏微信右上角的分享按钮

    百度查到的一串代码,挺好用的

    复制代码
    <!--禁用微信分享按钮-->
        <script>
            function onBridgeReady() {
                WeixinJSBridge.call('hideOptionMenu');
            }
    
            if (typeof WeixinJSBridge == "undefined") {
                if (document.addEventListener) {
                    document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
                } else if (document.attachEvent) {
                    document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
                    document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
                }
            } else {
                onBridgeReady();
            }
        </script>
    复制代码


    也看了一下别的

    查到一篇文章:http://www.2cto.com/weixin/201511/451592.html

    作者:人在钱途

    为防找不到,就干脆拷贝了一份。

    以下为文章中的内容:

     

    之前写了一篇关于这个WeixinJSBridge API的文章,文章地址 ,于是有很多网友都在过来咨询这个API的使用,在这里有必要跟大家再说一下:这个API在以前公布的部分接口被官方和谐掉很久 了, 比如一键关注、分享给好友、分享到朋友圈等。当然,你可能会发现微信官方推送的一些文章还能使用这些功能,粗略估计,官方是对这个API增加了白名单控 制,判断Referer,如果是微信官方的地址、或者是有合作的商家地址,则允许调用,否则,返回“access denied”!

    截止目前,笔者还没用发现还有什么办法能继续使用它!不过,官方和谐掉这个API其实也是说得过去的,因为在整个WebView的右上角,官方做了一个Navtive的按钮,点开以后,包括分享给好友、分享到朋友圈这样的功能都有,所以,官方也是在做一些引导。

    当然,WeixinJSBridge这个API也并不是所有功能都被和谐掉了,相反,有好几个功能还是相当有用的,可以正常使用,比如:

    1、隐藏微信网页右上角的按钮(...按钮):开发者可以用这个功能来禁止当前页面被分享

    2、隐藏微信网页底部的导航栏(比如前进后退和刷新):这个导航栏会占用一定的区域,开发者可以认为用户不会用到它,将其隐藏掉

    3、在微信网页中获取用户的网络状态:开发者可以利用这个API获得用户的网络状态,并提供不同的服务,比如视频类,在wifi下提供高清视频流,在2g网络下提供普通清晰视频流等等

    下面分别通过简单的几行代码,说明这几个API的用法:

    1、隐藏微信网页右上角的按钮

    1
    2
    3
    4
    5
    6
    7
    8
    9
    document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
        // 通过下面这个API隐藏右上角按钮
        WeixinJSBridge.call('hideOptionMenu');
    });
                 
    document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
        // 通过下面这个API显示右上角按钮
        WeixinJSBridge.call('showOptionMenu');
    });

    2、隐藏微信网页底部的导航栏

    1
    2
    3
    4
    5
    6
    7
    8
    9
    document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
        // 通过下面这个API隐藏底部导航栏
        WeixinJSBridge.call('hideToolbar');
    });
                
    document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
        // 通过下面这个API显示底部导航栏
        WeixinJSBridge.call('showToolbar');
    });

    3、在微信网页中获取用户的网络状态

    1
    2
    3
    4
    WeixinJSBridge.invoke('getNetworkType',{},function(e){
        // 在这里拿到e.err_msg,这里面就包含了所有的网络类型
        alert(e.err_msg);
     });

    e.err_msg的取值如下所示:

    network_type:wifi wifi网络 2 network_type:edge 非wifi,包含3G/2G 3 network_type:fail 网络断开连接 4 network_type:wwan 2g或者3g

     

    ********************************************************************************此处分割线 *******************************************************************************

     

    在微信JSSDK说明文档中有关于按钮屏蔽使用等的说明:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

    左边菜单点击【微信网页开发】,点击下面的二级菜单【微信JS-SDK说明文档】,然后就能看到一系列关于JS-SDK的说明。目录10.界面操作就是需要的地方,只不过火狐大概点击不了或者根本没做页面点击,所以直接页面CTRL+F搜【菜单】两个字,往下找就是了

     

    第十条界面操作则是对于按钮的处理

    1
     

    在附录三中有所有涉及的菜单项列表

    wx.hideMenuItems({
        menuList: [] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
    });

    使用方式,直接将项隐藏的菜单项
    • 发送给朋友: "menuItem:share:appMessage"
    • 分享到朋友圈: "menuItem:share:timeline"
    • 分享到QQ: "menuItem:share:qq"
    • 分享到Weibo: "menuItem:share:weiboApp"
    • 收藏: "menuItem:favorite"
    • 分享到FB: "menuItem:share:facebook"
    • 分享到 QQ 空间/menuItem:share:QZone

    放入到menuList:[]括号中,具体拼接方式,大概是","

    fighting
    展开全文
  • 1.集成微信sdk 首先在build.gradle文件中,添加如下依赖即可: dependencies{ compile'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' } 或者: dependencies{ compile'...
  • 1、引入微信官方的js文件,将该js文件放到最前面引入: 2、初始化微信所需参数: 2.1 注意:wx.config必须在页面加载时完成执行,wx.ready可以放到方法内通过触发执行。 //初始化微信  var url = null;  ...
  • 今天测试提交一个关于分享朋友圈信息的Bug:作者的作品可以分享出去,而且分享出去后允许他人编辑。 经过测试确实如此,两种解决方案:1.根据角色进行区分;2.禁止朋友圈或好友分享; 因为工期紧张的关系,偷懒...
  • 微信浏览器禁止用户分享功能实现: 前端js如下:vue实现 //引入JS &lt;script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"&gt;&lt;/script&...
  •   今天项目接入微信支付,在更新微信支付sdk(1.8.6)的时候,用到一个Universal Links,之前没有接触过,于是就简单的记录一下配置过程。在 iOS9 之前,要在浏览器中唤醒 App,我们通常使用 scheme。这种方式需要...
  • 原理就是,利用公众号模板消息,粉丝推送。 作为运营同学,大多是不会技术的,所以,这个方法,不需要开发,就可以免费模板消息群发!没有48小时的限制,只要是该公众号的粉丝,都可以群发 一、什么是模板消息...
  • 很多朋友的APP推广链接需要在微信中进行的网页宣传、传播、下载等等,但是各位朋友一定发现了微信中是屏蔽掉了APP的下载链接的。但是微信最为一个最大的社交平台,为了自身的利益,屏蔽掉了所有APK的下载链接。我们...
  • 微信浏览器阻止弹框

    2019-06-15 22:09:54
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 微信小程序(1) 准备工作 1 获取 AppID(小程序ID) 登录微信公众平台,新建一个邮箱,避免旧有的邮箱有注册过公众号等.无法获取. 进行小程序的注册. 选择个人, 然后填写信息.进行登录之后, 在首页, 设置中. 然后点击...
  • LNMP的配置与优化 一、LNMP的下载 LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat/Fedora、Debian/Ubuntu/Raspbian/Deepin VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQL/...
  • 仿微信app项目流程

    2020-05-25 21:19:46
    前台开发:vue 后台开发:node 数据库:MongoDB 组件:weui 创建项目:vue脚手架 vue create friends 注册登录页面 使用阿里云短信服务功能 用户根据手机号获取验证码后台判断是进行登录还是注册 验证手机号和...
  • 1、用户登录/注册功能的实现 该小程序提供登录/注册功能,输入用户名和密码点击登录,注册时系统首先判断输入手机号码是否正确,如果不正确则提示“输入号码不能为空”,“手机号格式不... ... 该模块主要包括两个部分...
  • 微信小程序项目实践总结】30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05-日历组件的实现 4. 微信...
  • Vue2中实现微信分享支付功能 ... 在这里,一些公众号的基本配置我就不多说了,不懂的可以看一下微信开发文档。  话不多说,咱们开始吧! 安装微信JS-SDK  首先需要通过npm安装微信的JS-SD...
1 2 3 4 5 ... 20
收藏数 506
精华内容 202
关键字:

微信开发 禁用“发送给朋友