这两天项目需要在微信上面开一个接口,就研究了一下,过程很艰难,结果很理想,下面我就介绍一下微信开发需要注意的地方。

1,账号问题

/* 首先说第一个你得选择公众平台(开放平台貌似是做应用集成的,这个没有仔细研究,如果有谁了解,希望告诉我一声),在公众平台我们需要注册账号,账号还分两种,个人类型和企业类型,其中个人类型的只能申请订阅号,而企业类型的才可以搞到服务号,订阅号只能手工或者配置一些关键词去做事情,服务号才能部署一些智能的东东,需要高级开发权限只能是服务号,所以如果你是个人,想要针对用户发过来的消息去回复不同的内容,洗洗睡吧。 */

搞开发的都知道上面那段话的意思,是的,我给注释了,我今天在登陆订阅号的时候,发现订阅号也有高级功能的,可能我那个时候没有通过审核吧,OK,不妨碍下面的分享。

2,开发模式

很简单,当你拿到你的服务账号的时候,你会发现,在功能中有个高级功能(在订阅账号里面是没有高级功能这个选项的),之后你可以选择开通哪种方式。目前开发和编辑只能启动一个。

微信接口只有一个URL,任何数据都是通过这个URL和你的服务器进行连接的(GET或者POST)都需要走这个接口,下面会说说两个用到的地方。

4,验证服务器

在填写你的服务器URL之后,微信会带上几个参数去访问你的URL,你只需要返回特定的数据就OK了,具体方法也可以查看此链接:http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97

在连接中有部分php的代码可以参考,下面我将我的代码贴一下,在这边我走了很多弯路,所以我尽量贴的全一点1 /// 2 /// 验证微信签名 3 /// 4 /// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 5 /// 时间戳 6 /// 随机数 7 /// 随机字符串 8 /// 开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。 9 [System.Web.Http.AcceptVerbs("GET")]10 [System.Web.Http.ActionName("Api")]11 [ApiExplorerSettings(IgnoreApi = false)]12 public HttpResponseMessage CheckSignature(string sigNature, string timestamp, string nonce, string echoStr)13 {14 var content =15 string.Format("SigNature:{0}\nTimestamp:{1}\nNonce:{2}\nEchoStr:{3}",16 sigNature, timestamp, nonce, echoStr);17 logger.Debug(content);    // 此处的log你可以删掉18 19 var list = new string[] { timestamp, nonce, TOKEN };20 Array.Sort(list);21 var tmpArr = string.Join("", list);22 var tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpArr, "SHA1").ToLower();23 24 if (tmpStr == sigNature && !string.IsNullOrEmpty(echoStr))     //根据微信的验证规则做判断25 return Tools.GetReturn(echoStr);26 27 return Tools.GetReturn("error");28 }

之所以写了GetReturn这个函数是因为MVC给我的结果封装了,每次我返回一个字符串的时候他都会在外层添加一对引号,微信还傻不愣登的不认识。。。。这个函数主要就是给我去除MVC封装的1      public static HttpResponseMessage GetReturn(string message)2 {3 return new HttpResponseMessage4 {5 Content = new StringContent(message, Encoding.UTF8, "text/html")6 };7 }

上面的CheckSignature是一个GET的接口,主要就是验证微信服务的,当然,你仔细研究下微信说的也可以发现,当你收到echoStr的时候,直接return其实就OK了,不必多出验证的步骤。

5,消息接收接口

我只关注了一个功能,当用户发送消息的时候我要回复用户消息,而且只关注文本消息就OK了(其实别的类型的消息原理都差不多)。

我们需要注意这边的几点:

a,此接口的ActionName和上面验证的接口是一样的,这样,他们在外面访问就是相同的URL,只是访问的Method不同罢了。1 [System.Web.Http.AcceptVerbs("POST")]2 [System.Web.Http.ActionName("Api")]3 [ApiExplorerSettings(IgnoreApi = false)]4 public HttpResponseMessage ReceiveMessage()

b,这种获取消息内容的方法我也是研究了好久才找到的,费死劲了。1   var message = Request.Content.ReadAsStringAsync().Result;

c,在这个接口他POST过来很多的变量,我都用正则给他搞到了1 var toUserName = GetItemValue(message, ToUserNameReg);2 var fromUserName = GetItemValue(message, FromUserNameReg);3 var createTime = GetItemValue(message, CreateTimeReg);4 var msgType = GetItemValue(message, MsgTypeReg);5 var content = GetItemValue(message, ContentReg);6 var msgId = GetItemValue(message, MsgIdReg);7 var eventStr = GetItemValue(message, EventReg);8 var eventKey = GetItemValue(message, EventKeyReg);

