C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题
不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼。于是今天兴致来潮,想做一个试试。
首先找到了开发者文档,看了看,蛮简单的。(公众号早已申请,有兴趣可以关注看看:zyjsoft)
第一步(提供接口,供微信调用,由于是HTTP请求,于是我用MVC模式做了一个简单的接口):
//认证接口
public ActionResult WeiXin(string signature, string timestamp, string nonce, string echostr)
{
//暂不验证
return Content(echostr);
} //接收/回复 消息接口
[HttpPost]
public ActionResult WeiXin()
{
//xxxx
}
从文档中看出,认证时使用GET方式请求接口地址,发送消息时使用POST方式请求接口地址,因此写了以上两个Action来处理
接口地址为:http://182.92.104.112/wx/open/weixin
暂时未认证,大家可以试着玩玩~~~
第二步 接收和响应消息
接下来看怎么接收和响应数据:
从官方文档抄来:
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。各消息类型的推送XML数据包结构如下
===文本消息(接收)
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
对于每一个POST请求,开发者在响应包(Get)中返回特定XML结构,对该消息进行响应
===文本消息(响应)
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
看上去也是蛮简单的,就是按照指定XML格式解析、构成就OK了。
代码很快就写完了(具体实现代码就不贴上来了,主要就是实现POST的那个Action,也比较简单),开始测试:
Test-1:失败(响应空字符串,原因:未取到参数,因为取Xml的数据包是通过Request.InputStream来取的,而并非Forms)…… 改……
Test-2:失败(响应正确,微信客户端可无法接收到消息。原因:可能字段顺序与官方不相同)……改……
Test-3:失败(响应正确,微信客户端仍无法接收到消息。原因:可能是返回MIME类型需要text/xml和Encoding需要UTF8)……改……
Test-4:失败(响应正确、顺序正确、Encoding正确、MIDE类型正确,可就是收不到消息)……没改的了,能改的都改了,就是不出来
表示测试一次非常麻烦啊:编译=>发布=>再测试
以下是官方在线测试工具响应结果:
每个字符都对了,跟官方例子完全一致,就是不知道哪里出问题了,网上的资料都是说要么少几个字符、要么格式不对什么的。
最后找了很久……了很久……很久……久…… 仔细叮着那几句简单的代码看,最后终于在代码中找到了个巨坑:
发现这个巨坑后我怀疑跟什么字段顺序、IMIE类型没有丝毫关系,之前改的都是做无用功罢了
为了让大家能搜索到这个问题,将这个巨坑放在下一篇文章讲解……
C#开发微信公众号.NET平台MVC微信开发Demo解决收不到消息的问题的更多相关文章
- Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token
获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...
- Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理
在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...
- Java开发微信公众号(三)---微信服务器请求消息,响应消息,事件消息以及工具处理类的封装
在前面几篇文章我们讲了微信公众号环境的配置 和微信公众号服务的接入,接下来我们来说一下微信服务器请求消息,响应消息以及事件消息的相关内容,首先我们来分析一下消息类型和返回xml格式及实体类的封装. ( ...
- 微信公众号第三方平台生成自定义菜单提示 获取"access_token失败"
在微信公众号第三方平台要生成自定义菜单时,程序反应很慢,最终提示"获取access_token失败"(之前程序无改动,使用时间已久),查了大半天,找不出原因. 排除.在微信公众号平 ...
- 微信公众号的SpringBoot+Quartz的定时任务Demo
SpringBoot整合quartz并不难,难在普通类实现了Job接口后等于实例化交给quartz,不受Spring管理,则service层等等其他依赖的注入将无法注入,这也是难点之一. 解决方法: ...
- 上篇: php 微信公众号 基于Thinkphp3.2框架开发
说明:本教程是自己自学+自己的理解+扩展(包括学习过程中遇到的一些问题) 参考教程:麦子学院--李忠益--http://www.maiziedu.com/u/70409/ 微盟: http://www ...
- NodeJs 开发微信公众号(四)微信网页授权
微信的网页授权指的是在微信公众号中访问第三方网页时获取用户地理.个人等信息的权限.对于开发了自己的网页app应用时,获取个人的信息非常重要.上篇博客讲到了注册时可以获取用户的信息,很多人会问为什么还需 ...
- NodeJs 开发微信公众号(三)微信事件交互
微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成.比如说自定义菜单功能,必须通过发送post请求的方式生成.本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么 ...
- 微信公众号内H5调用微信支付国内服务商模式
最近在折微信公众号内H5用JSAPI调用微信支付,境内服务商版支付,微信支付给出的官方文档以及SDK不够详细,导至我们走了一些弯路,把他分享出来,我这边主要是用PHP开发,所以未加说的话示例都是PHP ...
随机推荐
- java 学习第三篇if判断
JAVA 判断 单词: if 如果 else 否则 单分支: If(条件) { 代码块 } If是一个判断语句.代码格式如上. If括号的内是表达式.如果表达式值是成立的便执行代码块.之后在执行IF语 ...
- P1579 哥德巴赫猜想(升级版)
程序是人类的财富!!11 ------------------------------------------- 题目链接:MIKU OK,Let's gi; -------------------- ...
- Ubuntu16.04跑loam_velodyne
Ubuntu16.04,ros kinetic 其实按照github上的README.md来编译就好 cd ~/catkin_ws/src git clone https://github.com/l ...
- [USACO5.4]奶牛的电信Telecowmunication 最小割
题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...
- 谷歌通过ajax获取本地JSON文件,为什么会显示跨域?转载的
在本地写了一段JSON代码,然后用ajax读取后,在浏览器打开,发现谷歌提示涉及到跨域问题, 但是跨域是由于协议,域名,端口中有一个不同,才会跨域,我在本地访问自己的文件,怎么和跨域扯上关系了?? 谷 ...
- C语言值拷贝传递机制
当参数是常量,变量,或表达式时,传递的数据就是这些数据对象所具有的内容,这种方式称为数值参数传递方式(简称传值方式).如果函数调用时所传递的实参是数据对象在内存中的存储单元的首地址值,这种方式称为地址 ...
- 【笔记】MySQL的基础学习
[笔记]MySQL的基础学习 老男孩 MySQL 一 安装与配置 1 下载安装 官网:http://dev.mysql.com/downloads/mysql/ 下载相应版本的压缩包 解压压缩包至任 ...
- Codeforces Round #532 (Div. 2)- A(思维)
This morning, Roman woke up and opened the browser with nn opened tabs numbered from 11 to nn. There ...
- nginx与 Keepalived高可用
1.1 keepalived软件能干什么? Keepalived软件起初是专为LVS负载均衡软件设计的, 用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能 K ...
- django ORM 连表查询2
set() 更新model对象的关联对象 book_obj=models.Book.objects.first() book_obj.authors.set([2,3]) 把book_obj这个对象重 ...