博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
token验证-微信公众平台开发3(asp.net)
阅读量:4887 次
发布时间:2019-06-11

本文共 2634 字,大约阅读时间需要 8 分钟。

童鞋们直接看代码吧:(我这里是ashx处理程序写的类,开发过网站的一般都知道)

<%@ WebHandler Language="C#" class="weixin" %>

using System;
using System.Web;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Security.Policy;
using System.Collections;
using System.Xml;
public class weixin : IHttpHandler {
    protected string TOKEN = "asdasd"; //TOKEN 必须跟你在微信公众平台上写的token是一致的
    public void ProcessRequest (HttpContext context) {
        //context.Response.ContentType = "text/plain";
        context.Response.Clear(); //清除所有之前生成的Response内容
        Handlewinxin(context);  //进入专业微信处理程序
        context.Response.End();
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="content"></param>
    public void Handlewinxin(HttpContext context)
    {
        
        if (context.Request.HttpMethod.ToUpper() == "GET")
        {
            // 微信加密签名  
            string signature = context.Request.QueryString["signature"];
            // 时间戳  
            string timestamp = context.Request.QueryString["timestamp"];
            // 随机数  
            string nonce = context.Request.QueryString["nonce"];
            // 随机字符串  
            string echostr = context.Request.QueryString["echostr"];
            if (CheckSignature(signature, timestamp, nonce))
            {
                context.Response.Write(echostr);
            }
            
        }
        else if (context.Request.HttpMethod.ToUpper() == "POST")
        {
            StreamReader stream = new StreamReader(context.Request.InputStream);
            string xml = stream.ReadToEnd();
            processRequest(xml, context);
        }
    }
    /// <summary>
    /// 验证签名
    /// </summary>
    /// <param name="signature"></param>
    /// <param name="timestamp"></param>
    /// <param name="nonce"></param>
    /// <returns></returns>
    public bool CheckSignature(String signature, String timestamp, String nonce)
    {
        String[] arr = new String[] { TOKEN, timestamp, nonce };
        // 将token、timestamp、nonce三个参数进行字典序排序  
        Array.Sort<String>(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.Length; i++)
        {
            content.Append(arr[i]);
        }
        String tmpStr = SHA1_Encrypt(content.ToString());
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  
        return tmpStr != null ? tmpStr.Equals(signature) : false;
    }
    /// <summary>
    /// 使用缺省密钥给字符串加密
    /// </summary>
    /// <param name="Source_String"></param>
    /// <returns></returns>
    public static string SHA1_Encrypt(string Source_String)
    {
        byte[] StrRes = Encoding.Default.GetBytes(Source_String);
        HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
        StrRes = iSHA.ComputeHash(StrRes);
        StringBuilder EnText = new StringBuilder();
        foreach (byte iByte in StrRes)
        {
            EnText.AppendFormat("{0:x2}", iByte);
        }
        return EnText.ToString();
    }
    /// <summary>
    /// 处理微信发来的请求
    /// </summary>
    /// <param name="xml"></param>
    public void processRequest(String xml,HttpContext context)
    {
        //待下一章节全部贴出代码
    }
}

 

转载于:https://www.cnblogs.com/feijian/p/3586154.html

你可能感兴趣的文章
Hadoop集群安装配置教程_Hadoop2.6.0_Ubuntu/CentOS
查看>>
Oracle查询优化4大方面的主要途径
查看>>
spring boot配置文件application.propertis
查看>>
有类路由与无类路由的区别
查看>>
如何设置GridView中某个字段显示数据的一部分?
查看>>
Eureka服务注册中心
查看>>
【学习笔记】【C语言】指向函数的指针
查看>>
Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(二)
查看>>
《MySQL必知必会》读书笔记
查看>>
解析AFNetWorking 网络框架(一)
查看>>
12 python生成器,列表推导式,生成器表达式
查看>>
【如何写商业计划书?】
查看>>
ViewController 生命周期
查看>>
后缀数组
查看>>
bitcask
查看>>
Socket 异常说明
查看>>
差模和共模干扰
查看>>
JAVA HW2
查看>>
ThinkPHP运算符与PHP运算符对照表
查看>>
最简单的混合开发教程资料汇总
查看>>