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

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

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 开发包,细化了微信的各项接口操作。调用官方API,具有更灵活的消息分类响应方式,支持链式调用操作 。 主要功能 接入验证 (初级权限) 自动回复(文本、图片、语音、视频、音乐、图文) (初级权限) 菜单操作(查询、创建、删除) (菜单权限) 客服消息(文本、图片、语音、视频、音乐、图文) (认证权限) 二维码(创建临时、永久二维码,获取二维码URL) (服务号、认证权限) 长链接转短链接接口 (服务号、认证权限) 分组操作(查询、创建、修改、移动用户到分组) (认证权限) 网页授权(基本授权,用户信息授权) (服务号、认证权限) 用户信息(查询用户基本信息、获取关注者列表) (认证权限) 多客服功能(客服管理、获取客服记录、客服会话管理) (认证权限) 媒体文件(上传、获取) (认证权限) 高级群发 (认证权限) 模板消息(设置所属行业、添加模板、发送模板消息) (服务号、认证权限) 卡券管理(创建、修改、删除、发放、门店管理等) (认证权限) 语义理解 (服务号、认证权限) 获取微信服务器IP列表 (初级权限) 微信JSAPI授权(获取ticket、获取签名) (初级权限) 数据统计(用户、图文、消息、接口分析数据) (认证权限) > 备注: > 初级权限:基本权限,任何正常的公众号都有此权限 > 菜单权限:正常的服务号、认证后的订阅号拥有此权限 > 认证权限:分为订阅号、服务号认证,如前缀服务号则仅认证的服务号有此权限,否则为认证后的订阅号、服务号都有此权限 > 支付权限:仅认证后的服务号可以申请此权限 初始化动作  $options = array(     'token'=>'tokenaccesskey', //填写你设定的key     'encodingaeskey'=>'encodingaeskey', //填写加密用的EncodingAESKey     'appid'=>'wxdk1234567890', //填写高级调用功能的app id, 请在微信开发模式后台查询     'appsecret'=>'xxxxxxxxxxxxxxxxxxx' //填写高级调用功能的密钥     );  $weObj = new Wechat($options); //创建实例对象  //TODO:调用$weObj各实例方法   标签:wechat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值