2017-06-07 22:31:15 ke7in1314 阅读数 1355
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14979 人正在学习 去看看 秦子恒

    前不久做了一个微信公众号项目,有用到JSSDK接口,今晚正好有空,就开始动手整理。如何获得accesstoken和jsapitiket以及生成签名就不细说了,大家看接口文档,有不明白的地方可以给我留言。本文主要介绍了如何去使用JSSDK的部分接口,包括选择图片、上传图片、下载图片、获取地理位置、调用微信扫一扫,其他接口以后补充,代码我贴出来了,测试通过。

     接口文档官方地址:https://mp.weixin.qq.com/wiki

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

	<head>
		<title>接入微信JSSDK</title>
		<base href="<%=basePath%>">
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />

		<head>
			<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
			<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
			<script type="text/javascript">
			
		
				$(function() {
					var appId = '${sign.appId}';
					var nonceStr = '${sign.nonceStr}';
					var timestamp = '${sign.timestamp}';
					var signature = '${sign.signature}';
					wx.config({
						debug: true,
						appId: appId,
						timestamp: timestamp,
						nonceStr: nonceStr,
						signature: signature,
						jsApiList: [
							'checkJsApi',
							'chooseImage',
							'uploadImage',
							'downloadImage',
							'getLocation',
							'scanQRCode'
						]
					});
					var images = {
						localId: [],
						serverId: [],
						downloadId: []
					};

					//选择图片
					$("#chooseImage").bind("click", function() {
						wx.chooseImage({
							count: 9, // 默认9,最多可选9张图片
							sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
							sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
							success: function(res) {
								images.localId = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
							}
						});
					});
					
					//上传图片
				    $("#uploadImage").bind("click", function() {
						var i = 0,
							len = images.localId.length;
						if(len == 0) {
							alert('请先使用 chooseImage 接口选择图片', null);
							return;
						}
						// if(images.localId.length > 1) {
						//    alert('目前仅支持单张图片上传,请重新上传');
						//   images.localId = [];
						//   return false;
						//  }
						function wxUpload() {
							wx.uploadImage({
								localId: images.localId[i], // 需要上传的图片的本地ID,由chooseImage接口获得
								isShowProgressTips: 9, // 默认为1,显示进度提示
								success: function(res) {
									i++;
									alert('已上传:' + i + '/' + len);
									//将上传成功后的serverId保存到serverid
									images.serverId.push(res.serverId);
									//上传成功,下载到本地
									wxImgCallback(res.serverId);
									if(i < len) {
										wxUpload();
									}
								},
								fail: function(res) {
									alert('上传失败');
								}
							});
						}
						wxUpload();
					});
				    
					//下载图片
				    $("#downloadImage").bind("click", function() {
						var i = 0,
							len = images.serverId.length;
						if(len == 0) {
							alert('请先使用 chooseImage 接口选择图片', null);
							return;
						}

						function wxDownload() {
							wx.downloadImage({
								serverId: images.serverId[i], // 需要下载的图片的服务器端ID,由uploadImage接口获得
								isShowProgressTips: 1, // 默认为1,显示进度提示
								success: function(res) {
									i++;
									alert('已下载:' + i + '/' + len);
									images.downloadId.push(res.localId);
									if(i < len) {
										wxDownload();
									}
								}
							});
						}
						wxDownload();
					});

					//获取地理位置
		            $("#openLocation").bind("click", function() {
						wx.getLocation({
							success: function(res) {
								alert(JSON.stringify(res));
							},
							cancel: function(res) {
								alert('用户拒绝授权获取地理位置');
							},
							fail: function(res) {
								alert(JSON.stringify(res));
							}
						});
					});
					
					//调用扫一扫
					$("#scanQRCode").bind("click", function() {
						wx.scanQRCode({
						    needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
						    scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
						    success: function (res) {
							    var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
							    alert(result);
							}
						});
					});
				});

				function wxImgCallback(serverId) {
					$.ajax({
						type: "get",
						url: "${base}/mall/download",
						contentType: "application/json;charset=utf-8",
						data: "serverId=" + serverId,
						success: function(data) {
							if(data == 1){
								alert("下载成功");
							}
						},
						error: function(data) {
							alert("失败");
						}
					});

				}

				wx.error(function(res) {
					alert("出错了:" + res.errMsg);
				});
			</script>
		</head>

		<body>
			<input type="button" id="chooseImage" value="选择图片" /> <br>
			<input type="button" id="uploadImage" value="上传图片" /> <br>
			<input type="button" id="downloadImage" value="下载图片" /> <br>
			<input type="button" id="openLocation" value="查看位置" /> <br>
			<input type="button" id="scanQRCode" value="扫一扫" /> <br>
		</body>
</


      


