先貼參考連接html
http://www.cnblogs.com/constantince/p/5207365.html
http://www.cnblogs.com/xuange306/p/4971702.htmlnode
一、準備工做
ngrok用來作內網映射,Node.js用來搭建後臺服務,微信測試賬號用來和服務器交互
這裏直接用我的PC作服務器開發測試比較方便(也能夠去阿里雲,騰訊雲買服務器,還須要買域名,域名備案也比較麻煩須要公司資質)
微信公衆號當前分爲訂閱號、服務號、企業號(如今叫企業微信)具體區別見http://kf.qq.com/faq/120911VrYVrA130805byM32u.html(公衆平臺服務號、訂閱號、企業號的相關說明),
簡單來講訂閱號更適合作信息羣發,服務號則能夠跟用戶交互,功能更多(好比微信支付功能),企業號用來公司內部通信用
訂閱號支持組織和我的,服務號和企業號須要公司資質,並且高級接口和微信支付功能都須要微信認證(須要公司資質和300元認證費用,開通微信支付還須要300)
直接作開發測試弄個微信測試賬號就好了,真正上線才須要雲服務器,域名備案和微信認證這些東西
相關資源連接
ngrok下載
https://ngrok.com/download
Node.js英文官網
https://nodejs.org/en/
Node.js中文官網
http://nodejs.cn/download/
公衆平臺測試賬號,微信掃碼登錄後會獲得
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/loginweb
二、開發環境配置
安裝Node.js
安裝下載的Node.js安裝包後,確認下是否成功安裝
win+R,輸入cmd後回車,進入dos界面,輸入命令 node -v
獲得版本信息說明安裝成功express
npm安裝express(Node.js的一個web開發框架,封裝了不少底層接口用起來比較方便,並且遵循mvc開發規範)
一樣dos命令npm install -g express進行全局安裝(這個命令是連接官方的npm網站下載通常不會出現連接失敗的問題,若是連接失敗的話能夠切淘寶源,也就是國內的npm包鏡像,10分鐘同步一次。方式是執行npm install -g cnpm -- registry=https://registry.npm.taobao.org,之後的命令就變成了cnpm install -g express,參數和npm同樣)npm
還須要輸入下一個命令,這樣就能夠在任何目錄執行express命令,不執行的話得去express安裝目錄執行cmd(路徑npm安裝的時候會顯示)
npm install -g express-generatorjson
建立express項目,cmd進入你想建立項目的目錄下執行express porjectName,我這裏直接在E盤根目錄下建了一個weixin-test項目gulp
他這裏也給提示了install dependencies:> cd weixin-test && npm install,當前目錄執行cd weixin-test && npm install來安裝依賴模塊api
還有啓動命令run the app:> SET DEBUG=weixin-test:* & npm start,直接進weixin-test執行npm start就行,他會直接找bin下的www配置文件啓動瀏覽器
項目目錄執行npm Install 會將package.json(項目配置文件)裏配置的依賴包都下載下來,express建的項目package.json裏是express須要的一些基礎服務模塊安全
啓動項目瀏覽器訪問測試
7個npm包下載完後就能夠啓動服務器了,express4.x建立的服務器默認端口爲3000;配置文件在項目目錄下的bin/www
啓動命令直接在項目目錄下執行npm start,用webstrom的話能夠配置後直接在webstrom啓動,webstrom配置以下
dos啓動
瀏覽器訪問
ngrok內網映射,測試域名連接
解壓下載的ngrok進入目錄執行cmd調起dos,執行ngrok.exe http 3000(這個3000是express項目bin下面的www配置文件裏面的端口),鏈接成功後會返回映射的http和https域名
返回映射域名
測試映射是否成功http和https鏈接均可以(美國的服務器連接會比較慢)
實現微信接入交互代碼(參考微信官方文檔https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319)
主要要實現的邏輯以下
首先須要安裝crypto模塊,項目目錄執行npm install crypto --save(--save參數會將模塊加入到package.json裏的dependencies屬性裏,這個屬性裏存的是當前項目的依賴模塊,上線的時候用。還有一個參數是--save-dev區別是加入到package.json裏的devDependencies屬性,這個屬性用來存放開發用的模塊,好比gulp自動構建用的方便開發,上線的時候不用這些模塊)---更新下(這裏不用下crypto模塊了,直接require就行,Crypto庫是隨Nodejs內核一塊兒打包發佈的,主要提供了加密、解密、簽名、驗證等功能。)
修改app.js增長路由配置,這裏require的api文件須要在routes下建用來實現具體的驗證邏輯
1 var express = require('express'); 2 var path = require('path'); 3 var favicon = require('serve-favicon'); 4 var logger = require('morgan'); 5 var cookieParser = require('cookie-parser'); 6 var bodyParser = require('body-parser'); 7 8 var index = require('./routes/index'); 9 var users = require('./routes/users'); 10 var api = require('./routes/api');//引入js文件,先要在routes下新建api.js 11 12 var app = express(); 13 14 // view engine setup 15 app.set('views', path.join(__dirname, 'views')); 16 app.set('view engine', 'jade'); 17 18 // uncomment after placing your favicon in /public 19 //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 20 app.use(logger('dev')); 21 app.use(bodyParser.json()); 22 app.use(bodyParser.urlencoded({ extended: false })); 23 app.use(cookieParser()); 24 app.use(express.static(path.join(__dirname, 'public'))); 25 26 app.use('/', index); 27 app.use('/users', users); 28 app.use('/api', api);//增長路由 29 30 // catch 404 and forward to error handler 31 app.use(function(req, res, next) { 32 var err = new Error('Not Found'); 33 err.status = 404; 34 next(err); 35 }); 36 37 // error handler 38 app.use(function(err, req, res, next) { 39 // set locals, only providing error in development 40 res.locals.message = err.message; 41 res.locals.error = req.app.get('env') === 'development' ? err : {}; 42 43 // render the error page 44 res.status(err.status || 500); 45 res.render('error'); 46 }); 47 48 module.exports = app;
routes下新建api.js
1 var express = require('express'); 2 var crypto = require('crypto'); 3 var router = express.Router(); 4 5 var token = "xxxxx"; //此處須要你本身修改!微信公衆測試號裏設置的token須要和這裏同樣 6 7 router.get('/getToken', function(req, res, next) { 8 var signature = req.query.signature; 9 var timestamp = req.query.timestamp; 10 var nonce = req.query.nonce; 11 var echostr = req.query.echostr; 12 13 /* 加密/校驗流程以下: */ 14 //1. 將token、timestamp、nonce三個參數進行字典序排序 15 var array = new Array(token,timestamp,nonce); 16 array.sort(); 17 var str = array.toString().replace(/,/g,""); 18 19 //2. 將三個參數字符串拼接成一個字符串進行sha1加密 20 var sha1Code = crypto.createHash("sha1"); 21 var code = sha1Code.update(str,'utf-8').digest("hex"); 22 23 //3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信 24 if(code===signature){ 25 res.send(echostr) 26 }else{ 27 res.send("error"); 28 } 29 }); 30 31 module.exports = router;
重啓項目,ctrl + c 而後y回車 或者直接兩次ctrl +c 而後npm start
登陸微信測試公衆號填寫相關信息
訪問https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login掃碼進入會出現以下頁面
appID和appsecret是自動分配的信息,用來後臺實現公衆號自定義菜單或者微信網頁受權等功能用
接口配置信息就是微信接入的接口,微信服務器會用GET請求訪問這個接口並匹配返回的信息,一致的話則認證成功(這裏的路徑http://xxxx.ngrok.io/api/getToken是根據你app.js裏的路由和api.js裏的get配置路徑定義的,由於加密校驗代碼在api.js裏,固然也能夠配置http://xxxx.ngrok.io或者http://xxxx.ngrok.io/api或者別的http://xxxx.ngrok.io下的接口可是相應的api.js裏的代碼也要對應上,具體能夠百度下express路由)
Token要跟你api.js裏面的Token一致用來作加密校驗,不一致的話固然校驗也不會經過
JS接口安全域名是之後網頁使用微信JSSDK時用,不加http https協議內容
填寫接口配置信息而後點提交
頁面返回結果失敗的話重試,可能會碰到網絡問題
返回成功則接入成功了,能夠進行進一步開發了