>  기사  >  위챗 애플릿  >  소스 코드에서 WeChat 개발을 분석해 보세요.

소스 코드에서 WeChat 개발을 분석해 보세요.

Y2J
Y2J원래의
2017-05-05 10:49:291696검색

지난 이틀 동안 위챗에서 인터페이스를 오픈해야 해서 공부를 했는데요, 과정은 매우 어려웠지만 결과는 이상적으로 좋았습니다. 이제 위챗 개발에 있어서 주의해야 할 점을 소개하겠습니다. .

1. 계정 문제

 /* 우선 공개 플랫폼을 선택해야 합니다(오픈 플랫폼은 신청용인 것 같습니다) 통합에 대해서는 잘 연구하지 않았는데 혹시 아시는 분 계시면 알려주세요.) 공개 플랫폼에서는 계정을 등록해야 하는데 그 중 개인형과 법인형이 있습니다. 구독 번호만 신청할 수 있으며, 기업 유형에서만 서비스 계정을 얻을 수 있습니다. 구독 계정은 일부 키워드를 구성하여 수행할 수 있습니다. 서비스 계정은 서비스 계정에만 일부 스마트 기능을 배포할 수 있습니다. 따라서 귀하가 개인이고 다른 콘텐츠로 사용자가 보낸 메시지에 대한 답장을 타겟팅하려면 잠자기 상태로 전환하세요. */

위 문단의 의미는 개발에 종사하시는 분들은 아실 겁니다. 네, 오늘 구독 계정에 로그인해 보니 구독 계정에도 고급 기능이 있다는 걸 알았네요. 그 당시에는 없었습니다. 리뷰를 통과하세요. 좋아요, 아래 공유를 방해하지 않습니다.

2. 개발 모드

서비스 계정을 얻으면 매우 간단합니다. (구독 계정에는 고급 기능 옵션이 없습니다.) 나중에 활성화할 방법을 선택할 수 있습니다. 현재 개발 및 편집을 위해 하나만 시작할 수 있습니다.

3, 구성 서버

WeChat 인터페이스에는 URL이 하나만 있으며 모든 데이터는 다음을 통해 연결됩니다. 이 URL 서버는 이 인터페이스를 사용하여 연결(GET 또는 POST)해야 합니다. 다음은 이 인터페이스가 사용되는 두 위치에 대해 설명합니다.

4. 확인 서버

귀하의 서버 URL을 입력한 후 WeChat은 귀하의 URL에 액세스하기 위해 여러 매개변수를 가져옵니다. 특정 데이터를 반환하려면 다음 링크를 확인하세요: http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E5%85%A5 %E6% 8C%87%E5%8D%97

참고용으로 몇 가지 PHP 코드가 있습니다. 여기에서 여러 번 우회하여 전체 코드를 게시하겠습니다.

 1         /// <summary> 2         /// 验证微信签名 3         /// </summary> 4         /// <param name="sigNature">微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。</param> 5         /// <param name="timestamp">时间戳</param> 6         /// <param name="nonce">随机数</param> 7         /// <param name="echoStr">随机字符串</param> 8         /// <returns>开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。</returns> 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가 문자열을 반환할 때마다 한 쌍의 따옴표가 추가되기 때문입니다. 외부 계층으로 이동하고 WeChat은 여전히 ​​​​이를 인식하지 못할 정도로 멍청합니다. . . . 이 기능은 주로 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는 주로 WeChat 서비스를 확인하는 데 사용되는 GET 인터페이스입니다. 물론 WeChat이 말한 내용을 잘 살펴보면, echoStr을 받았을 때 별도의 확인 단계를 거치지 않고 그냥 돌려보내도 괜찮다는 것을 알 수 있습니다.

5, 메시지 수신 인터페이스

사용자가 메시지를 보낼 때 한 가지 기능에만 집중했습니다 가끔 사용자 메시지에 답장을 하고 싶을 때가 있는데, 문자 메시지에만 집중해도 괜찮습니다(사실 다른 유형의 메시지도 원칙은 비슷합니다).

