前期準(zhǔn)備工作
1、開啟公眾號開發(fā)者模式
1.1 申請公眾號
1.2 開發(fā)者配置
2、AccessToken3、JS接口安全域名
1、開啟公眾號開發(fā)者模式
1.1 申請公眾號
微信的開發(fā)者文檔真的有點丈二和尚摸不著頭腦,有點讓人迷糊。
做微信公眾號開發(fā),先注冊微信公眾號,最好有一個服務(wù)器和一個備過案的域名,不然很多jsapi接口無法調(diào)試。
一般情況下,個人注冊訂閱號,企業(yè)注冊企業(yè)號。

2.2 開發(fā)者配置
公眾平臺官網(wǎng)登錄之后,找到“基本配置”菜單欄

這里的服務(wù)器配置,是微信發(fā)請求到你所填寫的服務(wù)器地址去驗證你是這個==公眾號==的開發(fā)者的。
url填寫:
http://外網(wǎng)IP。外網(wǎng)IP。嗯嗯http的端口號固定使用80,不可填寫其他。
Token:自主設(shè)置,這個token與公眾平臺wiki中常提的access_token不是一回事。這個token只用于驗證開發(fā)者服務(wù)器。
服務(wù)器配置
消息加解密密鑰隨機(jī)生成即可
消息加密模式,開發(fā)環(huán)境選擇明文即可
如果服務(wù)器端沒有,提交肯定提示失敗,或者出現(xiàn)錯誤。
我是自己有個域名,然后用Nodejs + Express寫了一個接口:
api/auth.js
// 第一步認(rèn)證為開發(fā)者
const crypto = require('crypto');
const config = require('../config');
// 微信認(rèn)證開發(fā)者 微信服務(wù)器發(fā)送請求到你的服務(wù)器,做校驗,參數(shù)都是微信傳過來的。
module.exports = auth = (req, res) => {
//1.獲取微信服務(wù)器Get請求的參數(shù) signature、timestamp、nonce、echostr
var signature = req.query.signature,//微信加密簽名
timestamp = req.query.timestamp,//時間戳
nonce = req.query.nonce,//隨機(jī)數(shù)
echostr = req.query.echostr;//隨機(jī)字符串
//2.將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序
// 這里的 config.token 就是上面你自定義的 Token (如:beip***6666)
var array = [config.token, timestamp, nonce];
array.sort();
//3.將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密
var tempStr = array.join('');
const hashCode = crypto.createHash('sha1'); //創(chuàng)建加密類型
var resultCode = hashCode.update(tempStr, 'utf8').digest('hex'); //對傳入的字符串進(jìn)行加密
//4.開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信
if (resultCode === signature) {
res.send(echostr);
} else {
res.send('mismatch');
}
};
這塊的邏輯流程圖如下:

