Crie convenientemente uma plataforma básica de serviços de terceiros WeChat Node.js.
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 ( )
///
O código de amostra é apenas para referência e deve ser ajustado de acordo com a situação real.
A conta WeChat Open Platform precisa ser registrada na WeChat Open Platform. Após o registro, você receberá o número da conta e a senha. (O endereço de e-mail fornecido durante o registro não foi registrado anteriormente para contas públicas e miniprogramas)
Uma conta de plataforma aberta WeChat pode criar várias plataformas de terceiros. Após a criação, o appId e o appSecret da plataforma de terceiros serão obtidos. Ou seja, componentAppId e componentAppSecret usados no código. (Há um limite superior para o número de plataformas de terceiros, o limite superior para tipos de provedores de serviços de desenvolvimento personalizados é 5 e o limite superior para tipos de provedores de serviços de plataforma é 5 )
toolkit . on ( EVENT_COMPONENT_VERIFY_TICKET , function ( result ) {
/* {
AppId: "wx304925fbea25bcbe",
CreateTime: "1562424829"
InfoType: "component_verify_ticket",
ComponentVerifyTicket: 'ticket@@@lEHjsBEi_TPDey0IZxw4Zbb7JRYLOtEf9ksvDpSwzkwog3R6xEpdaK0yIee7JOyOXM0V7cp0dpM58GKmb8FSKA'
} */
} )
O servidor WeChat fará push a cada 10 minutos, o que fará com que o serviço fique indisponível por 1 a 10 minutos após cada reinicialização do processo (porque todas as outras funções dependem de component_verify_ticket A solução é armazenar os últimos dados de push, e cada vez que ele). é iniciado, o mesmo evento é acionado ativamente. Os exemplos são os seguintes:
// !在所有侦听事件绑定完成后,再触发事件
// 从数据库(或其他地方)读取上次缓存的数据,通过事件通知给组件
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(componentAppId, redirectUrl [, authType]) retorna o middleware de autorização da plataforma de terceiros
events() retorna o middleware de processamento de eventos de autorização da plataforma de terceiros
message(componentAppId) retorna o middleware de processamento de mensagens da parte autorizadora
autoTest(componentAppId) retorna o middleware para publicação de casos de teste em toda a rede
oauth(componentAppId,authorizerAppId,redirectUrl [, scope [, state]]) retorna o middleware de autorização da página da web do autorizador
getAuthorizerInfo(componentAppId, componentAccessToken, authorizerAppId) obtém as informações básicas da conta do autorizador
clearQuota(componentAppId, componentAccessToken) A plataforma de terceiros limpa todas as chamadas de API para zero
getJsApiConfig(authorizerAppId, authorizerJsApiTicket, url) obtém a configuração do autorizador js sdk
getOauthAccessToken(componentAppId, componentAccessToken, authorizerAppId, code) obtém o token de acesso de autorização da página da web do autorizador
getUserInfo(authorizerAccessToken, openId) obtém as informações básicas do usuário autorizador do WeChat
send(authorizerAccessToken, openId, type, content) Enviar mensagem de atendimento ao cliente
getAuthorizerOptionInfo(componentAppId, componentAccessToken, authorizerAppId, optionName) obtém as informações de configuração da opção do autorizador
setAuthorizerOption(componentAppId, componentAccessToken, authorizerAppId, optionName, optionValue) define as informações da opção do autorizador
createOpenAccount(authorizerAppId, authorizerAccessToken) cria uma conta de plataforma aberta e vincula a conta oficial/mini programa
bindOpenAccount(openAppId,authorizerAppId,authorizerAccessToken) vincula a conta oficial/miniprograma à conta da plataforma aberta
unbindOpenAccount(openAppId,authorizerAppId,authorizerAccessToken) desvincula a conta oficial/miniprograma da conta da plataforma aberta
getOpenAccount(authorizerAppId, authorizerAccessToken) Obtém a conta da plataforma aberta vinculada à conta oficial/mini programa
Retorna o middleware de autorização da plataforma de terceiros.
O nome de domínio do link redirectUrl deve ser igual ao nome de domínio do serviço atual e ao nome de domínio configurado pela plataforma de terceiros WeChat.
authType especifica as opções opcionais exibidas durante a autorização. 1 significa exibir apenas contas oficiais, 2 significa exibir apenas miniprogramas e 3 significa exibir contas oficiais e miniprogramas. O padrão é 3 . Você também pode passar o APPID do autorizador para especificar o autorizador.
pageStyle especifica o estilo da página de autorização. 1 significa código de verificação do PC para autorização; 2 significa que o navegador WeChat está aberto. O valor padrão é 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 )
Retorna o middleware de processamento de eventos de autorização de plataforma de terceiros.
app . use ( '/wechat/events' , toolkit . events ( ) )
Retorna o middleware de processamento de mensagens da parte autorizadora
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'
}
*/
} )
Quando a plataforma de terceiros recebe uma mensagem do usuário autorizado, ela pode usar a função de resposta passiva para responder à mensagem.
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 } ] )
}
} )
Retorna o middleware para publicação de casos de teste em toda a rede. Este middleware precisa ser colocado atrás do middleware de mensagem e antes de outro middleware.
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 )
} )
Retorne ao middleware de autorização da página da web da conta oficial do agente de plataforma de terceiros WeChat.
scope é o escopo da autorização. Os valores possíveis são: snsapi_base e snsapi_userinfo. Padrão: 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 )
Obtenha as informações básicas da conta da parte autorizada
let ret = await WechatOpenToolkit . getAuthorizerInfo ( componentAppId , componentAccessToken , authorizerAppId )
Obtenha o objeto de configuração js SDK do autorizador
let conf = WechatOpenToolkit . getJsApiConfig ( authorizerAppId , authorizerJsApiTicket , url )
/**
{
appId: '',
timestamp: 158923408,
nonceStr: '292jslk30dk',
signature: '20kjafj20dfhl2j0sjhk2h3f0afjasd2'
}
*/
Obtenha o token de acesso de autorização da página da web do autorizador
let ret = await WechatOpenToolkit . getOauthAccessToken ( componentAppId , componentAccessToken , authorizerAppId , code )
Obtenha as informações básicas do usuário autorizado do WeChat
let ret = await WechatOpenToolkit . getUserInfo ( authorizerAccessToken , openId )
Enviar mensagem de atendimento ao cliente
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' } ) // 发送图文消息
Esta API é usada para obter informações de configuração de opções da conta oficial ou miniprograma da parte autorizada, como: relatórios de localização geográfica, troca de reconhecimento de voz e troca de atendimento multicliente.
let ret = await WechatOpenToolkit . getAuthorizerOptionInfo ( componentAppId , componentAccessToken , authorizerAppId , optionName )
Definir opções do autorizador
Esta API é usada para definir as informações de opção da conta oficial ou miniprograma da parte autorizada, como: relatório de localização geográfica, troca de reconhecimento de voz e troca de atendimento multicliente.
await WechatOpenToolkit . setAuthorizerOption ( componentAppId , componentAccessToken , authorizerAppId , optionName , optionValue )
A plataforma de terceiros limpa todos os tempos de chamada da API
await WechatOpenToolkit . clearQuota ( componentAppId , componentAccessToken )
Crie uma conta de plataforma aberta e vincule a conta oficial/mini programa
let ret = await WechatOpenToolkit . createOpenAccount ( authorizerAppId , authorizerAccessToken )
Vincule a conta oficial/mini programa à conta da plataforma aberta
await WechatOpenToolkit . bindOpenAccount ( openAppId , authorizerAppId , authorizerAccessToken )
Desvincule a conta oficial/mini programa da conta da plataforma aberta
await WechatOpenToolkit . unbindOpenAccount ( openAppId , authorizerAppId , authorizerAccessToken )
Obtenha a conta da plataforma aberta vinculada à conta oficial/mini programa
let ret = await WechatOpenToolkit . getOpenAccount ( authorizerAppId , authorizerAccessToken )