(转载注明出处,原文地址:http://blog.csdn.net/ke7in1314/article/details/72904491



       

 

   

2018-10-11 11:14:59 qq_41786458 阅读数 972
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14979 人正在学习 去看看 秦子恒

vue 使用微信jssdk

1、引入weixin-js-sdk
npm install weixin-js-sdk

使用文档 https://www.npmjs.com/package/weixin-js-sdk

2、配置 vue中微信jssdk配置

import wx from 'weixin-js-sdk'
 created(){ //微信jssdk配置
			let timestamp=new Date().getTime();//时间戳
			let noncestr=Math.random().toString(36).substr(2);//随机字符串
			let url = "http://"+window.location.host+'/' ;//获取锚点之前的链接 
			let dataJ={
					timestamp,
					noncestr,
					url
			}
			 //获取签名  https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
			getSignatureApi(dataJ).then(res=>{//调用获取签名方法
					wx.config({
							debug: false,
							appId: '12312312312312', // 必填,公众号的唯一标识
							timestamp:timestamp , // 必填,生成签名的时间戳
							nonceStr: noncestr, // 必填,生成签名的随机串
							signature:res.signature,
							jsApiList: [
									'chooseImage',//选择图片
									'uploadImage'//上传图片
								] // 必填,需要使用的JS接口列表
					});
		})
}

3、使用

methods: {
      choseFile:function(id,index){//点击事件选择图片
				var _this=this;
				wx.chooseImage({//
						count: 1, // 默认9
						sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
						sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
						success: function (res) {
							let localId=res.localIds;//获取到本地localIds
							wx.uploadImage({//上传到微信服务器
									localId: localId.toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
									isShowProgressTips: 1, // 默认为1,显示进度提示
									success: function (ret) {}
							});
						}
				});
		}
}
2016-01-18 09:28:07 u014369410 阅读数 601
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14979 人正在学习 去看看 秦子恒

根据微信开发文档步骤如下:

1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

JS接口安全域名设置 mi.com(前面不用带www/http,域名必须备案过)

 

2.引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

 

3.通过config接口注入权限验证配置

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

注:appId从公众号里面获取,timestamp、nonceStr、signature临时通过按微信规定的规则发送url获取

4.通过ready接口处理成功验证

wx.ready(function(){

    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

JS-SDK网页所有接口代码如下:
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>微信JS-SDK Demo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
   <link rel="stylesheet" href="http://demo.open.weixin.qq.com/jssdk/css/style.css?ts=1420774989">    
</head>
<body>
<div class="wxapi_container">
    <div class="wxapi_index_container">
      <ul class="label_box lbox_close wxapi_index_list">
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-basic">基础接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-share">分享接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-image">图像接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-voice">音频接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-smart">智能接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-device">设备信息接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-location">地理位置接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-webview">界面操作接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-scan">微信扫一扫接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-shopping">微信小店接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-card">微信卡券接口</a></li>
        <li class="label_item wxapi_index_item"><a class="label_inner" href="#menu-pay">微信支付接口</a></li>
      </ul>
    </div>
    <div class="lbox_close wxapi_form">
      <h3 id="menu-basic">基础接口</h3>
      判断当前客户端是否支持指定JS接口
      <button class="btn btn_primary" id="checkJsApi">checkJsApi</button>

      <h3 id="menu-share">分享接口</h3>
      获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
      <button class="btn btn_primary" id="onMenuShareTimeline">onMenuShareTimeline</button>
      获取“分享给朋友”按钮点击状态及自定义分享内容接口
      <button class="btn btn_primary" id="onMenuShareAppMessage">onMenuShareAppMessage</button>
      获取“分享到QQ”按钮点击状态及自定义分享内容接口
      <button class="btn btn_primary" id="onMenuShareQQ">onMenuShareQQ</button>
      获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
      <button class="btn btn_primary" id="onMenuShareWeibo">onMenuShareWeibo</button>

      <h3 id="menu-image">图像接口</h3>
      拍照或从手机相册中选图接口
      <button class="btn btn_primary" id="chooseImage">chooseImage</button>
      预览图片接口
      <button class="btn btn_primary" id="previewImage">previewImage</button>
      上传图片接口
      <button class="btn btn_primary" id="uploadImage">uploadImage</button>
      下载图片接口
      <button class="btn btn_primary" id="downloadImage">downloadImage</button>

      <h3 id="menu-voice">音频接口</h3>
      开始录音接口
      <button class="btn btn_primary" id="startRecord">startRecord</button>
      停止录音接口
      <button class="btn btn_primary" id="stopRecord">stopRecord</button>
      播放语音接口
      <button class="btn btn_primary" id="playVoice">playVoice</button>
      暂停播放接口
      <button class="btn btn_primary" id="pauseVoice">pauseVoice</button>
      停止播放接口
      <button class="btn btn_primary" id="stopVoice">stopVoice</button>
      上传语音接口
      <button class="btn btn_primary" id="uploadVoice">uploadVoice</button>
      下载语音接口
      <button class="btn btn_primary" id="downloadVoice">downloadVoice</button>

      <h3 id="menu-smart">智能接口</h3>
      识别音频并返回识别结果接口
      <button class="btn btn_primary" id="translateVoice">translateVoice</button>

      <h3 id="menu-device">设备信息接口</h3>
      获取网络状态接口
      <button class="btn btn_primary" id="getNetworkType">getNetworkType</button>

      <h3 id="menu-location">地理位置接口</h3>
      使用微信内置地图查看位置接口
      <button class="btn btn_primary" id="openLocation">openLocation</button>
      获取地理位置接口
      <button class="btn btn_primary" id="getLocation">getLocation</button>

      <h3 id="menu-webview">界面操作接口</h3>
      隐藏右上角菜单接口
      <button class="btn btn_primary" id="hideOptionMenu">hideOptionMenu</button>
      显示右上角菜单接口
      <button class="btn btn_primary" id="showOptionMenu">showOptionMenu</button>
      关闭当前网页窗口接口
      <button class="btn btn_primary" id="closeWindow">closeWindow</button>
      批量隐藏功能按钮接口
      <button class="btn btn_primary" id="hideMenuItems">hideMenuItems</button>
      批量显示功能按钮接口
      <button class="btn btn_primary" id="showMenuItems">showMenuItems</button>
      隐藏所有非基础按钮接口
      <button class="btn btn_primary" id="hideAllNonBaseMenuItem">hideAllNonBaseMenuItem</button>
      显示所有功能按钮接口
      <button class="btn btn_primary" id="showAllNonBaseMenuItem">showAllNonBaseMenuItem</button>

      <h3 id="menu-scan">微信扫一扫</h3>
      调起微信扫一扫接口
      <button class="btn btn_primary" id="scanQRCode0">scanQRCode(微信处理结果)</button>
      <button class="btn btn_primary" id="scanQRCode1">scanQRCode(直接返回结果)</button>

      <h3 id="menu-shopping">微信小店接口</h3>
      跳转微信商品页接口
      <button class="btn btn_primary" id="openProductSpecificView">openProductSpecificView</button>

      <h3 id="menu-card">微信卡券接口</h3>
      批量添加卡券接口
      <button class="btn btn_primary" id="addCard">addCard</button>
      调起适用于门店的卡券列表并获取用户选择列表
      <button class="btn btn_primary" id="chooseCard">chooseCard</button>
      查看微信卡包中的卡券接口
      <button class="btn btn_primary" id="openCard">openCard</button>

      <h3 id="menu-pay">微信支付接口</h3>
      发起一个微信支付请求
      <button class="btn btn_primary" id="chooseWXPay">chooseWXPay</button>
    </div>
  </div>
</body>
<!--步骤二:引入JS文件  -->
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
 
    //步骤三:通过config接口注入权限验证配置
  wx.config({
      debug: false,
      appId: '<?php echo $signPackage["appId"];?>',
      timestamp: <?php echo $signPackage["timestamp"];?>,
      nonceStr: '<?php echo $signPackage["nonceStr"];?>',
      signature: '<?php echo $signPackage["signature"];?>',
      jsApiList: [
        'checkJsApi',
        'onMenuShareTimeline',
        'onMenuShareAppMessage',
        'onMenuShareQQ',
        'onMenuShareWeibo',
        'hideMenuItems',
        'showMenuItems',
        'hideAllNonBaseMenuItem',
        'showAllNonBaseMenuItem',
        'translateVoice',
        'startRecord',
        'stopRecord',
        'onRecordEnd',
        'playVoice',
        'pauseVoice',
        'stopVoice',
        'uploadVoice',
        'downloadVoice',
        'chooseImage',
        'previewImage',
        'uploadImage',
        'downloadImage',
        'getNetworkType',
        'openLocation',
        'getLocation',
        'hideOptionMenu',
        'showOptionMenu',
        'closeWindow',
        'scanQRCode',
        'chooseWXPay',
        'openProductSpecificView',
        'addCard',
        'chooseCard',
        'openCard'
      ]
  });
</script>
<script> 

//步骤四:通过ready接口处理成功验证

wx.ready(function () {
  // 1 判断当前版本是否支持指定 JS 接口,支持批量判断
  document.querySelector('#checkJsApi').onclick = function () {
    wx.checkJsApi({
      jsApiList: [
        'getNetworkType',
        'previewImage'
      ],
      success: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };

  // 2. 分享接口
  // 2.1 监听“分享给朋友”,按钮点击、自定义分享内容及分享结果接口
  document.querySelector('#onMenuShareAppMessage').onclick = function () {
    wx.onMenuShareAppMessage({
      title: '<a href="http://www.it165.net/news/nhlw/" target="_blank" class="keylink">互联网</a>之子',
      desc: '在长大的过程中,我才慢慢发现,我身边的所有事,别人跟我说的所有事,那些所谓本来如此,注定如此的事,它们其实没有非得如此,事情是可以改变的。更重要的是,有些事既然错了,那就该做出改变。',
      link: 'http://movie.douban.com/subject/25785114/',
      imgUrl: 'http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg',
      trigger: function (res) {
        // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
        alert('用户点击发送给朋友');
      },
      success: function (res) {
        alert('已分享');
      },
      cancel: function (res) {
        alert('已取消');
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
    alert('已注册获取“发送给朋友”状态事件');
  };

  // 2.2 监听“分享到朋友圈”按钮点击、自定义分享内容及分享结果接口
  document.querySelector('#onMenuShareTimeline').onclick = function () {
    wx.onMenuShareTimeline({
      title: '<a href="http://www.it165.net/news/nhlw/" target="_blank" class="keylink">互联网</a>之子',
      link: 'http://movie.douban.com/subject/25785114/',
      imgUrl: 'http://demo.open.weixin.<a href="http://www.it165.net/qq/" target="_blank" class="keylink">qq</a>.com/jssdk/images/p2166127561.jpg',
      trigger: function (res) {
        // 不要尝试在trigger中使用ajax异步请求修改本次分享的内容,因为客户端分享操作是一个同步操作,这时候使用ajax的回包会还没有返回
        alert('用户点击分享到朋友圈');
      },
      success: function (res) {
        alert('已分享');
      },
      cancel: function (res) {
        alert('已取消');
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
    alert('已注册获取“分享到朋友圈”状态事件');
  };

  // 2.3 监听“分享到QQ”按钮点击、自定义分享内容及分享结果接口
  document.querySelector('#onMenuShareQQ').onclick = function () {
    wx.onMenuShareQQ({
      title: '互联网之子',
      desc: '在长大的过程中,我才慢慢发现,我身边的所有事,别人跟我说的所有事,那些所谓本来如此,注定如此的事,它们其实没有非得如此,事情是可以改变的。更重要的是,有些事既然错了,那就该做出改变。',
      link: 'http://movie.douban.com/subject/25785114/',
      imgUrl: 'http://img3.douban.com/view/movie_poster_cover/spst/public/p2166127561.jpg',
      trigger: function (res) {
        alert('用户点击分享到QQ');
      },
      complete: function (res) {
        alert(JSON.stringify(res));
      },
      success: function (res) {
        alert('已分享');
      },
      cancel: function (res) {
        alert('已取消');
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
    alert('已注册获取“分享到 QQ”状态事件');
  };
  
  // 2.4 监听“分享到微博”按钮点击、自定义分享内容及分享结果接口
  document.querySelector('#onMenuShareWeibo').onclick = function () {
    wx.onMenuShareWeibo({
      title: '互联网之子',
      desc: '在长大的过程中,我才慢慢发现,我身边的所有事,别人跟我说的所有事,那些所谓本来如此,注定如此的事,它们其实没有非得如此,事情是可以改变的。更重要的是,有些事既然错了,那就该做出改变。',
      link: 'http://movie.douban.com/subject/25785114/',
      imgUrl: 'http://img3.douban.com/view/movie_poster_cover/spst/public/p2166127561.jpg',
      trigger: function (res) {
        alert('用户点击分享到微博');
      },
      complete: function (res) {
        alert(JSON.stringify(res));
      },
      success: function (res) {
        alert('已分享');
      },
      cancel: function (res) {
        alert('已取消');
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
    alert('已注册获取“分享到微博”状态事件');
  };


  // 3 智能接口
  var voice = {
    localId: '',
    serverId: ''
  };
  // 3.1 识别音频并返回识别结果
  document.querySelector('#translateVoice').onclick = function () {
    if (voice.localId == '') {
      alert('请先使用 startRecord 接口录制一段声音');
      return;
    }
    wx.translateVoice({
      localId: voice.localId,
      complete: function (res) {
        if (res.hasOwnProperty('translateResult')) {
          alert('识别结果:' + res.translateResult);
        } else {
          alert('无法识别');
        }
      }
    });
  };

  // 4 音频接口
  // 4.2 开始录音
  document.querySelector('#startRecord').onclick = function () {
    wx.startRecord({
      cancel: function () {
        alert('用户拒绝授权录音');
      }
    });
  };

  // 4.3 停止录音
  document.querySelector('#stopRecord').onclick = function () {
    wx.stopRecord({
      success: function (res) {
        voice.localId = res.localId;
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };

  // 4.4 监听录音自动停止
  wx.onVoiceRecordEnd({
    complete: function (res) {
      voice.localId = res.localId;
      alert('录音时间已超过一分钟');
    }
  });

  // 4.5 播放音频
  document.querySelector('#playVoice').onclick = function () {
    if (voice.localId == '') {
      alert('请先使用 startRecord 接口录制一段声音');
      return;
    }
    wx.playVoice({
      localId: voice.localId
    });
  };

  // 4.6 暂停播放音频
  document.querySelector('#pauseVoice').onclick = function () {
    wx.pauseVoice({
      localId: voice.localId
    });
  };

  // 4.7 停止播放音频
  document.querySelector('#stopVoice').onclick = function () {
    wx.stopVoice({
      localId: voice.localId
    });
  };

  // 4.8 监听录音播放停止
  wx.onVoicePlayEnd({
    complete: function (res) {
      alert('录音(' + res.localId + ')播放结束');
    }
  });

  // 4.8 上传语音
  document.querySelector('#uploadVoice').onclick = function () {
    if (voice.localId == '') {
      alert('请先使用 startRecord 接口录制一段声音');
      return;
    }
    wx.uploadVoice({
      localId: voice.localId,
      success: function (res) {
        alert('上传语音成功,serverId 为' + res.serverId);
        voice.serverId = res.serverId;
      }
    });
  };

  // 4.9 下载语音
  document.querySelector('#downloadVoice').onclick = function () {
    if (voice.serverId == '') {
      alert('请先使用 uploadVoice 上传声音');
      return;
    }
    wx.downloadVoice({
      serverId: voice.serverId,
      success: function (res) {
        alert('下载语音成功,localId 为' + res.localId);
        voice.localId = res.localId;
      }
    });
  };

  // 5 图片接口
  // 5.1 拍照、本地选图
  var images = {
    localId: [],
    serverId: []
  };
  document.querySelector('#chooseImage').onclick = function () {
    wx.chooseImage({
      success: function (res) {
        images.localId = res.localIds;
        alert('已选择 ' + res.localIds.length + ' 张图片');
      }
    });
  };

  // 5.2 图片预览
  document.querySelector('#previewImage').onclick = function () {
    wx.previewImage({
      current: 'http://img5.douban.com/view/photo/photo/public/p1353993776.jpg',
      urls: [
        'http://img3.douban.com/view/photo/photo/public/p2152117150.jpg',
        'http://img5.douban.com/view/photo/photo/public/p1353993776.jpg',
        'http://img3.douban.com/view/photo/photo/public/p2152134700.jpg'
      ]
    });
  };

  // 5.3 上传图片
  document.querySelector('#uploadImage').onclick = function () {
    if (images.localId.length == 0) {
      alert('请先使用 chooseImage 接口选择图片');
      return;
    }
    var i = 0, length = images.localId.length;
    images.serverId = [];
    function upload() {
      wx.uploadImage({
        localId: images.localId[i],
        success: function (res) {
          i++;
          alert('已上传:' + i + '/' + length);
          images.serverId.push(res.serverId);
          if (i < length) {
            upload();
          }
        },
        fail: function (res) {
          alert(JSON.stringify(res));
        }
      });
    }
    upload();
  };

  // 5.4 下载图片
  document.querySelector('#downloadImage').onclick = function () {
    if (images.serverId.length === 0) {
      alert('请先使用 uploadImage 上传图片');
      return;
    }
    var i = 0, length = images.serverId.length;
    images.localId = [];
    function download() {
      wx.downloadImage({
        serverId: images.serverId[i],
        success: function (res) {
          i++;
          alert('已下载:' + i + '/' + length);
          images.localId.push(res.localId);
          if (i < length) {
            download();
          }
        }
      });
    }
    download();
  };

  // 6 设备信息接口
  // 6.1 获取当前网络状态
  document.querySelector('#getNetworkType').onclick = function () {
    wx.getNetworkType({
      success: function (res) {
        alert(res.networkType);
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };

  // 7 地理位置接口
  // 7.1 查看地理位置
  document.querySelector('#openLocation').onclick = function () {
    wx.openLocation({
      latitude: 23.099994,
      longitude: 113.324520,
      name: 'TIT 创意园',
      address: '广州市海珠区新港中路 397 号',
      scale: 14,
      infoUrl: 'http://weixin.<a href="http://www.it165.net/qq/" target="_blank" class="keylink">qq</a>.com'
    });
  };

  // 7.2 获取当前地理位置
  document.querySelector('#getLocation').onclick = function () {
    wx.getLocation({
      success: function (res) {
        alert(JSON.stringify(res));
      },
      cancel: function (res) {
        alert('用户拒绝授权获取地理位置');
      },
      fail: function (res) {
          alert(JSON.stringify(res));
        }
    });
  };

  // 8 界面操作接口
  // 8.1 隐藏右上角菜单
  document.querySelector('#hideOptionMenu').onclick = function () {
    wx.hideOptionMenu();
  };

  // 8.2 显示右上角菜单
  document.querySelector('#showOptionMenu').onclick = function () {
    wx.showOptionMenu();
  };

  // 8.3 批量隐藏菜单项
  document.querySelector('#hideMenuItems').onclick = function () {
    wx.hideMenuItems({
      menuList: [
        'menuItem:readMode', // 阅读模式
        'menuItem:share:timeline', // 分享到朋友圈
        'menuItem:copyUrl' // 复制链接
      ],
      success: function (res) {
        alert('已隐藏“阅读模式”,“分享到朋友圈”,“复制链接”等按钮');
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };

  // 8.4 批量显示菜单项
  document.querySelector('#showMenuItems').onclick = function () {
    wx.showMenuItems({
      menuList: [
        'menuItem:readMode', // 阅读模式
        'menuItem:share:timeline', // 分享到朋友圈
        'menuItem:copyUrl' // 复制链接
      ],
      success: function (res) {
        alert('已显示“阅读模式”,“分享到朋友圈”,“复制链接”等按钮');
      },
      fail: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };

  // 8.5 隐藏所有非基本菜单项
  document.querySelector('#hideAllNonBaseMenuItem').onclick = function () {
    wx.hideAllNonBaseMenuItem({
      success: function () {
        alert('已隐藏所有非基本菜单项');
      }
    });
  };

  // 8.6 显示所有被隐藏的非基本菜单项
  document.querySelector('#showAllNonBaseMenuItem').onclick = function () {
    wx.showAllNonBaseMenuItem({
      success: function () {
        alert('已显示所有非基本菜单项');
      }
    });
  };

  // 8.7 关闭当前窗口
  document.querySelector('#closeWindow').onclick = function () {
    wx.closeWindow();
  };

  // 9 微信原生接口
  // 9.1.1 扫描二维码并返回结果
  document.querySelector('#scanQRCode0').onclick = function () {
    wx.scanQRCode();
  };
  // 9.1.2 扫描二维码并返回结果
  document.querySelector('#scanQRCode1').onclick = function () {
    wx.scanQRCode({
      needResult: 1,
      desc: 'scanQRCode desc',
      success: function (res) {
        alert(JSON.stringify(res));
      }
    });
  };

  // 10 微信支付接口
  // 10.1 发起一个支付请求
  document.querySelector('#chooseWXPay').onclick = function () {
    // 注意:此 Demo 使用 2.7 版本支付接口实现,建议使用此接口时参考微信支付相关最新文档。
    wx.chooseWXPay({
      timestamp: 1414723227,
      nonceStr: 'noncestr',
      package: 'addition=action_id%3dgaby1234%26limit_pay%3d&bank_type=WX&body=innertest&fee_type=1&input_charset=GBK¬ify_url=http%3A%2F%2F120.204.206.246%2Fcgi-bin%2Fmmsupport-bin%2Fnotifypay&out_trade_no=1414723227818375338&partner=1900000109&spbill_create_ip=127.0.0.1&total_fee=1&sign=432B647FE95C7BF73BCD177CEECBEF8D',
      signType: 'SHA1', // 注意:新版支付接口使用 MD5 加密
      paySign: 'bd5b1933cda6e9548862944836a9b52e8c9a2b69'
    });
  };

  // 11.3  跳转微信商品页
  document.querySelector('#openProductSpecificView').onclick = function () {
    wx.openProductSpecificView({
      productId: 'pDF3iY_m2M7EQ5EKKKWd95kAxfNw'
    });
  };

  // 12 微信卡券接口
  // 12.1 添加卡券
  document.querySelector('#addCard').onclick = function () {
    wx.addCard({
      cardList: [
        {
          cardId: 'pDF3iY9tv9zCGCj4jTXFOo1DxHdo',
          cardExt: '{"code": "", "openid": "", "timestamp": "1418301401", "signature":"64e6a7cc85c6e84b726f2d1cbef1b36e9b0f9750"}'
        },
        {
          cardId: 'pDF3iY9tv9zCGCj4jTXFOo1DxHdo',
          cardExt: '{"code": "", "openid": "", "timestamp": "1418301401", "signature":"64e6a7cc85c6e84b726f2d1cbef1b36e9b0f9750"}'
        }
      ],
      success: function (res) {
        alert('已添加卡券:' + JSON.stringify(res.cardList));
      }
    });
  };

  // 12.2 选择卡券
  document.querySelector('#chooseCard').onclick = function () {
    wx.chooseCard({
      cardSign: '97e9c5e58aab3bdf6fd6150e599d7e5806e5cb91',
      timestamp: 1417504553,
      nonceStr: 'k0hGdSXKZEj3Min5',
      success: function (res) {
        alert('已选择卡券:' + JSON.stringify(res.cardList));
      }
    });
  };

  // 12.3 查看卡券
  document.querySelector('#openCard').onclick = function () {
    alert('您没有该公众号的卡券无法打开卡券。');
    wx.openCard({
      cardList: [
      ]
    });
  };

  var shareData = {
    title: '微信JS-SDK Demo',
    desc: '微信JS-SDK,帮助第三方为用户提供更优质的移动web服务',
    link: 'http://demo.open.weixin.qq.com/jssdk/',
    imgUrl: 'http://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRt8Qia4lv7k3M9J1SKqKCImxJCt7j9rHYicKDI45jRPBxdzdyREWnk0ia0N5TMnMfth7SdxtzMvVgXg/0'
  };
  wx.onMenuShareAppMessage(shareData);
  wx.onMenuShareTimeline(shareData);
});

wx.error(function (res) {
  alert(res.errMsg);
});
</script>
</html>

 

window.shareData = {
        "timeLineLink":"http://www.baidu.com",   
        "sendFriendLink":"http://www.baidu.com",
        "weiboLink":"http://www.baidu.com",
        "tTitle":"八斗美妆人才网",
        "tContent":"共创会—八斗携手阿里O2O,聚合品牌、连锁渠道方共谋美妆未来商业模式",
        "fTitle":"八斗美妆人才网",
        "fContent":"共创会—八斗携手阿里O2O,聚合品牌、连锁渠道方共谋美妆未来商业模式",
        "wContent":"共创会—八斗携手阿里O2O,聚合品牌、连锁渠道方共谋美妆未来商业模式"
 };

 
其它分享调用:window.shareData.fContent
或者
<script>
    //自定义分享参数
    var wxData = {
        "imgUrl": "",//图片
        "link": "",//分享链接
        "title": "",//定义分享标题
        "desc":""
    };
</script>

 

//===============================================================================

方法二:

wx.ready(function () {    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。      var shareData = {        title: title, // 分享标题        desc: desc, // 分享描述        link: link, //网页地址        imgUrl: imgUrl, //小图片的地址        success: function () {            // 用户确认分享后执行的回调函数        },        cancel: function () {            // 用户取消分享后执行的回调函数        }      };      wx.onMenuShareAppMessage(shareData);      wx.onMenuShareTimeline(shareData);  });

 
wx.ready(function() {//地理位置wx.getLocation({ success:function (res) { var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 var speed = res.speed; // 速度,以米/每秒计 var accuracy = res.accuracy; // 位置精度 alert("latitude : "+latitude+"--longitude : "+longitude+"--speed : "+speed+"--accuracy : "+accuracy); }});

 


转自:http://www.cnblogs.com/Fooo/p/5049608.html

2015-06-23 20:09:51 lc598470345 阅读数 3960
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14979 人正在学习 去看看 秦子恒

    这篇文章主要来说说微信JSSDK的一些配置和微信分享的使用,包括从前端sdk文件引入到服务器端和微信服务器的交互。另外Tangide已经把一些工作做好了,我会简要说一说怎么把它用起来。在开发的过程中主要参考了微信官方开发文档,由于微信提供的功能略多,我会定期更新文档,如果你已经熟悉了微信JSSDK的开发流程可以直接跳过前面的步骤,直接跳转到Tangide与微信JSSDK的使用结合 :)。


1. 首先得有个公众号

微信把公众号细分为服务号订阅号。接口权限各不相同,如果你记不住你的公众号有没有对应功能的权限,可以到开发者中心->接口权限表对应查看。

2. 配置JS接口安全域名

微信限制了JS接口使用的域名,具体在:公众号设置->功能设置页面。好在可以同时配置3个,而且可以修改: js-api

这意味着配置可以复用了,重复劳动减少了:)。

3. 引入JS文件

http://res.wx.qq.com/open/js/jweixin-1.0.0.js这个是微信官方提供的sdk。可以在h5页面放个<script>标签把它引入进来。

4. 注入权限验证配置

微信为了验证调用SDK的合法性,需要我们的服务器与微信服务器交互获取配置信息。

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

一般来说只有是否开启调式模式由客户端决定,其他的都是通过http请求服务器获得,下面我们就来看看如何从服务获取配置信息。

5. 服务端获取配置信息

这是整个过程相对关键的一步,你必须要缓存好两个token: jsapi_ticket以及access_tokenaccess_token有效时间为2个小时。向微信服务器请求频率限制为:每天2000次。微信还有其他一些参数的频率限制,你可以看这里。
下面来说说获取配置信息的具体步骤:

get config uml

来看看服务器端是怎么处理的:

nodejs服务器端:

var fs = require('fs');
var path = require('path');
var urlParser = require('url');
var TokenManager = require('./token_manager');

var Handler = function() {
};

Handler.doit = function(req, res) {
    try {
        var query = urlParser.parse(req.url, true).query;
        if(!query || !query.url) {
            throw new Error('invalid params');
        }
        var realUrl= atob(decodeURI(query.url));
    }
    catch(e) {
        res.status(401).json({code: -1, message: e});
        res.end();
        return;
    }
    Handler.tokens.getJsApiTicket(realUrl, function(err, config) {
        if(!!err) {
           res.status(500).json({code: -1, message: err});
        }
        else {
           res.status(200).json({code: 0, message: 'success', data: config});
        }
        res.end();
    });
};

Handler.init = function(app, express, config) {
    Handler.opts = {
        appid: config.appid,
        secret:config.secret
    };
    Handler.tokens = TokenManager.create(opts);
    app.post('/weixin/get-config.php', Handler.doit);
};

module.exports = Handler;

//////////////////////////////////////////////////////////////////////////////
//token manager

var TokenManager = function(opts) {
    this.opts = opts;
    if(!opts.appid || !opts.secret) {
        thow new Error('appid and secret should not be empty!!!');
    }
    var tokenPath = path.join(__dirname, 'tokens.json');
    this.loadToken = opts.loadToken || function(type, cb) {
        fs.readFile(tokenPath, 'utf8', function(err, data) {
            if(!!err) {
                return cb(err);
            }
            try {
                data = data || JSON.stringify({});
                data = JSON.parse(data);
            }
            catch(e) {
               return cb(e);
            }
            cb(null, data[type] || {});
        });
    };
    this.saveToken = opts.saveToken || function(token, cb) {
        fs.readFile(tokenPath, 'utf8', function(err, data) {        
            if(!!err) {
                return cb(err);
            }
            data = data || {};
            var type = Object.keys(token)[0];
            data[type] = token[type];
            fs.writeFile(tokenPath, JSON.stringify(data), cb);
        });
    };
};

var isValid = function() {
    return !!this.token && (new Date().getTime()) < this.expireTime;
};

var load = function(stream, cb) {
    var chunks = [];
    stream.on('data', function(chunk) {
        chunks.push(chunk);
    });
    stream.on('error', function(err) {
        cb(err);
    });
    stream.on('end', function() {
        cb(null, Buffer.concat(chunks));
    });
};

var request = function(url, cb) {
    require('https').get(url, function(res) {
        load(res, cb);
    }).on('error', function(err) {
        cb(err);
    });
};

var wrapper = function(cb) {
    return function(err, rawData) {
         cb = cb || function() {};
         if(!!err) {
             return cb(err);
         }
         try {
             var data = rawData.toString('utf-8');
             data = JSON.parse(data);
         }
         catch(err) {
              return cb(err);
         }
         if(data && data.errcode) {
              err = new Error(data.errmsg);
              err.name = 'WeChatAPIError';
              err.code = data.errcode;
              return cb(err, data);
         }
         cb(null, data);
    };
};

TokenManager.prototype.getAccessToken = function(cb) {
    var self = this;
    this.loadToken('accessToken', function(err, token) {
         if(err) {
            cb(err);
         }
         else if(isValid.call(token)) {
            cb(null, token.token);
         }
         else {
              var url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential' +
                        this.opts.appid + this.opts.secret;
              request(url, wrapper(function(err, data) {
                  if(err) {
                      return cb(err);
                  }
                  console.assert(data && data.token);
                  var expireTime = (new Date().getTime()) + (data.expires_in - 10) * 1000;
                  var token = {
                      accessToken: {
                          'token': data.token,
                          'expireTime': expireTime
                      }
                  };
                  self.saveToken(token, function(err) {
                       if(err) {
                           return cb(err);
                       }
                       cb(null, data.token);
                  });
              });
         }
    });
};

TokenManager.prototype.getJsApiTicket = function(cb) {
    var self = this;
    this.loadToken('jsApiTicket', function(err, token) {
         if(err) {
            cb(err);
         }
         else if(isValid.call(token)) {
            cb(null, token.token);
         }
         else {
              self.getAccessToken(function(err, token) {
              if(err) {
                  return cb(err);
              }
              console.assert(token);
              var url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=' + token;
              request(url, wrapper(function(err, data) {
                  if(err) {
                      return cb(err);
                  }
                  console.assert(data && data.token);
                  var expireTime = (new Date().getTime()) + (data.expires_in - 10) * 1000;
                  var token = {
                     jsApiTicket: {
                          'token': data.ticket,
                          'expireTime': expireTime
                      }
                  };
                  self.saveToken(token, function(err) {
                       if(err) {
                           return cb(err);
                       }
                       cb(null, data.token);
                  });
              });
         }    
    });
};

var createNonceStr = function(length) {
    return Math.random().toString(36).substr(2, length || 15);
};

var createTimestamp = function() {
    return parseInt(new Date().getTime()/1000, 10) + '';
};

var crypto = require('crypto');

var genSignature = function() {
    var raw = function() {
        var keys = Object.keys(arguments);
        var newArgs = {};
        keys.sort().forEach(function(key) {
            newArgs[key.toLowerCase()] = arguments[key];
        });
        var str = '';
        for(var k in newArgs) {
            str += '&' + k + '=' + newArgs[k];
        }
        return str.substr(1);
    };
    var str = raw.apply(null, arguments);
    return crypto.createHash('sha1').update(str).digest('hex');
};

TokenManager.prototype.getJSSDKConfig = function(url, cb) {
    var self = this;

    this.getJsApiTicket(function(err, ticket) {
        if(err) {
            return cb(err);
        }
        console.assert(ticket);     
        var nonceStr = createNonceStr();
        var timestamp= createTimestamp();
        var signature= genSignature(nonceStr, timestamp, ticket, url);
        var ret = {
            appId: self.opts.appid,
            nonceStr: nonceStr,
            timestamp: timestamp,
            signature: signature,
            url: url,
            jsApiList: [
                 'checkJsApi', 'chooseImage',
                 'previewImage', 'uploadImage',
                 'onMenuShareTimeline', 'onMenuShareAppMessage',
                 'onMenuShareQQ', 'onMenuShareWeibo'
            ]
        };
        cb(null, ret);
    });
};

module.exports.create = function(opts) {
    if(!this.inst) {
        this.inst = new TokenManager(opts);
    }
    return inst;
};

    代码比较长,将就看吧!如果看过微信开发文档中的关于授权的大致流程,以上代码就没有什么问题了。需要注意的是,默认token保存在本地文件,如果有其他cluster需求可以自行注入函数来处理。

php服务器端

<?php
class JSSDK {
  private $appId;
  private $appSecret;
  public function __construct($appId, $appSecret) {
    $this->appId = $appId;
    $this->appSecret = $appSecret;
  }
  public function getSignPackage($url) {
    $jsapiTicket = $this->getJsApiTicket();
    if(!$url) {
        $url = "http://$_SERVER[HTTP_HOST]" . '/weixin/demo/index.html';
    }
    $timestamp = time();
    $nonceStr = $this->createNonceStr();
    // 这里参数的顺序要按照 key 值 ASCII 码升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
    $signature = sha1($string);
    $signPackage = array(
      "appId"     => $this->appId,
      "nonceStr"  => $nonceStr,
      "timestamp" => $timestamp,
      "url"       => $url,
      "signature" => $signature,
      "rawString" => $string
    );
    return $signPackage; 
  }
  private function createNonceStr($length = 16) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
  }

  private function getFileName($name) {
    //$fileName = sys_get_temp_dir() . "/weixin-" . $name;
    $fileName = dirname(__FILE__) . "/weixin-". $name;
    return $fileName;
  }

  private function saveData($name, $content) {
    $fileName = $this->getFileName($name);

    $fp = fopen($fileName, "wb+");
    if($fp) {
        fwrite($fp, $content);
        fclose($fp);
    }

    return;
  }

  private function loadData($name, $defaultContent) {
    $fileName = $this->getFileName($name);
    $content = file_get_contents($fileName);

    if($content) {
        return $content;
    }
    else {
        return $defaultContent;
    }

    return;
  }

  private function getJsApiTicket() {
    $data = json_decode($this->loadData("jsapi_ticket.json", '{"jsapi_ticket":"", "expire_time":0}'));
    if ($data->expire_time < time()) {
      $accessToken = $this->getAccessToken();
      $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
      $res = json_decode($this->httpGet($url));
      $ticket = $res->ticket;
      if ($ticket) {
        $data->expire_time = time() + 3600;
        $data->jsapi_ticket = $ticket;
        $this->saveData("jsapi_ticket.json",  json_encode($data));
      }
    } else {
      $ticket = $data->jsapi_ticket;
    }
    return $ticket;
  }

  private function getAccessToken() {
    $data = json_decode($this->loadData("access_token.json", '{"access_token":"", "expire_time": 0}'));
    if ($data->expire_time < time()) {
      $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
      $res = json_decode($this->httpGet($url));
      if(!isset($res->access_token)) {
        print_r($res);
        exit;
      }

      $access_token = $res->access_token;
      if ($access_token) {
        $data->expire_time = time() + 3000;
        $data->access_token = $access_token;
        $this->saveData("access_token.json", json_encode($data));
      }
    } else {
      $access_token = $data->access_token;
    }
    return $access_token;
  }

  private function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_URL, $url);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
  }
}

session_start();
if(!isset($_REQUEST['url'])) {
    echo "invalid arguments";
    exit;
}

$appID = "你的公众号appid";
$appSecret = "你的公众号secret";

$url = $_REQUEST['url'];
$url = base64_decode($url);

$jssdk = new JSSDK($appID, $appSecret);
$signPackage = $jssdk->getSignPackage($url); 
$signPackage['jsApiList'] = array('checkJsApi', 'chooseImage', 
            'onMenuShareTimeline', 'onMenuShareAppMessage', 
            'onMenuShareQQ', 'previewImage', 'uploadImage', 
            'downloadImage', 'getNetworkType');
echo json_encode($signPackage);
?>

php版本流程都是一样,只是语言差异罢了。

6. 写个demo来验证一下

由于微信团队限制没有提供主动分享的接口,我们只能准备好要分享的数据,等到用户点击右上角的分享按钮的时候,才把我们之前准备好的数据分享出去。demo包含一个可以动态设置文本的input标签,你可以动态修改其内容,然后点击微信右上角的分享给朋友查看效果。

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="pragma" content="no-cache"/>
    <meta http-equiv="Expires" content="0" />
    <meta http-equiv="Content-Type" content="type=text/html; charset=utf-8"/>
    <title>wechat-jssdk demo</title>
    <style>
    body {
        text-align: center;
    }
    input {
        width: 200px;
        height: 80px;
    font-size:40px;
    }
    </style>
    <script type="text/javascript" src = "http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script type="text/javascript">
        function get(uri) {
            return http(uri, 'GET', null);  
        }
    function http(uri, method, data, headers) {
        alert('promise: ' + typeof Promise);
        return new Promise(function(resolve, reject) {
            var xhr = new XMLHttpRequest();
        xhr.open(method, uri, true);
        if(headers) {
        for(var p in headers) {
            xhr.setRequestHeader(p, headers[p]);
        }
        }
        xhr.addEventListener('readystatechange', function(e) {
        if(xhr.readyState === 4) {
            if(String(xhr.status).match(/^2\d\d$/)) {
            try {
                var data = JSON.parse(xhr.responseText);
                resolve(data);
            }
            catch(e) {
                reject(e);  
            }
            }
            else {
            reject(xhr);
            }
        }
        });
        xhr.send(data);
    }); 
    }

        function wechatShare(cfg) {
        var inter = setInterval(function() {
        try {
            wx.config(cfg);
            clearInterval(inter);
        }
        catch(e) {
            console.log('wait ready');  
        }
        }, 200);

        var titleItem = document.getElementById('shareTitle');
        titleItem.onchange = function() {
        var shareTitle = titleItem.value;
        alert('shareTitle: ' + shareTitle);
        wx.onMenuShareAppMessage({
            title: shareTitle, // 分享标题
            desc: 'TangIDE test onMenuShareAppMessage', // 分享描述
            link: window.location.href, // 分享链接
            imgUrl: 'http://img1.bdstatic.com/static/common/widget/search_box_home/logo/home_white_logo_0ddf152.png',
            type: 'link', // 分享类型,music、video或link,不填默认为link
            success: function () { 
            // 用户确认分享后执行的回调函数
            },
            cancel: function () { 
            // 用户取消分享后执行的回调函数
            }
           });
        };

        wx.ready(function() {
        /*
            wx.onMenuShareAppMessage({
            title: '1234567', // 分享标题
            desc: 'TangIDE test onMenuShareAppMessage', // 分享描述
            link: window.location.href, // 分享链接
            imgUrl: 'http://img1.bdstatic.com/static/common/widget/search_box_home/logo/home_white_logo_0ddf152.png',
            type: 'link', // 分享类型,music、video或link,不填默认为link
            success: function () { 
                // 用户确认分享后执行的回调函数
            },
            cancel: function () { 
                // 用户取消分享后执行的回调函数
            }
            });
        */
        });

        wx.error(function(res) {

        });
        }

    function regConfig() {
        var uri = 'http://www.i5r.com.cn/weixin/php/json_config.php' +
                '?url=' + window.btoa(location.href);
        get(uri).then(function(data) {
            data.debug = true;
        wechatShare(data);
        }).catch(function(err) {
            alert('request error:' + err);  
        });
    }

    window.onload = function() {
        setTimeout(regConfig, 600);
    };
    </script>
</head>
<body>
    <p><input placeholder="分享标题" type="text" id="shareTitle" required="required"/></p>
</body>
</html>

    config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。所以说如果需要分享的东西不变,就直接放在ready事件处理函数去做号了(如上面demo的ready事件处理函数),如果要分享的东西一直在变,就像demo演示的那样动态的修改要分享的titledemo演示(微信环境)

7. TangIDE与微信SDK的结合

    上面的这些代码看似有点多,不过幸好强大的tangIDE已经帮我们完成很多工作了:
- [1] 提供微信配置控件,自动完成微信JSSDK环境搭建

        打开TangIDE在左侧控件栏,SNS控件->微信设置直接拖入你需要调用jssdk接口的场景即可。
- [2] 各种SNS组件支持
        打开TangIDE在左侧控件栏,SNS控件选择想要的组件直接拖入你需要调用的场景即可。


end

2017-06-14 15:50:11 m249005779 阅读数 187
  • 微信公众号开发9-公众号JSSDK开发-微信开发php

    微信公众平台开发之公众号JSSDK开发是子恒老师《微信公众平台开发》视频教程的第9部。详细讲解了用php开发微信公众号,对微信公众平台中的JSSDK开发。内容包含用JSSDK获取网络状态,地理位置,分享到朋友圈,QQ,空间设置等等。欢迎反馈,微信/QQ:68183131

    14979 人正在学习 去看看 秦子恒

记录一下微信JSSDK的使用,第一次开发。

1.到微信公众平台->公众号设置->功能设置->设置JS接口安全域名。


2.在需要使用JSSDK的页面头部引入JS文件 http://res.wx.qq.com/open/js/jweixin-1.2.0.js

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
3.在php中该页面对应的方法里获取签名数据

public function index(){
        //签名数据
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $qm = createName($url);
        $this->assign('qm',$qm);
        $this->display();
    }
(1)签名数据方法放在Common目录下function.php里

function createName($url){
    $time = time();
    $nonoce = createNonceStr();
    $appid = C('APPID');//公众号的APPID
    $jsapiTicket = jsapitkt();
    $str = "jsapi_ticket=$jsapiTicket&noncestr=$nonoce×tamp=$time&url=$url";
    $signature = sha1($str);
    return array(
        'appid'=>$appid,
        'timestamp'=>$time,
        'nonceStr'=>$nonoce,
        'signature'=>$signature
    );
}
/**
 * 生成随机字符串
 * @param int $length //字符串长度
 * @return string
 */
function createNonceStr($length = 16) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
}
//获取jsapi_ticket
function jsapitkt(){
    if(S('jsapitkt')){
        if (time() - S('jsapitkt')['time']>7000){
            $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.getToken().'&type=jsapi';
            $data = httpGet($url);
            $data['time'] = time();
            S('jsapitkt',$data);
        }
        return S('jsapitkt')['ticket'];
    }else{
        $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.getToken().'&type=jsapi';
        $data = httpGet($url);
        $data['time'] = time();
        S('jsapitkt',$data);
        return S('jsapitkt')['ticket'];
    }
}
//获取accesstoken
function getToken(){
    if(S('access_token')){
        if(time() - S('access_token')['time']>7000){
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.C('APPID').'&secret='.C('APPSECRET');
            $data = httpGet($url);
            $data['time'] = time();
            S('access_token',$data);
        }
        return S('access_token')['access_token'];
    }else{
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.C('APPID').'&secret='.C('APPSECRET');
        $data = httpGet($url);
        $data['time'] = time();
        S('access_token',$data);
        return S('access_token')['access_token'];
    }
}

/**
 * curl GET
 * @param $url //链接
 * @param string $data_type //返回数据类型,默认为数组
 * @return array|bool
 */
function httpGet($url, $data_type='text'){
    $cl = curl_init();
    if(stripos($url, 'https://') !== FALSE) {
        curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($cl, CURLOPT_SSLVERSION, 1);
    }
    curl_setopt($cl, CURLOPT_URL, $url);
    curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1 );
    $content = curl_exec($cl);
    $status = curl_getinfo($cl);
    curl_close($cl);
    if (isset($status['http_code']) && $status['http_code'] == 200) {
        if ($data_type == 'json') {
            $content = json_decode($content);
        }
        return json_decode($content,true);
    } else {
        return FALSE;
    }
}
4.前端页面通过config接口注入权限验证配置。

wx.config({
            debug: true,
            appId: '{$qm.appid}',
            timestamp: '{$qm.timestamp}',
            nonceStr: '{$qm.nonceStr}',
            signature: '{$qm.signature}',
            jsApiList: ["chooseImage"]
        });
4.前端页面通过config接口注入权限验证配置。
wx.config({
            debug: true,
            appId: '{$qm.appid}',
            timestamp: '{$qm.timestamp}',
            nonceStr: '{$qm.nonceStr}',
            signature: '{$qm.signature}',
            jsApiList: ["chooseImage"]
        });
 5.成功则alert 成功信息






                                

java微信jssdk开发

阅读数 2471

没有更多推荐了,返回首页