> 웹 프론트엔드 > JS 튜토리얼 > 메시지 관리를 위해 Koa2 WeChat 공개 계정을 운영하는 방법

메시지 관리를 위해 Koa2 WeChat 공개 계정을 운영하는 방법

php中世界最好的语言
풀어 주다: 2018-05-29 11:15:19
원래의
2463명이 탐색했습니다.

메시지 수신

일반 WeChat 사용자가 공개 계정으로 메시지를 보내면 WeChat 서버는 메시지의 XML 데이터 패킷을 개발자가 입력한 URL에 게시합니다.

2.1 공통 메시지 데이터 형식 수신

XML의 구조는 기본적으로 고정되어 있으며 메시지 유형에 따라 조금씩 다릅니다.

사용자가 문자 메시지를 보낼 때 WeChat 공개 계정에서 받는 XML 데이터 형식은 다음과 같습니다.

<xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>createTime</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
</xml>
로그인 후 복사

사용자가 사진 메시지를 보낼 때 WeChat 공용 계정에서 받는 XML 데이터 형식은 다음과 같습니다.

<xml> 
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime> 
 <MsgType><![CDATA[image]]></MsgType> 
 <PicUrl><![CDATA[this is a url]]></PicUrl>
 <MediaId><![CDATA[media_id]]></MediaId> 
 <MsgId>1234567890123456</MsgId>
</xml>
로그인 후 복사

다른 메시지 유형 구조는 [WeChat 공개 플랫폼 개발 문서]를 참조하세요.

POST 요청 처리에 대해 koa2는 매개변수를 얻는 방법을 캡슐화하지 않으며 기본 node.js를 구문 분석해야 합니다. 직접 컨텍스트에서 객체 요청을 요청하세요. 데이터를 가져오기 위해 row-body 모듈을 사용할 것입니다.

2.2 먼저 이전 코드를 최적화하겠습니다

이 섹션의 코드는 이전 세션을 기반으로 약간 변경된 이전 세션에서 구현된 코드를 따릅니다.

'use strict'
const Koa = require('koa')
const app = new Koa()
const crypto = require('crypto')
// 将配置文件独立到config.js
const config = require('./config')
app.use(async ctx => {
 // GET 验证服务器
 if (ctx.method === 'GET') {
  const { signature, timestamp, nonce, echostr } = ctx.query
  const TOKEN = config.wechat.token
  let hash = crypto.createHash('sha1')
  const arr = [TOKEN, timestamp, nonce].sort()
  hash.update(arr.join(''))
  const shasum = hash.digest('hex')
  if (shasum === signature) {
   return ctx.body = echostr
  }
  ctx.status = 401
  ctx.body = 'Invalid signature'
 } else if (ctx.method === 'POST') { // POST接收数据
  // TODO
 }
});
app.listen(7001);
로그인 후 복사

여기서는 GET에서 서명 값이 유효한지 여부만 확인했습니다. 실제로 POST에서도 서명을 확인해야 합니다.

서명 확인을 함수로 작성

function getSignature (timestamp, nonce, token) {
 let hash = crypto.createHash('sha1')
 const arr = [token, timestamp, nonce].sort()
 hash.update(arr.join(''))
 return hash.digest('hex')
}
로그인 후 복사

코드 최적화 및 POST에 확인 추가

...
app.use(async ctx => {
 const { signature, timestamp, nonce, echostr } = ctx.query
 const TOKEN = config.wechat.token
 if (ctx.method === 'GET') {
  if (signature === getSignature(timestamp, nonce, TOKEN)) {
   return ctx.body = echostr
  }
  ctx.status = 401
  ctx.body = 'Invalid signature'
 }else if (ctx.method === 'POST') {
  if (signature !== getSignature(timestamp, nonce, TOKEN)) {
   ctx.status = 401
   return ctx.body = 'Invalid signature'
  }
  // TODO
 }
});
...
로그인 후 복사

지금까지 XML 데이터 패킷을 받아들이는 기능을 구현하지는 않았지만 이전 코드를 수정하고 있습니다. 이는 실제 개발 프로세스를 보여주기 위한 것입니다. 모든 코드 작성은 한 단계 프로세스가 아니며, 좋은 코드는 수정만 가능합니다.

2.3 공개 계정에서 일반 메시지의 XML 데이터 패킷 수신

이제 이 섹션의 요점으로 가서 XML 데이터 패킷을 수락하고 JSON으로 변환하겠습니다.

$ npm install raw-body --save
로그인 후 복사
...
const getRawBody = require('raw-body')
...
// TODO
// 取原始数据
const xml = await getRawBody(ctx.req, {
 length: ctx.request.length,
 limit: '1mb',
 encoding: ctx.request.charset || 'utf-8'
});
console.log(xml)
return ctx.body = 'success' // 直接回复success,微信服务器不会对此作任何处理
로그인 후 복사

테스트 계정에 문자 메시지를 보내면 다음과 같은 작업을 할 수 있습니다. 명령줄에서 확인하세요. 다음 데이터를 인쇄하세요

<xml>
 <ToUserName><![CDATA[gh_9d2d49e7e006]]></ToUserName>
 <FromUserName><![CDATA[oBp2T0wK8lM4vIkmMTJfFpk6Owlo]]></FromUserName>
 <CreateTime>1516940059</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[JavaScript之禅]]></Content>
 <MsgId>6515207943908059832</MsgId>
</xml>
로그인 후 복사

축하합니다. 이제 XML 데이터를 받을 수 있습니다.

위 내용은 메시지 관리를 위해 Koa2 WeChat 공개 계정을 운영하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