微信jssdk接入指南

利用nodejs+express快速搭建公眾號(hào)開發(fā)環(huán)境

jssdk:就是一個(gè)js 文件,這個(gè)JS文件可以 在微信公共賬號(hào)里面想調(diào)用手機(jī)原生的功能民晒,比如掃描二維碼精居,拍照,分享到朋友圈自定義顯示等等潜必!
有的小伙伴可能要問了靴姿,調(diào)用手機(jī)原生功能,直接調(diào)用原生App提供的方法就行了磁滚,為什么還要后臺(tái)搭建環(huán)境佛吓?微信為了安全考慮,不會(huì)讓隨便什么人都能調(diào)用他的方法的垂攘,想要調(diào)用维雇,必須注冊(cè)成為開發(fā)者,而且有一套簽名驗(yàn)證流程晒他,只有通過這些驗(yàn)證吱型,才能成功調(diào)用SDK里的方法。
那么具體流程是怎樣的呢仪芒?注冊(cè)賬號(hào)這一步就不說了唁影,假設(shè)你已經(jīng)成功注冊(cè)一個(gè)開發(fā)者賬號(hào)耕陷,我們從前端開始掂名。
微信開發(fā)者文檔中說,調(diào)用SDK哟沫,分為五個(gè)步驟:
1.綁定域名饺蔑,先登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”
2.步驟二:引入JS文件在需要調(diào)用JS接口的頁(yè)面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js
3.步驟三:通過config接口注入權(quán)限驗(yàn)證配置

wx.config({
    debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來嗜诀,若要查看傳入的參數(shù)猾警,可以在pc端打開孔祸,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印发皿。
    appId: '', // 必填崔慧,公眾號(hào)的唯一標(biāo)識(shí)
    timestamp: , // 必填,生成簽名的時(shí)間戳
    nonceStr: '', // 必填穴墅,生成簽名的隨機(jī)串
    signature: '',// 必填惶室,簽名
    jsApiList: [] // 必填,需要使用的JS接口列表
});

4.步驟四:通過ready接口處理成功驗(yàn)證

wx.ready(function(){
    // config信息驗(yàn)證后會(huì)執(zhí)行ready方法玄货,所有接口調(diào)用都必須在config接口獲得結(jié)果之后皇钞,config是一個(gè)客戶端的異步操作,所以如果需要在頁(yè)面加載時(shí)就調(diào)用相關(guān)接口松捉,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行夹界。對(duì)于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用隘世,不需要放在ready函數(shù)中可柿。
});

5.步驟五:通過error接口處理失敗驗(yàn)證

wx.error(function(res){
    // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗(yàn)證失敗丙者,具體錯(cuò)誤信息可以打開config的debug模式查看趾痘,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名蔓钟。
});

通過以上步驟可以看出永票,調(diào)用的關(guān)鍵是在步驟三,其余幾個(gè)步驟都好理解滥沫,第三步wx.config方法的參數(shù)侣集,timestamp時(shí)間戳、nonceStr隨機(jī)串兰绣,signature簽名從哪里來呢世分?沒做過微信開發(fā)的想必看著官方文檔也會(huì)懵。我們下面介紹的核心內(nèi)容都是圍繞這三個(gè)參數(shù)的獲取來講的缀辩。
打開這個(gè)網(wǎng)站臭埋,http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
申請(qǐng)測(cè)試號(hào)臀玄。然后進(jìn)行相關(guān)配置瓢阴;
第一步:配置url和token

1.png

2.png

注:Url:你服務(wù)器的地址,必須公網(wǎng)上的地址
Token:這個(gè)token是我們開發(fā)者自己隨意填寫的健无,微信服務(wù)器會(huì)給你上面URL 會(huì)發(fā)送一個(gè)請(qǐng)求荣恐,帶上這個(gè)token,再與后臺(tái)自定義token做一致性的驗(yàn)證,是同一個(gè)token就驗(yàn)證通過叠穆。(意思就是你在這里寫的token跟調(diào)用驗(yàn)證方法傳入token必須要一樣)

3.png

