1. 기업 계정의 콜백 모드 설정
공개 계정과 유사하게 WeChat 기업 계정에 2차 개발이 필요한 경우 해당 콜백 매개변수를 백그라운드에서 설정해야 합니다. 다음 인터페이스.
이를 설정하고 확인을 통과하면 자체 WeChat 애플리케이션 서버에서 메시지를 보내고 받을 수 있습니다.
콜백 메시지 입력 시 POST 데이터와 일반 GET 데이터를 별도로 처리해야 합니다. GET 데이터는 WeChat 자체 확인 처리이고 POST 데이터는 WeChat 메시지의 대화형 작업입니다.
/// <summary> /// 企业号回调信息接口。统一接收并处理信息的入口。 /// </summary> public class corpapi : IHttpHandler { /// <summary> /// 处理企业号的信息 /// </summary> /// <param name="context"></param> public void ProcessRequest(HttpContext context) {
위에서 우리는 메시지를 처리하는 일반 애플리케이션 핸들러를 정의했습니다.
그런 다음 다양한 메시지 유형(POST, GET 방식)을 분리하여 그에 따라 처리합니다.
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST") { using (Stream stream = HttpContext.Current.Request.InputStream) { Byte[] postBytes = new Byte[stream.Length]; stream.Read(postBytes, 0, (Int32)stream.Length); postString = Encoding.UTF8.GetString(postBytes); } if (!string.IsNullOrEmpty(postString)) { Execute(postString, accountInfo); } } else { Auth(accountInfo); }
다음은 WeChat의 콜백 모드 및 확인 URL에 대한 지침입니다.
URL 유효성 확인
위 정보를 제출하면 기업 계정은 입력된 URL로 GET 요청을 보냅니다. GET 요청에는 4개의 매개변수가 포함됩니다. 기업은 을 얻을 때 urldecode 처리를 수행해야 합니다. 그렇지 않으면 확인이 실패합니다.
参数 | 描述 | 是否必带 |
---|---|---|
msg_signature | 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体 | 是 |
timestamp | 时间戳 | 是 |
nonce | 随机数 | 是 |
echostr | 加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 | 首次校验时必带 |
기업은 msg_signature 매개변수를 통해 요청을 확인합니다. GET 요청이 기업 계정에서 온 것으로 확인되면 기업 애플리케이션은 echostr 매개변수를 해독하고 echostr 일반 텍스트를 다음과 같이 반환합니다. (따옴표 없음)이면 액세스 인증이 적용되고 콜백 모드를 켤 수 있습니다.
이후 기업에 콜백이 이루어질 때 위의 매개변수(echostr 제외)가 요청 URL에 포함되며, 확인 방법은 첫 번째 확인 URL과 동일합니다.
위 지침에 따라 이러한 매개변수를 얻은 다음 WeChat에서 제공하는 메시지 처리 기능을 호출하여 암호화 및 암호 해독 처리를 수행해야 합니다.
URL을 확인하는 Auth(accountInfo); 작업에서 전달된 매개변수 정보를 얻은 후 이를 기본 클래스에 전달하여 처리하는 핵심 내용은 다음과 같음을 알 수 있습니다. 메시지의 서명 내용.
#region 具体处理逻辑 string echoString = HttpContext.Current.Request.QueryString["echoStr"]; string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature string timestamp = HttpContext.Current.Request.QueryString["timestamp"]; string nonce = HttpContext.Current.Request.QueryString["nonce"]; string decryptEchoString = ""; if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString)) { if (!string.IsNullOrEmpty(decryptEchoString)) { HttpContext.Current.Response.Write(decryptEchoString); HttpContext.Current.Response.End(); } } #endregion
인증코드 부서는 아래와 같습니다.
/// <summary> /// 验证企业号签名 /// </summary> /// <param name="token">企业号配置的Token</param> /// <param name="signature">签名内容</param> /// <param name="timestamp">时间戳</param> /// <param name="nonce">nonce参数</param> /// <param name="corpId">企业号ID标识</param> /// <param name="encodingAESKey">加密键</param> /// <param name="echostr">内容字符串</param> /// <param name="retEchostr">返回的字符串</param> /// <returns></returns> public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr) { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId); int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr); if (result != 0) { LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result); return false; } return true; }
위에서 소개한 것처럼 URL에 대한 WeChat 기업 계정의 확인 과정에는 또 다른 메시지가 있습니다. 처리 프로세스는 WeChat 서버가 처리를 위해 메시지를 자체 애플리케이션 서버로 보내는 프로세스입니다. 당사 애플리케이션 서버는 메시지를 수신한 후 적시에 정기적인 응답 처리를 수행해야 합니다.
은 아래의 코드 로직입니다.
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST") { using (Stream stream = HttpContext.Current.Request.InputStream) { Byte[] postBytes = new Byte[stream.Length]; stream.Read(postBytes, 0, (Int32)stream.Length); postString = Encoding.UTF8.GetString(postBytes); } if (!string.IsNullOrEmpty(postString)) { Execute(postString, accountInfo); } }
마찬가지로 WeChat 서버에 대한 메시지에 응답할 때 해당 매개변수도 가져온 다음 메시지 응답을 구성해야 합니다.
string echoString = HttpContext.Current.Request.QueryString["echoStr"]; string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature string timestamp = HttpContext.Current.Request.QueryString["timestamp"]; string nonce = HttpContext.Current.Request.QueryString["nonce"];
그리고 일부 다른 매개변수 정보는 기업 계정의 구성 매개변수에서 가져옵니다.
//获取配置参数并对加解密函数初始化 string CorpToken = accountInfo.Token; string AESKey = accountInfo.EncodingAESKey; string CorpId = accountInfo.CorpID;
그런 다음 WeChat에서 제공하는 메시지 암호화 및 복호화 클래스를 사용하여 메시지를 성공적으로 암호화하고 복호화합니다. 구체적인 연산 코드는 다음과 같습니다.
//根据参数信息,初始化微信对应的消息加密解密类 WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(CorpToken, AESKey, CorpId); //对收到的密文进行解析处理 string sMsg = ""; // 解析之后的明文 int flag = wxcpt.DecryptMsg(signature, timestamp, nonce, postStr, ref sMsg); if (flag == 0) { //LogTextHelper.Info("记录解密后的数据:"); //LogTextHelper.Info(sMsg);//记录解密后的数据 CorpApiDispatch dispatch = new CorpApiDispatch(); string responseContent = dispatch.Execute(sMsg); //加密后并发送 //LogTextHelper.Info(responseContent); string encryptResponse = ""; timestamp = DateTime.Now.DateTimeToInt().ToString(); wxcpt.EncryptMsg(responseContent, timestamp, nonce, ref encryptResponse, ref signature); HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(encryptResponse); } else { LogTextHelper.Info("解密消息失败!"); }
마지막으로, 통합 처리를 위해 복호화된 메시지를 해당 캡슐화 클래스에 넘겨주기만 하면 됩니다.
CorpApiDispatch dispatch = new CorpApiDispatch(); string responseContent = dispatch.Execute(sMsg);
이런 방식으로 Enterprise API를 캡슐화할 때 메시지에 응답하는 방법의 논리에만 집중하면 됩니다. 나머지도 신경써야 해요.
WeChat 포털의 추가 C# 개발 및 WeChat 기업 계정 수신, 메시지 처리 및 암호 해독 애플리케이션 이벤트 관련 기사는 PHP 중국어 홈페이지를 주목해주세요!