作为计算机学院的学生的学生,时刻在打计算机学院官网的主意,前段时间我的一个好基友在我面前炫耀他的能够查课表的公众号(服务模拟登录返回数据),把我眼红得,所以我暗自下决心,自己一定要弄个微信公众号来玩玩儿。经过各种网上查资料,各种走弯路,还是实现了微信公众号机器人聊天功能。虽然这个很简单,但是网上完善而又详细的资料很难找,而且官网的开发文档只针对php语言发布了Demo,开发者文档简直坑爹,不过我还是忍不住分享出来,嘿嘿,下面我就开始分享我的经验了。
1、开发准备:你需要一台服务器或者虚拟主机,一个微信号,然后到微信公众平台注册一个账号,并且申请一个订阅号。PS:订阅号可以每天群发消息,服务号一个月只能发一次。所以首选订阅号,不要问我为什么,一个字,爽。
2、当你申请公众号成功了就可以群发消息了,不过这些只能手动群发,还有就是针对用户回复的消息不能做出只能的响应,要响应的话必须手动添加关键字回复,所以这样肯定是不行的,这个时候就需要进入开发这中心进行相关的配置,如下图:
具体详情点击我
很多人会卡在服务器验证这关,因为总是显示taken验证失败,那是因为开发者服务器没有返回数据或者返回的数据微信服务器不能识别,大家仔细看红框里的:
如果你很久都没有验证成功,你可以直接返回echostr参数内容,这样达到欺骗微信服务器的效果(不建议这样做,因为没有验证taken,安全性非常低,但是作为初学者,咱先把功能实现了再说,嘿嘿)。当然我整熟了后也是验证了的。
3、当你验证服务器成功了后,就可以开始开发服务器端了。
我先来一段服务器欺骗的接口代码(我用的是.ashx一般处理文件):
<%@ WebHandler Language="C#" Class="Login" %>
using System;
using System.Web;
public class Login : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string echoString = HttpContext.Current.Request.QueryString["echoStr"];
context.Response.Write(echoString);
}
public bool IsReusable
{
get
{
return false;
}
}
}
直接撂到服务器上运行,不过你会发现网页会报错,不过不用担心,你按照报错的来修改web.config文件,就成功了。
好了,以上就是开发准备,接下来我将开始进入开发微信公众号服务端正题。
思路:
1、首先你得有一个图灵机器人的接口,这个时候你就要到图灵机器人官网注册账号,申请账号(希望你自己申请一个接口,不要用博主的,谢谢合作)。
2、服务器端接受到微信服务器发送过来的消息后,开发者写的接口直接爬取图灵接口所返回的数据,然后解析,转化成微信服务能够识别的数据格式,最后返回给微信服务器,这样微信服务器就会自动转发给指定openId的用户。
一、weixinapi.ashx(我用的是明文模式,所以把加密的代码注释了):
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Web;
using System.Xml;
using WeiXinApi.Util;
namespace WeiXinApi
{
/// <summary>
/// weixinapi 的摘要说明
/// </summary>
public class weixinapi : IHttpHandler
{
string sToken = null;
string sAppID = null;
string sEncodingAESKey = null;
public void ProcessRequest(HttpContext context)
{
try
{
Stream stream = context.Request.InputStream;
byte[] byteArray = new byte[stream.Length];
stream.Read(byteArray, 0, (int)stream.Length);
string postXmlStr = System.Text.Encoding.UTF8.GetString(byteArray);
if (!string.IsNullOrEmpty(postXmlStr))
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(postXmlStr);
//if (string.IsNullOrWhiteSpace(sToken))
//{
// DataTable dt = ConfigDal.GetConfig(WXMsgUtil.GetFromXML(do