配置完成后少漆,后臺(tái)生成簽名:分為3步;
1.使用之前拿到的 appId和appsecre t向微信獲取全局唯一票據(jù)access_token(獲取就可以了)
http請(qǐng)求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
2:使用access_token獲取api_ticket(此調(diào)用次數(shù)受限硼被,需緩存到服務(wù)器)
http請(qǐng)求方式: GET
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card
3:根據(jù)api_ticketjs接口安全域名(訪問url) 一起生成簽名示损,再返回給前端:
以上講了jssdk接入流程,下面我們就根據(jù)這個(gè)流程嚷硫,用nodejs作后端屎媳,搭建一個(gè)簡(jiǎn)單的開發(fā)環(huán)境。搭建之前有個(gè)問題论巍,就是在配置url和token這一步的時(shí)候烛谊,我們需要一個(gè)公網(wǎng)能夠訪問得到的域名,作為一個(gè)普通開發(fā)者來說嘉汰,我們并沒有域名丹禀,該怎么辦?咱們實(shí)際開發(fā)的解決方案就是利用花生殼一類的工具進(jìn)行映射鞋怀,將我們本地服務(wù)映射到公網(wǎng)上双泪。這類工具很多,花生殼很常用密似,一個(gè)月幾塊錢焙矛。當(dāng)然也有免費(fèi)的,ngrok,免費(fèi)的有個(gè)缺點(diǎn)就是訪問速度慢残腌,域名也是每次打開都隨機(jī)生成村斟,修改很麻煩,當(dāng)然抛猫,本著節(jié)約精神蟆盹,我還是用免費(fèi)的。

真實(shí)搭建開始

二話不說上后臺(tái)代碼,代碼里面有注釋闺金,不用過多解釋了吧逾滥。

var express = require('express'); //node的一個(gè)框架 就是相當(dāng)于jquery
var path = require('path');
var request = require('./request.js');
var ejs = require('ejs'); // 后臺(tái)模板庫(kù)
var wechat = require('wechat'); //第三方處理微信推送的庫(kù)
var https = require('https'); // node 端 請(qǐng)求別的服務(wù)的模塊
var sign = require('./sign'); //微信提供的簽名工具
var app = express();

app.set('views', './views');
app.engine('.html', ejs.__express);
app.set('view engine', 'html');


app.use(express.static(path.join(__dirname, 'assets')));
//發(fā)送請(qǐng)求
app.get('/index', function(req, res) {
    res.render('index');
});
//處理URL 驗(yàn)證的 微信服務(wù)器要通過get請(qǐng)求來測(cè)試的
app.get('/weixin', wechat('wechat', function(req, res, next) {
    console.log('true');
}));
//處理后臺(tái)獲取簽名的請(qǐng)求
app.post('/getSignature', function(req, res) {
    var token = 'wechat',
        appsecret = '3c8dfb57bd4c3f5e189a63e8c10defee', //你申請(qǐng)的
        APPID = 'wx249331f661eb5583', //你申請(qǐng)的id
        url = 'http://tanghui.tunnel.qydev.com/index' //JS接口安全域名 參與簽名用的
    Res = res;
    //發(fā)送https get請(qǐng)求 獲取 access_token;l
    https.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + appsecret, function(res) {
        var datas = [];
        var size = 0;
        res.on('data', function(data) {
            datas.push(data);
            size += data.length;
        });
        res.on("end", function() {
            var buff = Buffer.concat(datas, size);
            var result = buff.toString();
            //console.log(JSON.parse(result).access_token);
            // 獲取 jsapi_ticket //異步嵌套是不合理的 不推薦這樣 使用promise
            https.get('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' + JSON.parse(result).access_token + '&type=jsapi', function(res) {
                var datas = [];
                var size = 0;
                res.on('data', function(data) {
                    datas.push(data);
                    size += data.length;
                });
                res.on('end', function() {
                    var buff = Buffer.concat(datas, size);
                    var rlt = buff.toString();
                    var config = sign(JSON.parse(rlt).ticket, url);
                    console.log(config);
                    Res.json(config);
                });

            }).on('error', function(e) {
                console.log("Got error: " + e.message);
            })


        });

    }).on('error', function(e) {
        console.log("Got error: " + e.message);
    });

});

var server = app.listen(3000, function() {
    var host = server.address().address;
    var port = server.address().port;
    console.log('Example app listening at http://%s:%s', host, port);
});

下面再看前端代碼

