基于SENPARC盛派微信sdk的.net WebService微信公众号的相关开发(包含从零开始本机测试环境搭建//token验证//获取微信推送消息//向微信推送消息)

前言:

由于微信公众号正式号,一直在被使用,所以在研发的时候,本机测试环境,就显得非常重要。

而且在自己闲暇之余,可以自己尝试更深程度的微信公众号的研发工作。

 

1、首先,必要的网站

 http://sdk.weixin.senparc.com/ 盛派SDK下载地址(官网有WeChatSampleBuilder不过博主没有使用过,vs可以用NuGet下载,本人使用的是全部源码,并没有使用最新版本(ps、最新版本太过于庞大))。

 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login   微信测试公众号(第一次扫码,微信确定后,会卡顿很久,等待即可)

https://mp.weixin.qq.com/debug 微信公众平台接口调试工具(AccessToken 获取)

http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 盛派帮助教程(ps.下载了好几个demo,结合着看,个人感觉有点乱,)。

2、建设基于盛派SDK的公众号个人网站

------这一步有兴趣的同许多可以使用,盛派官网WeChatSampleBuilder试试,也可以使用NuGet。

------不详细展开,直接进入主题。

3、微信注册号的申请绑定已经推送消息获取(针对没有微信公众号的同学)

首先进入微信测试公众号网站  https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login   

a、点击登录,用微信扫码登录即可、

b、进入之后,记录appID 以及 appsecret。

这一步第一次登录会有卡顿,需要等待几分钟(一开始我还以为是微信这个测试账号有bug。。。等待即可。。)

记录 appID 以及 appsecret,添加到自己的项目中。

c、创建一个全新的aspx页面,准备接受微信的请求。

首先新建一个空的apsx页面。在Page_Load上写上如下代码,这一步 仅仅 是为了与 正确响应微信发送的Token验证。

当然,这一步必须包括将自己的项目挂在IIS外网可以访问才可以!!

注意:引用一系列的dll,Token可以随意设置。

 public static readonly string Token = "Wechart";//与微信公众账号后台的Token设置保持一致,区分大小写。 
 protected void Page_Load(object sender, EventArgs e)
 {
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce = Request["nonce"];
            string echostr = Request["echostr"];

            Log.WriteLog("开始");
            if (Request.HttpMethod == "GET")
            {
                Log.WriteLog("GET");
                //get method - 仅在微信后台填写URL验证时触发
                if (CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    HttpContext.Current.Response.Write(echostr); //返回随机字符串则表示验证通过
                }
                else
                {
                    Log.WriteLog("路由");
                    WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                    //            "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
                }
                Response.End();
            }
            else
            {
                //待之后处理微信发过来的请求。
                //之后再补充剩余代码。
            }

}

 

注意:Token必须与自己aspx页面上相同。

ps.很多人都是在公司内网,这里推荐可以使用 花生壳 natapp。这边我使用的是natapp做外网挂接。

此处写natapp生成的网页即可。

//提交成功及测试通过。至此,已经可以获取微信推送的消息。

d、接着必须要处理微信推送过来的信息。微信推送的消息都以POST推送。

需要获取post中的InputStream,转成xml,并返回给微信,在此微信会进行三次消息推送,直到你有返回为止。

在上述代码的else中添加,如下代码:

                Log.WriteLog("POST");
                //post method - 当有用户想公众账号发送消息时触发
                if (!CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    HttpContext.Current.Response.Write("参数错误!");
                    return;
                }

                Log.WriteLog("访问:数据流");

                //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
                var messageHandler = new CustomMessageHandler(Request.InputStream);

                try
                {
                    Log.WriteLog("微信处理");
                    //var result = RequestMessageFactory.GetRequestEntity(stream);

                    //messageHandler.OnEvent_ScanRequest(messageHandler.RequestMessage as RequestMessageEvent_Scan);
                    Log.WriteLog("处理开始"+ messageHandler.RequestDocument.ToString());
                    //执行微信处理过程
                    messageHandler.Execute();

                    Log.WriteLog("处理结束"+ messageHandler.ResponseDocument.ToString());

                    HttpContext.Current.Response.Write(messageHandler.ResponseDocument.ToString());

                    Log.WriteLog("结束");
          
                }
                catch (Exception ex)
                {
                    Log.WriteLog(ex.ToString());
                }
                finally
                {
                    Response.End();
                }

此处最为关键的,CustomMessageHandler类,是基于原来盛派封装好的类做了继承,来重写操作。以达到自行处理微信请求的目的,这边只写出了 微信扫码带参二维码的方法。

public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel = null, int maxRecordCount = 0)
            : base(inputStream, postModel, maxRecordCount)
        {

        }

        //override重写各种微信post获取方法即可。
        
        /// <summary>
        /// 通过二维码扫描关注扫描事件
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)
        {

            //通过扫描关注
            var responseMessage = CreateResponseMessage<ResponseMessageText>();
            responseMessage.Content = string.Format("扫码成功");
            return responseMessage;
        }
}

