接下来我将详细讲解微信小程序配置服务器提示验证token失败的解决方法,并提供两个示例说明。
- 环境搭建
首先需要在自己的服务器上搭建一个可以运行代码的环境。这个环境需要支持HTTPS协议,并且需要设置相应的nginx或其他反向代理服务器。
- 配置服务器
在进行小程序服务器配置时,首先需要在公众平台申请一个小程序开发账号,并填写服务器地址和验证token。在服务器端需要搭建相应的服务器程序,接收微信服务器推送过来的消息,处理后再返回给微信服务器。
其中,验证token是服务器对微信平台请求的验证方式。在微信公众号后台配置服务器的时候,在填写服务器配置URL的同时,需要设置检验Token。这个Token相当于是开发者和公众号之间的秘钥,开发者通过 token 来验证消息的合法性,需要在服务器上写代码来进行验证。具体代码实现可以参考以下示例:
# -*- coding: utf-8 -*-
import hashlib
def check_signature(signature, timestamp, nonce, token):
"""
验证请求是否合法
"""
tmp_lst = [token, timestamp, nonce]
tmp_lst.sort()
tmp_str = ''.join(tmp_lst)
tmp_str = hashlib.sha1(tmp_str.encode('utf8')).hexdigest()
if tmp_str == signature:
return True
else:
return False
- 验证过程
在进行服务器配置的过程中,微信平台会向填写的服务器配置URL地址发起一个HTTP GET请求,携带4个参数:signature、timestamp、nonce和echostr。服务验证通过后,应当直接把echostr返回给微信平台。
下面是一个demo,可以用来作为服务器签名验证的参考:
from flask import Flask, request
import hashlib
app = Flask(__name__)
@app.route('/wechat', methods=['GET', 'POST'])
def wechat():
if request.method == 'GET':
args = request.args
signature = args.get('signature', '')
timestamp = args.get('timestamp', '')
nonce = args.get('nonce', '')
token = 'token' # 这里填写你在微信开发者后台设置的Token
echostr = args.get('echostr', '')
if check_signature(signature, timestamp, nonce, token):
return echostr
else:
return 'Invalid signature'
else:
pass
- 示例说明
示例1:Python Flask框架实现微信小程序服务器
下面这个示例是通过使用Python Flask框架来实现微信小程序服务器的一个简单实现。在运行这个示例之前,需要进行相应的安装,同时,修改相应的参数,比如:token、appid、secret等等。
from flask import Flask, request
import hashlib
import requests
import json
app = Flask(__name__)
@app.route('/wechat', methods=['GET', 'POST'])
def wechat():
if request.method == 'GET':
args = request.args
signature = args.get('signature', '')
timestamp = args.get('timestamp', '')
nonce = args.get('nonce', '')
token = 'token' # 这里填写你在微信开发者后台设置的Token
echostr = args.get('echostr', '')
if check_signature(signature, timestamp, nonce, token):
return echostr
else:
return 'Invalid signature'
else:
data = request.data
data = json.loads(data)
if 'MsgType' in data:
if data['MsgType'] == 'text':
if 'Content' in data:
text = data['Content']
sender = data['FromUserName']
# 返回相应的消息给用户
response = {
"touser":sender,
"msgtype":"text",
"text":
{
"content":text,
}
}
# 发送消息
url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s" % get_access_token(appid, secret)
resp = requests.post(url=url, data=json.dumps(response))
if resp.ok and 'errcode' in resp.json() and resp.json()['errcode'] == 0:
return 'success'
else:
return 'fail'
else:
return 'No Content'
else:
return 'Invalid MsgType'
else:
return 'No MsgType'
def get_access_token(appid, secret):
url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (appid, secret)
resp = requests.get(url)
if resp.ok and 'access_token' in resp.json():
token = resp.json()['access_token']
return token
else:
return None
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
示例2:使用Node.js实现微信小程序服务器
下面这个示例是使用Node.js实现微信小程序服务器的一个简单实现。同样,修改相应的参数,比如:token、appid、secret等等。
const express = require('express');
const crypto = require('crypto');
const request = require('request');
const app = express();
app.use(express.json());
app.get('/wechat', (req, res) => {
const token = "token"; // 公众号配置的token
const signature = req.query['signature'];
const timestamp = req.query['timestamp'];
const nonce = req.query['nonce'];
const echostr = req.query['echostr'];
if (signature && timestamp && nonce && echostr) {
const arr = [token, timestamp, nonce];
arr.sort();
const sha1 = crypto.createHash('sha1');
const str = sha1.update(arr.join('')).digest('hex');
if (str === signature) {
res.send(echostr);
} else {
res.send('Error');
}
} else {
res.send('Error');
}
});
app.post('/wechat', (req, res) => {
const body = req.body;
const sender = body.FromUserName;
const text = body.Content;
// 返回相应的消息给用户
const options = {
method: 'post',
url: 'https://api.weixin.qq.com/cgi-bin/message/custom/send',
json: {
touser: sender,
msgtype: 'text',
text: {
content: text,
},
},
qs: {
access_token: getAccessToken(),
},
};
request(options, (err, httpResponse, body) => {
if (!err && body && body.errcode === 0) {
res.send('success');
} else {
res.send('fail');
}
});
});
function getAccessToken() {
return new Promise((resolve, reject) => {
const url = 'https://api.weixin.qq.com/cgi-bin/token';
const options = {
method: 'get',
url: url,
qs: {
grant_type: 'client_credential',
appid: 'your_appid',
secret: 'your_secret',
},
};
request(options, (err, httpResponse, body) => {
if (!err && body && body.access_token) {
resolve(body.access_token);
} else {
reject(err);
}
});
});
}
app.listen(80, () => {
console.log(`Wechat server is running at ${80} port.`);
});
以上就是关于微信小程序配置服务器提示验证token失败的解决方法的完整攻略,希望能帮到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序配置服务器提示验证token失败的解决方法 - Python技术站