$(function() {
        $('#getSign').on('click', function(event) {
            event.preventDefault();
            $.post("/getSignature", {}, function(config) {
            if (config != undefined && config != null) {

                wx.config({
                    debug : true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù)败匹,可以在pc端打開寨昙,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印掀亩。
                    appId : 'wx249331f661eb5583', // 必填舔哪,appID公眾號(hào)的唯一標(biāo)識(shí)
                    timestamp : config.timestamp, // 必填,生成簽名的時(shí)間戳
                    nonceStr : config.nonceStr, // 必填归榕,生成簽名的隨機(jī)串
                    signature : config.signature,// 必填尸红,簽名吱涉,見附錄1
                    jsApiList : [ 'scanQRCode' ,'onMenuShareTimeline',"chooseImage"]
                // 必填刹泄,需要使用的JS接口列表外里,所有JS接口列表見附錄2
                });
                //alert('配置成功!');
            }
          });
        });

        wx.ready(function() {
            // 9.1.2 掃描二維碼并返回結(jié)果
            document.querySelector('#scanQRCode1').onclick = function() {
                wx.scanQRCode({
                    needResult : 1,
                    desc : '微信調(diào)掃描',
                    success : function(res) {
                        //掃描成功的返回值
                        //alert(JSON.stringify(res));
                    }
                });
            };
            document.querySelector("#share").onclick = function(){
                alert("hhh");
                wx.onMenuShareTimeline({
                    title: '分享', // 分享標(biāo)題
                    link: 'http://861261d9.ngrok.io/index', // 分享鏈接
                    imgUrl: './img3.png', // 分享圖標(biāo)
                    success: function () { 
                        // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                        alert("成功");
                    },
                    cancel: function () { 
                        // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                        alert("失敗");
                    }
                });
            }
            document.querySelector('#choseImg').onclick = function(){
                wx.chooseImage({
                    count: 1, // 默認(rèn)9
                    sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖特石,默認(rèn)二者都有
                    sourceType: ['album', 'camera'], // 可以指定來源是相冊(cè)還是相機(jī)盅蝗,默認(rèn)二者都有
                    success: function (res) {
                        var localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標(biāo)簽的src屬性顯示圖片
                      document.querySelector('img').src = localIds[0];
                      wx.uploadImage({
                            localId: localIds[0], // 需要上傳的圖片的本地ID姆蘸,由chooseImage接口獲得
                            isShowProgressTips: 1, // 默認(rèn)為1墩莫,顯示進(jìn)度提示
                            success: function (res) {
                                var serverId = res.serverId;
                                alert(serverId)
                            }
                        });
                    }
                });
            }
            //分享到朋友圈
        });
    });

然后啟動(dòng)本地服務(wù),并且打開ngrok,啟動(dòng)成功提示如下逞敷,ngrok使用方法自行百度


4.png

然后用手機(jī)微信訪問圖中l(wèi)ocalhost:3000左側(cè)的公網(wǎng)地址狂秦,先點(diǎn)擊獲取簽名,再點(diǎn)擊拍照推捐,我們可以看到裂问,攝像頭成功調(diào)起。注意牛柒,調(diào)攝像頭之前一定要關(guān)注自己的測(cè)試賬號(hào)堪簿。
以上就是jssdk簡(jiǎn)單的接入流程介紹,有不清楚的歡迎留言

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末皮壁,一起剝皮案震驚了整個(gè)濱河市椭更,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛾魄,老刑警劉巖虑瀑,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異滴须,居然都是意外死亡缴川,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門描馅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來把夸,“玉大人,你說我怎么就攤上這事铭污×等眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嘹狞,是天一觀的道長(zhǎng)岂膳。 經(jīng)常有香客問我,道長(zhǎng)磅网,這世上最難降的妖魔是什么谈截? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上簸喂,老公的妹妹穿的比我還像新娘毙死。我一直安慰自己,他們只是感情好喻鳄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布扼倘。 她就那樣靜靜地躺著,像睡著了一般除呵。 火紅的嫁衣襯著肌膚如雪再菊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天颜曾,我揣著相機(jī)與錄音纠拔,去河邊找鬼。 笑死泛豪,一個(gè)胖子當(dāng)著我的面吹牛绿语,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播候址,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吕粹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了岗仑?” 一聲冷哼從身側(cè)響起匹耕,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荠雕,沒想到半個(gè)月后稳其,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炸卑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年既鞠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盖文。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘱蛋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出五续,到底是詐尸還是另有隱情洒敏,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布疙驾,位于F島的核電站凶伙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏它碎。R本人自食惡果不足惜函荣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一显押、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧傻挂,春花似錦乘碑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旋讹。三九已至殖蚕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沉迹,已是汗流浹背睦疫。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鞭呕,地道東北人蛤育。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像葫松,于是被迫代替她去往敵國(guó)和親瓦糕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容