기본 Node.js WeChat 타사 서비스 플랫폼을 편리하게 구축하세요.
npm install wechat-open-toolkit
const express = require ( 'express' )
const app = express ( )
const WechatOpenToolkit = require ( 'wechat-open-toolkit' )
const {
EVENT_COMPONENT_VERIFY_TICKET , EVENT_AUTHORIZED , EVENT_UPDATE_AUTHORIZED ,
EVENT_UNAUTHORIZED , EVENT_COMPONENT_ACCESS_TOKEN , EVENT_AUTHORIZER_ACCESS_TOKEN ,
EVENT_AUTHORIZER_JSAPI_TICKET
} = WechatOpenToolkit
// 微信第三方平台列表
let list = [
{
componentAppId : '' , // 微信第三方平台 appId
componentAppSecret : '' , // 微信第三方平台 appSecret
token : '' , // 消息校验 Token
encodingAESKey : '' // 消息加解密 key
}
]
let toolkit = new WechatOpenToolkit ( { list } )
// 绑定全部事件
toolkit . on ( EVENT_COMPONENT_VERIFY_TICKET , ret => {
console . log ( ret )
} )
toolkit . on ( EVENT_AUTHORIZED , ret => {
console . log ( ret )
} )
toolkit . on ( EVENT_UPDATE_AUTHORIZED , ret => {
console . log ( ret )
} )
toolkit . on ( EVENT_UNAUTHORIZED , ret => {
console . log ( ret )
} )
toolkit . on ( EVENT_COMPONENT_ACCESS_TOKEN , ret => {
console . log ( ret )
} )
toolkit . on ( EVENT_AUTHORIZER_ACCESS_TOKEN , ret => {
console . log ( ret )
} )
toolkit . on ( EVENT_AUTHORIZER_JSAPI_TICKET , ret => {
console . log ( ret )
} )
toolkit . on ( 'error' , err => {
console . error ( err )
} )
// 通常需要绑定5个中间件
app . use ( '/wechat/events' , toolkit . events ( ) ) // 第三方平台事件接收中间件
list . forEach ( ( { componentAppId } ) => {
let authMiddleware = toolkit . auth ( componentAppId , 'https://domain.com/' ) // 第三方平台网页授权中间件
let msgMiddleware = toolkit . message ( componentAppId ) // 授权方用户消息接收中间件
let autoTestMiddleware = toolkit . autoTest ( componentAppId ) // 第三方平台全网发布测试中间件
app . get ( `/wechat/auth/ ${ componentAppId } ` , authMiddleware )
app . post ( `/wechat/message/ ${ componentAppId } /:authorizerAppId` , msgMiddleware , autoTestMiddleware , ( req , res ) => {
res . end ( 'success' )
console . log ( req . wechat )
} )
app . get ( `/wechat/oauth/ ${ componentAppId } /:authorizerAppId` , ( req , res ) => {
let { authorizerAppId } = req . params
let oauthMiddleware = toolkit . oauth ( componentAppId , authorizerAppId , 'https://domain.com/' ) // 授权方网页授权中间件
oauthMiddleware ( req , res )
} )
} )
app . listen ( 3000 )
console . log ( 'server start at 3000' )
const CoWechatApi = require ( 'co-wechat-api' )
const WechatApi = require ( 'wechat-api' )
let store = { } // 缓存数据
let componentAppId = 'test app id'
let authorizerAppId = 'test app id'
let api = new WechatApi ( '' , '' , callback => {
// 每次调用 api.方法(),都会从 store 对象取 access token
callback ( null , {
accessToken : store [ ` ${ componentAppId } / ${ authorizerAppId } ` ] ,
expireTime : Date . now ( ) + 1000 * 60
}
} )
let coApi = new CoWechatApi ( '' , '' , async ( ) => {
// 每次调用 api.方法(),都会从 store 对象取 access token
return {
accessToken : store [ ` ${ componentAppId } / ${ authorizerAppId } ` ] ,
expireTime : Date . now ( ) + 1000 * 60
}
} )
// 每次授权方 access token 更新时,同步更新缓存数据
toolkit . on ( EVENT_AUTHORIZER_ACCESS_TOKEN , function ( ret ) {
let { AppId , authorizer_appid , authorizer_access_token } = ret
store [ ` ${ AppID } / ${ authorizer_appid } ` ] = authorizer_access_token // 更新
} )
// 该功能需等到 access token 首次更新后,才能调用
api . sendText ( )
await coApi . sendText ( )
///
샘플 코드는 참고용이며 실제 상황에 따라 조정되어야 합니다.
WeChat Open Platform 계정은 WeChat Open Platform에 등록해야 합니다. 등록 후 계정 번호와 비밀번호를 받게 됩니다. (등록 시 제공한 이메일 주소는 이전에 공개 계정 및 미니 프로그램에 등록된 적이 없습니다.)
WeChat 개방형 플랫폼 계정은 여러 타사 플랫폼을 생성할 수 있으며, 생성 후 타사 플랫폼의 appId 및 appSecret을 얻게 됩니다. 즉, 코드에 사용되는 componentAppId 및 componentAppSecret 입니다. (타사 플랫폼 수에는 상한이 있으며, 맞춤형 개발 서비스 제공자 유형의 상한은 5 , 플랫폼 서비스 제공자 유형의 상한은 5 입니다.)
toolkit . on ( EVENT_COMPONENT_VERIFY_TICKET , function ( result ) {
/* {
AppId: "wx304925fbea25bcbe",
CreateTime: "1562424829"
InfoType: "component_verify_ticket",
ComponentVerifyTicket: 'ticket@@@lEHjsBEi_TPDey0IZxw4Zbb7JRYLOtEf9ksvDpSwzkwog3R6xEpdaK0yIee7JOyOXM0V7cp0dpM58GKmb8FSKA'
} */
} )
WeChat 서버는 10분마다 푸시하므로 각 프로세스가 다시 시작된 후 1~10분 동안 서비스를 사용할 수 없게 됩니다(다른 모든 기능은 component_verify_ticket에 의존하기 때문입니다). 해결책은 마지막 푸시 데이터를 저장하고 매번 푸시하는 것입니다. 시작되면 동일한 이벤트가 활발하게 트리거됩니다. 예는 다음과 같습니다:
// !在所有侦听事件绑定完成后,再触发事件
// 从数据库(或其他地方)读取上次缓存的数据,通过事件通知给组件
toolkit . emit ( EVENT_COMPONENT_VERIFY_TICKET , {
AppId : "wx52ffab2939ad" ,
CreateTime : "142345003"
InfoType : "component_verify_ticket" ,
ComponentVerifyTicket : 'ticket@@@lEHjsBEi_TPDey0IZxw4Zbb7JRYLOtEf9ksvDpSwzkwog3R6xEpdaK0yIee7JOyOXM0V7cp0dpM58GKmb8FSKA'
} )
toolkit . on ( EVENT_COMPONENT_ACCESS_TOKEN , function ( result ) {
/* {
component_access_token: 'M5CvflZyL5fkV29gU6MhQIoNsvzPEGBjYgmgA7yxnI_l8sblqm0QUULiMHoWY3gXPOnenZs3-42x_EenE1DEAg2F1K3X_fOI44h_eqxrV_7b0K7yc3pEGf_qTZl8HOlyCTSiAHAVML',
expires_in: 7200,
componentAppId: 'componentAppId'
} */
} )
toolkit . on ( EVENT_AUTHORIZER_ACCESS_TOKEN , function ( result ) {
/**
{
AppId: 'wx304925fbea25bcbe',
authorizer_appid: 'wxc736b9251b3c6c41',
authorizer_access_token: 'j7mR_dvcCAmUq5Iw-MuzE4sBT0unN-ukg7LR8EqZEQ1wZ7oyw0rs1Idk40d7uxriOubE3795JiFa3e5jDGdofRpTemXd2HLLV6p_i_Uwy7m2Rp-qv1k1ld-T9iCCDcVeQONdALDFDC',
authorizer_refresh_token: 'refreshtoken@@@6Esz0GgFsth_vRPtqjQd_aIQcCBcJ4iuzQFf3akLwgg',
expires_in: 7200
}
*/
} )
toolkit . on ( EVENT_AUTHORIZER_JSAPI_TICKET , function ( result ) {
/* {
errcode: 0,
errmsg: 'ok',
ticket: 'Zqqmael1_O_ddyFwCE14BtflzySMrtVpp086SHhK3P07xXnhjii2MTmKAGQHBwPOg8GsEtR9HG_dHUngs22ayQ',
expires_in: 7200,
componentAppId: 'wx304925fbea25bcbe',
authorizerAppId: 'wxc736b9251b3c6c41'
} */
} )
toolkit . on ( EVENT_AUTHORIZED , function ( result ) {
/* {
AppId: 'wx304925fbea25bcbe',
CreateTime: '1562428385',
InfoType: 'authorized',
AuthorizerAppid: 'wxc736b9251b3c6c41',
AuthorizationCode: 'queryauthcode@@@SozCwT_ve8WQI6Poum-qdGrrBrnQoX2rApglrUIMF0e308IQY7w_tCfAkndxzUth_YwHDto8DUsIeNrX4atetA',
AuthorizationCodeExpiredTime: '1562431985',
PreAuthCode: 'preauthcode@@@c4Uh5vOCS3wu9Bbx4tJWxplzkn5swwVHQc9xGtF57C1lfk_UeW50INZsh2flrwxh'
} */
} )
toolkit . on ( EVENT_UPDATE_AUTHORIZED , function ( result ) {
/* {
AppId: 'wx304925fbea25bcbe',
CreateTime: '1562426956',
InfoType: 'updateauthorized',
AuthorizerAppid: 'wxc736b9251b3c6c41',
AuthorizationCode: 'queryauthcode@@@SozCwT_ve8WQI6Poum-qdG_rFKaepJCyhL-zx1OkvsxmmJkbZadF78t3U9lh20IaWFqb2DcLne7MGVICr5eRfQ',
AuthorizationCodeExpiredTime: '1562430556',
PreAuthCode: 'preauthcode@@@ivkKNYhiXXsDFLBmH2ccOCg6doXsD_RdQOS7Cxw5GoILrdQktfx_glIzmhWQrMyT'
} */
} )
toolkit . on ( EVENT_UNAUTHORIZED , function ( result ) {
/* {
AppId: 'wx304925fbea25bcbe',
CreateTime: '1562428154',
InfoType: 'unauthorized',
AuthorizerAppid: 'wxc736b9251b3c6c41'
} */
} )
toolkit . on ( 'error' , function ( err ) {
console . error ( err )
} )
auth(comComponentAppId, RedirectUrl [, authType])은 타사 플랫폼 인증 미들웨어를 반환합니다.
events()는 타사 플랫폼 인증 이벤트 처리 미들웨어를 반환합니다.
message(comComponentAppId)는 승인 당사자 메시지 처리 미들웨어를 반환합니다.
autoTest(comComponentAppId)는 전체 네트워크에 테스트 사례를 게시하기 위한 미들웨어를 반환합니다.
oauth(comComponentAppId,authorizerAppId,redirectUrl[,scope[,state]])는 승인자 웹페이지 인증 미들웨어를 반환합니다.
getAuthorizerInfo(comComponentAppId, componentAccessToken, AuthorizerAppId)는 권한 부여자의 기본 계정 정보를 가져옵니다.
clearQuota(comComponentAppId, componentAccessToken) 타사 플랫폼은 모든 API 호출을 0으로 지웁니다.
getJsApiConfig(authorizerAppId, AuthorizerJsApiTicket, url)는 승인자 js SDK 구성을 가져옵니다.
getOauthAccessToken(comComponentAppId, componentAccessToken, AuthorizerAppId, code)는 승인자의 웹페이지 승인 액세스 토큰을 얻습니다.
getUserInfo(authorizerAccessToken, openId)는 권한 부여자 WeChat 사용자의 기본 정보를 가져옵니다.
send(authorizerAccessToken, openId, type, content) 고객 서비스 메시지 보내기
getAuthorizerOptionInfo(comComponentAppId, componentAccessToken, AuthorizerAppId, optionName)는 Authorizer의 옵션 설정 정보를 가져옵니다.
setAuthorizerOption(comComponentAppId, componentAccessToken, AuthorizerAppId, optionName, optionValue)는 권한 부여 옵션 정보를 설정합니다.
createOpenAccount(authorizerAppId, AuthorizerAccessToken)는 오픈 플랫폼 계정을 생성하고 공식 계정/미니 프로그램을 바인딩합니다.
binOpenAccount(openAppId, AuthorizerAppId, AuthorizerAccessToken)는 공식 계정/미니 프로그램을 오픈 플랫폼 계정에 바인딩합니다.
unbindOpenAccount(openAppId, AuthorizerAppId, AuthorizerAccessToken)는 오픈 플랫폼 계정에서 공식 계정/미니 프로그램 바인딩을 해제합니다.
getOpenAccount(authorizerAppId, AuthorizerAccessToken) 공식 계정/미니 프로그램에 바인딩된 오픈 플랫폼 계정을 가져옵니다.
타사 플랫폼 인증 미들웨어를 반환합니다.
RedirectUrl 링크의 도메인 이름은 현재 서비스의 도메인 이름 및 WeChat 타사 플랫폼에서 구성한 도메인 이름과 동일해야 합니다.
authType은 인증 중에 표시되는 선택적 옵션을 지정합니다. 1은 공식 계정만 표시, 2는 미니 프로그램만 표시, 3은 공식 계정과 미니 프로그램만 표시를 의미합니다. 기본값은 3 입니다. 승인자 APPID를 전달하여 승인자를 지정할 수도 있습니다.
pageStyle은 인증 페이지의 스타일을 지정합니다. 1은 인증을 위한 PC 스캔 코드를 의미하고, 2는 WeChat 브라우저가 열려 있음을 의미합니다. 기본값은 1 입니다.
const { AUTH_TYPE_BOTH , PAGE_STYLE_PC } = require ( 'wechat-open-toolkit' )
let componentAppId = 'wx52ffab2939ad'
let redirectUrl = 'https://domain.com/authorized'
let authMiddleware = toolkit . auth ( componentAppId , redirectUrl , AUTH_TYPE_BOTH , PAGE_STYLE_PC )
// 浏览器打开该路由即可扫码授权
app . get ( `/wechat/auth/ ${ componentAppId } ` , authMiddleware )
타사 플랫폼 인증 이벤트 처리 미들웨어를 반환합니다.
app . use ( '/wechat/events' , toolkit . events ( ) )
승인 당사자 메시지 처리 미들웨어를 반환합니다.
const componentAppId = 'wx52ffab2939ad'
let msgMiddleware = toolkit . message ( componentAppId ) // 用户消息中间件
app . post ( `/wechat/message/ ${ componentAppId } /:authorizerAppId` , msgMiddleware , ( req , res ) => {
console . log ( req . wechat )
/**
{
ToUserName: 'gh_2a33e5f5a9b0',
FromUserName: 'oVtjJv5NEub-fbE7E6_P2_jCLMXo',
CreateTime: '1508406464',
MsgType: 'text',
Content: 'hello world',
MsgId: '6478556432393017916'
}
*/
} )
제3자 플랫폼은 승인된 당사자 사용자로부터 메시지를 받으면 수동 응답 기능을 사용하여 메시지에 응답할 수 있습니다.
let componentAppId = 'wx52ffab2939ad' // 第三方平台APPID
let msgMiddleware = toolkit . message ( componentAppId ) // 用户消息中间件
app . post ( `/wechat/message/ ${ componentAppId } /:authorizerAppId` , msgMiddleware , ( req , res ) => {
let { MsgType , Content , MediaId , Label , Title , Description , Url } = req . wechat
switch ( MsgType ) {
case 'text' :
res . text ( Content ) // 被动回复文本消息
break ;
case 'image' :
res . image ( MediaId ) // 被动回复图片消息
break ;
case 'voice' :
res . voice ( MediaId ) // 被动回复语音消息
break ;
case 'video' :
res . video ( MediaId ) // 被动回复视频消息
break ;
case 'location' :
res . text ( Label )
break ;
case 'link' :
res . news ( [ { Title , Description , Url } ] )
}
} )
전체 네트워크에 테스트 사례를 게시하기 위한 미들웨어를 반환합니다. 이 미들웨어는 메시지 미들웨어 뒤, 다른 미들웨어 앞에 배치되어야 합니다.
let componentAppId = 'wx52ffab2939ad'
let msgMiddleware = toolkit . message ( componentAppId ) // 用户消息中间件
let testMiddleware = toolkit . autoTest ( componentAppId ) // 全网发布测试中间件
app . post ( `/wechat/message/ ${ componentAppId } /:authorizerAppId` , msgMiddleware , testMiddleware , ( req , res ) => {
res . end ( 'success' ) // 响应微信服务器
console . log ( req . wechat )
} )
제3자 플랫폼 에이전트 WeChat 공식 계정 웹페이지 인증 미들웨어로 돌아갑니다.
범위는 인증 범위입니다. 가능한 값은 snsapi_base 및 snsapi_userinfo입니다. 기본값: snsapi_base
const { OAUTH_TYPE_USERINFO } = require ( 'wechat-open-toolkit' )
let componentAppId = 'wx304925fbea25bcbe'
let authorizerAppId = 'wxc736b9251b3c6c41'
let redirectUrl = 'https://domain.com/authorized'
let oauthMiddleware = toolkit . oauth ( componentAppId , authorizerAppId , redirectUrl , OAUTH_TYPE_USERINFO )
app . get ( `/wechat/oauth/ ${ componentAppId } / ${ authorizerAppId } ` , oauthMiddleware )
승인된 당사자의 기본 계정 정보를 얻습니다.
let ret = await WechatOpenToolkit . getAuthorizerInfo ( componentAppId , componentAccessToken , authorizerAppId )
승인자의 js SDK 구성 객체를 가져옵니다.
let conf = WechatOpenToolkit . getJsApiConfig ( authorizerAppId , authorizerJsApiTicket , url )
/**
{
appId: '',
timestamp: 158923408,
nonceStr: '292jslk30dk',
signature: '20kjafj20dfhl2j0sjhk2h3f0afjasd2'
}
*/
승인자의 웹페이지 승인 액세스 토큰을 얻습니다.
let ret = await WechatOpenToolkit . getOauthAccessToken ( componentAppId , componentAccessToken , authorizerAppId , code )
승인된 WeChat 사용자의 기본 정보를 얻습니다.
let ret = await WechatOpenToolkit . getUserInfo ( authorizerAccessToken , openId )
고객 서비스 메시지 보내기
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'text' , { content : '消息内容' } ) // 发送文本消息
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'image' , { media_id : 'MEDIA_ID' } ) // 发送图片消息
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'voice' , { media_id : 'MEDIA_ID' } ) // 发送语音消息
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'video' , {
media_id : 'MEDIA_ID' ,
thumb_media_id : 'MEDIA_ID' ,
title : 'TITLE' ,
description : 'DESCRIPTION'
} ) // 发送视频消息
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'music' , {
title : 'TITLE' ,
description : 'DESCRIPTION' ,
musicurl : 'MUSIC_URL' ,
hqmusicurl : 'HQ_MUSIC_URL' ,
thumb_media_id : 'MEDIA_ID'
} ) // 发送音乐消息
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'news' , {
articles : [ {
title : 'TITLE' ,
description : 'DESCRIPTION' ,
url : 'URL' ,
picurl : 'PIC_URL'
} ]
} ) // 发送图文消息
await WechatOpenToolkit . send ( authorizerAccessToken , openId , 'mpnews' , { media_id : 'MEDIA_ID' } ) // 发送图文消息
이 API는 지리적 위치 보고, 음성 인식 스위치, 다중 고객 서비스 스위치 등 승인된 당사자의 공식 계정 또는 미니 프로그램의 옵션 설정 정보를 얻는 데 사용됩니다.
let ret = await WechatOpenToolkit . getAuthorizerOptionInfo ( componentAppId , componentAccessToken , authorizerAppId , optionName )
승인자 옵션 설정
이 API는 지리적 위치 보고, 음성 인식 스위치, 다중 고객 서비스 스위치 등 승인된 당사자의 공식 계정 또는 미니 프로그램의 옵션 정보를 설정하는 데 사용됩니다.
await WechatOpenToolkit . setAuthorizerOption ( componentAppId , componentAccessToken , authorizerAppId , optionName , optionValue )
타사 플랫폼은 모든 API 호출 시간을 지웁니다.
await WechatOpenToolkit . clearQuota ( componentAppId , componentAccessToken )
오픈 플랫폼 계정 생성 및 공식 계정/미니 프로그램 연동
let ret = await WechatOpenToolkit . createOpenAccount ( authorizerAppId , authorizerAccessToken )
공식 계정/미니 프로그램을 오픈 플랫폼 계정에 바인딩
await WechatOpenToolkit . bindOpenAccount ( openAppId , authorizerAppId , authorizerAccessToken )
오픈 플랫폼 계정에서 공식 계정/미니 프로그램 연결 해제
await WechatOpenToolkit . unbindOpenAccount ( openAppId , authorizerAppId , authorizerAccessToken )
공식계정/미니프로그램과 연동된 오픈플랫폼 계정 획득
let ret = await WechatOpenToolkit . getOpenAccount ( authorizerAppId , authorizerAccessToken )