สร้างแพลตฟอร์มบริการบุคคลที่สาม 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(componentAppId, เปลี่ยนเส้นทางUrl [, authType]) ส่งคืนมิดเดิลแวร์การอนุญาตแพลตฟอร์มบุคคลที่สาม
events() ส่งคืนมิดเดิลแวร์ประมวลผลเหตุการณ์การอนุญาตแพลตฟอร์มบุคคลที่สาม
message(componentAppId) ส่งคืนมิดเดิลแวร์ประมวลผลข้อความของฝ่ายที่ได้รับอนุญาต
autoTest(componentAppId) ส่งคืนมิดเดิลแวร์สำหรับการเผยแพร่กรณีทดสอบทั่วทั้งเครือข่าย
oauth(componentAppId, authorizerAppId, เปลี่ยนเส้นทางUrl [, ขอบเขต [, สถานะ]]) ส่งคืนมิดเดิลแวร์การอนุญาตหน้าเว็บของผู้อนุญาต
getAuthorizerInfo(componentAppId, componentAccessToken, authorizerAppId) รับข้อมูลบัญชีพื้นฐานของผู้อนุญาต
clearQuota(componentAppId, componentAccessToken) แพลตฟอร์มบุคคลที่สามจะล้างการเรียก API ทั้งหมดให้เป็นศูนย์
getJsApiConfig (authorizerAppId, authorizerJsApiTicket, url) รับการกำหนดค่า authorizer js sdk
getOauthAccessToken(componentAppId, componentAccessToken, authorizerAppId, code) รับโทเค็นการเข้าถึงเว็บเพจของผู้อนุญาต
getUserInfo(authorizerAccessToken, openId) รับข้อมูลพื้นฐานของผู้ใช้ WeChat ของผู้อนุญาต
send(authorizerAccessToken, openId, ประเภท, เนื้อหา) ส่งข้อความบริการลูกค้า
getAuthorizerOptionInfo(componentAppId, componentAccessToken, authorizerAppId, optionName) รับข้อมูลการตั้งค่าตัวเลือกของผู้อนุญาต
setAuthorizerOption(componentAppId, componentAccessToken, authorizerAppId, optionName, optionValue) ตั้งค่าข้อมูลตัวเลือกของผู้อนุญาต
createOpenAccount(authorizerAppId, authorizerAccessToken) สร้างบัญชีแพลตฟอร์มแบบเปิดและผูกบัญชีอย่างเป็นทางการ/มินิโปรแกรม
bindOpenAccount(openAppId, authorizerAppId, authorizerAccessToken) ผูกบัญชีทางการ/มินิโปรแกรมเข้ากับบัญชีแพลตฟอร์มเปิด
unbindOpenAccount(openAppId, authorizerAppId, authorizerAccessToken) ยกเลิกการเชื่อมโยงบัญชีอย่างเป็นทางการ/มินิโปรแกรมจากบัญชีแพลตฟอร์มเปิด
getOpenAccount(authorizerAppId, authorizerAccessToken) รับบัญชีแพลตฟอร์มแบบเปิดที่เชื่อมโยงกับบัญชีอย่างเป็นทางการ/มินิโปรแกรม
ส่งคืนมิดเดิลแวร์การอนุญาตแพลตฟอร์มบุคคลที่สาม
ชื่อโดเมนของลิงก์ URL เปลี่ยนเส้นทาง จะต้องเหมือนกับชื่อโดเมนของบริการปัจจุบันและชื่อโดเมนที่กำหนดค่าโดยแพลตฟอร์มบุคคลที่สาม WeChat
authType ระบุตัวเลือกเพิ่มเติมที่แสดงระหว่างการให้สิทธิ์ 1 หมายถึง แสดงเฉพาะบัญชีทางการ 2 หมายถึง แสดงเฉพาะมินิโปรแกรม และ 3 หมายถึง แสดงบัญชีทางการและมินิโปรแกรม ค่าเริ่มต้นคือ 3 คุณยังสามารถส่ง APPID ของผู้อนุญาตเพื่อระบุผู้อนุญาตได้
pageStyle ระบุรูปแบบของหน้าการอนุญาต 1 หมายถึงรหัสสแกนพีซีเพื่อขออนุมัติ 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'
}
*/
} )
เมื่อแพลตฟอร์มบุคคลที่สามได้รับข้อความจากผู้ใช้ที่ได้รับอนุญาต ก็สามารถใช้ฟังก์ชันตอบกลับแบบพาสซีฟเพื่อตอบกลับข้อความได้
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 )
} )
กลับไปที่มิดเดิลแวร์การอนุญาตหน้าเว็บบัญชีอย่างเป็นทางการของตัวแทนแพลตฟอร์ม WeChat บุคคลที่สาม
scope คือขอบเขตการอนุญาต ค่าที่เป็นไปได้คือ: 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 )