成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

微信公眾平臺(tái)開發(fā)接入指南

luodongseu / 730人閱讀

摘要:在進(jìn)行微信公眾平臺(tái)開發(fā)之前,需要先接入微信公眾平臺(tái)。后續(xù)我也還會(huì)更新一些關(guān)于微信公眾平臺(tái)開發(fā)的文章,歡迎關(guān)注。

在進(jìn)行微信公眾平臺(tái)開發(fā)之前,需要先接入微信公眾平臺(tái)。具體的步驟在 公眾平臺(tái)開發(fā)者文檔-接入指南 已有詳細(xì)介紹,文檔中也提供了驗(yàn)證服務(wù)器的 PHP 示例代碼。

本文主要提供了 Node.js 版本的驗(yàn)證代碼,同時(shí)把步驟細(xì)化,讓開發(fā)者更方便地了解整個(gè)接入過程,對(duì)初學(xué)者更友好。

TL;DR

在微信公眾平臺(tái)后臺(tái)的 開發(fā)者中心/填寫服務(wù)器配置 頁(yè)面,配置好 URL 和 Token 后,復(fù)制下面的代碼,修改 Token,在服務(wù)器運(yùn)行,然后再在頁(yè)面上點(diǎn)擊提交即可進(jìn)行接入驗(yàn)證。

// checkSignature.js
/**
 * 整個(gè)驗(yàn)證步驟分為三步
 *    1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
 *    2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
 *    3. 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
 */


const http = require("http");
const url = require("url");
const crypto = require("crypto");


// Web 服務(wù)器端口
const port = 3333;
// 微信公眾平臺(tái)服務(wù)器配置中的 Token
const token = "token";


/**
 *  對(duì)字符串進(jìn)行sha1加密
 * @param  {string} str 需要加密的字符串
 * @return {string}     加密后的字符串
 */
function sha1(str) {
  const md5sum = crypto.createHash("sha1");
  md5sum.update(str);
  const ciphertext = md5sum.digest("hex");
  return ciphertext;
}

/**
 * 驗(yàn)證服務(wù)器的有效性
 * @param  {object} req http 請(qǐng)求
 * @param  {object} res http 響應(yīng)
 * @return {object}     驗(yàn)證結(jié)果
 */
function checkSignature(req, res) {
  const query = url.parse(req.url, true).query;
  console.log("Request URL: ", req.url);
  const signature = query.signature;
  const timestamp = query.timestamp;
  const nonce = query.nonce;
  const echostr = query.echostr;
  console.log("timestamp: ", timestamp);
  console.log("nonce: ", nonce);
  console.log("signature: ", signature);
  // 將 token/timestamp/nonce 三個(gè)參數(shù)進(jìn)行字典序排序
  const tmpArr = [token, timestamp, nonce];
  const tmpStr = sha1(tmpArr.sort().join(""));
  console.log("Sha1 String: ", tmpStr);
  // 驗(yàn)證排序并加密后的字符串與 signature 是否相等
  if (tmpStr === signature) {
    // 原樣返回echostr參數(shù)內(nèi)容
    res.end(echostr);
    console.log("Check Success");
  } else {
    res.end("failed");
    console.log("Check Failed");
  }
}


const server = http.createServer(checkSignature)
server.listen(port, () => {
  console.log(`Server is runnig ar port ${port}`);
  console.log("Start Checking...");
});
填寫服務(wù)器配置

登錄進(jìn)入微信公眾平臺(tái)后臺(tái)管理頁(yè)面

然后進(jìn)入 基本配置 頁(yè)面

再然后選擇 修改配置,進(jìn)入到 填寫服務(wù)器配置 子頁(yè)面

URL 為已經(jīng)解析到你的服務(wù)器的域名,這里以 http://wechat.nodejh.com 這個(gè)二級(jí)域名為例

Token 隨意填寫即可

驗(yàn)證服務(wù)器地址的有效性

