摘要:廢話不多說來說說用做服務端調用微信遇到的坑。微信都有說明不做贅述。因為以后微信返回的值才會改變,并且微信規定每天限定的訪問次數如果使用庫的話優勢可以減少對微信服務器訪問的次數提升性能。
這幾天要做一個H5的頁面,之前沒做。對我來說也是一次對新領域的接觸。廢話不多說來說說用node做服務端調用微信JS SDK遇到的坑。
首先講一下思路:
微信JS-SDK說明文檔
綁定域名
引入JS文件
通過config接口注入權限驗證配置
wx.config({ debug: true, appId: "", // 必填,公眾號的唯一標識 timestamp: , // 必填,生成簽名的時間戳 nonceStr: "", // 必填,生成簽名的隨機串 signature: "",// 必填,簽名,見附錄1 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2 });
之后就是通過ready接口處理成功驗證、通過error接口處理失敗驗證。微信JS-SDK都有說明不做贅述。
Node調用微信JS-SDK實踐需要安裝一下模塊供我們使用:
npm install sha1
這個哈希1模塊是處理對字符的哈希加密,生成signature
npm install redis
這個大家都懂,用來做對access_token、jsapi_ticket的存儲并且設定存在時間7200s。(因為7200s以后微信返回的值才會改變,并且微信規定每天限定2000的訪問次數);
如果使用co庫的話
npm install co
優勢
可以減少對微信sdk服務器訪問的次數,提升性能。同時對訪問的次數限制做了最大的優化處理。
首先建一個wechatConfig.js用來存放appid,appsecret
module.exports = { appid : "",//公眾號的appId,可以在公眾平臺上找到,-。-自己找。 appsecret : ""http://公眾號的appsecret };
建立getWebToken.js 用來返回access_token,因為這個是異步返回一個promise
"use strict"; const request = require("request"); const qs = require("querystring"); const config = require("./../wechatConfig"); function getToken() { let reqUrl = "https://api.weixin.qq.com/cgi-bin/token?"; let params = { grant_type: "client_credential", appid: config.appid, secret: config.appsecret }; let options = { method: "get", url: reqUrl+qs.stringify(params) }; console.log(options.url); return new Promise((resolve, reject) => { request(options, function (err, res, body) { if (res) { console.log(body) resolve(body); } else { reject(err); } }) }) } module.exports = getToken;
param的順序一定不能錯!!!這個很重要不然會證書會認證失敗!這個坑我整了1天才爬出來。
建立一個getJsApiData.js 文件用來做為主要的controller返回結果返回給client
/** * Created by caozheng on 2016/11/24. */ "use strict"; const fs = require("fs"); const request = require("request"); const getToken = require("./getWebToken"); const sha1 = require("sha1"); function getJsApiTicket() { return new Promise((resolve, reject) => { getToken().then(function (body) { body = JSON.parse(body); var token = body.access_token; var reqUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi"; let options = { method: "get", url: reqUrl }; request(options, function (err, res, body) { if (res) { resolve(body); } else { reject(err); } }) }).catch(function (err) { throw (err) }); }) } //noncestr function getNonceStr () { var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for(var i = 0; i < 16; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); } return text; } //timestamp function getTimestamp() { var time = String(new Date().valueOf()); return time.substr(0, time.length-3); } function getSign(jsApiTicket, noncestr, timestamp, url) { console.log("******************"); console.log(jsApiTicket); var sortData = "jsapi_ticket=" + jsApiTicket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; return sha1(sortData); } //返回數據分別為sign, timestamp, noncestr function getJsApiData(clientUrl) { let noncestr = getNonceStr(); let timestamp = getTimestamp(); return getJsApiTicket().then(data => { return [getSign(JSON.parse(data).ticket, noncestr, timestamp, clientUrl), timestamp, noncestr]; }) } module.exports = getJsApiData;
在路由處添加入口
/*微信返回sdk參數*/ router.post("/wechat",function (req, res) { var clientUrl = req.body.url; getJsApiData(clientUrl).then(data => { res.send({signature: data[0], timestamp: data[1], nonceStr: data[2]}); }); });
注意:這里從client傳過來的url一定是動態獲取的location.href.split("#")[0],并且不能帶有#號,因為分享一篇文章之后微信會在鏈接后加參數。
使用redis緩存access_token、jsapi_ticket
建立一個redis.js文件,因為這里只需要存儲功能。
/** * Created by caozheng on 2016/11/24. */ var db = {}; var redis = require("redis"); var options = { host : "", // 這里不需要解釋吧 port : "6379", // 這里也不需要 password : "", // 這個論英文的重要性 db : 2 //db存儲的位置 }; var client = redis.createClient(options); client.on("ready",function(err){ console.log("ready"); }); client.on("error", function (err) { console.log("Error :" , err); }); client.on("connect", function(){ console.log("Redis連接成功."); }); /** * 添加string類型的數據 * @param key 鍵 * @params value 值 * @params expire (過期時間,單位秒;可為空,為空表示不過期) * @param callBack(err,result) */ db.set = function(key, value, expire, callback){ client.set(key, value, function(err, result){ console.log(key); console.log(value); if (err) { console.log(err); callback(err,null); return; } if (!isNaN(expire) && expire > 0) { client.expire(key, parseInt(expire)); } callback(null,result) }) }; /** * 查詢string類型的數據 * @param key 鍵 * @param callBack(err,result) */ db.get = function(key, callback){ client.get(key, function(err,result){ if (err) { console.log(err); callback(err,null); return; } callback(null,result); }); }; module.exports = db;
總結:這里也可以寫成異步! express可以使用co庫,KOA的話那就不用看我寫的了...
在getJsApiData.js中的getJsApiTicket函數中添加redis存儲,讀取。同時需要引入redis.js
const db = require("./../../db/radis"); var res = { access_token :"", ticket : "" } // 這里為了和公共接口同步把數 co(function* (){ // 引用co庫 var result = yield { access_token : db.get("access_token"), ticket : db.get("ticket") } // 判斷redis中是否存在access_token、ticket if(result.access_token && result.ticket){ return result // 返回存儲中的ticket的值 }else{ // 這里是之前代碼 -> getJsApiTicket 中返回promise的方法 } })
總結 : 這只是個示例代碼的具體實現還是看場景。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81047.html
摘要:微信選擇圖片遇到的坑有個需求要在微信企業號里面做開發,有個功能是選擇圖片,使用標簽肯定是不管用了,手機上不能多選,所以使用了微信的提供的相關,這個地方真的是有坑,記錄一下。 微信JS-SDK選擇圖片遇到的坑 有個需求要在微信企業號里面做開發,有個功能是選擇圖片,使用input標簽肯定是不管用了,Android手機上不能多選,所以使用了微信的JS-SDK提供的相關API,這個地方真的是有...
摘要:微信說明文檔分享的坑根據的文檔,很多人都是在初始化的配置的時候,傳入的當前的地址不正確。同樣的,給微信初始化的加入對應的參數。 date: 2018-12-13 15:23:09 用于記錄接入微信JS-SDK的坑,以后方便查詢第一次接入公眾號微信支付、分享、定位等等的坑的時候,心里是迷茫而又恐懼。因為,聽說坑特別多,后來發現自己的親身體驗到了這一點。 支付的坑 1、當前URL未注冊 ...
摘要:微信說明文檔分享的坑根據的文檔,很多人都是在初始化的配置的時候,傳入的當前的地址不正確。同樣的,給微信初始化的加入對應的參數。 date: 2018-12-13 15:23:09 用于記錄接入微信JS-SDK的坑,以后方便查詢第一次接入公眾號微信支付、分享、定位等等的坑的時候,心里是迷茫而又恐懼。因為,聽說坑特別多,后來發現自己的親身體驗到了這一點。 支付的坑 1、當前URL未注冊 ...
摘要:微信說明文檔分享的坑根據的文檔,很多人都是在初始化的配置的時候,傳入的當前的地址不正確。同樣的,給微信初始化的加入對應的參數。 date: 2018-12-13 15:23:09 用于記錄接入微信JS-SDK的坑,以后方便查詢第一次接入公眾號微信支付、分享、定位等等的坑的時候,心里是迷茫而又恐懼。因為,聽說坑特別多,后來發現自己的親身體驗到了這一點。 支付的坑 1、當前URL未注冊 ...
閱讀 2804·2021-11-19 11:35
閱讀 2582·2021-11-02 14:40
閱讀 1396·2021-09-04 16:48
閱讀 3009·2019-08-30 15:55
閱讀 1753·2019-08-30 13:11
閱讀 1956·2019-08-29 11:12
閱讀 1088·2019-08-27 10:52
閱讀 3157·2019-08-26 18:36