일반 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!