nodejs微信開發(fā)接入指南

微信二次開發(fā)已經(jīng)很火熱,php、C#获搏、java像鸡、python等關(guān)于微信后臺開發(fā)案例也是比較多。但是關(guān)于nodejs開發(fā)微信的案例比較少墓律。博主在百度上找到案例也是只字片言,關(guān)于接入微信的文章也是各類各樣。博主嘗試過各種失敗梢薪,最后才接入微信。所謂萬事開始難尝哆,博主在文章會貼出自己失敗的例子秉撇,以及后續(xù)也會推出在微信開發(fā)中遇到的錯誤。

  • 申請微信公眾號

    • 個人開發(fā)者只能申請未認(rèn)證的訂閱號秋泄,未認(rèn)證的訂閱號可以使用的微信API接口有限琐馆;所以個人開發(fā)者申請成功訂閱號成功后,可以直接申請免費(fèi)的測試號恒序,測試號提供的API接口比較多瘦麸,方便開發(fā)進(jìn)行測試開發(fā),測試號的使用時限是一年奸焙,一年過后會被釋放瞎暑。關(guān)于注冊公眾號的流程,開發(fā)者可以自己根據(jù)騰訊官方的提示進(jìn)行填寫与帆。
  • 申請測試號

    • 個人性的訂閱號很多接口是不能用的了赌;個人的訂閱號也不能認(rèn)證。所以為了體驗(yàn)微信公眾號的開發(fā)的最好方法就是申請測試號了玄糟。測試號提供了很多API接口勿她,方便我們進(jìn)行測試。登錄個人訂閱號以后阵翎,在微信開發(fā)者文檔里面有申請測試號的入口逢并。申請測試號很簡單,直接用管理員的微信掃一掃就可以直接注冊到測試號了郭卫。
  • 登錄到的測試頁面如下所示:

    • APPID以及APPsecret都是微信提供的砍聊,這連個值到時候是用來調(diào)用獲取access_token的,而access_token是用來取得微信一些API接口的使用的口令贰军;至于下面的url是第三方服務(wù)器地址(主要是微信服務(wù)器把用戶提交的信息轉(zhuǎn)發(fā)給的服務(wù)器處理地址玻蝌,博主買了阿里云ECS,沒有注冊域名,你們可以直接填http://192.168.x.x/deal; 這個公網(wǎng)ip是阿里云提供的俯树,后面的/deal是自己定義對的處理路由)帘腹;后面token是用來驗(yàn)證消息是否來自微信服務(wù)器,自定義许饿,例如weixin阳欲。
測試號的頁面
  • 第一步進(jìn)行鏈接認(rèn)證,即是配置第三方服務(wù)器和微信服務(wù)器的鏈接陋率;按照上面一步填寫好之后球化,直接提交;提交的過程中翘贮,微信服務(wù)器將會以get的方式發(fā)送nonce(隨機(jī)數(shù))赊窥,singnature(加密后簽名),timestamp(時間戳)狸页,echostr給第三方服務(wù)器。加密算法(首先將nonce扯再、timestamp芍耘、token字典序排序,然后再轉(zhuǎn)換成字符串熄阻,最后用sha1加密斋竞,最后得到signature;我們實(shí)際就是驗(yàn)證signature是否與第三方算出來的加密簽名相等)秃殉;代碼如下所示:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var xmlParse=require('xml2js').parseString;
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var sha1=require('sha1');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.get('/validate',(req,res,next)=>{
    let token='wechat';
    let signature=req.query.signature;
    let timestamp=req.query.timestamp;
    let echostr=req.query.echostr;
    let nonce=req.query.nonce;
    let oriArray=new Array();
    oriArray.push(nonce);
    oriArray.push(timestamp);
    oriArray.push(token);
    let original=oriArray.sort().join('');
    let combineStr=sha1(original);
    if(signature==combineStr){
        res.send(echostr);
    }else{
        console.log('error');
    }
    next();
});
app.post('/validate',(req,res,next)=>{
    var data='';
    req.on('data',(chunk)=>{
        data+=chunk;
    });
    req.on('end',()=>{
        // console.log(data);
        xmlParse(data,(err,result)=>{
            console.log(result);
            
            if(result.xml.MsgType=='image'){
                let str= '<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'image'+']]></MsgType><Image><MediaId><![CDATA['+result.xml.MediaId+']]></MediaId></Image></xml>';
                res.send(str);
            }
            if(result.xml.MsgType=='text'){
                let responseMSg='歡迎關(guān)注聊天小喵;小喵智能已經(jīng)下線坝初,其他接口在開發(fā)中。钾军。鳄袍。喵喵喵';
                let str='<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'text'+']]></MsgType><Content><![CDATA['+responseMSg+']]></Content></xml>';
                res.send(str);  
                
            }
            if(result.xml.MsgType=='voice'){
                // let requestMsg=result.xml.Recognition;
                let str='<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'voice'+']]></MsgType><Voice><MediaId><![CDATA['+result.xml.MediaId+']]></MediaId></Voice></xml>';
                res.send(str);
            }
            if(result.xml.MsgType=='video'){
                // console.log(result.xml.MediaId);
                let str='<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'video'+']]></MsgType><Video><MediaId><![CDATA['+result.xml.MediaId+']]></MediaId><Title><![CDATA['+'hello'+']]></Title><Description><![CDATA['+'hello world'+']]></Description></Video></xml>';
                res.send(str);
            }

        });
    });

});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;
  • 運(yùn)行上述代碼,然后按下提交按鈕吏恭,驗(yàn)證配置是否正確拗小;很多時候都會是提交失敗,這個時候可以繼續(xù)按提交按鈕樱哼,如果出現(xiàn)4-5次都提交失敗哀九,那很有可能是代碼出錯,可以檢查代碼搅幅;如果第一次提交出錯阅束,有可能是網(wǎng)絡(luò)原因延遲導(dǎo)致失敗,所以繼續(xù)提交茄唐。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末息裸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌界牡,老刑警劉巖簿寂,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宿亡,居然都是意外死亡常遂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門挽荠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來克胳,“玉大人,你說我怎么就攤上這事圈匆∧恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵跃赚,是天一觀的道長笆搓。 經(jīng)常有香客問我,道長纬傲,這世上最難降的妖魔是什么满败? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮叹括,結(jié)果婚禮上算墨,老公的妹妹穿的比我還像新娘。我一直安慰自己汁雷,他們只是感情好净嘀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侠讯,像睡著了一般挖藏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上继低,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天熬苍,我揣著相機(jī)與錄音,去河邊找鬼袁翁。 笑死柴底,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粱胜。 我是一名探鬼主播柄驻,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焙压!你這毒婦竟也來了鸿脓?” 一聲冷哼從身側(cè)響起抑钟,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎野哭,沒想到半個月后在塔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拨黔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年蛔溃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篱蝇。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡贺待,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出零截,到底是詐尸還是另有隱情麸塞,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布涧衙,位于F島的核電站哪工,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弧哎。R本人自食惡果不足惜正勒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望傻铣。 院中可真熱鬧,春花似錦祥绞、人聲如沸非洲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽两踏。三九已至,卻和暖如春兜喻,著一層夾襖步出監(jiān)牢的瞬間梦染,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工朴皆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帕识,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓遂铡,卻偏偏與公主長得像肮疗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扒接,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理伪货,服務(wù)發(fā)現(xiàn)们衙,斷路器,智...
    卡卡羅2017閱讀 134,664評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評論 25 707
  • title: 微信公眾號開發(fā):獲取openId和用戶信息 tags: 微信公眾號 categories: 筆記 ...
    行徑行閱讀 140,239評論 5 63
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,768評論 0 15
  • 輸出 寫文字7篇 錄制音頻一個 輸入 1.閱讀: 《好好學(xué)習(xí)》碱呼,在讀蒙挑。自學(xué)成才。 《英語魔法師之語法俱樂部》愚臀,句子...
    迷夏的小島閱讀 250評論 2 0