微信jssdk_微信jssdk错误苹果手机 - CSDN
精华内容
参与话题
  • 微信jssdk已无力吐槽

    千次阅读 2015-06-30 17:50:14
    微信强大的整合能力让企业公众号的开发迅速窜红,尤其是企业需要个性化定制的一些功能,公司在同时上线的app和触屏版的应用中,微信分享自然是不可或缺的重要一环。纵观现在大多数的微信公众号,分享大都是弹出...

    微信强大的整合能力让企业公众号的开发迅速窜红,尤其是企业需要个性化定制的一些功能,公司在同时上线的app和触屏版的应用中,微信分享自然是不可或缺的重要一环。纵观现在大多数的微信公众号,分享大都是弹出二维码或者干脆直接使用微信右上方的分享功能分享网页链接,对于自定义分享内容这个功能就显得力不从心了,所以在公司伟大领袖的号召下,我们要自定义分享内容,分享标题,分享链接。好的,领导的精神已经发布了,接下来该我们发神经了。拿到微信jssdk开发文档的那一刻我信心百倍的告诉自己,小意思,搞得定(我知道我又想多了)。是的,事情确实没有那么的顺利,测试号的开发进行的坎坎坷坷一切都要归功于开发文档的英明指导,一开始是微信版本号太低,接着是绑定安全域名,好容易到了js验证的时候一直报“invalid signature”,仔细检查下来原来是当前页面的url一定是要动态获取的。终于搞定了,简单分享一下开发过程。
    1.首先引入jweixin-1.0.0.js文件,这个文件是微信验证签名的执行文件。
    2.到官网下载微信提供的签名生成类,这个类需要稍加改造,得到生成ticket的方法,同时要注意缓存jsapi_ticket和token,防止频繁请求微信。
    3.通过js请求后台得到生成的时间戳,nonceStr和signature。
    代码如下:“(document).ready(function() {  
        var inviteLink = “邀请链接”;
    (“#shareContent”).val(inviteLink);
    $.ajax({
    url: ‘<%=path %>/weixin/myshare.htm?url=’+pathURL,
    type: ‘POST’,
    dataType: ‘json’,
    contentType:”application/json;charset=utf-8”,
    data:{},
    error: function(){alert(‘Error’);},
    success: function(result){
    wx.config({
    debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: result.appId, // 必填,公众号的唯一标识
    timestamp: result.timestamp, // 必填,生成签名的时间戳
    nonceStr: result.nonceStr, // 必填,生成签名的随机串
    signature: result.signature,// 必填,签名,见附录1
    jsApiList: [
    ‘checkJsApi’,
    ‘onMenuShareTimeline’,
    ‘onMenuShareAppMessage’,
    ‘onMenuShareQQ’,
    ‘onMenuShareWeibo’
    ]
    });
    wx.ready(function(){

            });
            wx.error(function(res){
                // config信息验证失败会执行error函数
                //alert(res);
            });
        }
    });
    

    });“

    其中jsApiList中是微信提供的分享功能,分别是分享到朋友圈,发送给微信好友,分享到微博和分享到QQ,开发前期可以使用checkJsApi检查公众号是否获取了这些权限,如果没有勿必先获取权限,否则无法正常使用。另外一个需要注意的问题就是在微信内置浏览器的缓存问题,经常困扰验证结果的就是缓存,所以每当进行一次测试之前最好先关闭微信,因缓存造成的麻烦太让人痛苦了。

    展开全文
  • 微信分享JSSDK接入

    2019-07-11 11:30:42
    结果如下,自定义分享链接,分享图片等等... 开始对接 1.JS安全域名 配置路径在: ... 登录公众号号平台后,-----------进入公众号设置-------功能设置------,如下 ... 微信公众号----基本配置--...

    结果如下,自定义分享链接,分享图片等等...

    开始对接

    1.JS安全域名

     配置路径在:

             登录公众号号平台后,-----------进入公众号设置-------功能设置------,如下

    JS安全域名强烈建议如下配置:

    cylothes.cn

    2获取和设置APP_ID,和APP_SECRET

     获取:

             微信公众号----基本配置----公众号开发信息---下

             

         AppId是唯一的

         APPSecret是每次都可以重新设置,丢了可以重设,不用担心

    IP白名单,需要设置你线上的,在此可以提醒你一下, ip白名单,可以设置多个,空格隔开,通过内网穿透将您的本地id可以让微信访问,增加你调试的快捷性.

    设置:

    public class WeChatJsConfig {
    
        public final static String APP_ID = "你的APPID";
        public final static String APP_SECRET = "你的秘钥";
        public final static String GET_ACCESSTOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
        public final static String GET_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
        // public static ConcurrentHashMap<String, Object> INTERFACE_URL_PROPERTIES = new ConcurrentHashMap<>();
    }
    

    因为accessToken和Ticket 每天只能调用2000次,这里我们选择一个缓存方式即可我这里只做个例子自行参考

    ------------------------------------------定时更新Token和Ticket-----建议存redis中---------------------------------------------

    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    
    /**
     * @ClassName: 微信jsSDK 定时刷新
     * @Descripton:
     * @Author: sansy
     * @Date: 2019/7/4 15:30
     * @Version: 2.0
     */
    @Component
    @EnableScheduling
    public class WeChatTask {
        //@Scheduled(cron = "0 0/2 * * * ?")//两分钟
        /**
         * 每隔两小时执行一次
         */
        @Scheduled(cron = "0 0 */2 * * ?")
        public void getTokenGetTicket() throws Exception {
            System.out.println("WeChatTask-执行一次");
    //        //通过AppId和Secret获取 Access_token
    //        Map<String, String> params = new HashMap<String, String>();
    //        params.put("grant_type", "client_credential");
    //        params.put("appid", WeChatJsConfig.APP_ID);
    //        params.put("secret", WeChatJsConfig.APP_SECRET);
    //
    //        //获取accessToken
    //        String accessTokenStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_ACCESSTOKEN_URL, params);
    //        HashMap accessTokenMap = JSON.parseObject(accessTokenStr, HashMap.class);
    //
    //        String accessToken = accessTokenMap.get("access_token").toString();
    //
    //        //将结果存入
    //        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("accessTokenMap", accessTokenMap);
    //        System.out.println("1  " + WeChatJsConfig.INTERFACE_URL_PROPERTIES.hashCode());
    //        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("accessToken", accessToken);
    //        System.out.println("2  " + WeChatJsConfig.INTERFACE_URL_PROPERTIES.hashCode());
    //
    //        //1,清空参数集合
    //        params.clear();
    //        //传入参数
    //        params.put("type", "jsapi");
    //        params.put("access_token", accessToken);
    //
    //        String jsApiTicketMapStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_TICKET_URL, params);
    //
    //        HashMap jsApiTicketMap = JSON.parseObject(jsApiTicketMapStr, HashMap.class);
    //        String jsApiTicket = jsApiTicketMap.get("ticket").toString();
    //
    //        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("jsApiTicketMap", jsApiTicketMap);
    //        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("jsApiTicket", jsApiTicket);
    //    }
    //    @Scheduled(cron = "0 0/1 * * * ?")
    //    public void testOne() {
    //        System.out.println("===========================每分钟执行一次===========================");
    //    }
    //
    //    @Scheduled(fixedRate = 30000)
    //    public void testTwo() {
    //        System.out.println("===========================每30秒执行一次===========================");
        }
    }

    -------------------------------------------------------------定时更新Token和Ticket-------------------------------------------------------------

    给前端一个接口传入URL

    controller层-----------------------------------------

    @PostMapping("/jsSdk")
    public DzResult jSSDKConfig(@RequestParam(value = "url") String url) {
        try {
            Map<String, String> configMap = customService.sign(url);
            return new DzResult().success(configMap);
        } catch (Exception e) {
            return new DzResult().error(1001, "调用失败");
        }
    }

    ----------------------------------------------------------

    service层

    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;
    }
    
    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }
    
    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
    
    @Override
    public Map<String, String> sign(String url) {
    
        System.out.println("进入调用SDK----------------");
        //如果不存在,重新加载,覆盖
        boolean accToken = redisTemplate.hasKey("acctoken");
        System.out.println("是否有这个key  " + accToken);
        Map<String, String> params = new HashMap<String, String>();
        if (!accToken) {
            System.out.println("进入获取access");
            params.put("grant_type", "client_credential");
            params.put("appid", WeChatJsConfig.APP_ID);
            params.put("secret", WeChatJsConfig.APP_SECRET);
    
            System.out.println("appid:  " + WeChatJsConfig.APP_ID);
            //获取accessToken
            String accessTokenStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_ACCESSTOKEN_URL, params);
            HashMap accessTokenMap = JSON.parseObject(accessTokenStr, HashMap.class);
    
            String accessToken = accessTokenMap.get("access_token").toString();
            System.out.println("------------------------------------------------------");
            System.out.println("accessTokenMap:  " + accessTokenMap);
            System.out.println("access_token:  " + accessToken);
            System.out.println("------------------------------------------------------");
            //将结果存入
            redisTemplate.boundValueOps("acctoken").set(accessToken);
            //设置有效期为110分钟
            redisTemplate.boundValueOps("acctoken").expire(110, TimeUnit.MINUTES);
            //1,清空参数集合
            params.clear();
        }
        String accesstoken = redisTemplate.boundValueOps("acctoken").get().toString();
    
        Boolean aBoolean = redisTemplate.hasKey("ticket");
        if (!aBoolean) {
            //传入参数
            params.put("type", "jsapi");
            params.put("access_token", accesstoken);
            String jsApiTicketMapStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_TICKET_URL, params);
            HashMap jsApiTicketMap = JSON.parseObject(jsApiTicketMapStr, HashMap.class);
            String jsApiTicket = jsApiTicketMap.get("ticket").toString();
            //将结果存入
            redisTemplate.boundValueOps("ticket").set(jsApiTicket);
            //设置有效期为110分钟
            redisTemplate.boundValueOps("ticket").expire(110, TimeUnit.MINUTES);
        }
        String jsTicket = redisTemplate.boundValueOps("ticket").get().toString();
    
        System.out.println("拿到的url为:  " + url);
        System.out.println("拿到的App_id为:   " + WeChatJsConfig.APP_ID);
        System.out.println("拿到的App_SECRET为:   " + WeChatJsConfig.APP_SECRET);
        System.out.println("拿到的AccessToken为:  " + accesstoken);
        System.out.println("拿到的ticket为:  " + jsTicket);
    
        Map<String, String> ret = new HashMap<String, String>();
        String nonceStr = create_nonce_str();
        String timestamp = create_timestamp();
        String string1;
        String signature = "";
        //注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsTicket +
                "&noncestr=" + nonceStr +
                "&timestamp=" + timestamp +
                "&url=" + url;
        System.out.println("有序的拼接参数为:    " + string1);
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        ret.put("url", url);
        ret.put("jsapi_ticket", jsTicket);
        ret.put("nonceStr", nonceStr);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        return ret;
    }

     

    关于Springboot静态访问JS安全文件 非templates 模板模式

     

    看了一个写的比较好的可以参考下,我没照着他的做,

    参考文档:https://blog.csdn.net/wangyang00700/article/details/78256943

    展开全文
  • 步骤一:绑定域名步骤二:引入js文件 这是微信服务器上的一个文件 已经写好了步骤三:通过config接口注入权限验证配置 微信官方各的demo 都填好了步骤四:通过·ready接口处理成功验证步骤五:通过·ready接口处理...

    步骤一:绑定域名
    步骤二:引入js文件 这是微信服务器上的一个文件 已经写好了
    步骤三:通过config接口注入权限验证配置 微信官方各的demo 都填好了
    步骤四:通过·ready接口处理成功验证
    步骤五:通过·ready接口处理失败验证

    转载于:https://blog.51cto.com/13550695/2410446

    展开全文
  • 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 步骤二:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https):...
    • 步骤一:绑定域名
      • 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
    • 步骤二:引入JS文件
    • 步骤三:通过config接口注入权限验证配置

       

      • 所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

      • 踩坑:根据微信官方文档,onMeneShareTimeline、onMenuShareAppMessage、onMenuShareQQ、onMenuShareQZone接口即将废弃。建议使用1.4.0版本之后的分享接口:updateAppMessageShareData、updateTimelineShareData、onMenuShareWeibo。但是在config的jsApiList列表中,在加上1.4.0的接口名称时,一定要将对应的老版本的接口名称加上,否则新的接口不起作用。

      • wx.config({
            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: '{$data.appId}', // 必填,公众号的唯一标识
            timestamp: '{$data.timeStamp}', // 必填,生成签名的时间戳
            nonceStr: '{$data.nonceStr}', // 必填,生成签名的随机串
            signature: '{$data.signature}',// 必填,签名
            jsApiList: [
                         'checkJsApi',//检测接口权限
        	             'updateTimelineShareData',//1.4.0的分享接口,注意:使用新版本的分享功能,一定要在该列表加上对应的老版本功能接口,否则新接口不起作用
        	             'updateAppMessageShareData',//1.4.0的分享接口,注意:使用新版本的分享功能,一定要在该列表加上对应的老版本功能接口,否则新接口不起作用
        	             'onMenuShareAppMessage',//老版本分享接口。
        	             'onMenuShareTimeline'//老版本分享接口。
                        ] // 必填,需要使用的JS接口列表
        });
        
        wx.checkJsApi({
        	    jsApiList: [ 'updateTimelineShareData',
        	                    'updateAppMessageShareData',
        	                    'onMenuShareAppMessage',
        	                    'onMenuShareTimeline'
                            ], // 需要检测的JS接口列表,所有JS接口列表见附录2,
        	    success: function(res) {
        	    // 以键值对的形式返回,可用的api值true,不可用为false
        	    // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
        	    	alert(JSON.stringify(res));
        	    },
        	    error:function(res){
        	    	alert(res);
        	    }
        	    
        });
        //分享功能
        wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
        		var shareData = {
        	        title: '分享标题', // 分享标题
        	        desc: '分享描述', // 分享描述
        	        link: 'http://www.baidu.com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
        	        imgUrl: 'http://www.baidu.com/static/addHtml/images/iterationTheme/common/logo_new.png', // 分享图标
        	        success: function (res) {
        	          // 设置成功
        	        },
        	        error:function(res){
        	        }
        		};
                //自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)
        	    wx.updateAppMessageShareData(shareData);
                //自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)
        	  	wx.updateTimelineShareData(shareData);
        	});
        	wx.error(function(res){
        	    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
        	    alert(res.errMsg);
        	});

        wx.config的参数在后台生成。以下是生成config参数的后台代码

      • //获取config的方法
        public function getWxConfig($wxtype = WXPAY_RETAIL){
        		$wxpay = new Wxpay($wxtype);
        		$config = $wxpay->getWxConfig();//获取微信的配置数据
        		$accessToken = $this->getAccessToken($config['appid'],$config['appsecret']);//获取微信的access_token方法
        		$ticket = $this->getJsapiTicket($wxtype);//获取ticket方法
        		$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        		$config = $wxpay->getWxPayJsConfig($accessToken,$ticket,$url);//根据access_token、ticket、当前访问链接获取config配置
        		return $config;
        	}
        
        //获取access_token
         public function getAccessToken($appid = '',$secret = ''){
               if(empty($appid)) $appid = $this->_appid;
            	if(empty($secret)) $secret = $this->_appsecret;
                $cacheName = md5($appid.$secret.'pur_access_token');
                if(empty($accessToken)){
                    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
                    $curl = new Curl();
                    $result = $curl->get($url);
                    $wxLogic = new WxpayLogic();
                    $result = json_decode($result,true);
                    $wxLogic->setLog($result,'获取access_token:');
                    if(isset($result['access_token'])){
                        $accessToken = $result['access_token'];
                        Cache::set($cacheName, $accessToken,$result['expires_in']-100);
                    }else{
                        throw new Exception($result['errmsg']);
                    }
                }
                return $accessToken;
            }
        
        /**
        	 * @return mixed
        	 * @desc:获取js所使用的jsapi_ticket
        	 */
        	function getJsapiTicket($wxpayType = WXPAY_RETAIL)
        	{
        		$cachName = md5($wxpayType.'JSAPI_TICKET');
        		$jsapiTicket = cache($cachName);
        		if (empty($jsapiTicket)) {
        			$wxpay = new Wxpay($wxpayType);
        			$config = $wxpay->getWxConfig();
        			$accessToken = $this->getAccessToken($config['appid'],$config['appsecret']);
        			$ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$accessToken}&type=jsapi";
        			//http_reqest是我自己封装的curl请求的函数
        			$curl = new Curl();
        			$ticketResult = $curl->get($ticketUrl);
        			$this->setLog($ticketResult,'ticket:');
        			$ticketArr = json_decode($ticketResult, true);
        			 if($ticketArr['errcode'] != 0){
        				throw new Exception($ticketArr['errmsg']);
        			} 
        			$jsapiTicket = $ticketArr['ticket'];
        			cache($cachName, $jsapiTicket, 7000);
        		}
        		return $jsapiTicket;
        	}
        
        //获取config参数
        public function getWxPayJsConfig($accessToken,$jsapiTicket,$url){
        		$appId = \WxPayConfig::APPID;
        		$timeStamp = time();
        		$nonceStr = \WxPayApi::getNonceStr();
        		$params = [
        				'jsapi_ticket' => $jsapiTicket,
        				'noncestr' => $nonceStr,
        				'timestamp' => $timeStamp,
        				'url' => $url,
        		];
        		
        		$signature = $this->MakeSign($params);
        		return ['appId'=>$appId,'timeStamp'=>$timeStamp,'nonceStr'=>$nonceStr,'signature'=>$signature,'url'=>$url,'ticket'=>$jsapiTicket];
        	}
        
        

         

    展开全文
  • 微信jssdk

    2019-07-07 10:26:49
    php/** Copyright (c) * All rights reserved.** 文件名称: wx_jssdk* 摘 要: 微信js_sdk config接口注入* * $Id: wx_jssdk.php 162850 2019-04-02 09:13:15Z niezichuan $*/require_once dirname(__FILE__) ....
  • 微信jssdk问题汇总

    2019-06-15 16:22:52
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 微信JSSDK实现微信自定义分享,微信扫一扫 前言: 由于微信使用的越来越多,也让大多数平台或者APP与微信建立了比较深的合作关系,我们公司自主研发的产品也是比较依赖于微信,最近也写了几篇关于微信的博客,本文...
  • 微信JSSDK

    2018-07-17 11:02:19
    首先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。要记得哦。 先看后端操作,基于thinkphp5, /* 微信JS-SDK配置 */ public function share(){ $ticket = getJsapiTicket...
  • 总结微信jssdk使用

    千次阅读 2019-04-11 11:55:20
    总结微信jssdk使用 在实际项目中调用微信jssdk,这篇博客主要做一个总结记录    首先是关于微信jssdk调用步骤 1.在公众号内部的“公众号设置”的“功能设置”里填写“JS接口安全域名”。    备注:登录后可在...
  • 微信jssdk基本使用

    万次阅读 2017-12-11 20:36:58
    对于如何使用jssdk并没有,太大难度,对于不熟悉的人来说,最大的坑在它配置的过程中。  使用jssdk需要注意以下几点:  1.需要在微信公众平台设置js接口安全域名。需要注意的是此处你需要设置的是域名,使用ip是...
  • 微信jssdk使用心得与源码分析

    千次阅读 2016-11-15 16:04:56
    所以微信官方就出了一个浏览器,内置在微信中,阉割了一下原生js的支持,并且封装好了sdk,提供的sdk功能还是比较强大,可以直接调用相机,相册,录音这些功能。但是要使用的话需要微信公众号的凭据,需要在微信...
  • 微信jssdk录音功能开发记录 标签(空格分隔): 前端 0.需求描述 在微信浏览器内打开的页面,制作一个按钮,用户按住按钮后开始录音,松手后停止录音并将录音上传并长期保存。 1.开发流程 如果开发的是普通的...
  • 最近一个客户的需求找到我,他的网站是html静态页,想做微信jssdk分享,他不会实现,asp的他会,他的程序是asp的,让我帮忙写一段能在html静态页中实现...微信jssdk分享页 <script type="text/javascript" src="...
  • 此文章是帮助一个粉丝整理的,如果按照此文一步一步的进行绝对可以引入成功。 ... 注意事项:所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),且...第一步:下载微信jssdk $ npm i weixin-js-sdk 第二步...
  • 微信jssdk接入指南

    2019-07-05 05:29:08
    好久没有写点东西了,最近手里做了一个小小的H5项目,其中用到了微信jssdk。 一提到微信开发,大家肯定很容易想到微信那复杂的文档,我也遇到了同样的问题。 接入jssdk的过程是比较曲折的,所以在这里写一篇文章记录...
  • 迁移到微信公众号后当然就不能再使用了,于是就打算用微信jssdk来实现此功能。 还是和做公众号分享的时候一样,按照微信开发文档的说明一步步来,先引入微信jssdk,不过这里得注意一下,官方默认给的是jweixin-...
  • 微信JSSDK分享DEMO

    2020-07-21 09:56:52
    PHP开发的微信JSSDK分享demo(内有实例)提供大家参考学习
  • 微信JSSDK使用指南

    千次阅读 2015-06-23 20:09:45
    这篇文章主要来说说微信JSSDK的一些配置和微信分享的使用,包括从前端sdk文件引入到服务器端和微信服务器的交互。另外Tangide已经把一些工作做好了,我会简要说一说怎么把它用起来。在开发的过程中主要参考了微信...
  • 微信JSSDK与录音相关的坑 最近一直在做微信JSSDK与录音相关的功能开发, 遇到了各种奇尺大坑, 时不时冷不丁地被坑一道, 让我时常想嘶吼: "微信JSSDK就是个大腊鸡!!!!!!!!!!" 现在工作得到阶段性成果, 有时间休息...
  • 微信JSSDK之签名生成

    万次阅读 2015-10-13 14:49:09
    最近做一个小游戏,需要使用微信分享,经查询,无法直接在网页中直接添加分享按钮进行添加,需调用微信接口定制微信的分享按钮,具体步骤详见微信JSSDK开发文档,通过查找资料,实践如下: 1.在微信公众平台(需...
1 2 3 4 5 ... 20
收藏数 6,266
精华内容 2,506
关键字:

微信jssdk