微信JS-SDK 示例
微信JS-SDK 示例
1、html部分
- <!DOCTYPE html>
- <!-- saved from url=(0028){sh:$selfUrl} -->
- <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <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="{sh::RES}/jssdk/css/style.css">
- </head>
- <body ontouchstart="">
- <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="{sh:$selfUrl}#menu-basic">基础接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-share">分享接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-image">图像接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-voice">音频接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-smart">智能接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-device">设备信息接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-location">地理位置接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-webview">界面操作接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-scan">微信扫一扫接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-shopping">微信小店接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-card">微信卡券接口</a></li>
- <li class="label_item wxapi_index_item"><a class="label_inner" href="{sh:$selfUrl}#menu-pay">微信支付接口</a></li>
- </ul>
- </div>
- <div class="lbox_close wxapi_form">
- <h3 id="menu-basic">基础接口</h3>
- <span class="desc">判断当前客户端是否支持指定JS接口</span>
- <button class="btn btn_primary" id="checkJsApi">checkJsApi</button>
- <h3 id="menu-share">分享接口</h3>
- <span class="desc">获取“分享到朋友圈”按钮点击状态及自定义分享内容接口</span>
- <button class="btn btn_primary" id="onMenuShareTimeline">onMenuShareTimeline</button>
- <span class="desc">获取“分享给朋友”按钮点击状态及自定义分享内容接口</span>
- <button class="btn btn_primary" id="onMenuShareAppMessage">onMenuShareAppMessage</button>
- <span class="desc">获取“分享到QQ”按钮点击状态及自定义分享内容接口</span>
- <button class="btn btn_primary" id="onMenuShareQQ">onMenuShareQQ</button>
- <span class="desc">获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口</span>
- <button class="btn btn_primary" id="onMenuShareWeibo">onMenuShareWeibo</button>
- <span class="desc">获取“分享到QZone”按钮点击状态及自定义分享内容接口</span>
- <button class="btn btn_primary" id="onMenuShareQZone">onMenuShareQZone</button>
- <h3 id="menu-image">图像接口</h3>
- <span class="desc">拍照或从手机相册中选图接口</span>
- <button class="btn btn_primary" id="chooseImage">chooseImage</button>
- <span class="desc">预览图片接口</span>
- <button class="btn btn_primary" id="previewImage">previewImage</button>
- <span class="desc">上传图片接口</span>
- <button class="btn btn_primary" id="uploadImage">uploadImage</button>
- <span class="desc">下载图片接口</span>
- <button class="btn btn_primary" id="downloadImage">downloadImage</button>
- <h3 id="menu-voice">音频接口</h3>
- <span class="desc">开始录音接口</span>
- <button class="btn btn_primary" id="startRecord">startRecord</button>
- <span class="desc">停止录音接口</span>
- <button class="btn btn_primary" id="stopRecord">stopRecord</button>
- <span class="desc">播放语音接口</span>
- <button class="btn btn_primary" id="playVoice">playVoice</button>
- <span class="desc">暂停播放接口</span>
- <button class="btn btn_primary" id="pauseVoice">pauseVoice</button>
- <span class="desc">停止播放接口</span>
- <button class="btn btn_primary" id="stopVoice">stopVoice</button>
- <span class="desc">上传语音接口</span>
- <button class="btn btn_primary" id="uploadVoice">uploadVoice</button>
- <span class="desc">下载语音接口</span>
- <button class="btn btn_primary" id="downloadVoice">downloadVoice</button>
- <h3 id="menu-smart">智能接口</h3>
- <span class="desc">识别音频并返回识别结果接口</span>
- <button class="btn btn_primary" id="translateVoice">translateVoice</button>
- <h3 id="menu-device">设备信息接口</h3>
- <span class="desc">获取网络状态接口</span>
- <button class="btn btn_primary" id="getNetworkType">getNetworkType</button>
- <h3 id="menu-location">地理位置接口</h3>
- <span class="desc">使用微信内置地图查看位置接口</span>
- <button class="btn btn_primary" id="openLocation">openLocation</button>
- <span class="desc">获取地理位置接口</span>
- <button class="btn btn_primary" id="getLocation">getLocation</button>
- <h3 id="menu-webview">界面操作接口</h3>
- <span class="desc">隐藏右上角菜单接口</span>
- <button class="btn btn_primary" id="hideOptionMenu">hideOptionMenu</button>
- <span class="desc">显示右上角菜单接口</span>
- <button class="btn btn_primary" id="showOptionMenu">showOptionMenu</button>
- <span class="desc">关闭当前网页窗口接口</span>
- <button class="btn btn_primary" id="closeWindow">closeWindow</button>
- <span class="desc">批量隐藏功能按钮接口</span>
- <button class="btn btn_primary" id="hideMenuItems">hideMenuItems</button>
- <span class="desc">批量显示功能按钮接口</span>
- <button class="btn btn_primary" id="showMenuItems">showMenuItems</button>
- <span class="desc">隐藏所有非基础按钮接口</span>
- <button class="btn btn_primary" id="hideAllNonBaseMenuItem">hideAllNonBaseMenuItem</button>
- <span class="desc">显示所有功能按钮接口</span>
- <button class="btn btn_primary" id="showAllNonBaseMenuItem">showAllNonBaseMenuItem</button>
- <h3 id="menu-scan">微信扫一扫</h3>
- <span class="desc">调起微信扫一扫接口</span>
- <button class="btn btn_primary" id="scanQRCode0">scanQRCode(微信处理结果)</button>
- <button class="btn btn_primary" id="scanQRCode1">scanQRCode(直接返回结果)</button>
- <h3 id="menu-shopping">微信小店接口</h3>
- <span class="desc">跳转微信商品页接口</span>
- <button class="btn btn_primary" id="openProductSpecificView">openProductSpecificView</button>
- <h3 id="menu-card">微信卡券接口</h3>
- <span class="desc">批量添加卡券接口</span>
- <button class="btn btn_primary" id="addCard">addCard</button>
- <span class="desc">调起适用于门店的卡券列表并获取用户选择列表</span>
- <button class="btn btn_primary" id="chooseCard">chooseCard</button>
- <span class="desc">查看微信卡包中的卡券接口</span>
- <button class="btn btn_primary" id="openCard">openCard</button>
- <h3 id="menu-pay">微信支付接口</h3>
- <span class="desc">发起一个微信支付请求</span>
- <button class="btn btn_primary" id="chooseWXPay">chooseWXPay</button>
- </div>
- </div>
- <script src="{sh::RES}/jssdk/js/jweixin-1.0.0.js"></script>
- <!-- 获取签名的核心 begin -->
- <?php
- import("@.ORG.jssdk");
- $jssdk = new JSSDK(C('oauth_config.appid'), C('oauth_config.appsecret'));
- $signPackage = $jssdk->GetSignPackage();
- ?>
- <!-- 获取签名的核心 end -->
- <script>
- /*
- * 注意:
- * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
- * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
- * 3. 常见问题及完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
- *
- * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决,如仍未能解决可通过以下渠道反馈:
- * 邮箱地址:weixin-open@qq.com
- * 邮件主题:【微信JS-SDK反馈】具体问题
- * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
- */
- 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',
- 'onMenuShareQZone',
- 'hideMenuItems',
- 'showMenuItems',
- 'hideAllNonBaseMenuItem',
- 'showAllNonBaseMenuItem',
- 'translateVoice',
- 'startRecord',
- 'stopRecord',
- 'onVoiceRecordEnd',
- 'playVoice',
- 'onVoicePlayEnd',
- 'pauseVoice',
- 'stopVoice',
- 'uploadVoice',
- 'downloadVoice',
- 'chooseImage',
- 'previewImage',
- 'uploadImage',
- 'downloadImage',
- 'getNetworkType',
- 'openLocation',
- 'getLocation',
- 'hideOptionMenu',
- 'showOptionMenu',
- 'closeWindow',
- 'scanQRCode',
- 'chooseWXPay',
- 'openProductSpecificView',
- 'addCard',
- 'chooseCard',
- 'openCard'
- ]
- });
- </script>
- <script src="{sh::RES}/jssdk/js/zepto.min.js"></script>
- <script src="{sh::RES}/jssdk/js/demo.js"> </script>
- <div id="cli_dialog_div"></div></body></html>
2、js部分
- /*
- * 注意:
- * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
- * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
- * 3. 完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
- *
- * 如有问题请通过以下渠道反馈:
- * 邮箱地址:weixin-open@qq.com
- * 邮件主题:【微信JS-SDK反馈】具体问题
- * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
- */
- 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: '互联网之子',
- 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: '互联网之子',
- 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.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('已注册获取“分享到微博”状态事件');
- };
- // 2.5 监听“分享到QZone”按钮点击、自定义分享内容及分享接口
- document.querySelector('#onMenuShareQZone').onclick = function () {
- wx.onMenuShareQZone({
- 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('用户点击分享到QZone');
- },
- complete: function (res) {
- alert(JSON.stringify(res));
- },
- success: function (res) {
- alert('已分享');
- },
- cancel: function (res) {
- alert('已取消');
- },
- fail: function (res) {
- alert(JSON.stringify(res));
- }
- });
- alert('已注册获取“分享到QZone”状态事件');
- };
- // 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.qq.com'
- });
- };
- // 7.2 获取当前地理位置
- document.querySelector('#getLocation').onclick = function () {
- wx.getLocation({
- success: function (res) {
- alert(JSON.stringify(res));
- },
- cancel: function (res) {
- alert('用户拒绝授权获取地理位置');
- }
- });
- };
- // 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',
- extInfo: '123'
- });
- };
- // 12 微信卡券接口
- // 12.1 添加卡券
- document.querySelector('#addCard').onclick = function () {
- wx.addCard({
- cardList: [
- {
- cardId: 'pDF3iY9tv9zCGCj4jTXFOo1DxHdo',
- cardExt: '{"code": "", "openid": "", "timestamp": "1418301401", "signature":"f54dae85e7807cc9525ccc127b4796e021f05b33"}'
- },
- {
- cardId: 'pDF3iY9tv9zCGCj4jTXFOo1DxHdo',
- cardExt: '{"code": "", "openid": "", "timestamp": "1418301401", "signature":"f54dae85e7807cc9525ccc127b4796e021f05b33"}'
- }
- ],
- success: function (res) {
- alert('已添加卡券:' + JSON.stringify(res.cardList));
- }
- });
- };
- var codes = [];
- // 12.2 选择卡券
- document.querySelector('#chooseCard').onclick = function () {
- wx.chooseCard({
- cardSign: '8ef8aa071f1d2186cb1355ec132fed04ebba1c3f',
- timestamp: 1437997723,
- nonceStr: 'k0hGdSXKZEj3Min5',
- success: function (res) {
- res.cardList = JSON.parse(res.cardList);
- encrypt_code = res.cardList[0]['encrypt_code'];
- alert('已选择卡券:' + JSON.stringify(res.cardList));
- decryptCode(encrypt_code, function (code) {
- codes.push(code);
- });
- }
- });
- };
- // 12.3 查看卡券
- document.querySelector('#openCard').onclick = function () {
- if (codes.length < 1) {
- alert('请先使用 chooseCard 接口选择卡券。');
- return false;
- }
- var cardList = [];
- for (var i = 0; i < codes.length; i++) {
- cardList.push({
- cardId: 'pDF3iY9tv9zCGCj4jTXFOo1DxHdo',
- code: codes[i]
- });
- }
- wx.openCard({
- cardList: 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);
- function decryptCode(code, callback) {
- $.getJSON('/jssdk/decrypt_code.php?code=' + encodeURI(code), function (res) {
- if (res.errcode == 0) {
- codes.push(res.code);
- }
- });
- }
- });
- wx.error(function (res) {
- alert(res.errMsg);
- });
3、后台部分
- <?php
- class JSSDK {
- private $appId;
- private $appSecret;
- public function __construct($appId, $appSecret) {
- $this->appId = $appId;
- $this->appSecret = $appSecret;
- }
- public function getSignPackage() {
- $jsapiTicket = $this->getJsApiTicket();
- // 注意 URL 一定要动态获取,不能 hardcode.
- $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
- $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
- $timestamp = time();
- $nonceStr = $this->createNonceStr();
- // 这里参数的顺序要按照 key 值 ASCII 码升序排序
- $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$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 getJsApiTicket() {
- // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
- $data = json_decode(file_get_contents("jsapi_ticket.json"));
- if ($data->expire_time < time()) {
- $accessToken = $this->getAccessToken();
- // 如果是企业号用以下 URL 获取 ticket
- // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
- $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() + 7000;
- $data->jsapi_ticket = $ticket;
- $fp = fopen("jsapi_ticket.json", "w");
- fwrite($fp, json_encode($data));
- fclose($fp);
- }
- } else {
- $ticket = $data->jsapi_ticket;
- }
- return $ticket;
- }
- private function getAccessToken() {
- // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
- $data = json_decode(file_get_contents("access_token.json"));
- if ($data->expire_time < time()) {
- // 如果是企业号用以下URL获取access_token
- // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
- $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));
- $access_token = $res->access_token;
- if ($access_token) {
- $data->expire_time = time() + 7000;
- $data->access_token = $access_token;
- $fp = fopen("access_token.json", "w");
- fwrite($fp, json_encode($data));
- fclose($fp);
- }
- } 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);
- // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
- // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
- curl_setopt($curl, CURLOPT_URL, $url);
- $res = curl_exec($curl);
- curl_close($curl);
- return $res;
- }
- }
注意:
1、示例代码只是讲解整体流程,关于路径部分可自行调整
2、由于app_secret比较保密,建议保存在服务端,由后台发起
微信JS-SDK 示例的更多相关文章
- 实战微信JS SDK开发:贺卡制作与播放(1)
前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...
- 微信JS SDK接入的几点注意事项
微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...
- 微信js sdk上传多张图片
微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="111111111111 ...
- 微信JS SDK使用权限签名算法
jsapi_ticket 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据.正常情况下,jsapi_ticket的有效期为7200秒, ...
- 调用微信js sdk
场景:需要调用微信获取当前位置的借口. 途径:查看微信 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 .后 ...
- 微信JS SDK配置授权,实现分享接口
微信开放的JS-SDK面向网页开发者提供了基于微信内的网页开发工具包,最直接的好处就是我们可以使用微信分享.扫一扫.卡券.支付等微信特有的能力.7月份的时候,因为这个分享的证书获取问题深深的栽了一坑, ...
- 微信js SDK接口
微信JS-SDK说明文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 一.微信登录功能 在进行微信OAut ...
- 【转】微信Android SDK示例代码及运行方法
原文网址:http://blog.csdn.net/icyfox_bupt/article/details/23742217 最近在研究微信SDK,无奈网上好使的教程太少,对于程序员来说最好的东西,一 ...
- 微信js sdk分享开发摘记java版
绑定域名和引入js的就不说了 废话不说直接上代码 public void share(HttpServletRequest request) throws Exception { StringBuff ...
- 微信JS SDK PHP Demo
一.JSSDK类定义 <?php class JSSDK { private $appId; private $appSecret; public function __construct($a ...
随机推荐
- HDU-1498-50years,50colors(最大匹配, 枚举)
链接:https://vjudge.net/problem/HDU-1498#author=634579757 题意: 撞气球游戏,一个n*n的矩阵中,有不同颜色的气球,气球的颜色最多50种(从1到5 ...
- Codeforces 384E-线段树+dfs序
如果这题只传到儿子不继续向下就是裸的dfs序+线段树,继续往下传的还改变正负号,我们可以根据它的层数来确定正负号 #include<bits/stdc++.h> #define inf 0 ...
- hdu1166-敌兵布阵-分块
把区间分成√n份降低复杂度. #include<bits/stdc++.h> #define inf 0x3f3f3f3f ; ; using namespace std; int t,n ...
- 安装redis服务器
安装redis服务器 Windows环境下安装: 第一步:下载压缩包(地址:https://github.com/MicrosoftArchive/redis/releases) 第二步:解压并打开 ...
- Python中输出字体的颜色设置
1.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程 开头部分: \033[显示方式;前 ...
- NET Core实现OAuth2.0的ResourceOwnerPassword和ClientCredentials模式
NET Core实现OAuth2.0的ResourceOwnerPassword和ClientCredentials模式 前言 开发授权服务框架一般使用OAuth2.0授权框架,而开发Webapi的授 ...
- Batch梯度下降
1.之前讲到随机梯度下降法(SGD),如果每次将batch个样本输入给模型,并更新一次,那么就成了batch梯度下降了. 2.batch梯度下降显然能够提高算法效率,同时相对于一个样本,batch个样 ...
- 关闭mysql validate-password插件
mysql5.7 的validate-password对密码策略有限制,比如长度大小写,太麻烦,我习惯开发环境下为root,所以在开发环境关闭这个插件的话只需在/etc/my.cnf中添加valida ...
- 使用Robot类模拟鼠标、键盘事件
Robot类用于模拟鼠标.键盘事件,生成本机系统输入事件.Robot 的主要用于自动化.自运行的程序和其他需要自动控制鼠标和键盘的程序 相当于实际操作的效果,不仅仅只是生成对应的鼠标.键盘事件.比如R ...
- 简单的Servlet结合Jsp实现请求和响应以及对doGet和doPost的浅析
1.新建jsp,创建表单 <body> <form action="/MyfirstWeb/login"> username:<input type= ...