d,我只关注其中两种类型的事件:event and text,event值得是关注和解除关注,在关注的时候要表示感谢不是;发过来的text,我需要找到回复的内容。switch (msgType)

{ case "text":

{

} case "event":

{

} default: return Tools.GetReturn("error");

}

e,全部代码在这里:1 private static readonly Regex ToUserNameReg = new Regex(@"(?<=)", RegexOptions.Compiled);2 private static readonly Regex FromUserNameReg = new Regex(@"(?<=)", RegexOptions.Compiled);3 private static readonly Regex CreateTimeReg = new Regex(@"(?<=)\d*?(?=)", RegexOptions.Compiled);4 private static readonly Regex MsgTypeReg = new Regex(@"(?<=)", RegexOptions.Compiled);5 private static readonly Regex ContentReg = new Regex(@"(?<=)", RegexOptions.Compiled);6 private static readonly Regex MsgIdReg = new Regex(@"(?<=)\d*?(?=)", RegexOptions.Compiled);7 private static readonly Regex EventReg = new Regex(@"(?<=)", RegexOptions.Compiled);8 private static readonly Regex EventKeyReg = new Regex(@"(?<=)", RegexOptions.Compiled);1      /// 2 /// 接受微信消息,如果需要反馈,则调用回复接口进行答复 3 /// 4 /// 开发者微信号 5 /// 发送方帐号(一个OpenID) 6 /// 消息创建时间 (整型) 7 /// text 8 /// 文本消息内容 9 /// 消息id,64位整型10 /// successful or not11 [System.Web.Http.AcceptVerbs("POST")]12 [System.Web.Http.ActionName("Api")]13 [ApiExplorerSettings(IgnoreApi = false)]14 public HttpResponseMessage ReceiveMessage()15 {16 var message = Request.Content.ReadAsStringAsync().Result;17 18 var toUserName = GetItemValue(message, ToUserNameReg);19 var fromUserName = GetItemValue(message, FromUserNameReg);20 var createTime = GetItemValue(message, CreateTimeReg);21 var msgType = GetItemValue(message, MsgTypeReg);22 var content = GetItemValue(message, ContentReg);23 var msgId = GetItemValue(message, MsgIdReg);24 var eventStr = GetItemValue(message, EventReg);25 var eventKey = GetItemValue(message, EventKeyReg);26 27 var logStr = string.Format("Message:{8}\n\nToUserName:{0}\nFromUserName:{1}\nCreateTime:{2}\nMsgType:{3}\nContent:{4}\nMsgId:{5}\nEvent:{6}\nEventKey:{7}",28 toUserName, fromUserName, createTime, msgType, content, msgId, eventStr, eventKey, message);29 logger.Debug(logStr);30 31 switch (msgType)32 {33 case "text":34 {35 var returnMessage = Tools.GetCategory(content);  // 这块是获取反馈信息的方法,你的和我的应该不一样,所以这块你得修改一下。36 var sendMessage = GetSendMessage(fromUserName, returnMessage, toUserName);37 logger.Debug("MsgId:" + msgId + Environment.NewLine + sendMessage);38 39 return Tools.GetReturn(sendMessage);        // 这个函数在上面已经贴出来了,在这块就不在贴了40 }41 case "event":42 {43 if (eventStr == "subscribe")      // 关注事件44 {45 var returnMessage = "欢迎关注**账号 [微笑]";46 var sendMessage = GetSendMessage(fromUserName, returnMessage, toUserName);47 return Tools.GetReturn(sendMessage);48 }49 return Tools.GetReturn("error");50 }51 default:52 return Tools.GetReturn("error");53 }54 }1      /// 2 /// 获取消息体中正则所能匹配到的内容 3 /// 4 /// 消息内容 5 /// 正则 6 /// 返回正则匹配的所有内容 7 [ApiExplorerSettings(IgnoreApi = true)] 8 private string GetItemValue(string message, Regex regex) 9 {10 if(regex.IsMatch(message))11 return regex.Match(message).Value;12 return "";13 }1 /// 2 /// 发送被动响应消息 3 /// 4 /// 接收方帐号(收到的OpenID) 5 /// 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) 6 /// 开发者微信号 7 /// 消息创建时间 (整型) 8 /// text 9 /// 10 [System.Web.Http.AcceptVerbs("POST")]11 [System.Web.Http.ActionName("GetSendMessage")]12 [ApiExplorerSettings(IgnoreApi = false)]13 public string GetSendMessage(string ToUserName, string Content, string FromUserName = Developer,14 string MsgType = "text")15 {16 var createTime = Tools.ConvertDateTimeToInt(DateTime.Now);17 18 return19 string.Format(@"{2}", ToUserName, FromUserName, createTime, MsgType, Content);20 }

