實(shí)現(xiàn)微信接口
- 如何獲取公眾號(hào)唯一票據(jù) access_token
- 如何獲取微信服務(wù)器IP地址
獲取access token
access_token是公眾號(hào)的全局唯一票據(jù)剩彬,公眾號(hào)調(diào)用各接口時(shí)都需使用access_token钦椭。開(kāi)發(fā)者需要進(jìn)行妥善保存屎飘。access_token的存儲(chǔ)至少要保留512個(gè)字符空間轻姿。access_token的有效期目前為2個(gè)小時(shí),需定時(shí)刷新叙淌,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。
access_token 是由中控服務(wù)器提供的闻鉴,目前的過(guò)期時(shí)間是7200秒,也就是2小時(shí)孟岛,中控服務(wù)器根據(jù)這個(gè)有效時(shí)間去刷新access_token
公眾號(hào)可以使用AppID和AppSecret調(diào)用接口來(lái)獲得這個(gè)票據(jù)
關(guān)于node發(fā)送https請(qǐng)求
錯(cuò)誤:發(fā)送https請(qǐng)求報(bào)錯(cuò):[error:getaddrinfo ENOTFOUND],查資料發(fā)現(xiàn)是請(qǐng)求的url地址不能添加’https://'
錯(cuò)誤:關(guān)于Nodejs Post請(qǐng)求報(bào)socket hang up
坑
發(fā)送https請(qǐng)求遇到了一些奇怪的坑获黔,筆者按照
官方的https的文檔有兩個(gè)例子蚀苛,
一個(gè)是直接https.get(url, function(){...})
一個(gè)是通過(guò)設(shè)置options參數(shù),再調(diào)用https.request(options, function() {...})
筆者第一次使用的是后一種方法玷氏,接過(guò)接連遇到上面兩種錯(cuò)誤堵未,嘗試了半天都沒(méi)有出來(lái),后面直接調(diào)用了前一種方法盏触,接過(guò)就通過(guò)了渗蟹。块饺。。雌芽。暫時(shí)不清楚是什么問(wèn)題授艰,總之先越過(guò)這個(gè)坑了,然后終于獲得了正確的accesstoken!
附上https請(qǐng)求樣例世落,有大牛知道為什么后一種方法錯(cuò)誤
請(qǐng)指點(diǎn)下在下
<pre><code>
const https = require('https');
https.get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET', (res) =>{
console.log('statusCode: ', res.statusCode);
console.log('headers: ', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
}).on('error', (e) => {
console.error(e);
});
</code></pre>
最后把它封裝成一個(gè)模塊來(lái)使用淮腾,后期可擴(kuò)展為可自動(dòng)更新提醒獲取的功能,即access_token判斷是否過(guò)期屉佳,過(guò)期則重新獲取谷朝,否則繼續(xù)使用,重新獲取的意識(shí)不是更改token值武花,而是更新它的過(guò)期時(shí)間圆凰。
獲取微信服務(wù)器的IP地址
有了獲取access_token的前例,獲取微信服務(wù)器的IP地址列表也是類(lèi)似的体箕,這次筆者將這個(gè)功能封裝成模塊专钉,并提供回調(diào)函數(shù)給路由器使用,附上樣例( 代碼的縮進(jìn)樣式貌似支持性不佳
)
<pre><code>
// 接口模塊
const https = require('https');
var wxUrl = 'https://api.weixin.qq.com';
// 獲取微信服務(wù)器IP列表
getCallBackIP = function(option, callback) {
var path = '/cgi-bin/getcallbackip';
var url = wxUrl + path + '?access_token=' + option.access_token;
var data = [];
var httpsReq = https.get(url, (res) => {
res.on('data', (d) => {
data.push(d);
}).on('end', () => {
var buffer = Buffer.concat(data);
var str = buffer.toString();
var obj = JSON.parse(str);
callback(null, obj);
});
}).on('error', (e) => {
console.log(e);
callback(e, 'Response error!');
});
httpsReq.end();
httpsReq.on('error', function(e) {
callback(e, 'Request error!');
});
}
exports.getCallBackIP = getCallBackIP;
</code></pre>
<pre><code>
// 獲取微信服務(wù)器的IP列表
app.get('/iplist', function (req, res) {
weixinInterface.getCallBackIP(wxStatus, function(err, doc){
if (err) {
console.log('url:/iplist Fail to get IP list !!!');
res.send('Get APPlist fail err message is ' + JSON.stringify(doc));
} else {
console.log('url:/iplist OK!');
res.send('Get APPlist ok! :' + JSON.stringify(doc));
}
});
});
</code></pre>
官方文檔可以多讀累铅,幫助我們解決很多疑問(wèn)和學(xué)到挺多東西跃须。