微信小程序配置服务器提示验证token失败的解决方法

接下来我将详细讲解微信小程序配置服务器提示验证token失败的解决方法,并提供两个示例说明。

  1. 环境搭建

首先需要在自己的服务器上搭建一个可以运行代码的环境。这个环境需要支持HTTPS协议,并且需要设置相应的nginx或其他反向代理服务器。

  1. 配置服务器

在进行小程序服务器配置时,首先需要在公众平台申请一个小程序开发账号,并填写服务器地址和验证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
  1. 验证过程

在进行服务器配置的过程中,微信平台会向填写的服务器配置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. 示例说明

示例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技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Hadoop中的压缩与解压缩案例详解

    下面就为您详细讲解“Hadoop中的压缩与解压缩案例详解”的完整攻略。 什么是Hadoop中的压缩与解压缩? 在Hadoop中,由于数据量通常都很大,为了提高数据的存储效率和运行效率,我们经常需要将数据进行压缩。同时,在MapReduce的过程中,也需要对数据进行解压缩以方便处理。 Hadoop支持多种数据压缩格式,包括Gzip、Bzip2、LZO等。在使用…

    Java 2023年5月20日
    00
  • Java Stream流的常见生成和操作方法总结

    Java Stream流的常见生成和操作方法总结 生成Stream流的常见方式 1. 通过Collection接口生成 可以通过Collection接口提供的stream()和parallelStream()方法生成一个Stream或ParallelStream流: List<String> list = Arrays.asList("…

    Java 2023年5月26日
    00
  • jsp中获得路径的两种方法和获得url路径的方法(推荐)

    JSP中获得路径的两种方法 在JSP中,我们需要经常获取文件或路径相关的信息,下面就介绍两种获取路径的方法: 方法一: <% String path1 = request.getSession().getServletContext() .getRealPath(""); out.println(path1); %> 这种方法…

    Java 2023年6月15日
    00
  • Java8中的Stream 流实践操作

    让我来详细讲解一下 Java8 中的 Stream 流实践操作的完整攻略。 什么是 Stream? Stream 是 Java8 新增加的 API,用于支持对集合及数组的操作。使用 Stream API,可以更方便地进行筛选、过滤、映射及归约等操作。 在 Java8 中,每一个和集合相关的接口都提供了一个 stream 方法,用于返回一个 Stream 对象…

    Java 2023年5月26日
    00
  • SpringBoot启动器Starters使用及原理解析

    SpringBoot启动器Starters使用及原理解析 Spring Boot是一个快速、方便的构建Spring应用程序的框架,它提供了一系列的启动器(Starters)来帮助我们快速引入一些常用的依赖包。Starters的作用就是提供一个快速的方式来导入一个或多个依赖包,它不仅简化了我们的配置过程,还有助于保持我们的应用程序的兼容性和依赖性。 Start…

    Java 2023年5月15日
    00
  • JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)

    JVM内存分配 先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm) 程序计数器 栈 1. 虚拟机栈 2. 本地方法栈 Java堆 堆内存是各个线程共享的区域 方法区 它用于存储已经被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据。静态变量、常量在方法区,所有方法,包括静态和非静态的,也在方法区 这里解释一下方法…

    Java 2023年4月17日
    00
  • 一篇超详细的Spring Boot整合Mybatis文章

    Spring Boot整合MyBatis完整攻略 Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在Spring Boot中,整合MyBatis可以帮助我们更方便地操作数据库。本文将介绍如何在Spring Boot中整合MyBatis,并提供两个示例。 整合MyBatis 在Spring Boot中整合MyBatis需要以下…

    Java 2023年5月15日
    00
  • extjs_02_grid显示本地数据、显示跨域数据

    现在我来详细讲解“extjs_02_grid显示本地数据、显示跨域数据”的完整攻略。 1. Grid 显示本地数据 1.1 示例说明 下面是一个简单的示例,演示如何创建 Ext JS Grid 并显示本地数据。 Ext.application({ name: ‘MyApp’, launch: function() { // 创建数据模型 Ext.define…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部