摘要:在微信開發者工具中調試和一定要正確域名一定是備案的綁定域名需要的放在服務器上的位置一定要正確參考微信公眾號開發文檔
node微信公眾號開發 概覽
key | value |
---|---|
項目名稱 | node微信公眾號開發 |
項目描述 | 使用node編寫接口,前后端分離獲取簽名數據 |
開發者 | leinov |
發布日期 | 2018-11-07 |
倉庫 | github地址 |
git clone git@github.com:leinov/node-weixin-api.git npm install
在微信公眾號后臺配置域名白名單
在server/weixin/wx.js里添加自己的appid secret
在src/index/index.js里wxShare里添加自己的分享內容
npm run dev
打開微信開發者工具調試
npm run build
將域名配置時下載的txt文件放到dist文件夾下
上傳到服務器
pm2 start www.js啟動服務
在微信里打開連接分享給好友測試
擴展:修改/src/component/wxconfig.js中的jsApiList數組,添加想要使用的微信api
架構 技術使用webpack-react-multi-page 多頁面架構
webpack4
react16
es6
node
js-sdk
git
目錄結構&功能介紹|-- node-weixin-api //項目 |-- dist //編譯生產目錄 |-- index |-- index.css |-- index.js |-- index.html |-- xxx.txt // 微信域名綁定識別文件 |-- node_modules |-- server // node文件 |-- sign.js //公眾號文檔提供簽名算法 |-- wx.js //獲取簽名數據文件 |-- src //開發目錄 |-- index |-- images/ |-- js/ |-- app.js |-- b.js |-- index.scss |-- index.js //頁面js入口文件 |-- template.html // webpack html-webpack-plugin 插件生成html模板 |-- style.sass //公共sass |-- webpackConfig //webpack配置 |-- package.json |-- .gitignore |-- webpack.config.js //webpack配置文件 |-- www.js //生產啟動程序WIKI
我們在微信網頁開發的時候需要通過后端返回的微信簽名數據加以前端的配置才能使用微信提供的分享,圖像,音頻等api接口。這里我們就用前后端分離的思想,拿分享到朋友圈為例,使用node來完成這一過程
接下來我們一步步來實現
步驟一:綁定域名先登錄微信公眾平臺進入“公眾號設置”的“功能設置”里填寫“JS接口安全域名”。
在添加域名時需要下載一個txt文件放到服務器web可訪問的根目錄 比如http://www.leinov.com/xxx.txt 可訪問的靜態根目錄,比如node的靜態文件設置的是public文件,就放public下
備注:登錄后可在“開發者中心”查看對應的接口權限,看是否有分享朋友圈等權限
步驟二: 引入微信JS文件在需要調用JS接口的頁面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/... 也可以直接下載到本地目錄引入
步驟三:通過config接口注入權限驗證配置(第六步詳解)所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調用(同一個url僅需調用一次,對于變化url的SPA的web app可在每次url變化時進行調用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實現web
wx.config({ debug: true, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。 appId: "", // 必填,公眾號的唯一標識 timestamp: , // 必填,生成簽名的時間戳 nonceStr: "", // 必填,生成簽名的隨機串 signature: "",// 必填,簽名 jsApiList: [] // 必填,需要使用的JS接口列表 });
我們使用微信的所有接口都需要有在引入wx js-sdk和配置config的前提下
下面我們主要講解如何通過node來獲取微信簽名的config的數據。
步驟三所需要的數據需要通過簽名算來生成,下面是生成簽名數據的步驟
1,通過公眾號的appid和secret獲取access_token
2.根據access_token獲取ticket票據
3.根據微信提供node生成簽名算法(需要ticket,url參數來返回config數據
這里要強調是secret一定要寫在后端,決不能暴露在前端,這也是為什么需要用接口返回數據的原因。
/********************************************************************************* * @file: 返回微信開發需要的config數據 * @desc: * 1,通過appid和secret獲取access_token * 2.根據access_token獲取ticket * 3.根據ticket和url(訪問的頁面地址由接口傳過來 )通過sgin加密返回前度需要用到的config數據 * @ahthor: leinov * @usedate:2018-11-07 **********************************************************************************/ const request = require("request"); const Base64 = require("js-base64").Base64; const sign = require("./sign.js"); //微信提供在開發文檔可以找到下載到本地 const base={ appid:"****",//公眾號appid secret:"****", // 公眾號secret (重要不要暴露在前端) wxapi:"https://api.weixin.qq.com/cgi-bin" }; /** * 根據appid,secret獲取access_token */ function getAccessToken(){ return new Promise((resolve, reject)=>{ request.get(`${base.wxapi}/token?grant_type=client_credential&appid=${base.appid}&secret=${base.secret}`, function (error, response, body) { if(error!==null){ reject("獲取access_token失敗 檢查getAccessToken函數"); } resolve(JSON.parse(body)); }); }); } /** * 根據access_token獲取api_ticket * * @param {String} access_token * @return {Promise} */ function getTicket(access_token){ return new Promise((resolve,reject)=>{ request.get(`${base.wxapi}/ticket/getticket?access_token=${access_token}&type=jsapi`, function (error, response, body) { if(error!==null){ reject("獲取api_ticket失敗 檢查getTicket函數"); } resolve(JSON.parse(body)); }); }); } /** * 根據api_ticket和url通過加密返回所有config數據 * * @param {String} href * @return {Object} configdata */ async function getConfigData(href){ let configData; try{ const accessTokenData = await getAccessToken(); const ticketData = await getTicket(accessTokenData.access_token); const decodeHref = Base64.decode(href); configData = sign(ticketData.ticket,decodeHref); configData.appid = base.appid; }catch(err){ //打印錯誤日志 console.log(err); configData = {}; } return configData; } module.exports = getConfigData;
這里使用到了request來請求微信接口,sign.js是微信提供的node簽名算法,自己可以下載,通過微信接口請求以及node簽名算法就可以獲取到如下簽名數據。
timestamp: , // 生成簽名的時間戳 nonceStr: "", // 生成簽名的隨機串 signature: "",// 簽名第五步:編寫接口返回config數據
上面wx.js已經獲得數據, 接下來我們用node編寫接口返回數據。注意下面的href,href是前端傳回的用來生成簽名的,而且這個網頁地址的域名一定是在設置里加入白名單了的。
var express = require("express"); var app = express(); var getConfigData = require("./server/wx.js"); var port = "3000"; //獲取微信配置數據接口 app.get("/wxconfigdata", function(req, res){ //獲取配置 let href = req.query.href;//get獲取前端傳來的base64網頁地址 getConfigData(href).then((data)=>{ res.send(JSON.stringify(data)); }); }); var server = http.createServer(app); server.listen(port); server.on("listening", onListening);
這樣就啟動了一個3000端口的服務
我們通過訪問 "http://localhost:3000/wxconfigdata" 就可以拿到數據,但這個數據是不正確的,因為locahost跟在設置里的白名單域名不匹配,所以在開發時我們要放到測試服務器里測試。
/********************************************************************************* * @file: src/wxconfig.js 通過接口獲取微信config數據 * @ahthor: leinov * @usedate:2018-11-07 **********************************************************************************/ import { Base64 } from "js-base64"; const axios = require("axios"); /** * 頁面調用微信分享方法 * * @param {Object} obj 分享的標題,描述,圖片等 * @param {type} callback * @return {type} */ function wxShare(obj,callback){ const href = Base64.encode(location.href); //base64當前頁面地址傳給后端生成簽名 axios.get(`${location.origin}/wxconfigdata?href=${href}`).then((res)=>{ wx.config({ debug: false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。 appId: res.data.appid, // 必填,公眾號的唯一標識 timestamp: res.data.timestamp, // 必填,生成簽名的時間戳 nonceStr: res.data.nonceStr, // 必填,生成簽名的隨機串 signature: res.data.signature,// 必填,簽名,見附錄1 jsApiList: ["onMenuShareTimeline","onMenuShareAppMessage"] // 必填,需要使用的JS接口列表,所有JS接口列表見文檔 }); shareConfig(obj,callback); }).catch((err)=>{ shareConfig({},callback); }); } function shareConfig(obj,callback){ wx.ready(function(){ //分享到朋友圈 wx.onMenuShareTimeline({ title: obj.timelinetitle ? obj.timelinetitle : obj.title , // 分享標題 link: obj.link, // 分享鏈接 imgUrl: obj.imgUrl ? obj.imgUrl :"" , // 分享圖標 success: function () { if (typeof callback === "function"){ callback(); } }, cancel: function () { // 用戶取消分享后執行的回調函數 } }); // 分享給微信好友 wx.onMenuShareAppMessage({ title: obj.title, // 分享標題 desc: obj.desc, // 分享描述 link: obj.link, // 分享鏈接 imgUrl: obj.imgUrl ? obj.imgUrl:"", success: function () { if (typeof callback === "function"){ callback(); } }, cancel: function () { // 用戶取消分享后執行的回調函數 } }); }); } export default wxShare;步驟七:頁面使用
假設我們使用的是react 在react 打包入口js文件里調用配置即可
import wxShare from "../component/wxconfig.js"; wxShare({ title: "駕多多-小程序時代的駕校管理系統", // 分享標題 desc:"駕多多駕校管理系統。幫助駕校在互聯網時代,零門檻使用小程序工具,提升招生量、提升服務能力、降低運營成本,是為駕校提供人、財、物及業務辦理的綜合管理系統。", // 分享描述 link: location.href, // 分享鏈接 imgUrl:"https://***/jiaddwxicon.png" , // 分享圖標 });
在微信開發者工具中調試
appid和secret一定要正確
域名一定是備案的
綁定域名需要的放在服務器上的txt位置一定要正確
參考微信公眾號開發文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99214.html
摘要:消息推送也是微信公眾號開發更為有趣的功能,涉及到文本消息圖片消息語音消息視頻消息音樂消息以及圖文消息。在文件中創建文件用于消息的管理。 一、寫在前面的話 ??當用戶發送消息給公眾號時(或某些特定的用戶操作引發的事件推送時),會產生一個POST請求,開發者可以在響應包(Get)中返回特定XML結構,來對該消息進行響應。 ??消息推送也是微信公眾號開發更為有趣的功能,涉及到文本消息、圖片消...
摘要:打開中文網文檔打開微信開發者文檔三接入微信公眾平臺創建項目首先我們在電腦的任意磁盤上創建文件夾,命名隨意,我這命名為隨后在文件夾中創建兩個文件一個是,另一個為。接入驗證再次進入微信公眾平臺在左側菜單點擊基本配置,如圖點擊修改配置。 一、寫在前面的話 ??Node.js是一個開放源代碼、跨平臺的JavaScript語言運行環境,采用Google開發的V8運行代碼,使用事件驅動、非阻塞和異...
摘要:一寫在前面的話上一篇文章中,我們使用成功的實現了的獲取存儲以及更新,這篇文章我們來實現微信的自定義菜單功能。二自定義微信菜單微信文檔步驟在開始碼代碼之前,我們依然是先理清實現的思路,再開始編寫實現代碼。 一、寫在前面的話 ??上一篇文章中,我們使用 Node.js 成功的實現了access_token 的獲取、存儲以及更新,這篇文章我們來實現微信的自定義菜單功能。showImg(htt...
摘要:主要用于封裝開發微信公眾平臺的所有方法。剩下的就是去微信公眾平臺接入驗證了,在上一篇文章中有詳細的教程,這里我就不再演示了三的獲取存儲及更新微信文檔步驟在開始碼代碼之前,我們依然是先理清實現的思路,在開始編寫實現代碼。 一、寫在前面的話 ??上一篇文章中,我們使用 Node.js 成功的實現了接入微信公眾平臺功能。在這篇文章中,我們將實現微信公眾平臺一個非常重要的參數 access_t...
摘要:本篇主要講述,如何在微信中打開自家的頁面,在然后在用戶分享的時候,能由我們自定義分享出去后,展示的頁面卡片中的頁面標題頁面描述頁面圖片和分享鏈接。 本篇主要講述,如何在微信中打開自家的頁面,在然后在用戶分享的時候,能由我們自定義分享出去后,展示的頁面卡片中的頁面標題、頁面描述、頁面圖片和分享鏈接。 此功能,具體的來說,是: 在微信打開自家的頁面 點擊右上角微信的功能按鈕,出現功能菜單...
閱讀 2536·2023-04-25 19:47
閱讀 3383·2019-08-29 17:18
閱讀 855·2019-08-29 15:26
閱讀 3360·2019-08-29 14:17
閱讀 1114·2019-08-26 13:49
閱讀 3338·2019-08-26 13:22
閱讀 3022·2019-08-26 10:44
閱讀 2692·2019-08-23 16:51