Erstellen Sie bequem eine grundlegende Node.js WeChat-Dienstplattform eines Drittanbieters.
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 ( )
///
Der Beispielcode dient nur als Referenz und sollte entsprechend der tatsächlichen Situation angepasst werden.
Das WeChat Open Platform-Konto muss auf der WeChat Open Platform registriert werden. Nach der Registrierung erhalten Sie die Kontonummer und das Passwort. (Die bei der Registrierung angegebene E-Mail-Adresse wurde bisher noch nicht für öffentliche Konten und Miniprogramme registriert.)
Ein offenes WeChat-Plattformkonto kann mehrere Drittanbieterplattformen erstellen. Nach der Erstellung werden die App-ID und das AppSecret der Drittanbieterplattform abgerufen. Das heißt, im Code werden „componentAppId“ und „componentAppSecret“ verwendet. (Es gibt eine Obergrenze für die Anzahl der Drittanbieterplattformen, die Obergrenze für benutzerdefinierte Entwicklungsdienstanbietertypen beträgt 5 und die Obergrenze für Plattformdienstanbietertypen beträgt 5 )
toolkit . on ( EVENT_COMPONENT_VERIFY_TICKET , function ( result ) {
/* {
AppId: "wx304925fbea25bcbe",
CreateTime: "1562424829"
InfoType: "component_verify_ticket",
ComponentVerifyTicket: 'ticket@@@lEHjsBEi_TPDey0IZxw4Zbb7JRYLOtEf9ksvDpSwzkwog3R6xEpdaK0yIee7JOyOXM0V7cp0dpM58GKmb8FSKA'
} */
} )
Der WeChat-Server führt alle 10 Minuten einen Push durch, was dazu führt, dass der Dienst nach jedem Neustart des Prozesses 1 bis 10 Minuten lang nicht verfügbar ist (da alle anderen Funktionen von „component_verify_ticket“ abhängen). Die Lösung besteht darin, die letzten Push-Daten zu speichern und jedes Mal gestartet wird, wird das gleiche Ereignis aktiv ausgelöst. Beispiele sind wie folgt:
// !在所有侦听事件绑定完成后,再触发事件
// 从数据库(或其他地方)读取上次缓存的数据,通过事件通知给组件
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, restartUrl [, authType]) gibt die Plattformautorisierungs-Middleware des Drittanbieters zurück
events() gibt die Middleware für die Verarbeitung von Drittanbieter-Plattformautorisierungsereignissen zurück
message(componentAppId) gibt die Nachrichtenverarbeitungs-Middleware der autorisierenden Partei zurück
autoTest(componentAppId) gibt die Middleware zum Veröffentlichen von Testfällen im gesamten Netzwerk zurück
oauth(componentAppId, AuthorizerAppId, RedirectUrl [, Scope [, State]]) gibt die Authorizer-Webseiten-Autorisierungs-Middleware zurück
getAuthorizerInfo(componentAppId, ComponentAccessToken, AuthorizerAppId) ruft die grundlegenden Kontoinformationen des Autorisierers ab
clearQuota(componentAppId, ComponentAccessToken) Die Drittanbieterplattform setzt alle API-Aufrufe auf Null zurück
getJsApiConfig(authorizerAppId,authorizerJsApiTicket, url) ruft die JS-SDK-Konfiguration des Authorizers ab
getOauthAccessToken(componentAppId, ComponentAccessToken, AuthorizerAppId, Code) ruft das Webseiten-Autorisierungszugriffstoken des Autorisierers ab
getUserInfo(authorizerAccessToken, openId) ruft die Basisinformationen des autorisierten WeChat-Benutzers ab
send(authorizerAccessToken, openId, type, content) Kundendienstnachricht senden
getAuthorizerOptionInfo(componentAppId, ComponentAccessToken, AuthorizerAppId, OptionName) ruft die Optionseinstellungsinformationen des Autorisierers ab
setAuthorizerOption(componentAppId, ComponentAccessToken, AuthorizerAppId, OptionName, OptionValue) legt die Informationen zur Autorisierungsoption fest
createOpenAccount(authorizerAppId,authorizerAccessToken) erstellt ein offenes Plattformkonto und bindet das offizielle Konto/Miniprogramm
bindOpenAccount(openAppId,authorizerAppId,authorizerAccessToken) bindet das offizielle Konto/Miniprogramm an das Open-Platform-Konto
unbindOpenAccount(openAppId,authorizerAppId,authorizerAccessToken) entbindet das offizielle Konto/Miniprogramm vom Open-Platform-Konto
getOpenAccount(authorizerAppId,authorizerAccessToken) Ruft das offene Plattformkonto ab, das an das offizielle Konto/Miniprogramm gebunden ist
Gibt die Plattformautorisierungs-Middleware des Drittanbieters zurück.
Der Domänenname des RedirectUrl -Links muss mit dem Domänennamen des aktuellen Dienstes und dem von der WeChat-Drittanbieterplattform konfigurierten Domänennamen übereinstimmen.
authType gibt die optionalen Optionen an, die während der Autorisierung angezeigt werden. 1 bedeutet, dass nur offizielle Konten angezeigt werden, 2 bedeutet, dass nur Miniprogramme angezeigt werden und 3 bedeutet, dass offizielle Konten und Miniprogramme angezeigt werden. Der Standardwert ist 3 . Sie können auch die APPID des Autors übergeben, um den Autor anzugeben.
pageStyle gibt den Stil der Autorisierungsseite an. 1 bedeutet, dass der PC den Code zur Autorisierung scannt; 2 bedeutet, dass der WeChat-Browser geöffnet ist. Der Standardwert ist 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 )
Gibt die Middleware für die Verarbeitung von Autorisierungsereignissen der Plattform eines Drittanbieters zurück.
app . use ( '/wechat/events' , toolkit . events ( ) )
Gibt die Nachrichtenverarbeitungs-Middleware der autorisierten Partei zurück
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'
}
*/
} )
Wenn die Drittanbieterplattform eine Nachricht vom autorisierten Benutzer erhält, kann sie die passive Antwortfunktion verwenden, um auf die Nachricht zu antworten.
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 } ] )
}
} )
Gibt die Middleware zum Veröffentlichen von Testfällen im gesamten Netzwerk zurück. Diese Middleware muss hinter der Nachrichten-Middleware und vor anderer Middleware platziert werden.
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 )
} )
Kehren Sie zur offiziellen Website-Autorisierungs-Middleware des Drittanbieter-Plattformagenten WeChat zurück.
Scope ist der Autorisierungsumfang. Mögliche Werte sind: snsapi_base und snsapi_userinfo. Standard: 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 )
Erhalten Sie die grundlegenden Kontoinformationen der autorisierten Partei
let ret = await WechatOpenToolkit . getAuthorizerInfo ( componentAppId , componentAccessToken , authorizerAppId )
Rufen Sie das js-sdk-Konfigurationsobjekt des Autorisierers ab
let conf = WechatOpenToolkit . getJsApiConfig ( authorizerAppId , authorizerJsApiTicket , url )
/**
{
appId: '',
timestamp: 158923408,
nonceStr: '292jslk30dk',
signature: '20kjafj20dfhl2j0sjhk2h3f0afjasd2'
}
*/
Besorgen Sie sich das Zugriffstoken für die Webseitenautorisierung des Autors
let ret = await WechatOpenToolkit . getOauthAccessToken ( componentAppId , componentAccessToken , authorizerAppId , code )
Erhalten Sie die grundlegenden Informationen des autorisierten WeChat-Benutzers
let ret = await WechatOpenToolkit . getUserInfo ( authorizerAccessToken , openId )
Senden Sie eine Kundendienstnachricht
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' } ) // 发送图文消息
Diese API wird verwendet, um die Optionseinstellungsinformationen des offiziellen Kontos oder Miniprogramms der autorisierten Partei abzurufen, z. B. geografische Standortberichte, Spracherkennungsschalter und Multi-Kundenservice-Schalter.
let ret = await WechatOpenToolkit . getAuthorizerOptionInfo ( componentAppId , componentAccessToken , authorizerAppId , optionName )
Legen Sie Autorisierungsoptionen fest
Diese API wird verwendet, um die Optionsinformationen des offiziellen Kontos oder Miniprogramms der autorisierten Partei festzulegen, z. B. geografische Standortberichte, Spracherkennungsschalter und Multi-Kundenservice-Schalter.
await WechatOpenToolkit . setAuthorizerOption ( componentAppId , componentAccessToken , authorizerAppId , optionName , optionValue )
Die Drittanbieterplattform löscht alle API-Aufrufzeiten
await WechatOpenToolkit . clearQuota ( componentAppId , componentAccessToken )
Erstellen Sie ein offenes Plattformkonto und binden Sie ein offizielles Konto/Miniprogramm ein
let ret = await WechatOpenToolkit . createOpenAccount ( authorizerAppId , authorizerAccessToken )
Binden Sie das offizielle Konto/Miniprogramm an das offene Plattformkonto
await WechatOpenToolkit . bindOpenAccount ( openAppId , authorizerAppId , authorizerAccessToken )
Trennen Sie das offizielle Konto/Miniprogramm vom offenen Plattformkonto
await WechatOpenToolkit . unbindOpenAccount ( openAppId , authorizerAppId , authorizerAccessToken )
Besorgen Sie sich das offene Plattformkonto, das an das offizielle Konto/Miniprogramm gebunden ist
let ret = await WechatOpenToolkit . getOpenAccount ( authorizerAppId , authorizerAccessToken )