驗(yàn)證服務(wù)器地址的有效性,需要在域名對(duì)應(yīng)的服務(wù)器上運(yùn)行一段驗(yàn)證程序。該程序會(huì)接收上個(gè)步驟中的域名所發(fā)送的 HTTP 請(qǐng)求。

官方文檔提供了 PHP 的示例程序,下面是 Node.js 版本:

// checkSignature.js
/**
 * 整個(gè)驗(yàn)證步驟分為三步
 *    1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
 *    2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
 *    3. 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
 */


const http = require("http");
const url = require("url");
const crypto = require("crypto");


// Web 服務(wù)器端口
const port = 3333;
// 微信公眾平臺(tái)服務(wù)器配置中的 Token
const token = "token";


/**
 *  對(duì)字符串進(jìn)行sha1加密
 * @param  {string} str 需要加密的字符串
 * @return {string}     加密后的字符串
 */
function sha1(str) {
  const md5sum = crypto.createHash("sha1");
  md5sum.update(str);
  const ciphertext = md5sum.digest("hex");
  return ciphertext;
}

/**
 * 驗(yàn)證服務(wù)器的有效性
 * @param  {object} req http 請(qǐng)求
 * @param  {object} res http 響應(yīng)
 * @return {object}     驗(yàn)證結(jié)果
 */
function checkSignature(req, res) {
  const query = url.parse(req.url, true).query;
  console.log("Request URL: ", req.url);
  const signature = query.signature;
  const timestamp = query.timestamp;
  const nonce = query.nonce;
  const echostr = query.echostr;
  console.log("timestamp: ", timestamp);
  console.log("nonce: ", nonce);
  console.log("signature: ", signature);
  // 將 token/timestamp/nonce 三個(gè)參數(shù)進(jìn)行字典序排序
  const tmpArr = [token, timestamp, nonce];
  const tmpStr = sha1(tmpArr.sort().join(""));
  console.log("Sha1 String: ", tmpStr);
  // 驗(yàn)證排序并加密后的字符串與 signature 是否相等
  if (tmpStr === signature) {
    // 原樣返回echostr參數(shù)內(nèi)容
    res.end(echostr);
    console.log("Check Success");
  } else {
    res.end("failed");
    console.log("Check Failed");
  }
}


const server = http.createServer(checkSignature)
server.listen(port, () => {
  console.log(`Server is runnig ar port ${port}`);
  console.log("Start Checking...");
});

因?yàn)轵?yàn)證要使用 80(HTTP) 端口或 443(HTTPS) 端口,而 Node.js 一般不直接監(jiān)聽 80 端口,所以需要使用 Nginx 或其他程序?qū)碜?http://wechat.nodejh.com 的請(qǐng)求轉(zhuǎn)發(fā)到 Node.js 程序端口如上面的 3333。關(guān)于 Nginx 的配置,可以看我之前寫的《使用 Ngnix 給 Node.js 應(yīng)用做反向代理》。

這里也順便給出該程序的 Nginx 配置

upstream nodejs {
    server 127.0.0.1:3333;
    keepalive 64;
}

server {
    listen 80;
    server_name wechat.nodejh.com;
    # 日志
    access_log /var/log/nginx/wechat.nodejh.com.log;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Nginx-Proxy true;
        proxy_set_header Connection "";
        proxy_pass http://nodejs;
    }
}

配置就緒之后,啟動(dòng)驗(yàn)證程序

$ node checkSignature.js
Server is runnig ar port 3333
Start Checking...

這樣,checkSignature.js 就會(huì)創(chuàng)建一個(gè) 3333 端口的服務(wù)。訪問 http://wechat.nodejh.com 這個(gè)域名的時(shí)候,Nginx 就會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到 3333 端口。