使用Express搭建你的restfull api服務(wù)
app.js
const express = require('express');
const api = require('./api');
const path = require('path');
const app = express();
const port = 3000;
// 這里就是你的認(rèn)證路由
app.get('/', (req, res) => {
api.auth(req, res);
});
// listen
app.listen(port, () => {
console.log(`Server started on localhost:%d`, port);
});
一般你要把你的Node項目升級到你的服務(wù)器;
其實就是當(dāng)做服務(wù)器和你的電腦一樣就行了,一樣要先裝一個nodejs(如果不會,可以參考之前的教程,Node項目線上部署), 然后一樣啟動就行了,比如:
node app.js
這樣就啟動你項目,http://你的外網(wǎng)ip:3000;
不過微信規(guī)定端口必須是80,如果上一步你的port 可以設(shè)置80最好,如果不可以的,只能考慮用 Nginx 走下反向代理。
假設(shè)以上問題都解決了。
訪問 http://你的外網(wǎng)ip,如果瀏覽器打印了mismatch,說明這個路由走通了
這時候你再回到服務(wù)器設(shè)置這里,點擊按鈕,就會提示成功。
那么恭喜你,開始了萬里長征的第一步。
2、AccessToken
切記,這是繼續(xù)開發(fā)下去的一個重要步驟,缺少這個訪問令牌,一切都將不能進(jìn)行。
access_token是公眾號的全局唯一接口調(diào)用憑據(jù),公眾號調(diào)用各接口時都需使用access_token。開發(fā)者需要進(jìn)行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前為2個小時,需定時刷新,重復(fù)獲取將導(dǎo)致上次獲取的access_token失效。
公眾平臺的API調(diào)用所需的access_token的使用及生成方式說明:
1、建議
公眾號開發(fā)者使用中控服務(wù)器統(tǒng)一獲取和刷新access_token,其他業(yè)務(wù)邏輯服務(wù)器所使用的access_token均來自于該中控服務(wù)器,不應(yīng)該各自去刷新,否則容易造成沖突,導(dǎo)致access_token覆蓋而影響業(yè)務(wù);2、目前
access_token的有效期通過返回的expire_in來傳達(dá),目前是7200秒之內(nèi)的值。中控服務(wù)器需要根據(jù)這個有效時間提前去刷新新access_token。在刷新過程中,中控服務(wù)器可對外繼續(xù)輸出的老access_token,此時公眾平臺后臺會保證在5分鐘內(nèi),新老access_token都可用,這保證了第三方業(yè)務(wù)的平滑過渡;3、
access_token的有效時間可能會在未來有調(diào)整,所以中控服務(wù)器不僅需要內(nèi)部定時主動刷新,還需要提供被動刷新access_token的接口,這樣便于業(yè)務(wù)服務(wù)器在API調(diào)用獲知access_token已超時的情況下,可以觸發(fā)access_token的刷新流程。
公眾號和小程序均可以使用AppID和AppSecret調(diào)用本接口來獲取access_token。AppID和AppSecret可在“微信公眾平臺-開發(fā)-基本配置”頁中獲得(需要已經(jīng)成為開發(fā)者,且?guī)ぬ枦]有異常狀態(tài))。調(diào)用接口時,請登錄“微信公眾平臺-開發(fā)-基本配置”提前將服務(wù)器IP地址添加到IP白名單中,點擊查看設(shè)置方法,否則將無法調(diào)用成功。小程序無需配置IP白名單。

接口調(diào)用請求說明
https請求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
參數(shù)說明
| 參數(shù) | 是否必須 | 說明 |
|---|---|---|
| grant_type | 是 | 獲取access_token填寫client_credential |
| appid | 是 | 第三方用戶唯一憑證 |
| secret | 是 | 第三方用戶唯一憑證密鑰,即appsecret |
返回說明
正常情況下,微信會返回下述JSON數(shù)據(jù)包給公眾號:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
參數(shù)說明
| 參數(shù) | 說明 |
|---|---|
| access_token | 獲取到的憑證 |
| expires_in | 憑證有效時間,單位:秒 |
錯誤時微信會返回錯誤碼等信息,JSON數(shù)據(jù)包示例如下(該示例為AppID無效錯誤):
{"errcode":40013,"errmsg":"invalid appid"}
返回碼說明
| 返回碼 | 說明 |
|---|---|
| -1 | 系統(tǒng)繁忙,此時請開發(fā)者稍候再試 |
| 0 | 請求成功 |
| 40001 | AppSecret錯誤或者AppSecret不屬于這個公眾號,請開發(fā)者確認(rèn)AppSecret的正確性 |
| 40002 | 請確保grant_type字段值為client_credential |
| 40164 | 調(diào)用接口的IP地址不在白名單中,請在接口IP白名單中進(jìn)行設(shè)置。(小程序及小游戲調(diào)用不要求IP地址在白名單內(nèi)。) |
可以在線調(diào)試:


access_token是很多微信接口的必傳參數(shù),所以這一步很重要。
3、JS接口安全域名
這個設(shè)置很重要,微信只允許在JS接口安全域名下調(diào)試所有開發(fā)的JS接口;
如果是正式公眾號的開發(fā),這個域名只能是備案過的域名;


如果是測試公眾號,這里就隨意,可以是本地server;
這里需要注意的是,填寫格式,如wx.qq.com
