亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

基于nodejs的微信JS-SDK簡單應用實現

2024-05-06 16:51:08
字體:
來源:轉載
供稿:網友

2015 是 Hybrid App 崛起之年 ,Web App 和 Native App 各有其強大之處,也有著致命的缺點,人們一邊追求native流暢的用戶體驗,一邊同時期望產品能夠快速的迭代更新,Hybrid 成為必然的趨勢。

鵝廠一馬當先,發布了業內震驚一時的 JS-SDK , 這對于基于微信的h5開發者來說簡直是如降甘露,從此開發者們告別了用箭頭來提示右上角可以分享,并且隨時可以使用微信的原生能力,微信變成了一個超級瀏覽器。

一、準備工作

1.在微信公眾平臺申請測試賬號,并設置好好 JS 接口安全域名 (注:域名必須可以外網訪問)

2.查看微信開發者文檔

二、開始編碼

使用微信 sdk 必須自己實現微信的簽名算法。

大概需要4個步驟:

1.獲取access_token;

2.根據access_token 獲取jsapi_ticket

3. 根據 appId(公眾號唯一id)、noncestr(隨機字符串)、timestamp(時間戳)、url(當前頁面完整url,不包括#aaa=bbb) 通過sha1算法簽名

4.將信息返回給前端 , 設置wx.config。

由于獲取access_token 和jsapi_ticket 的接口都有訪問限制,所以明確指出需要第三方做緩存處理。此處我們緩存jsapi_ticket 就可以了。

/config/wechat.cfg.js

module.exports = {  grant_type: 'client_credential',  appid: 'xxxxxxxxxxxxxxx',  secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxx',  noncestr:'Wm3WZYTPz0wzccnW',  accessTokenUrl:'https://api.weixin.qq.com/cgi-bin/token',  ticketUrl:'https://api.weixin.qq.com/cgi-bin/ticket/getticket',  cache_duration:1000*60*60*24 //緩存時長為24小時}

最主要部分是簽名:

signature.js

var request = require('request'),  cache = require('memory-cache'),  sha1 = require('sha1'),  config = require('../config/wechat.cfg');exports.sign = function (url,callback) {  var noncestr = config.noncestr,    timestamp = Math.floor(Date.now()/1000), //精確到秒    jsapi_ticket;  if(cache.get('ticket')){    jsapi_ticket = cache.get('ticket');    console.log('1' + 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url);    callback({      noncestr:noncestr,      timestamp:timestamp,      url:url,      jsapi_ticket:jsapi_ticket,      signature:sha1('jsapi_ticket=' + jsapi_ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url)    });  }else{    request(config.accessTokenUrl + '?grant_type=' + config.grant_type + '&appid=' + config.appid + '&secret=' + config.secret ,function(error, response, body){      if (!error && response.statusCode == 200) {        var tokenMap = JSON.parse(body);        request(config.ticketUrl + '?access_token=' + tokenMap.access_token + '&type=jsapi', function(error, resp, json){          if (!error && response.statusCode == 200) {            var ticketMap = JSON.parse(json);            cache.put('ticket',ticketMap.ticket,config.cache_duration); //加入緩存            console.log('jsapi_ticket=' + ticketMap.ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url);            callback({              noncestr:noncestr,              timestamp:timestamp,              url:url,              jsapi_ticket:ticketMap.ticket,              signature:sha1('jsapi_ticket=' + ticketMap.ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url)            });          }        })      }    })  }}

由于只是簡單的demo , 也就沒有采用promise,而是采用的普通的回調。

客戶端部分

document.getElementById('refresh').onclick = function(){location.reload();}/** * 以下內容多摘自官方demo ***/wx.config({  debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。  appId: appId, // 必填,公眾號的唯一標識  timestamp: timestamp, // 必填,生成簽名的時間戳  nonceStr: nonceStr, // 必填,生成簽名的隨機串  signature: signature,// 必填,簽名,見附錄1  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'] // 必填,需要使用的JS接口列表,});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('已注冊獲取“發送給朋友”狀態事件'); };  // 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'   ]  }); };  // 7.2 獲取當前地理位置 document.querySelector('#getLocation').onclick = function () {  wx.getLocation({   success: function (res) {    alert(JSON.stringify(res));   },   cancel: function (res) {    alert('用戶拒絕授權獲取地理位置');   }  }); };  // 9 微信原生接口 // 9.1.1 掃描二維碼并返回結果 document.querySelector('#scanQRCode0').onclick = function () {  wx.scanQRCode(); };});wx.error(function(res){  JSON.stringify(res)});

至此,基本功能已經完成。附上效果圖

nodejs,微信,JS-SDK

nodejs,微信,JS-SDK

nodejs,微信,JS-SDK

踩的坑:

1.簽名算法不一致: 通過 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 驗證算法正確性

2.url 必須完全一致,并且外網可訪問。 將代碼部署到 BAE ,或者其他應用引擎服務器上。

3.timestamp需要精確到秒。

源碼:https://github.com/liaobin312716/wechat-sdk-demo/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲最大在线视频| 午夜精品久久久久久久99热| 国产视频精品va久久久久久| 欧美性猛交99久久久久99按摩| 亚洲成人aaa| 亚洲人成电影网站色www| 91久久精品美女高潮| 欧美日韩中文字幕在线| 亚洲女人天堂av| 国产91精品黑色丝袜高跟鞋| 激情成人中文字幕| 久久手机精品视频| 精品视频在线播放免| 久久久久久免费精品| 国产成人黄色av| 奇米四色中文综合久久| 亚洲午夜精品久久久久久久久久久久| 有码中文亚洲精品| 久久亚洲国产成人| 久久久中精品2020中文| 亚洲春色另类小说| 北条麻妃久久精品| 欧美日韩亚洲高清| 91九色视频在线| 精品亚洲夜色av98在线观看| 国产精品一区二区三区成人| 91tv亚洲精品香蕉国产一区7ujn| 亚洲人成啪啪网站| 成人免费视频xnxx.com| 亚洲国产高清自拍| 精品久久久久久久久国产字幕| 国内精品一区二区三区| 欧美激情videos| 超在线视频97| 亚洲国语精品自产拍在线观看| 欧美日韩一区二区免费在线观看| 国产精品欧美亚洲777777| 亚洲一区制服诱惑| 日本在线观看天堂男亚洲| 欧美性感美女h网站在线观看免费| 国产视频精品xxxx| 在线看欧美日韩| 国产午夜精品一区二区三区| 久久久www成人免费精品| 国产91色在线|| 91精品国产高清自在线| 欧美高清性猛交| 亚洲人成网站999久久久综合| 国产欧美日韩91| 日韩色av导航| 国模gogo一区二区大胆私拍| 国产精品九九九| 亚洲成人a**站| 色在人av网站天堂精品| 日韩中文字幕久久| 久久色精品视频| 亚洲毛茸茸少妇高潮呻吟| 久久久久999| 亚洲香蕉在线观看| 91精品久久久久| 狠狠躁夜夜躁人人爽超碰91| 国产成人精品久久亚洲高清不卡| 国产精品美女www爽爽爽视频| 欧美成人一区二区三区电影| 国内精品一区二区三区| 九九久久久久99精品| 亚洲欧美综合区自拍另类| 亚洲精品视频免费在线观看| 亚洲第一区在线| 欧美老女人性视频| 欧美激情一二三| 日韩av免费在线观看| 国产精品成人品| 欧美性猛交xxxx偷拍洗澡| 亚洲精品美女久久久| 亚洲精品成人久久久| 成人看片人aa| 日韩在线播放视频| 日韩av综合网| www.日韩免费| 日韩免费看的电影电视剧大全| 午夜精品久久久久久久99热浪潮| 午夜精品久久久久久久久久久久久| 久久精品最新地址| 91影院在线免费观看视频| 中文日韩在线观看| 91在线观看免费高清完整版在线观看| 久久久久亚洲精品成人网小说| 久久精品视频播放| 亚洲综合中文字幕在线观看| 亚洲男人天堂久| 成人免费视频在线观看超级碰| 亚洲成人激情在线| 色小说视频一区| 欧美激情视频给我| 91精品国产91久久久久久久久| 国产精品69av| 欧美中文字幕第一页| 亚洲欧美在线免费观看| 91网站在线免费观看| 欧美美女18p| 69久久夜色精品国产69| 欧美成人午夜剧场免费观看| 久久精品视频网站| 色哟哟网站入口亚洲精品| 亚洲第一精品电影| 国产成人免费av电影| 福利微拍一区二区| 97精品在线视频| 欧美尤物巨大精品爽| 黄色成人在线免费| 亚洲精品丝袜日韩| 91精品免费久久久久久久久| 色婷婷亚洲mv天堂mv在影片| 亚洲天堂开心观看| 国产精品久在线观看| 成人精品一区二区三区电影免费| 亚洲精品美女在线| 久久久久久久一区二区三区| 日本久久91av| 97精品国产97久久久久久春色| 国产日韩专区在线| 亚洲精品www久久久| 欧美一区深夜视频| 精品中文字幕在线观看| 日本高清久久天堂| 成人福利网站在线观看| 日韩电影中文 亚洲精品乱码| 中文字幕久久亚洲| 97福利一区二区| 日韩电影中文字幕一区| 日本高清不卡在线| 久久精彩免费视频| 欧美在线中文字幕| 精品亚洲一区二区三区在线播放| 成人免费看吃奶视频网站| 精品电影在线观看| 午夜精品久久久99热福利| 中文字幕精品一区久久久久| 国产91成人在在线播放| 久久福利视频网| 日韩视频免费大全中文字幕| 日韩动漫免费观看电视剧高清| 美女扒开尿口让男人操亚洲视频网站| 亚洲电影免费观看高清| 亚洲色图综合网| 亚洲人成啪啪网站| 久久久噜噜噜久久中文字免| 国产日韩av在线播放| 欧美国产第二页| 亚洲一区二区三区四区视频| 九九视频这里只有精品| 日韩精品视频中文在线观看| 午夜精品久久久久久久白皮肤| 欧美激情亚洲国产| 日韩欧美亚洲国产一区| 亚洲黄色www网站| 亚洲桃花岛网站| 久久国产精彩视频| 欧美日韩午夜剧场| 日韩最新中文字幕电影免费看| 亚洲a级在线观看| 在线精品91av| 国产精品久久久久99|