精华内容
下载资源
问答
  • 微信分享接口

    2019-04-10 09:09:48
    微信分享接口,支持自定义分享到、微信朋友圈、腾讯微博、QQ聊天、QQ空间、微信聊天等。
  • php实现微信分享接口 自己在用的 有需要的可以下载看看
  • 本文实例讲述了thinkPHP微信分享接口JSSDK用法。分享给大家供大家参考,具体如下: 首先在数据库中添加access_token表: SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for ...
  • 基于springBoot2.0以上的微信分享接口后端实现,代码绝对可复用,稍加修改就可以为您所用
  • 主要为大家详细介绍了java开发微信分享接口的步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了Java微信分享接口开发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 分享接分享接口sdk
  • 主要为大家详细介绍了js微信分享接口调用的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 微信JS-SDK 微信分享接口开发 代码包微信JS-SDK 微信分享接口开发 代码包
  • 主要介绍了微信端html5页面调用分享接口示例的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 微信分享接口调用

    千次阅读 2019-04-11 16:44:56
    微信api直通车,仔细阅读官方文档问题都可以解决的 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 好吧,最近用到了,整理下发出来,就这个效果吧 1.设置js接口安全域名 这需要...

    微信api直通车,仔细阅读官方文档问题都可以解决的

    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

    好吧,最近用到了,整理下发出来,就这个效果吧

     

     

    1.设置js接口安全域名

    这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名。打开这个页面之后你会看到下面的提示。需要先下载这个文件并上传到指定域名的根目录。

    这个文件里面是一个字符串,从名称看是用来校验用的。先上传了这个文件,你才能保存成功。这样你就可以使用jssdk了。

    2.页面,要从后台获取签名

    页面核心代码,用的是jweixin-1.4.0.js,最新版的说是将之前的四个接口合并成两个,不知道为什么没起作用,所以还是用之前的四个吧

    <script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
    <script>
        var currurl = decodeURIComponent(location.href.split('#')[0]);
    
            var res = ${(jsApi)!};
            wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: res.appId, // 必填,公众号的唯一标识
                timestamp: res.timestamp, // 必填,生成签名的时间戳
                nonceStr: res.nonceStr, // 必填,生成签名的随机串
                signature: res.signature,// 必填,签名
                jsApiList: ["checkJsApi","updateAppMessageShareData","updateTimelineShareData", "onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareQZone"] // 必填,需要使用的JS接口列表
            });
        wx.ready(function () {
            // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
            wx.checkJsApi({
                jsApiList : ["checkJsApi", "updateAppMessageShareData","updateTimelineShareData","onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareQZone"], // 需要检测的JS接口列表,所有JS接口列表见附录2,
                success : function(res) {
                    // 以键值对的形式返回,可用的api值true,不可用为false
                    // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
                    // alert(res.checkResult);
                    // alert(res.errMsg);
                }
            });
            //自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)
            wx.updateAppMessageShareData({
                title:"饿了么红包", // 分享标题
                desc: "饿了么红包描述", // 分享描述
                link: currurl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl:  ${(pic)!}, // 分享图标
                success: function () {
                    // 设置成功
                }
            })
            //自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)
            wx.updateTimelineShareData({
                 title:"饿了么红包", // 分享标题
                link: currurl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: ${(pic)!},
                success: function () {
                    // 设置成功
                }
            });
            //朋友圈
            wx.onMenuShareTimeline({
                title:"饿了么红包", // 分享标题
                link: currurl, // 分享链接
                imgUrl: "图片地址",
                success: function (res) {
                },
                cancel: function (res) {
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });
            //朋友
            wx.onMenuShareAppMessage({
                title:"饿了么红包", // 分享标题
                desc: "饿了么红包描述", // 分享描述
                link: currurl, // 分享链接
                 imgUrl: "图片地址",
                type: '', // 分享类型,music、video或link,不填默认为link
                dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                success: function () {
                    // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
            //QQ
            wx.onMenuShareQQ({
                 title:"饿了么红包", // 分享标题
                desc: "饿了么红包描述", // 分享描述
                link: currurl, // 分享链接
                imgUrl: "图片地址", // 分享图标
                success: function () {
                    // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
            //QQ空间
            wx.onMenuShareQZone({
                 title:"饿了么红包", // 分享标题
                desc: ${(describe)!}, // 分享描述
                link: currurl, // 分享链接
                 imgUrl: "图片地址", // 分享图标
                success: function () {
                    // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
    
        });
        wx.error(function (res) {
            // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
            console.log("初始化wx.config失败" + res)
        });
    </script>

     

    3.后端获取签名,注意签名的算法,不然就会签名失败啊,怎么算的,看微信附录1-JS-SDK使用权限签名算法

    @GetMapping(value = "/test")
    public String test(@RequestParam(value = "id")Long id,Model model,HttpServletRequest request ) throws WxErrorException{
            String url = request.getRequestURL().toString()+"?id="+id;
            WxJsapiSignature sign = wxMpService.createJsapiSignature(url);
            model.addAttribute("jsApi",JsonUtils.toJson(sign));
            return "对应的页面";
        }

    最后说总结下思路,1下载文件,2后台获取签名(注意签名算法),3页面引入js调用接口。

    完成!

     

    展开全文
  • 接手外包项目,修改其中微信分享朋友/朋友圈的功能 此功能微信提供了两个接口 updateTimelineShareData(分享朋友圈)/ updateAppMessageShareData(分享朋友) onMenuShareTimeline / onMenuShareAppMessage 后...

    常有一些微信内分享自定义内容的需求,遇到几个小问题,分析记录于此

    接手外包项目,修改其中微信分享朋友/朋友圈的功能

    此功能微信提供了两个接口

    updateTimelineShareData(分享朋友圈) / updateAppMessageShareData(分享朋友)

    onMenuShareTimeline / onMenuShareAppMessage

    后者是即将被废弃的接口

    于是选用新版本接口处理,使用updateTimelineShareData  / updateAppMessageShareData

    配置动态参数(标题,链接,图片,回调函数)要注意一下几点:

    • 标题 无过多限制
    • 链接 域名须与当前页面的公众号JS安全域名一致,不得携带中文参数
    • 图片 路径无限制(非安全域名亦可),图片大小不得超过32K
    • 回调函数 使用旧版本接口,函数会在分享成功后触发,新版本接口会在调用方法时便触发

    内容如需动态变化,配置参数变量,调用方法即可

    以上几点问题处理不当,可能引发调用无效,且无错误反馈现象

    还有一类问题:

    使用新版本接口,参数配置正确,却调用无效且无报错

    原因:避免引入多个版本的微信JS版本

    为此在微信社区反馈了问题,后发现是版本引入干扰问题

    引入最新微信JS版本,使用新版本接口,测试成功!

     

     

     

    展开全文
  • Java微信分享接口开发

    万次阅读 多人点赞 2017-07-25 15:33:02
    Java微信分享,步骤是 1、根据当前的url,获取signature,nonceStr,timestamp 和appId。 2、通过signature,nonceStr,timestamp 和appId来配置微信 wx.config。 3、通过wx.ready实现微信分享功能。

    Java微信分享,步骤是

    1、根据当前的url,获取signature,nonceStr,timestamp 和appId。
    2、通过signature,nonceStr,timestamp 和appId来配置微信 wx.config。
    3、通过wx.ready实现微信分享功能。

    1、html端

    引入微信JS-SDK.

    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

    //分享核心js代码
    $(document).ready(function () {
    	//通过ajax,在页面加载的时候获取微信分享接口signature,nonceStr,timestamp 和appId
        $.ajax({
            type: "post",
            url: "/weixin/share",
            dataType: "json",
            data:"url="+window.location.href,
            success: function (data) {
                wx.config({
                    debug: false,
                    appId: data.appId,
                    timestamp: data.timestamp,
                    nonceStr: data.nonceStr,
                    signature: data.signature,
                    jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline', 'hideAllNonBaseMenuItem', 'showMenuItems']
                    // 功能列表,我们要使用JS-SDK的什么功能
                });
                wx.ready(function () {
                    // 获取“分享给朋友”按钮点击状态及自定义分享内容接口
                    wx.onMenuShareAppMessage({
                        title: "分享自定义标题", // 分享标题
                        desc: "分享自定义描述", // 分享描述
                        link: "http://localhost/weixin/share?openId=1",//分享点击之后的链接
                        imgUrl:'/images/photo/1.jpg', // 分享图标
                        type: 'link', // 分享类型,music、video或link,不填默认为link
                        success: function () {
    						//成功之后的回调
                        }
                    });
                    wx.hideAllNonBaseMenuItem();
                    wx.showMenuItems({
                        menuList: ['menuItem:share:appMessage', 'menuItem:share:timeline'] // 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3
                    });
                    wx.onMenuShareTimeline({
                        title: "分享自定义标题", // 分享标题
                        desc: "分享自定义描述", // 分享描述
                        link: "http://localhost/weixin/share?openId=1",//分享点击之后的链接
                        imgUrl:'/images/photo/1.jpg', // 分享图标
                        type: 'link', // 分享类型,music、video或link,不填默认为link
                        success: function () {
    						//成功之后的回调
                        }
                        cancel: function () {
                            // 用户取消分享后执行的回调函数
                        }
                    });
                });
                wx.error(function (res) {
                    //打印错误消息。及把 debug:false,设置为debug:ture就可以直接在网页上看到弹出的错误提示
                });
            }
        })
    });
    
    

    2、Java代码,获取 signature,nonceStr,timestamp 和appId

        @RequestMapping(value = "/share", method = RequestMethod.POST)
        @ResponseBody
        public Map<String, Object> share(HttpServletRequest request) {
            String urlTemp = "http://" + request.getServerName() + request.getContextPath();
            String urlpath = "http://" + request.getServerName();
            String appUrl = request.getParameter("url");
            if (request.getParameter("code") != null) {
                appUrl += "&code=" + request.getParameter("code");
            }
            if (request.getParameter("state") != null) {
                appUrl += "&state=" + request.getParameter("state");
            }
            return WxConfigUtil.getSignature(appUrl, ContentValues.APPID, ContentValues.SECRET, urlTemp, urlpath);
        }
    

    工具类我就把整个贴上来了,其中有些方法是没有用到的。

    getSignature()整个方法是微信分享中的核心方法,用来获取signature,nonceStr,timestamp 和appId这几个核心参数。

    package com.blog.common.util;
    
    import com.alibaba.fastjson.JSONObject;
    import com.blog.common.model.Token;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    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 java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    
    /**
     * 公众平台通用接口工具类
     *
     * @author james
     * @date 2015-02-27
     */
    public class WxConfigUtil {
        // 获取access_token的接口地址(GET) 限2000(次/天)
        public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
        // 获取jsapi_ticket的接口地址(GET) 限2000(次/天)
        public final static String jsapi_ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
        // 缓存添加的时间
        public static String cacheAddTime = null;
        // token,ticket缓存
        public static Map<String, Token> TOKEN_TICKET_CACHE = new HashMap<String, Token>();
        // token对应的key
        private static final String TOKEN = "token";
        // ticket对应的key
        private static final String TICKET = "ticket";
    
        /**
         * 外部获取签名入口类
         *
         * @param appUrl    应用的url
         * @return
         */
        public static Map<String, Object> getSignature(String appUrl, String appId, String secret, String url, String urlpath) {
            // 生成签名的随机串
            String noncestr = RandomUtil.getStringRandom(4);
            if (appUrl == null || "".equals(appUrl)) {
                return null;
            }
            String signature = null;
            Token accessTocken = getToken(appId, secret, System.currentTimeMillis() / 1000);
            Token accessTicket = getTicket(accessTocken.getToken(), System.currentTimeMillis() / 1000);
            signature = signature(accessTicket.getTicket(), cacheAddTime, noncestr, appUrl);
            System.out.println("-=-=-=-=-=-=-=-=appUrl:" + appUrl);
            System.out.println("-=-=-=-=-=-=-=-=token:" + accessTocken.getToken());
            System.out.println("-=-=-=-=-=-=-=-=ticket:" + accessTicket.getTicket());
            System.out.println("-=-=-=-=-=-=-=-=signature:" + signature);
            System.out.println("-=-=-=-=-=-=-=-=timestamp:" + cacheAddTime);
            Map<String, Object> map = new HashMap<>();
            map.put("appId", appId);
            map.put("timestamp", cacheAddTime);
            map.put("nonceStr", noncestr);
            map.put("appUrl", appUrl);
            map.put("signature", signature);
            map.put("url", url);
            map.put("urlpath", urlpath);
            return map;
        }
    
        /**
         * 获得Token
         *
         * @return
         */
        public static String getToken(String appId, String secret) {
            Token accessTocken = getToken(appId, secret, System.currentTimeMillis() / 1000);
            return accessTocken.getToken();
        }
    
        /**
         * 签名
         *
         * @param timestamp
         * @return
         */
        private static 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, noncestr, timestamp, 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;
        }
    
        /**
         * 获取access_token
         *
         * @param appid     凭证
         * @param appsecret 密钥
         * @return
         */
        public static Token getToken(String appid, String appsecret, long currentTime) {
            Token tockenTicketCache = getTokenTicket(TOKEN);
            Token Token = null;
    
            if (tockenTicketCache != null && (currentTime - tockenTicketCache.getAddTime() <= tockenTicketCache.getExpiresIn())) {// 缓存存在并且没过期
                System.out.println("==========缓存中token已获取时长为:" + (currentTime - tockenTicketCache.getAddTime()) + "毫秒,可以重新使用");
                return tockenTicketCache;
            }
            System.out.println("==========缓存中token不存在或已过期===============");
            String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
            JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
            // 如果请求成功
            if (null != jsonObject) {
                Token = new Token();
                Token.setToken(jsonObject.getString("access_token"));
                Token.setExpiresIn(jsonObject.getIntValue("expires_in") / 2);// 正常过期时间是7200秒,此处设置3600秒读取一次
                System.out.println("==========tocket缓存过期时间为:" + Token.getExpiresIn() + "毫秒");
                Token.setAddTime(currentTime);
                updateToken(TOKEN, Token);
            }
            return Token;
        }
    
        /**
         * 获取ticket
         *
         * @param token
         * @return
         */
        private static Token getTicket(String token, long currentTime) {
            Token tockenTicketCache = getTokenTicket(TICKET);
            Token Token = null;
            if (tockenTicketCache != null && (currentTime - tockenTicketCache.getAddTime() <= tockenTicketCache.getExpiresIn())) {// 缓存中有ticket
                System.out.println("==========缓存中ticket已获取时长为:" + (currentTime - tockenTicketCache.getAddTime()) + "毫秒,可以重新使用");
                return tockenTicketCache;
            }
            System.out.println("==========缓存中ticket不存在或已过期===============");
            String requestUrl = jsapi_ticket_url.replace("ACCESS_TOKEN", token);
            JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
            // 如果请求成功
            if (null != jsonObject) {
                Token = new Token();
                Token.setTicket(jsonObject.getString("ticket"));
                Token.setExpiresIn(jsonObject.getIntValue("expires_in") / 2);// 正常过期时间是7200秒,此处设置3600秒读取一次
                System.out.println("==========ticket缓存过期时间为:" + Token.getExpiresIn() + "毫秒");
                Token.setAddTime(currentTime);
                updateToken(TICKET, Token);
            }
            return Token;
        }
    
        /**
         * 发起https请求并获取结果
         *
         * @param requestUrl    请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr     提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
        private static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            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();
                jsonObject = JSONObject.parseObject(buffer.toString());
                // jsonObject = JSONObject.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                System.out.println("Weixin server connection timed out.");
            } catch (Exception e) {
                System.out.println("https request error:{}" + e.getMessage());
            }
            return jsonObject;
        }
    
        /**
         * 将字节数组转换为十六进制字符串
         *
         * @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;
        }
    
        /**
         * 将字节转换为十六进制字符串
         *
         * @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;
        }
    
        /**
         * 从缓存中读取token或者ticket
         *
         * @return
         */
        private static Token getTokenTicket(String key) {
            if (TOKEN_TICKET_CACHE != null && TOKEN_TICKET_CACHE.get(key) != null) {
                System.out.println("==========从缓存中获取到了" + key + "成功===============");
                return TOKEN_TICKET_CACHE.get(key);
            }
            return null;
        }
    
        /**
         * 更新缓存中token或者ticket
         *
         * @return
         */
        private static void updateToken(String key, Token accessTocken) {
            if (TOKEN_TICKET_CACHE != null && TOKEN_TICKET_CACHE.get(key) != null) {
                TOKEN_TICKET_CACHE.remove(key);
                System.out.println("==========从缓存中删除" + key + "成功===============");
            }
            TOKEN_TICKET_CACHE.put(key, accessTocken);
            cacheAddTime = String.valueOf(accessTocken.getAddTime());// 更新缓存修改的时间
            System.out.println("==========更新缓存中" + key + "成功===============");
        }
    
    }
    

    由于大家都希望能看到分享微信的核心代码,关于微信分享功能代码及微信其他的核心功能代码
    已分享在自己的个人博客网站了 https://dingyinwu.com 在资源共享页面,其中还有其它的一些资源~

    展开全文
  • H5微信分享接口开发JS-SDK PHP[附源码]

    万次阅读 热门讨论 2018-04-30 11:02:28
    背景 H5开发中几乎所有项目都要用到自定义分享,见过的分享接口有php引入和ajax调用两种,使用不方便且对代码环境有要求。故共享一版可通过javascript文件引入方式来实现自定义分享的接口(这是15年底做的接口,...

    背景

            H5开发中几乎所有项目都要用到自定义分享,见过的分享接口有php引入和ajax调用两种,使用不方便且对代码环境有要求。故共享一版可通过javascript文件引入方式来实现自定义分享的接口(这是15年底做的接口,一直在使用,如果有更简单便捷的方法欢迎交流)。

            使用这个接口,不管你是php开发的项目还是纯前端的html项目,不管是把代码放服务器还是放到OSS CDN,都是OK的,是一件一劳永逸的事情。


    实现方法

            根据微信JS-SDK开发文档,实现分享主要有几个步骤:步骤一,绑定域名。步骤二,引入JS文件。步骤三,权限验证。步骤四,设置自定义分享信息。

            首先是要有一个认证的微信公众号,进入 公众号设置/功能设置/JS接口安全域名,填入项目域名。然后就是第三步,用接口实现权限验证。

            这里不探讨具体的实现方法(实现已封装到jssdk.php文件),只说明 接口配置和项目调用方法。

            接口配置只需填写公众号AppID、AppSecret两个参数,    

    require_once "jssdk.php";
    $jssdk = new JSSDK("AppID", "AppSecret", $url); // 公众号AppID、AppSecret
    $signPackage = $jssdk->GetSignPackage();
    echo "var signPackage=";
    die(json_encode($signPackage)); // 返回微信分享所需参数

            项目调用接口更方便,只需在index.html里通过javascript引入接口地址即可,

    <script>
        document.write("<script src='accessToken/signPackage.php?originUrl=" + window.location.href + "' type='text/javascript'><\/script>");
    </script>
    <script>
        var baseUrl = "http://xxx.com/";       // 项目地址
        var wxData = {
            "imgUrl" : baseUrl + 'share.jpg',  // 分享图标
            "link"   : baseUrl,                // 分享地址
            "title"  : '微信分享接口-分享标题',   // 分享标题
            "desc"   : '分享文案'               // 分享文案
        };
        wx.config({
            debug: false,
            appId: signPackage.appId,
            timestamp: parseInt(signPackage.timestamp),
            nonceStr: signPackage.nonceStr,
            signature: signPackage.signature,
            jsApiList: [
                'onMenuShareTimeline',
                'onMenuShareAppMessage'
            ]
        });
        wx.ready(function () {
            wx.onMenuShareTimeline({
                title: wxData.title,
                link: wxData.link,
                imgUrl: wxData.imgUrl,
                success: function () {
                }
            });
            wx.onMenuShareAppMessage({
                title: wxData.title,
                desc: wxData.desc,
                link: wxData.link,
                imgUrl: wxData.imgUrl,
                type: 'link',
                dataUrl: '',
                success: function () {
                }
            });
        });
    </script>


    Demo二维码

            


    源码下载地址

            https://download.csdn.net/download/gaofei880219/10383643


    参考链接

            微信JS-SDK说明文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

            微信JS SDK PHP Demo:http://www.cnblogs.com/txw1958/p/weixin-js-sdk-php-demo.html


    -------------------------------  时间分界线:2018.6.26  -------------------------------

            最近一个项目投放微信朋友圈,代码部署腾讯服务器,用到负载均衡共4台IP不同的服务器。那么问题来了,分享接口代码部署到4台服务器,用于存储access_token和jsapi_ticket缓存的json文件在不同的地方,那签名过期重新生成数据必定不同而导致分享配置出错。

            解决思路,把access_token和jsapi_ticket缓存到一个固定的地方,分享接口都去调用这个地方的签名缓存文件。

            具体实现,使用阿里云的RDS云数据库,上面的问题得以解决,而且也能应对高并发。

            数据表设计,如下图:

            

            代码实例见 https://github.com/YanKaiwei/Demo/tree/master/shareDemoRDS


    展开全文
  • 微信分享接口的参数解析 wx.config({ appId: "{$jsapi['appId']}", //固定字符串 timestamp: "{$jsapi['timestamp']}", //根据微信api要求生成的 nonceStr: "{$jsapi['nonceStr']}"...
  • 最近项目中的网页通过微信分享朋友或朋友圈等功能出现了无法显示分享图片等信息,后经过排查发现是微信版本升级导致,采用js-sdk完成分享接口,为了快速实现该功能效果,于是我打算通过前台js进行实现来看看分享效果...
  • 微信分享接口SDK 1,帮兄弟对接微信公众号上的分享朋友圈接口对接;签名一定要用微信签名工具去生成比对下代码中签名规则是否一致;好,下面讲下对接顺序; 2,首先:我分享的页面是index.html,所以要在这个页面...
  • 最近项目中的网页通过微信分享朋友或朋友圈等功能出现了无法显示分享图片等信息,后经过排查发现是微信版本升级导致,采用js-sdk完成分享接口,为了快速实现该功能效果,于是我打算通过前台js进行实现来看看分享效果...
  • 微信分享接口配置和调用常见问题

    千次阅读 2018-04-25 11:33:06
    相信大家在做微信分享功能的时候一定会遇到很多奇怪的问题,有时候会出现一些无厘头的问题,自己明明都配置没问题了,却分享失败,下面给大家介绍一下微信分享经常出现的一些问题和出现问题的原因;1、接口验证失败...
  • 一、申请公众号 ...  通过AppID和AppSecret获得access_token 二、认证 ... 1、微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”;  2、下载文件MP_verify_NKeyegDEdG...
  • 微信分享接口 当分享的标题或描述含有 恭喜发财 ,领取,红包,等字眼的时候 分享的链接图片则显示不出来,只有自己能看得到
  • 微信分享完整demo

    2018-12-02 11:02:02
    微信分享完整demo,带appid,同时有签名文件,下载可用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,882
精华内容 28,752
关键字:

微信分享接口

友情链接: 9018102.rar