先有个公众号,这样就有appID和appSecret(在开发/基本配置分类下)
引入JS文件http://res.wx.qq.com/open/js/jweixin-1.2.0.js,去使用微信JS-SDK
拿access_token,配置IP白名单才能调此接口,根据appID和appSecret进行请求 (有效期7200秒,每次使用前检查,过期重新获取)
拿jsapi_ticket,根据上一步的access_token进行请求 (有效期7200秒,每次使用前检查,过期重新获取)
计算signature,根据上一步的jsapi_ticket
1)排序,参与签名的字段:noncestr(随机字符串),有效的jsapi_ticket,timestamp(时间戳),url(不带#后面部分部分),字典序从小到大排序, 2)拼接,使用URL键值对的格式拼接字符串string1,参数名必须均为小写字符 3)加密,对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义 注意:计算签名必须在服务端完成签名,返回前端。
添加JS接口安全域名(在公众号后台的设置/公众号设置/功能设置中添加),这里需要实现MP_verify_AwmmQFM5B0vHg035.txt文件检查功能
部署测试,注意事项:80端口,域名已备案
https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.3895532325111326#67
https://www.jianshu.com/p/1a35e1dbe1ad
签名错误排查
https://my.oschina.net/u/2308739/blog/371414
dec 配置文本换行
\n 换行
data.company+'\n'+'Fans '
node 版本分享
http://www.cnblogs.com/wuyuchang/p/7170949.html
var timestamp = Math.floor(new Date().getTime()/1000); // 时间戳单位为秒
// 将请求以上字符串,先按字典排序,再以'&'拼接,如下:其中j > n > t > u,此处直接手动排序
var str = 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + nonce_str + '×tamp=' + timestamp + '&url=' + url
// 用sha1加密
var signature = sha1(str)
微信小程序接入客服自动回复
1.设置服务器url,token,数据格式json(本地开发-需要内网穿透 https://www.ngrok.cc/)
2.小程序设置开启消息推送
3.接入步骤
a.服务器域名验证
这里是设置完第一步后微信会发送一个带签名的get请求
服务端需要将token (自己设置的) 、timestamp(时间戳,微信传参)、nonce(随机数微信传参)三个参数进行字典排序
var key=[token, params.timestamp, params.nonce].sort().join('');
var sha1 = crypto.createHash('sha1');
var str = sha1(key); 拿这个str与get请求传参签名对比,相同的话吧get请求带过来的echostr返回(注意这里直接返回一个字符串,不要json包装,坑)
b.自动消息推送
点击客服按钮会产生一个事件,小程序服务器将发送一个post请求到我们自己设置的服务器url,其中FromUserName是用户id
这里分两步,一是取得token,根据appid和appSecret【https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appSecret}】这个token过期时间7200秒,需要在服务端做缓存。第二步是根据取回的token通过链接https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='+access_token向用户发送回复消息。这里需要注意post过去的数据不再需要json包装(坑)
formData={
"touser":req.body.FromUserName,
"msgtype":'text',
"text":{
"content":'nihao dsfds'
}
};
实现代码 nodejs
router.post('/download', function(req,res){
var token = "123456";
var url = https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='${token}'
;
var formData={
"touser":req.body.FromUserName,
"msgtype":'text',
"text":{
"content":'nihao dsfds'
}
};
var appId = 'wxe138b0ff20c78e8d';
var appSecret =
'19219bd30a3cc72ec068cc5fde21f885';
var tokenUrl =https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}
;
第一步获取token
request(tokenUrl, function(err, response, body){
if (response.statusCode === 200) {
var body = JSON.parse(body);
// 缓存token
// cache.access_token = body.access_token;
// 缓存token时间戳
sendTextMessage("1233",body.access_token);
}
})
//post请求 回复消息
function sendTextMessage(content,access_token){
console.log(1,content)
request({
url: 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='+access_token,
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: formData
}, function(err, response, body) {
if (err) {
return console.error('upload failed:', err);
}
console.log('Upload successful! Server responded with:', body);
res.send(body);
});
}
//get请求 服务器url验证
function checkSignature(params){
console.log(123);
var token = "123456";
//token 就是自己填写的令牌
var key=[token, params.timestamp, params.nonce].sort().join('');
//将token (自己设置的) 、timestamp(时间戳)、nonce(随机数)三个参数进行字典排序
// var sha1 = crypto.createHash('sha1');
var str = sha1(key);
//将加密后的字符串与signature进行对比,若成功,返回echostr
if(str === params.signature){
res.send(params.echostr)
}
}
})
常见错误
不合法的OpenID?
{ errcode: 40003,
errmsg: 'invalid openid hint: [8V._JA0212ge32]' }
这里遇到的问题是注意自动回复消息时post过去的数据是一个对象而不是一个json
返回码说明
-1 系统繁忙,此时请开发者稍候再试
0 请求成功
40001 获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口
40002 不合法的凭证类型
40003 不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433747234
微信小程序访问nodejs接口服务器搭建
小程序的后台数据接口需要https安全请求,https服务器的搭建
https://www.jianshu.com/p/6ba8e1a6e1e5
模版消息功能概述突破微信小程序模板消息的推送限制https://mp.weixin.qq.com/s?__biz=MzA5MTAyNTA4NQ==&mid=2650421717&idx=1&sn=696a9cdb9247b4529b072428b04475bd&chksm=880c2207bf7bab11e1ee8cc93d1d38299ff46cb54cb5f31121f9c5523793e90a7305296c2fb8&scene=21#wechat_redirect
基于微信的通知渠道,为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验。
- 模板推送位置:服务通知
- 模板下发条件:用户本人在微信体系内与页面有交互行为后触
1、 支付:当用户在小程序内完成过支付行为,可允许开发者向用户在7天内推送有限条数的模板消息(1次支付可下发1条,多次支付下发条数独立,互相不影响) 2、提交表单:当用户在小程序内发生过提交表单行为且该表单声明为要发模板消息的,开发者需要向用户提供服务时,可允许开发者向用户在7天内推送有限条数的模板消息(1次提交表单可下发1条,多次提交下发条数独立,相互不影响)
https://www.jianshu.com/p/92ebdd5e233f
https://www.cnblogs.com/xuzhengzong/p/7245285.html
http://www.weikeba.cn/article-1635-1.html
https://www.w3cschool.cn/weixinapp/weixinapp-api-custommsg-receive.html