أنشئ منصة خدمة أساسية تابعة لجهة خارجية 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 المفتوحة إنشاء منصات متعددة تابعة لجهات خارجية بعد الإنشاء، وسيتم الحصول على معرف التطبيق و 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 دقائق بعد إعادة تشغيل كل عملية (لأن جميع الوظائف الأخرى تعتمد على مكون_التحقق_تذكرة). الحل هو تخزين بيانات الدفع الأخيرة، وفي كل مرة يتم ذلك بدأ، يتم تشغيل نفس الحدث بشكل نشط. الأمثلة هي كما يلي:
// !在所有侦听事件绑定完成后,再触发事件
// 从数据库(或其他地方)读取上次缓存的数据,通过事件通知给组件
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]) يُرجع البرنامج الوسيط لترخيص النظام الأساسي التابع لجهة خارجية
تقوم events() بإرجاع البرنامج الوسيط لمعالجة حدث ترخيص النظام الأساسي التابع لجهة خارجية
تقوم message(componentAppId) بإرجاع البرنامج الوسيط لمعالجة رسائل الجهة المخولة
يقوم autoTest(componentAppId) بإرجاع البرنامج الوسيط لنشر حالات الاختبار عبر الشبكة بالكامل
oauth(componentAppId, AuthorizerAppId, redirectUrl [,scope [,state]]) يقوم بإرجاع البرنامج الوسيط لترخيص صفحة الويب للمعتمد
يحصل getAuthorizerInfo(componentAppId, ComponentAccessToken, AuthorizerAppId) على معلومات الحساب الأساسية للمصرح
ClearQuota(componentAppId, ComponentAccessToken) يقوم النظام الأساسي التابع لجهة خارجية بمسح جميع استدعاءات واجهة برمجة التطبيقات (API) إلى الصفر
يحصل getJsApiConfig(authorizerAppId, AuthorizerJsApiTicket, url) على تكوين Authorizer js sdk
يحصل getOauthAccessToken(componentAppId, ComponentAccessToken, AuthorizerAppId, code) على رمز الوصول إلى ترخيص صفحة الويب الخاص بالمصرح
تحصل getUserInfo(authorizerAccessToken, openId) على المعلومات الأساسية لمستخدم WeChat المعتمد
إرسال (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) يحصل على حساب النظام الأساسي المفتوح المرتبط بالحساب الرسمي/البرنامج المصغر
إرجاع البرامج الوسيطة لتخويل النظام الأساسي لجهة خارجية.
يجب أن يكون اسم مجال رابط redirectUrl هو نفس اسم مجال الخدمة الحالية واسم المجال الذي تم تكوينه بواسطة نظام 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 التابع لجهة خارجية.
النطاق هو نطاق الترخيص. القيم المحتملة هي: 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' } ) // 发送图文消息
تُستخدم واجهة برمجة التطبيقات هذه للحصول على معلومات إعداد الخيارات الخاصة بالحساب الرسمي أو البرنامج الصغير للطرف المعتمد، مثل: الإبلاغ عن الموقع الجغرافي، ومفتاح التعرف على الصوت، وتبديل خدمة العملاء المتعددين.
let ret = await WechatOpenToolkit . getAuthorizerOptionInfo ( componentAppId , componentAccessToken , authorizerAppId , optionName )
ضبط خيارات المعتمد
تُستخدم واجهة برمجة التطبيقات هذه لتعيين معلومات الخيار الخاصة بالحساب الرسمي أو البرنامج المصغر للطرف المعتمد، مثل: الإبلاغ عن الموقع الجغرافي، ومفتاح التعرف على الصوت، وتبديل خدمة العملاء المتعددين.
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 )