여기서 몇 가지 사항에 주의해야 합니다.

a. 이 인터페이스의 ActionName은 위에서 확인한 인터페이스와 동일합니다. 외부에서 접근하는 방식이 다릅니다.

아아아아

b. 메시지 내용을 가져오는 이 방법을 찾기까지 오랫동안 연구해 왔고 많은 노력이 필요했습니다.

1         [System.Web.Http.AcceptVerbs("POST")]2         [System.Web.Http.ActionName("Api")]3         [ApiExplorerSettings(IgnoreApi = false)]4         public HttpResponseMessage ReceiveMessage()

 c. 이 인터페이스에서 그는 많은 변수를 게시했습니다. 나는 그를 위해 정규 표현식을 사용했습니다.

1   var message = Request.Content.ReadAsStringAsync().Result;

 d. 두 가지 유형이 있습니다. 이벤트: 이벤트와 텍스트, 이벤트는 팔로우와 언팔로우가 필요하며, 보낸 텍스트에 주의를 기울일 때 감사를 표시해야 합니다. 회신하다.

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);

 e, 모든 코드는 여기에 있습니다:

            switch (msgType)
            {                case "text":
                    {
                    }                case "event":
                    {
                    }                default:                    return Tools.GetReturn("error");
            }
1         private static readonly Regex ToUserNameReg = new Regex(@"(?<=<ToUserName><!\[CDATA\[).*?(?=\]\]></ToUserName>)", RegexOptions.Compiled);2         private static readonly Regex FromUserNameReg = new Regex(@"(?<=<FromUserName><!\[CDATA\[).*?(?=\]\]></FromUserName>)", RegexOptions.Compiled);3         private static readonly Regex CreateTimeReg = new Regex(@"(?<=<CreateTime>)\d*?(?=</CreateTime>)", RegexOptions.Compiled);4         private static readonly Regex MsgTypeReg = new Regex(@"(?<=<MsgType><!\[CDATA\[).*?(?=\]\]></MsgType>)", RegexOptions.Compiled);5         private static readonly Regex ContentReg = new Regex(@"(?<=<Content><!\[CDATA\[).*?(?=\]\]></Content>)", RegexOptions.Compiled);6         private static readonly Regex MsgIdReg = new Regex(@"(?<=<MsgId>)\d*?(?=</MsgId>)", RegexOptions.Compiled);7         private static readonly Regex EventReg = new Regex(@"(?<=<Event><!\[CDATA\[).*?(?=\]\]></Event>)", RegexOptions.Compiled);8         private static readonly Regex EventKeyReg = new Regex(@"(?<=<EventKey><!\[CDATA\[).*?(?=\]\]></EventKey>)", RegexOptions.Compiled);
 1      /// <summary> 2         /// 接受微信消息,如果需要反馈,则调用回复接口进行答复 3         /// </summary> 4         /// <param name="ToUserName">开发者微信号</param> 5         /// <param name="FromUserName">发送方帐号(一个OpenID)</param> 6         /// <param name="CreateTime">消息创建时间 (整型)</param> 7         /// <param name="MsgType">text</param> 8         /// <param name="Content">文本消息内容</param> 9         /// <param name="MsgId">消息id,64位整型</param>10         /// <returns>successful or not</returns>11         [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      /// <summary> 2         /// 获取消息体中正则所能匹配到的内容 3         /// </summary> 4         /// <param name="message">消息内容</param> 5         /// <param name="regex">正则</param> 6         /// <returns>返回正则匹配的所有内容</returns> 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         }

[관련 추천]

WeChat 공개 계정 플랫폼 소스 코드 다운로드

2. Xiaozhu CMS Lifetong O2O 시스템 v2.0 전용 버전을 다운로드하세요

위 내용은 소스 코드에서 WeChat 개발을 분석해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.