顺晟科技
2021-06-16 10:55:48
315
a一、准备工作
1.在微信公众平台申请测试账号,并设置好好射流研究…接口安全域名
2.验证服务器信息
1531734590_1_ 微信截图_20180716122946
router.use('/wx ',(req,res)={
让{ signature,timestamp,nonce,echostr }=url.parse(req.url,true).查询;
//将令牌、时间戳、随机数按字典排序,排序后链接成一个字符串
让str=[TOKEN,timestamp,nonce].排序()。join(');
//使用sha1模块进行sha1加密
让jsSHA=require(' jsSHA ');
让ShabJ=new jsSHA(str,' TEXT ');
让sha1 str=ShabJ。Gethash(' SHA-1 ',' HEX ');
if (sha1Str===签名){
//将数据返回给微信服务器
res.send(echostr)
}
else {
res.send('错误)
}
})
二、微信的签名算法
使用微信软件开发工具包必须自己实现微信的签名算法,大概需要四个步骤:
1.获取access _ token
函数getAccessToken() {
退货请求(` https://API。微信。QQ。com/CGI-bin/token?grant _ type=client _ credential APPID=$ { APPID } secret=$ { APPSECRET } `)。然后(功能(身体){
accessToken=JSON.parse(body).access _ token
})
2.根据access_token获取jsapi_ticket
函数getAccessToken() {
退货请求(` https://API。微信。QQ。com/CGI-bin/token?grant _ type=client _ credential APPID=$ { APPID } secret=$ { APPSECRET } `)。然后(功能(身体){
accessToken=JSON.parse(body).access _ token
退货请求(` https://API。微信。QQ。com/CGI-bin/ticket/getticket?access _ token=$ { AccessToken } type=jsapi `);
})。然后(功能(身体){
jsapiTicket=JSON.parse(body).车票;
});
}
3.根据appId(公众号id)、非estr(随机字符串)、时间戳(时间戳)、url(当前页面完整url,不包括#aaa=bbb)通过sha1算法签名
让createnonestr=function(){
返回Math.random().toString(36).substr(2,15);
};
让createTimestamp=function () {
返回参数(新日期()。GetTime()/1000)' ';
};
//对所有待签名参数按照字段名的美国信息交换标准代码码从小到大排序(字典序)后,使用统一资源定位器键值对的格式(即key1=value1 key2=value2…)拼接成字符串线
让raw=function (args) {
let key=object。key(args);
keys=keys.sort()
让字符串=
keys.forEach(k={
string=' k '=' args[k];
})
string=string。substr(1);
返回字符串;
};
//生成签名
const sign=function(jsapi _ ticket,url) {
让ret={
jsapi_ticket: jsapi_ticket,
非波峰:创建非波峰(),
timestamp: createTimestamp(),
url: url
};
const string=raw(ret);
const JSShA=require(' JSShA ');
const shaObj=new jsSHA(字符串,' TExT ');
ret。signature=ShaoBj。Gethash(' SHA-1 ',' HEX ');
浸水使柔软返回;
};
4.将信息返回给前端,设置wx.config。
由于获取access_token和jsapi_ticket的接口都有访问限制,所以明确指出需要第三方做缓存处理。
//增加定时任务,刷新访问令牌和jsapiTicket
setInterval(function () {
getAccessToken();
}, 7200000);
三、消息管理当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个邮政请求,开发者可以在响应包(获取)中返回特定可扩展置标语言结构,来对该消息进行响应。 消息推送也是微信公众号开发更为有趣的功能,涉及到文本消息、图片消息、语音消息、视频消息、音乐消息以及图文消息。 1.捕获消息信息微信消息产生的请求方式为开机自检,然后监听这个接口,得到的数据是可扩展标记语言的数据,解析XML,这里使用了第三方的包xml2js(npm安装xml2js):
让xml='' //存储将要回复给公众号的文字
//接收邮政内容
req.on('data ',chunk={
xml=chunk
})
//接收结束
req.on('end ',()={
//将接受到的可扩展标记语言数据转化为数据
if (xml) {
xml2js.parseString(xml,{ explicitArray: false },function (err,json) {
让backTime=parseInt(新日期()。valueOf()/1000) //创建发送时间,整数
console.log(json)
})
}
})
2.根据得到的消息类型(MsgType),可以进行不同的回复
//事件表示事件,
if (json.xml.MsgType=='event') {
//EventKey是在自定义菜单的时候定义的事件名称
if(JSON。XML。EventKey==' ClickEvent '){
res.send(msg.getTextXml(json,backTime ')你戳我干啥.'))
}
//文本表示文字信息
} else if(JSON。XML。MSgtype==' text '){
//回复公众号的文字信息
if (json.xml.Content==1) {
var contentArr=[{
Title: 'Node.js微信自定义菜单,
描述: '使用Node.js实现自定义微信菜单,
http://www . fpfh 5 . site/images/recording/record . png ' :号,
Url: 'http://www.baidu.com '
}]
res.send(msg.graphicMsg(json,backTime,contentArr))
} else {
res.send(msg.getTextXml(json,backTime,`你发${json.xml.Content} '过来干啥?`))
}
} else if(JSON。XML。MSgtype==' image '){
//回复公众号的图片信息
res.send(msg.getImageXml(json,backTime))
} else if(JSON。XML。MSgtype==' voice '){
//回复公众号的语音信息
res.send(msg.getVoiceXml(json,backTime))
}
其中接收方帐号是接受者的openid,FromUserName是发送者的openid,CreateTime就是一个整型的时间戳MsgType。就是消息类型,一般有文本(正文),图片(图片),语音(声音),视频(视频),小视频(短视频),地理位置(位置)以及链接消息(链接).
3.消息模板,消息接口收到消息时,与回复消息时,ToUserName和发件人用户名的位置互换。
//回复图文消息
出口。GraphicmsG=函数(JSON,backTime,contentArr) {
让content=ContentArr。地图(项目=`项目
标题![CDATA[${item .标题}]]/标题
描述![CDATA[${item .描述}]/描述
PicUrl![CDATA[${item .PicUrl}]]/PicUrl
Url![CDATA[${item .Url}]]/Url
/item `)
content=content.join(')
让backXML=`xml
ToUserName![CData[$ { JSON。XML。FromUserName }]/Tousername
来自用户名![CData[$ { JSON。XML。用户名中的touser name }]/a
创建时间$ { back time }/创建时间
MsgType![CData[新闻]]/MsgType
文章计数$ { content arr。长度}/文章数量
文章$ { content }/文章
/XML ` s
返回backXML
}
//回复文本消息
出口。GetTextXMl=function(JSON,backTime,word) {
让backXML=`xml
ToUserName![CData[$ { JSON。XML。FromUserName }]/Tousername
来自用户名![CData[$ { JSON。XML。用户名中的touser name }]/a
创建时间$ { back time }/创建时间
MsgType![CData[文本]]/MsgType
内容![CData[$ { word }]/内容
/XML ` s
返回backXML
};
//回复图片消息
出口。GetImageXML=函数(JSON,backTime) {
让backXML=`xml
ToUserName![CData[$ { JSON。XML。FromUserName }]/Tousername
来自用户名![CData[$ { JSON。XML。用户名中的touser name }]/a
创建时间$ { back time }/创建时间
MsgType![CData[图像]]/MsgType
ImageMediaId![CData[$ { JSON。XML。MediaID }]/MediaID/Image
/XML ` s
返回backXML
};
///回复语音消息
出口。GetVoiceXMl=函数(JSON,backTime) {
让backXML=`xml
ToUserName![CData[$ { JSON。XML。FromUserName }]/Tousername
来自用户名![CData[$ { JSON。XML。用户名中的touser name }]/a
创建时间$ { back time }/创建时间
MsgType![CData[语音]]/MsgType
VoiceMediaId![CData[$ { JSON。XML。MediaID }]/MediaID/语音
/XML ` s
返回backXML
};
4.客服回复消息
请求({
方法: '开机自检,
乌里: `https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken} `,
json: true,
body:{
touser ' : JSON。XML。从用户名,
msgtype': '文本,
文本' : {
内容' : '你好世界'
}
}
})
17
2022-03
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06