先有個公眾號耘婚,這樣就有appID和appSecret(在開發(fā)/基本配置分類下)
引入JS文件http://res.wx.qq.com/open/js/jweixin-1.2.0.js茅茂,去使用微信JS-SDK
拿access_token径玖,配置IP白名單才能調(diào)此接口,根據(jù)appID和appSecret進(jìn)行請求 (有效期7200秒压彭,每次使用前檢查,過期重新獲取)
拿jsapi_ticket狸捅,根據(jù)上一步的access_token進(jìn)行請求 (有效期7200秒,每次使用前檢查累提,過期重新獲瘸竞取)
計算signature,根據(jù)上一步的jsapi_ticket
1)排序斋陪,參與簽名的字段:noncestr(隨機字符串)朽褪,有效的jsapi_ticket置吓,timestamp(時間戳),url(不帶#后面部分部分)缔赠,字典序從小到大排序衍锚, 2)拼接,使用URL鍵值對的格式拼接字符串string1嗤堰,參數(shù)名必須均為小寫字符 3)加密戴质,對string1作sha1加密,字段名和字段值都采用原始值踢匣,不進(jìn)行URL 轉(zhuǎn)義 注意:計算簽名必須在服務(wù)端完成簽名告匠,返回前端。
添加JS接口安全域名(在公眾號后臺的設(shè)置/公眾號設(shè)置/功能設(shè)置中添加)离唬,這里需要實現(xiàn)MP_verify_AwmmQFM5B0vHg035.txt文件檢查功能
部署測試后专,注意事項:80端口,域名已備案
https://mp.weixin.qq.com/wiki?action=doc&id=mp1421141115&t=0.3895532325111326#67
http://www.reibang.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)
微信小程序接入客服自動回復(fù)
1.設(shè)置服務(wù)器url建瘫,token,數(shù)據(jù)格式j(luò)son(本地開發(fā)-需要內(nèi)網(wǎng)穿透 https://www.ngrok.cc/)
2.小程序設(shè)置開啟消息推送
3.接入步驟
a.服務(wù)器域名驗證
這里是設(shè)置完第一步后微信會發(fā)送一個帶簽名的get請求
服務(wù)端需要將token (自己設(shè)置的) 尸折、timestamp(時間戳啰脚,微信傳參)、nonce(隨機數(shù)微信傳參)三個參數(shù)進(jìn)行字典排序
var key=[token, params.timestamp, params.nonce].sort().join('');
var sha1 = crypto.createHash('sha1');
var str = sha1(key); 拿這個str與get請求傳參簽名對比实夹,相同的話吧get請求帶過來的echostr返回(注意這里直接返回一個字符串橄浓,不要json包裝,坑)
b.自動消息推送
點擊客服按鈕會產(chǎn)生一個事件亮航,小程序服務(wù)器將發(fā)送一個post請求到我們自己設(shè)置的服務(wù)器url荸实,其中FromUserName是用戶id
這里分兩步,一是取得token缴淋,根據(jù)appid和appSecret【https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appSecret}】這個token過期時間7200秒准给,需要在服務(wù)端做緩存。第二步是根據(jù)取回的token通過鏈接https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='+access_token向用戶發(fā)送回復(fù)消息重抖。這里需要注意post過去的數(shù)據(jù)不再需要json包裝(坑)
formData={
"touser":req.body.FromUserName,
"msgtype":'text',
"text":{
"content":'nihao dsfds'
}
};
實現(xiàn)代碼 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請求 回復(fù)消息
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請求 服務(wù)器url驗證
function checkSignature(params){
console.log(123);
var token = "123456";
//token 就是自己填寫的令牌
var key=[token, params.timestamp, params.nonce].sort().join('');
//將token (自己設(shè)置的) 露氮、timestamp(時間戳)、nonce(隨機數(shù))三個參數(shù)進(jìn)行字典排序
// var sha1 = crypto.createHash('sha1');
var str = sha1(key);
//將加密后的字符串與signature進(jìn)行對比钟沛,若成功畔规,返回echostr
if(str === params.signature){
res.send(params.echostr)
}
}
})
常見錯誤
不合法的OpenID?
{ errcode: 40003,
errmsg: 'invalid openid hint: [8V._JA0212ge32]' }
這里遇到的問題是注意自動回復(fù)消息時post過去的數(shù)據(jù)是一個對象而不是一個json
返回碼說明
-1 系統(tǒng)繁忙,此時請開發(fā)者稍候再試
0 請求成功
40001 獲取 access_token 時 AppSecret 錯誤恨统,或者 access_token 無效叁扫。請開發(fā)者認(rèn)真比對 AppSecret 的正確性三妈,或查看是否正在為恰當(dāng)?shù)墓娞栒{(diào)用接口
40002 不合法的憑證類型
40003 不合法的 OpenID ,請開發(fā)者確認(rèn) OpenID (該用戶)是否已關(guān)注公眾號陌兑,或是否是其他公眾號的 OpenID
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433747234
微信小程序訪問nodejs接口服務(wù)器搭建
小程序的后臺數(shù)據(jù)接口需要https安全請求沈跨,https服務(wù)器的搭建
http://www.reibang.com/p/6ba8e1a6e1e5
模版消息功能概述突破微信小程序模板消息的推送限制https://mp.weixin.qq.com/s?__biz=MzA5MTAyNTA4NQ==&mid=2650421717&idx=1&sn=696a9cdb9247b4529b072428b04475bd&chksm=880c2207bf7bab11e1ee8cc93d1d38299ff46cb54cb5f31121f9c5523793e90a7305296c2fb8&scene=21#wechat_redirect
基于微信的通知渠道,為開發(fā)者提供了可以高效觸達(dá)用戶的模板消息能力兔综,以便實現(xiàn)服務(wù)的閉環(huán)并提供更佳的體驗饿凛。
- 模板推送位置:服務(wù)通知
- 模板下發(fā)條件:用戶本人在微信體系內(nèi)與頁面有交互行為后觸
1、 支付:當(dāng)用戶在小程序內(nèi)完成過支付行為软驰,可允許開發(fā)者向用戶在7天內(nèi)推送有限條數(shù)的模板消息(1次支付可下發(fā)1條涧窒,多次支付下發(fā)條數(shù)獨立,互相不影響) 2锭亏、提交表單:當(dāng)用戶在小程序內(nèi)發(fā)生過提交表單行為且該表單聲明為要發(fā)模板消息的纠吴,開發(fā)者需要向用戶提供服務(wù)時,可允許開發(fā)者向用戶在7天內(nèi)推送有限條數(shù)的模板消息(1次提交表單可下發(fā)1條慧瘤,多次提交下發(fā)條數(shù)獨立戴已,相互不影響)
http://www.reibang.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