在微信公眾平臺(tái)后臺(tái)管理的服務(wù)器配置頁(yè)面,點(diǎn)擊提交按鈕,就會(huì)填寫的 URL (這里是 http://wechat.nodejh.com)發(fā)送一個(gè) HTTP 請(qǐng)求,并帶上 signature,timestamp,nonce,echostr 這四個(gè)參數(shù)。

啟動(dòng) checkSignature.js 后,在服務(wù)器配置頁(yè)面,點(diǎn)擊提交按鈕,就會(huì)開啟驗(yàn)證。

服務(wù)器端出現(xiàn)下面的結(jié)果,就說明驗(yàn)證成功。驗(yàn)證成功后,微信公眾平臺(tái)后臺(tái)會(huì)自動(dòng)跳轉(zhuǎn)到 基本配置 頁(yè)面。

# 服務(wù)端響應(yīng)...
signature:  8fffb8f011d64819ec61105415114694bb03d392
Sha1 String:  8fffb8f011d64819ec61105415114694bb03d392
Check Success

然后就可以依據(jù)接口文檔實(shí)現(xiàn)業(yè)務(wù)邏輯了。

后續(xù)我也還會(huì)更新一些關(guān)于微信公眾平臺(tái)開發(fā)的文章,歡迎關(guān)注。

Github Issue: https://github.com/nodejh/nodejh.github.io/issues/24

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91252.html

相關(guān)文章

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

    摘要:內(nèi)網(wǎng)穿透由于微信開發(fā)的端口必須是最近貌似增加了,所以一個(gè)內(nèi)網(wǎng)穿透工具還是很有必要的。我個(gè)人使用的是瀏覽器微信調(diào)試工具。若確認(rèn)此次請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷貐?shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。 首先github地址奉上:https://github.com/xiadd/shorthand 歡迎star?最近又拾起了微信開發(fā),之前的公眾號(hào)是用的flask進(jìn)行開發(fā)的,所以...

    LiangJ 評(píng)論0 收藏0
  • 【Node.js 微信公眾號(hào)實(shí)戰(zhàn)】1.Node.js 接入微信公眾平臺(tái)開發(fā)

    摘要:打開中文網(wǎng)文檔打開微信開發(fā)者文檔三接入微信公眾平臺(tái)創(chuàng)建項(xiàng)目首先我們?cè)陔娔X的任意磁盤上創(chuàng)建文件夾,命名隨意,我這命名為隨后在文件夾中創(chuàng)建兩個(gè)文件一個(gè)是,另一個(gè)為。接入驗(yàn)證再次進(jìn)入微信公眾平臺(tái)在左側(cè)菜單點(diǎn)擊基本配置,如圖點(diǎn)擊修改配置。 一、寫在前面的話 ??Node.js是一個(gè)開放源代碼、跨平臺(tái)的JavaScript語(yǔ)言運(yùn)行環(huán)境,采用Google開發(fā)的V8運(yùn)行代碼,使用事件驅(qū)動(dòng)、非阻塞和異...

    winterdawn 評(píng)論0 收藏0
  • 慕課網(wǎng)_《初識(shí)Java微信公眾號(hào)開發(fā)》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期五說明本文部分內(nèi)容均來自慕課網(wǎng)。本套課程介紹微信公眾號(hào)開發(fā),主要涉及公眾號(hào)介紹編輯模式介紹開發(fā)模式介紹等。慕課網(wǎng)是垂直的互聯(lián)網(wǎng)技能免費(fèi)學(xué)習(xí)網(wǎng)站。 時(shí)間:2017年08月11日星期五說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github...

    PrototypeZ 評(píng)論0 收藏0
  • Python爬蟲學(xué)習(xí)路線

    摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過一遍Python最基本的知識(shí),比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法...

    liaoyg8023 評(píng)論0 收藏0
  • 微信小程序的筆記-流程記錄

    摘要:百度微信小程序進(jìn)入開發(fā)支持以及接入流程微信公眾平臺(tái)小程序首頁(yè)接入小程序接入指南小程序開發(fā)開發(fā)文檔小程序開發(fā)之簡(jiǎn)易教程小程序開發(fā)之文檔小程序開發(fā)之官方教程小程序開發(fā)指南 百度微信小程序 showImg(https://segmentfault.com/img/remote/1460000015422248);進(jìn)入showImg(https://segmentfault.com/img/r...

    Muninn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<