微信分享

WxHandler.ashx

using System;
using System.Text;
using System.Web;
using System.Web.Security;
using Service;

namespace ShareServer.Handler
{
    /// <summary>
    ///     微信业务逻辑处理
    /// </summary>
    public class WxHandler : IHttpHandler
    {
        private readonly WxService service = new WxService();

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/json";

            var type = context.Request["type"];

            switch (type)
            {
                case "share":
                    Share(context);
                    break;
                case "auth":
                    Auth(context);
                    break;
                case "openid":
                    OpenId(context);
                    break;
                default:
                    break;
            }
        }

        public bool IsReusable
        {
            get { return false; }
        }

        /// <summary>
        ///     微信分享
        /// </summary>
        /// <param name="context"></param>
        private void Share(HttpContext context)
        {
            var jsonHelper = new JsonHelper(context);

            var url = context.Request["page_url"];
            var utf8 = Encoding.UTF8;
            url = HttpUtility.UrlDecode(url, utf8);

            var config = service.GetShareConfig(url);

            jsonHelper.Success("查询成功", config);
        }

        /// <summary>
        ///     微信认证
        /// </summary>
        /// <param name="context"></param>
        private void Auth(HttpContext context)
        {
            var token = "alsgame";
            var echoStr = context.Request["echoStr"];
            var signature = context.Request["signature"];
            var timestamp = context.Request["timestamp"];
            var nonce = context.Request["nonce"];
            string[] ArrTmp = {token, timestamp, nonce};
            Array.Sort(ArrTmp); //字典排序  
            var tmpStr = string.Join("", ArrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            tmpStr = tmpStr.ToLower();
            if (tmpStr == signature)
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    context.Response.Write(echoStr);
                    context.Response.End();
                }
            }
        }

        /// <summary>
        ///     获取OpenId
        /// </summary>
        public void OpenId(HttpContext context)
        {
            var jsonHelper = new JsonHelper(context);
            var code = context.Request["code"];

            var obj = service.GetOpenId(code);

            jsonHelper.Success("查询成功", obj);
        }
    }
}

WxService.cs

using System;
using System.Configuration;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Security;
using Newtonsoft.Json;

namespace Service
{
    /// <summary>
    ///     微信业务处理
    /// </summary>
    public class WxService
    {
        /// <summary>
        ///     微信公众号
        /// </summary>
        private static readonly string appId = ConfigurationManager.AppSettings["APPID"];

        private static readonly string secret = ConfigurationManager.AppSettings["SECRET"];

        /// <summary>
        ///     全局缓存
        /// </summary>
        private static string AccessToken = "";

        private static string JsApiTicket = "";

        /// <summary>
        ///     上次更新时间
        /// </summary>
        private static long LastAccessToken;

        private static long LastJsApiTicket;

        /// <summary>
        ///     获取OPENID
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public string GetOpenId(string code)
        {
            var url =
                "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code";
            url = string.Format(url, appId, secret, code);

            return HttpGet(url);
        }

        /// <summary>
        ///     获取微信配置信息
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public WxConfig GetShareConfig(string url)
        {
            var ticket = GetJsApiTicket();
            var noncestr = GetNonceStr();
            var timestamp = GetTimeStamp();
            var signature = CreateSignature(ticket, noncestr, timestamp, url);

            var config = new WxConfig();
            config.appId = appId;
            config.ticket = ticket;
            config.nonceStr = noncestr;
            config.timestamp = timestamp;
            config.signature = signature;

            return config;
        }

        /// <summary>
        ///     生成签名算法
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private string CreateSignature(string ticket, string nocestr, long timestamp, string url)
        {
            var text = "jsapi_ticket=" + ticket;
            text += "&noncestr=" + nocestr;
            text += "&timestamp=" + timestamp;
            text += "&url=" + url;

            return SHA1(text);
        }