【相关推荐】

微信开发中的php代码,从源代码中带你解析微信开发相关推荐

  1. 小程序云开发获取手机号完整代码 云函数中网络请求第三方接口

    小程序云开发获取手机号完整代码 效果图: 小程序代码 <button open-type="getPhoneNumber" bindgetphonenumber=" ...

  2. 【Android 应用开发】 Android 相关代码规范 更新中 ...

    . 简介 : Android 常用的代码结构, 包括包的规范, 测试用例规范, 数据库模块常用编写规范; 参考 : 之前写的一篇博客  [Android 应用开发] Application 使用分析  ...

  3. php:html中嵌入php代码,php中嵌入html代码

    html中嵌入php代码(以.html结尾的文件) index.html <!DOCTYPE html> <html lang="en"> <head ...

  4. word表格导出html代码,(网页源代码中的表格数据怎么导出excel)如何将把从WORD、EXCEL中复制的内容转换成HTML源代码,再通过网页表单提交上传到数据库?...

    如何将ASP页面中的表格生成一个Excel表,求源码 '给你个例子吧.保存为 asp文件看看.具体就在第一句. New Page 1PJ计画 第版 案件No 案件名 主门 顾客 PJ责任者 営业担当 ...

  5. 件工程项目开发最全文档模板_一文带你了解微信小程序社区和小程序开发

    微信小程序越来越受欢迎,很多小白也想制作自己的小程序.小白若想自己顺利制作,有两种方法:一种是下载安装微信官方开发者工具,然后写代码开发:一种是使用第三方小程序制作工具,选个现成的小程序模板,自己再稍 ...

  6. 2022年最新微信小程序支付后端代码通俗易懂一篇文章让你了解微信支付

    一.获取客户资料(百度很简单) #1.微信支付API秘钥 appsecret: d1056292feb*******439f32a0179baf918#2.微信商户IDmchid: 1618****6 ...

  7. python中的散点图代码-绘制python中的线和散点图

    我目前正在从Coursera( https://www.coursera.org/learn/ml-foundations/lecture/6wD6H/visualizing-predictions- ...

  8. matlab中加入C代码:matlab中安装C语言编译器TDM-GCC,编译、运行及mexFunction接口设置

    通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度.Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种. 如果你在安装Matlab ...

  9. 带你解析微信公众号灵魂有香气的女子的创始人李筱懿

    我呢?是一个家庭主妇,平时在家没什么事,无聊的时候就喜欢看看网上的一些衣服从而打发一下时间,这不朋友向我推荐了一个微信公众号--灵魂有香气的女子,发现里面的衣服.化妆品都蛮不错的,衣服穿在身上非常的时 ...

最新文章

  1. 宇宙和你,本质上其实只是个八维数字?
  2. smarty模板引擎_3-预保留变量
  3. tar中的zxvf都是什么?
  4. Python笔记-使用sqlalchemy根据类创建数据库表
  5. Java中获取文件大小的正确方法
  6. HTML复选框可以设置为只读吗?
  7. flash位图技术研究篇(3):移动缓冲区域
  8. BI_DBA_安装(3):安装informatic
  9. Android基于ViewPager2实现循环轮播图、3D画廊效果
  10. 微信小程序-样式-引入
  11. JMeter 修改字体大小
  12. Importing the numpy c-extensions failed 解决方案
  13. java监控命令_Java程序各种监控命令和排查方法
  14. html首页随机飘浮图片,jQuery 全屏随机漂浮图片广告
  15. Windbg命令学习4(d和e)
  16. mysql order field_mysql 使用order by filed,locate和instr自定义排序
  17. YOLOv5 + Tesseract-OCR 实现车牌号文本识别
  18. Unity Tilemap动态生成2d地图
  19. 人工智能领域数据标注行业的核心需求痛点
  20. 大国数据跨境规则博弈,谁能抢占“数据经济制高地”?

热门文章

  1. 报错:ABRT 已检测到 ‘1‘ 个问题。预了解详细信息请执行:abrt-cli list --since 1653881497
  2. VVIC搜款网根据关键词取商品列表 API
  3. 水文监测RTU遥测终端机的设计与实现
  4. python 字典循环赋值,Python字典循环添加一键多值的用法实例
  5. 面试官问了我7个问题,场面一度很尴尬
  6. Internet/Custom路由配置——网络测试仪实操
  7. 烂泥:wiki系统confluence5.6.6安装、中文、破解及迁移
  8. soso地图api接口地理解析geocoder检索示例----并在信息框显示经纬度
  9. linux中的块缓冲
  10. 忆实习与假期的bili