두 번째 강의에서는 Delphi+intraweb을 사용하여 WeChat 개발 2 - intraweb을 .net 모드로 게시합니다(asp.net mvc4 모드로 배포). IIS(.net 가상 호스트)에 iw 애플리케이션을 성공적으로 배포했습니다. 클라우드 가상 호스트에서 이번 강의에서는 첫 번째 강의 내용을 이어가고 WeChat 개발로 돌아가서 이번에는 WeChat 메시지 처리에 대해 설명하겠습니다.
우선 몇 가지 알아두어야 할 사항을 명확히 하세요.
1. WeChat 서버에서 사용자 메시지를 전달하는 데 사용하는 http 게시 방법은 첫 번째 강의에서 언급하지 않았습니다. WeChat 서버의 http 데이터 제출 방법. WeChat은 실제로 사용자 메시지를 전달할 때 액세스 확인을 위해 http get 방법을 사용하고, 메시지를 전달할 때 메시지는 ContentType으로 인코딩됩니다. =텍스트/xml.
2. WeChat 서버 메시지 전달은 1. 일반 텍스트, 3. 혼합의 세 가지 데이터 전송 방법을 선택할 수 있습니다. 이 기사에서는 디버깅의 편의를 위해 일반 텍스트를 사용하여 데이터를 전송합니다. 다음 강의에서는 메시지 암호화 방법의 처리에 대해 설명하겠습니다.
원래 이 강의의 내용은 .net, php, 심지어 Delphi 웹브로커로도 쉽게 구현될 수 있다고 느꼈습니다. 하지만 iw를 사용한 후에 문제가 매우 복잡하다는 것을 알았습니다!
iw http 요청 데이터를 처리하는 클래스가 THttpRequest인데, THttpRequest의 속성과 메소드를 살펴보니 http 콘텐츠에 직접 접근할 수 있는 곳을 찾지 못한 것 같습니다. 하지만 실제로 코드를 실행하고 디버깅한 후에는 이 속성이 WeChat 서버에서 전달된 xml 파일을 전혀 가져올 수 없으며 콘텐츠가 항상 비어 있는 것으로 나타났습니다.
반복 검증 결과 이 ContentFields 속성은 http 요청에서 ContentType이 application/x-www-form-urlencoded일 때 전달된 키 값에 대해서만 유효한 것으로 나타났습니다. 즉, 이를 얻을 수 있습니다. 양식 형식의 제출에 대해서는 첫 번째 강의에서 WeChat 액세스의 경우입니다. WeChat에서 전달한 서명, 타임스탬프, nonce 및 기타 필드 값은 THttpRequest.ContentFields를 통해 가져올 수 있습니다.
이제 상황은 완전한 딜레마로 발전했습니다. 그러면 ContentType=text/xml일 때 THttpRequest 클래스 메서드를 사용하여 콘텐츠를 얻는 방법은 무엇입니까? 조사해본 결과 THttpRequest 클래스에 Files 속성이 있다는 것을 알게 되었는데, 결국 이 속성에 xml도 파일로 업로드할 수 있다는 생각이 들었습니다. ㅎㅎ 아쉽게도 당시에 아무리 실험을 하여도(DCU를 분해하는데 사용했습니다) 이 속성을 가진 파일의 개수는 항상 0개였고, 이 희망은 사라졌습니다!
그래서 iw 공식 질문게시판에 글을 올리고 조언을 구하기 시작했는데 1~2일 동안은 항상 읽어주시는 분들이 계셨는데 관련 질문을 여러번 검색해본 결과 답변이 없었습니다. 예전에 누군가 나를 만난 적이 있었는데, 같은 질문을 받았을 때 작성자는 질문자가 불분명하다고 대답하고 작성자에게 이메일로 코드를 보내달라고 요청했습니다. 코드를 작성하고 질문을 첨부했습니다. 네, 로스트 인 더 오션(Lost in the Ocean), 하하, 아이고, 당신을 그렇게 많이 사랑하는 것은 정말 쉽지 않습니다.
다른 사람의 질문을 계속 검색할 방법이 없습니다. 노력한 결과 마침내 질문자의 질문이 나와 다른 게시물을 찾았는데 답변자가 다음과 같이 언급했습니다. iw 데모 프로젝트의 PostFormData 예제를 다운로드한 데모를 즉시 확인해보니 해당 프로젝트가 전혀 없다는 것을 발견했습니다. 예제 프로젝트를 다시 다운로드하기 위해 공식 웹사이트에 갔습니다. 하하, 드디어 나왔습니다! 코드를 열고 살펴보면 이것이 사실이라는 것이 밝혀졌습니다! 첫 번째 강의와 마찬가지로 코드 한 줄이 며칠 동안 나를 괴롭혔다.
친구 여러분, 보세요:
는 "RegisterContentType" 메소드입니다. 하하, 생각나시나요? 도움말에 언급되어 있나요? 젠장!
드디어 작동합니다. 콘텐츠 유형 등록을 추가한 후 THttpRequest.Files를 사용하여 게시된 XML을 얻을 수 있습니다. 이는 제가 원래 예측한 것과 거의 같습니다.
사랑하는 여러분, iw와 같이 도움말이 불완전하고 소스 코드도 없는 웹 개발 프레임워크의 경우 질문 영역에서 검색하고 iw 데모가 가장 큰 도움이 됩니다. . iw를 사용해야 합니다. 최신 데모를 다운로드하여 살펴보세요.
더 이상 말할 내용이 없습니다. 모두가 볼 수 있도록 코드 스크린샷을 게시하겠습니다. WeChat 문서를 따르는 것이 더 쉽습니다.
TEventHandler 클래스:
서버에 배포한 후 WeChat 클라이언트로 스크린샷 테스트:
이것을 본다면 작은 비밀을 알려드리겠습니다.
제가 반복적으로 테스트한 결과 "RegisterContentType" 메서드는 SA 및 ISAPI 모드에서만 사용할 수 있습니다. 두 번째 튜토리얼에 따라 라이브러리로 컴파일하고 aspx 모드에 따라 배포하면 어쨌든 xml 파일을 가져올 수 없습니다. 배포 요구 사항으로 인해 프로젝트 유형만 변경되었으며 다른 코드는 없습니다. 왜 변경되었는지 모르겠습니다. 위에 보이는 스크린샷은 ISAPI를 사용하여 내 서버에 배포되었습니다.
마지막으로 WeChat 메시지의 xml 형식에 날짜 필드의 인코딩 및 디코딩 기능을 첨부합니다. TDateTime 유형의 WeChat 정수 값은 '1970-01-01 00:00:00'을 기준 시간으로 사용하여 두 번째 차이로 계산됩니다. 또 한 가지 주의할 점은 위챗 시간은 UTC 시간이므로 베이징 시간으로 변환할 때 8시간을 추가해야 한다는 점입니다.
///
/// WeChat의 날짜와 시간은 모두 int64 형식이며, 이는 1970-01-01 00:00:00의 두 번째 차이점입니다. 이 함수는 1970-01-01 00:00:00을 반환하는 데 사용됩니다. 시간 | 🎜>
함수 GetWxBaseDt
: TDateTime;
시작 🎜 > := VarToDateTime('1970-01-01 00:00:00'
; 🎜>///
/ // 현재 날짜를 적절하게 가져옵니다. WeChat의 경우 int64로 표현하면 현재 시간과 1970-01-01 00:00:00 3600*8을 UTC 시간으로 변환하고 두 번째 차이는 WeChat 시간입니다. 🎜>
///
함수 GetWxNow: Int64;
시작
결과 := 초 (현재, GetWxBaseDt) - 3600 * 8;
종료;
함수 GetWxNowStr: 문자열;
var
i64: Int64;
시작
i64 := GetWxNow;
결과 := IntToStr(i64);
끝;
///
/// WeChat XML에서 얻은 CreateTime 필드 값을 매개변수로 사용하여 함수
/// 시간을 TDatetime 유형으로 변환
///
// /
함수 ConvertWxDtToDateTime(wxDt: string ): TDateTime;
var i64
: Int64; :=
StrToInt64(
wxDt); 결과 := IncSecond(
GetWxBaseDt, i64 + 3600*8); >;WeChat 메시지 처리를 위한 delphi+intraweb 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!