4、微信推送消息

向微信推送消息,比如模板消息等,这里只介绍一个生成带参二维码。

这里说明一个重要情况:

内网 或者 无线网络,然后通过,natapp 来验证的时候,。调用此接口 会出现 微信 IP 白名单的错误

原因是AccessToken 获取的时候,你的IP并不在服务器的白名单内。

这边推荐一个方法,在   https://mp.weixin.qq.com/debug  根据你之前测试号的appid 以及 secret  提前获取好AccessToken ,在此处写死,即可跳过验证。

也可以在此处增加ip白名单,但是外网穿透好像不行,暂时没找到好的方法。。有好办法欢迎提出。。。感谢

 

        public string WeChartQRCode(string name, string uid)
        {
            var AccessToken = AccessTokenContainer.TryGetAccessToken(AppConfig.WeChatAppId, AppConfig.WeChatAppSecret);            
          
            string filename = $"{name}.jpg";
            string path = AppDomain.CurrentDomain.BaseDirectory + "wxqrcode/" + filename;

            var qrResult = QrCodeApi.Create(AccessToken, 100, 1, QrCode_ActionName.QR_LIMIT_STR_SCENE, uid);
            var qrCodeUrl = QrCodeApi.GetShowQrCodeUrl(qrResult.ticket);

            if (qrCodeUrl != "")
            {
                Log.WriteLog(qrCodeUrl);
                DownFile(qrCodeUrl, path);
            }
            else
            {
                Log.WriteLog("url为空");
                path = "url获取失败。";
            }

            return path;
        }


        //下载到文件
        public static void DownFile(string url, string target)
        {
            try
            {
                WebClient _client = new WebClient();
                byte[] data = _client.DownloadData(url);
                File.WriteAllBytes(target, data);
            }
            catch (Exception ex)
            {
                throw new Exception("下载文件(" + target + ")失败:" + ex.Message + "|" + ex.StackTrace);
            }

        }

 

总结

至此,已经完全搭建好了一个与微信联通的测试项目。

而且可以在本机测试调试。非常的方便。

有讲解不到位,或者不了解的,可以留言交流。

不对的地方欢迎指出修改。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Senparc.Weixin微信公众平台SDK支持.NET Framework及.NET Core。已支持微信公众号、小程序、小游戏、企业号、企业微信、开放平台、微信支付、JSSDK微信周边等全平台。  使用 Senparc.Weixin,您可以方便快速地开发微信全平台的应用(包括微信公众号、小程序、小游戏、企业号、开放平台、微信支付、JS-SDK微信硬件/蓝牙,等等)。本项目的 Demo 同样适合初学者进行 .NET 编程学习。 目前 Senparc.Weixin 已经支持几乎所有微信平台模块和接口,并同时支持 .NET 3.5 / 4.0 / 4.5 / .NET Standard 2.0 / .NET Core 2.2 / .NET Core 3.0 多种框架。 Senparc.Weixin SDK 是目前使用率最高的微信 .NET SDK,也是国内最受欢迎的 .NET 开源项目之一。 自 2013 年起立项 7 年多来,我们一直保持着项目的持续更新,并将完整的源代码以及设计思想毫无保留地分享给大家,希望有更多的人可以从中受益,理解并传播开源的精神,一同助力中国开源事业!感恩一路上给我们提供帮助的朋友们! 功能支持: 已经支持大部分微信 7.x API,包括微信支付、自定义菜单/个性化菜单、模板信息接口、素材上传接口、群发接口、多客服接口、支付接口、微小店接口、卡券接口、发票接口等等。 已支持微信公众号、小程序、企业号、开放平台等各个模块。 已经支持用户会话上下文(解决服务器无法使用 Session 处理用户信息的问题)。 已经全面支持微信公众号、小程序、企业号(企业微信)、微信支付、开放平台的最新 API。 已经支持分布式缓存及缓存策略扩展(默认支持:本地缓存、Redis、Memcached,可自由扩展)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值