基于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);
            }

        }

 

总结

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

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值