지난 이틀 동안 위챗에서 인터페이스를 오픈해야 해서 공부를 했는데요, 과정은 매우 어려웠지만 결과는 이상적으로 좋았습니다. 이제 위챗 개발에 있어서 주의해야 할 점을 소개하겠습니다. .
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 }
[관련 추천]
2. Xiaozhu CMS Lifetong O2O 시스템 v2.0 전용 버전을 다운로드하세요
위 내용은 소스 코드에서 WeChat 개발을 분석해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!