当前位置: 首页 > 后端技术 > Node.js

还记得一个个人开发者是如何让H5喜帖在微信中“正经”流传的吗!

时间:2023-04-03 15:27:43 Node.js

鎴戠殑鍘熷湴鍧€鍏紬鍙佛煋栤殸锔忎竴涓緢閲嶈鐨勫墠鎻愨殸锔忊潡锔忎釜浜哄紑鍙戣€呬娇鐢╳x-jssdk鏉冮檺鏈夐檺鉂楋笍锛堟棤鏉冮檺杞彂鏈嬪弸鍦堬紝鍒嗕韩鏈嬪弸鍦堢瓑锛夛紝鍙互鍒扳€滆缃€濆拰寮€鍙戔€?鎺ュ彛鏉冮檺鈥濇煡鐪嬫潈闄愯鎯呫€傪煠封€嶁檪锔忔枃鏈氨鏄垜璇寸殑鈥滃儚鏍风殑鈥濃潡锔忓叕浼楀彿鎼缓鏈嶅姟鍣ㄤ唬鐮侊紙鍩轰簬Koa2寮€鍙戯紝鐪佺暐鎼缓鏈嶅姟鍣ㄤ唬鐮侊紝鍙彁渚涘叧閿楠や唬鐮侊級1.缂栧啓闇€瑕佷粈涔堛€婃湇鍔″櫒閰嶇疆-鏈嶅姟鍣ㄥ湴鍧€锛圲RL锛夈€嬫帴鍙e湴鍧€https://yourserver.com/api/ch...letsha1=require("sha1");/***寰俊鍏紬鍙?鎸囧畾鏈嶅姟鍣ㄥ湴鍧€-楠岃瘉鎺ュ彛*@param{*}ctx*/checkToken:async(ctx)=>{const{signature,timestamp,nonce,echostr}=ctx.query;//ctx.query鑾峰彇璇锋眰鎼哄甫鐨勫弬鏁發et{token}=wxconfig;//璁剧疆Token锛宼imestamp锛宯once鏍规嵁瀛楀吀鎺掑簭锛屾帓搴忓悗閾炬帴鎴愬瓧绗︿覆letstr=[token,timestamp,nonce].sort().join("");//浣跨敤sha1妯″潡杩涜sha1鍔犲瘑letsha1Str=sha1(str);//鍒ゆ柇鍔犲瘑鍚庣殑瀛楃涓叉槸鍚︾瓑浜庤姹備腑鐨勭鍚峣f(sha1Str===signature){ctx.body=echostr;}else{ctx.body="浠ょ墝妫€鏌ュけ璐ャ€?;}};杩欎竴姝K涔嬪悗锛屸€滃井淇″叕浼楀彿鍚庡彴灏卞彲浠ユ垚鍔熸墦寮€鏈嶅姟鍣ㄤ簡銆傗€濇帴涓嬫潵灏辨槸缂栧啓H5鍦ㄥ井淇′腑璋冪敤wx-jssdk鐩稿叧鍔熻兘鎵€闇€鐨勬巿鏉冩祦绋嬨€傚叾瀹炰富瑕佹槸鑾峰彇wxconfig闇€瑕佺殑涓€浜涘繀瑕佸弬鏁般€傚啓鍏x.config鎵€闇€鏁版嵁鐨勬帴鍙ttps://yourserver.com/api/wx...闇€瑕佹巿鏉冪殑缃戠珯url鐢熸垚wxconfig鏁版嵁鐨勪竴鑸繃绋嬶細鑾峰彇access_token锛岄€氳繃access_token鑾峰彇jsapi_ticket;鐒跺悗鎷兼帴access_token銆乯sapi_ticket銆乶oncestr銆乼imestamp銆侀渶瑕佹巿鏉冮〉闈㈢殑url鐢熸垚signature绛惧悕锛屾渶鍚庡皢appId銆乼imestamp銆乶onceStr銆乻ignature杩斿洖缁欏墠绔紝鍓嶇璋冪敤wx.config娉ㄥ唽銆傛垚鍔熷悗灏卞彲浠ヨ皟鐢╳x.ready涓殑鐩稿叧js鎺ュ彛浜嗐€倃xConfig.js鏂囦欢浠g爜锛侊紒锛佽繖閲岄儴鍒嗕唬鐮佹槸鍊熺敤鐨勶紝鎳掑緱鏀瑰ぇ浣撴祦绋嬩簡锛乧onstsha1=require("sha1");constrequest=require("璇锋眰");const{wxconfig}=require("./wxConfig");//涓轰簡搴斿缂撳瓨鍘嬪姏锛屼笉瑕佹瘡娆¢兘鍒锋柊token锛岄珮娴侀噺浼氬嚭澶ч棶棰?/鍥犱负access_token鎺ュ彛鏈€澶氬彲浠ヨ皟鐢?000娆′竴澶╁嚑娆★紝姣忔鏈夋晥鏈熶袱涓皬鏃秎etCACHE={ticket:"",ticketTimeout:0,//绁ㄨ繃鏈熸椂闂磘icketTime:0,//鑾峰彇绁ㄦ椂闂碼ccessToken:"",accessTokenTimeout:0,//token杩囨湡鏃堕棿accessTokenTime:0,//gettokentime};classwxModel{/***鍒锋柊access_token*/staticasyncrefreshAccessToken(){returnnewPromise((resolve,reject)=>{consttokenUrl=`${wxconfig.getAccessTokenUrl}?grant_type=client_credential&appid=${wxconfig.appId}&secret=${wxconfig.appSecret}`;request(tokenUrl,(error,response,body)=>{if(typeofbody==="string"){try{body=JSON.parse(body);}catch(e){body={errcode:"-1000",body,};}}if(body&&(!body.errcode||body.errcode==0)){CACHE.accessToken=body.access_token;CACHE.accessTokenTimeout=body.expires_in*500;CACHE.accessTokenTime=newDate();resolve(CACHE.accessToken);}elseif(body){reject(body.errmsg);}else{reject("鏈煡寮傚父");}});});}/***鍒锋柊绁?@param{*}access_token*@param{*}callback*/staticasyncrefreshJsapiTicket(access_token){//Jsapi_ticketreturnnewPromise((resolve,reject)=>{letticketUrl=`${wxconfig.getJsapiTicketUrl}?access_token=${access_token}&type=jsapi`;request(ticketUrl,function(err,response,content){content=JSON.parse(content);if(content&&(content.errcode==0||!content.errcode)){CACHE.ticket=content.ticket;CACHE.ticketTimeout=content.expires_in*500;CACHE.accessTokenTime=newDate();瑙e喅锛圕ACHE.ticket锛夛紱//ticket}elseif(content){reject(content.errmsg);}else{reject("鏈煡寮傚父");}});});}/***鑾峰彇wxconfig*@param{*}url*@returns*/staticasyncgeneWxConfig(url){//鑾峰彇access_tokenletaccess_token=CACHE.accessToken;letticket=CACHE.ticket;濡傛灉(!access_token||newDate()-CACHE.accessTokenTime>CACHE.accessTokenTimeout){access_token=awaitthis.refreshAccessToken();ticket=awaitthis.refreshJsapiTicket(access_token);}璁﹏onceStr=this.createNonceStr();璁╂椂闂存埑=this.createTimestamp();letsignature=this.createSign({jsapi_ticket:ticket,nonceStr,timestamp,url,});杩斿洖{appId:wxconfig.appId,access_token,ticket,鏃堕棿鎴炽€乶onceStr銆佺鍚嶃€亇锛泒/***闅忔満瀛楃涓?/staticcreateNonceStr(){returnMath.random().toString(36).substr(2,15);}/***鏃堕棿鎴?/staticcreateTimestamp(){returnparseInt(newDate().getTime()/1000).toString();}/***鐢熸垚绛惧悕*鈿狅笍鍙姞瀵唘rl鍓嶉潰閮ㄥ垎#*鈿狅笍鍏ㄩ儴灏忓啓noncestr*@param{*}config*/staticcreateSign(config){letret={jsapi_ticket:config.jsapi_ticket,nonceStr:config.nonceStr,鏃堕棿鎴?config.timestamp,url:config.url,};璁﹗rl=ret.url.split("#")[0];letstring=`jsapi_ticket=${ret.jsapi_ticket}&noncestr=${ret.nonceStr}×tamp=${ret.timestamp}&url=${url}`;璁﹕haObjs=sha1(瀛楃涓?;杩斿洖shaObjs锛泒}module.exports=wxModel;wxConfig.js鏂囦欢鍐呭constwxconfig={appId:"wx9xxxxxxx",appSecret:"xxxxxxxxxxxxxxxxxxxxxxxx",token:"hxxxt",//鍏紬鍙峰悗鍙拌嚜閰嶇疆tokengetAccessTokenUrl:"https://api.weixin.qq.com/cgi-bin/token",getJsapiTicketUrl:"https://api.weixin.qq.com/cgi-bin/ticket/getticket",};module.exports={wxconfig,};鍓嶇浠g爜1.寮曞叆wx-jssdkletjssdkUri=`${window.location.protocol}//res.wx.qq.com/open/js/jweixin-1.6.0.js`;loadJs(){returnnewPromise((resolve,reject)=>{if(window.wx){returnresolve(window.wx);}letscript=document.createElement("script");script.type="text/javascript";script.src=this.jssdkUri;window.document.getElementsByTagName("head")[0].appendChild(script);script.onload=()=>{resolve(window.wx);};script.onerror=reject;});}2.璇锋眰/api/wxconfig鎺ュ彛锛岃皟鐢╳x.configleturl=window.location.href;letdata=awaitthis.getWxconfig(url);wx.config({debug:false,//寮€鍚痙ebug妯″紡锛屾墍鏈堿PI璋冪敤鐨勮繑鍥炲€奸兘浼氭樉绀哄湪瀹㈡埛绔痑lert涓婏紝濡傛灉鎯虫煡鐪嬩紶鍏ョ殑鍙傛暟锛屽彲浠ュ湪PC绔墦寮€锛屽弬鏁颁俊鎭細閫氳繃log鎵撳嵃鍑烘潵锛屽苟涓斿彧浼氭墦鍗板湪PC绔痑ppId:data.appId,//蹇呭~锛屽叕浼楀彿鐨勫敮涓€鏍囪瘑timestamp:data.timestamp,//蹇呭~锛岀敓鎴愮鍚嶇殑鏃堕棿鎴硁onceStr:data.nonceStr,//蹇呭~锛岀敓鎴愮鍚嶇殑闅忔満瀛楃涓瞫ignature:data.signature,//蹇呭~锛岀鍚峧sApiList:["hideMenuItems","updateAppMessageShareData","updateTimelineShareData",],//蹇呭~锛岃浣跨敤鐨凧S鎺ュ彛鍒楄〃});3銆佸湪wx.ready涓啓鍏モ€滃垎浜€佽浆鍙戔€濈瓑涓氬姟闇€瑕佺殑鏂规硶share({title,desc,link,imgUrl}){this.shareData={title,desc,link,imgUrl};if(!this.isReady){console.error("wxjssdk杩樻病鏈夊噯澶囧ソ銆?);杩斿洖;}wx.ready(()=>{wx.updateAppMessageShareData({title,desc,link,imgUrl,//鍒嗕韩鍥炬爣success:(res)=>{},fail:(err)=>this.onError(err),});wx.updateTimelineShareData({title,link,imgUrl,//鍒嗕韩鍥炬爣鎴愬姛:(res)=>{},澶辫触:(err)=>this.onError(err),});});}hideMenu(){if(!this.isReady){console.error("wxjssdk杩樻病鏈夊噯澶囧ソ銆?);閫€褰圭摦;}wx.ready(()=>{wx.hideMenuItems({menuList:["menuItem:share:appMessage","menuItem:share:timeline","menuItem:share:qq","menuItem:share:weiboApp","menuItem:share:QZone","menuItem:copyUrl",],});});}濡備綍璁〩5鍦ㄥ井淇′腑鈥滃儚鏍封€濓紒鏈€鍚庢兂璇寸殑鏄紝浣滀负涓汉寮€鍙戣€咃紝鎴戜笉鑳借皟鐢╳x.updateAppMessageShareData銆亀x.updateTimelineShareData绛変竴浜涙帴鍙c€傚浣曚娇鐢ㄦ湁闄愮殑鍔熻兘璁╂垜鐨凥5缃戦〉灏藉彲鑳解€滃儚鏍封€濓紒鏃㈢劧涓嶈兘鍒嗕韩锛屽氨鎶婄偣鍑诲井淇″彸涓婅鍔熻兘鎸夐挳寮瑰嚭鐨勨€滆浆鍙戠粰鏈嬪弸鈥濆拰鈥滃垎浜埌鏈嬪弸鍦堚€濆垹鎺夛紝杩炩€滃鍒堕摼鎺モ€濆姛鑳借彍鍗曚篃鍒犳帀锛岃繖鏍峰敖閲忓噺灏戣浆鍙戯紝鍙暀涓嬭8闇插拰涓戦檵鐨剈rl閾炬帴銆傦紙璇风湅瀵规瘮鍥撅級鑷充簬濡備綍浼犳挱杩欎釜H5缃戦〉锛熺敓鎴怘5浜岀淮鐮侊紝璐村湪濂界湅鐨勫浘鐗囦笂锛岃浆鍙戠粰浣犵殑鏈嬪弸鍚у搱鍝堝搱锛侌煒曢『渚块檮涓婁竴涓濂囩殑鍏嶈垂鍦ㄧ嚎浜岀淮鐮佺敓鎴愮綉绔?/p>