        /// <summary>
        ///     获取Ticket
        /// </summary>
        /// <returns></returns>
        public string GetJsApiTicket()
        {
            if (GetTimeStamp() - LastJsApiTicket > 7000)
            {
                var accessToken = GetAccessToken();
                var url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi";
                url = string.Format(url, accessToken);

                var result = HttpGet(url);
                var config = JsonConvert.DeserializeObject<WxConfig>(result);
                JsApiTicket = config.ticket;

                LastJsApiTicket = GetTimeStamp();
            }
            return JsApiTicket;
        }

        /// <summary>
        ///     获取Access_Token
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="secret"></param>
        /// <returns></returns>
        public string GetAccessToken()
        {
            if (GetTimeStamp() - LastAccessToken > 7000)
            {
                var url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
                url = string.Format(url, appId, secret);

                var result = HttpGet(url);
                var config = JsonConvert.DeserializeObject<WxConfig>(result);
                AccessToken = config.access_token;

                LastAccessToken = GetTimeStamp();
            }
            return AccessToken;
        }

        /// <summary>
        ///     获取TimeStamp
        /// </summary>
        /// <returns></returns>
        private long GetTimeStamp()
        {
            var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds);
        }

        /// <summary>
        ///     获取NoceStr
        /// </summary>
        /// <returns></returns>
        private string GetNonceStr()
        {
            return Guid.NewGuid().ToString();
        }

        /// <summary>
        ///     Sha1加密
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        private string SHA1(string text)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(text, "SHA1");
        }

        /// <summary>
        ///     http请求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="postDataStr"></param>
        /// <returns></returns>
        public string HttpGet(string url)
        {
            var request = (HttpWebRequest) WebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = "text/json;charset=UTF-8";

            var response = (HttpWebResponse) request.GetResponse();
            var myResponseStream = response.GetResponseStream();
            var streamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            var result = streamReader.ReadToEnd();
            streamReader.Close();
            myResponseStream.Close();

            return result;
        }
    }
}

JsonHelper.cs

using System;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace Service
{
    /// <summary>
    ///     JSON辅助类
    /// </summary>
    public class JsonHelper
    {
        private readonly HttpContext context;

        public JsonHelper(HttpContext context)
        {
            this.context = context;
        }

        /// <summary>
        ///     处理成功
        /// </summary>
        public void Success(string msg, object data = null)
        {
            var message = new Message();

            message.status = 0;
            message.msg = msg;
            message.data = data == null ? new Array[0] : data;
            message.updateTime = DateTime.Now;
            context.Response.Write(SerializeObject(message));
        }

        /// <summary>
        ///     处理失败
        /// </summary>
        public void Failure(string msg, object data = null)
        {
            var message = new Message();

            message.status = -1;
            message.msg = msg;
            message.data = data == null ? new Array[0] : data;
            message.updateTime = DateTime.Now;
            context.Response.Write(SerializeObject(message));
        }

        /// <summary>
        ///     序列化
        /// </summary>
        public string SerializeObject(object obj)
        {
            var timeFormat = new IsoDateTimeConverter();
            timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
            return JsonConvert.SerializeObject(obj, Formatting.Indented, timeFormat);
        }
    }
}

实体类

WxConfig.cs

namespace Service
{
    public class WxConfig
    {
        public string appId { get; set; }

        public string signature { get; set; }

        public string nonceStr { get; set; }

        public long timestamp { get; set; }

        public string ticket { get; set; }

        public string access_token { get; set; }
    }
}

Message.cs

using System;

namespace Service
{
    public class Message
    {
        /// <summary>
        ///     响应状态码
        /// </summary>
        public int status { get; set; }

        /// <summary>
        ///     响应消息
        /// </summary>
        public string msg { get; set; }

        /// <summary>
        ///     响应数据集
        /// </summary>
        public object data { get; set; }

        /// <summary>
        ///     服务器时间
        /// </summary>
        public DateTime updateTime { get; set; }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值