Cuenta oficial de WeChat, apertura del programa WeChat, minijuegos de WeChat, pago de WeChat y WeChat empresarial y otras encapsulaciones de módulos API nestjs del lado del servidor. También se puede utilizar directamente como clase de herramienta.
nest-wechat es un paquete para empresas de uso propio. Si la API que necesita utilizar aún no está disponible, puede enviarme los problemas y lo solucionaré lo antes posible.
documentación china
npm i --guardar nido-wechat
registro método registro
importar {Módulo} desde '@nestjs/common';importar {WeChatModule} desde 'nest-wechat';@Module({ importaciones: [WeChatModule.register({appId: 'tu ID de aplicación', secreto: 'tu secreto'})],}) clase de exportación AppModule {}
para registro de configuración raíz
importar { CACHE_MANAGER, Módulo } de '@nestjs/common'; importar { ConfigModule, ConfigService } de '@nestjs/config'; importar { Cache } de 'cache-manager'; importar { RedisCache, WeChatModule } de 'nest-wechat ';@Módulo({ importaciones: [ConfigModule.forRoot({ envFilePath: '.env.test.local',}),WeChatModule.forRootAsync({ importaciones: [ConfigModule], inyectar: [ConfigService, CACHE_MANAGER], useFactory: (configService: ConfigService, caché: caché) => ({appId: configService.get('WX_APPID'), secreto: configService.get('WX_SECRET'), token: configService.get('WX_TOKEN'), codificaciónAESKey: configService.get('WX_AESKEY'), cacheAdapter: nuevo RedisCache(caché), depurar: verdadero, }),}), ]}) clase de exportación AppModule {}
importar { WeChatService } desde 'nest-wechat'; const service = new WeChatService({ appId: 'tu ID de aplicación', secreto: 'tu secreto'});
/** * Interfaz de caché, implemente esta interfaz si necesita personalizar el caché * * interfaz de caché, implemente esta interfaz si es necesario * */exportar interfaz ICache {. get<T> (clave: cadena): Promesa<T>; // eslint-deshabilitar-siguiente-línea @typescript-eslint/no-explicit-any set (clave: cadena, valor: cualquiera): void; eliminar (clave: cadena): booleano; cerrar (): nulo;}
Configure propiedades de lectura y escritura, escriba: WeChatModuleOptions
Atributos de lectura y escritura del adaptador de caché, tipo: ICache, el valor predeterminado es un caché implementado por Map
getAccessTokenByCode asíncrono público (código: cadena, _appId?: cadena, _secret?: cadena): Promesa<UserAccessTokenResult>;
Regresar correctamente
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
retorno de error
{"errcode": 40029,"errmsg": "código no válido"}
Documentación de referencia
La cuenta oficial extrae información del usuario
getUserInfo async público (accessToken: cadena, openid: cadena, idioma: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promesa<UserInfoResult>;
Regresar correctamente
{ "openid": "OPENID", "apodo": APODO, "sexo": 1, "provincia":"PROVINCIA", "ciudad":"CIUDAD", "país":"PAÍS", "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilegio":[ "PRIVILEGIO1" "PRIVILEGIO2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
retorno de error
{ "errcode": 40003, "errmsg": "openid no válido"}
getAccountAccessToken público asíncrono (_appId?: cadena, _secret?: cadena): Promesa<AccountAccessTokenResult>;
Regresar correctamente
{ "token_acceso": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", "expire_in": 7200}
retorno de error
{ "errcode": 40013, "errmsg": "aplicación no válida"}
Documentación de referencia
getStableAccessToken público asíncrono (_appId?: cadena, _secret?: cadena, fuerza = falso): Promesa<AccountAccessTokenResult>;
Documentación de referencia
getJSApiTicket asíncrono público (_appId?: cadena, _secret?: cadena): Promesa<TicketResult>;
Datos de devolución
{ "errcode": 0, "errmsg": "ok", "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in": 7200}
Documentación de referencia
jssdkSignature asíncrono público (url: cadena): Promesa<Resultado de la firma>;
Documentación de referencia
sendTemplateMessage asíncrono público (mensaje: TemplateMessage, appId?: cadena, secreto?: cadena): Promise<DefaultRequestResult & {msgid: string}>;
Documentación de referencia
createQRCode asíncrono público (datos: AccountCreateQRCode, appId?: cadena, secreto?: cadena): Promesa<AccountCreateQRCodeResult>;
Documentación de referencia
showQRCode público (boleto: cadena): Promis<Buffer>;
Documentación de referencia
WeChatService.checkSignatureExpress (req: Solicitud, res: Respuesta);
Uso:
@Get('push')async pushTest (@Req() req: Solicitud, @Res() res: Respuesta) { this.service.checkSignatureExpress(req, res);}
Documentación de referencia
// Modo cifrado WeChatService.messagePushExpressHandler (req: Solicitud, res?: Respuesta, resText?: cadena); // Modo texto sin formato WeChatService.plainMessagePushExpressHandler (req: Solicitud, res?: Respuesta, resText?: cadena);
Uso:
@Post('push')async officialPushTest (@Req() req: Solicitud, @Res() res: Respuesta) { const decrypt = espera this.service.messagePushExpressHandler(req, res);}
Documentación de referencia
getAccessToken público (appId?: cadena, ¿secreto?: cadena): Promesa<AccessTokenResult>;
const service = new WeChatService({ appId: 'tu ID de aplicación', secreto: 'tu secreto'}); const res = await service.mp.getAccessToken();console.log(res.data.access_token);
getRid asíncrono público (deshacerse: cadena, accessToken: cadena): Promesa<RidInfo>;
getPluginOpenPId asíncrono público (código: cadena, accessToken: cadena): Promise<DefaultRequestResult & { openpid: string }>;
código asíncrono público2Session (código: cadena, appId?: cadena, secreto?: cadena): Promesa<SessionResult>;
Datos de devolución
{ "openid": "openid", "session_key": "clave", "unionid": "unionid", "errcode": 0, "errmsg": "ok", }
Documentación de referencia
getPhoneNumber asíncrono público (código: cadena, accessToken: cadena);
Documentación de referencia
getQRCode asíncrono público (parámetros: QRCode, accessToken: cadena): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
getUnlimitedQRCode público (parámetros: GetUnlimitedQRCode, accessToken: cadena): Promise<DefaultRequestResult & { buffer: Buffer }>;
createQRCode asíncrono público (parámetros: CreateQRCode, accessToken: string): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
esquema de consulta asíncrono público (esquema: cadena, accessToken: cadena): Promise<DefaultRequestResult & { esquema_info: SchemeInfo, esquema_quota: SchemeQuota }>;
generarScheme público (parámetros: GenerateScheme, accessToken: cadena): Promise<DefaultRequestResult & {openlink: cadena>;
generarNFCScheme público (parámetros: GenerateNFCScheme, accessToken: cadena): Promise<DefaultRequestResult & {openlink: string}>;
generarUrlLink público (parámetros: GenerateUrlLink, accessToken: cadena): Promise<DefaultRequestResult & {url_link: cadena}>;
queryUrlLink público (urlLink: cadena, accessToken: cadena): Promesa<UrlLinkResult>;
generarShortLink público (parámetros: GenerateShortLink, accessToken: cadena): Promise<DefaultRequestResult & {enlace: cadena}>;
sendUniformMessage público (parámetros: SendUniformMessage, accessToken: cadena): Promise<DefaultRequestResult>;
createActivityId público (parámetros: CreateActivityId, accessToken: cadena): Promise<ActivityIdResult>;
setUpdatableMsg público (parámetros: UpdatableMsg, accessToken: cadena): Promise<DefaultRequestResult>;
eliminarMessageTemplate público (priTmplId: cadena, accessToken: cadena): Promesa<DefaultRequestResult>;
getCategory pública (accessToken: cadena): Promise<DefaultRequestResult & {datos: {id: número, nombre: cadena}[] }>;
getPubTemplateKeyWordsById público (tid: número, accessToken: cadena): Promesa<PubTemplateKeyWords>;
getPubTemplateTitleList público (parámetros: PubTemplateTitleList, accessToken: cadena): Promesa<PubTemplateTitleListResult>;
getMessageTemplateList público (accessToken: cadena): Promesa<MessageTemplateListResult>;
sendMessage público (parámetros: SendMessage, accessToken: cadena): Promise<DefaultRequestResult>;
addMessageTemplate público (parámetros: MessageTemplate, accessToken: cadena): Promise<DefaultRequestResult & { priTmplId: string }>;
Importación de módulos
importar {Módulo} desde '@nestjs/common';importar {WeChatMobileModule} desde 'nest-wechat';@Module({ importaciones: [WeChatMobileModule.register()],}) clase de exportación AppModule {}
Introducción de herramientas.
importar {MobileService} desde 'nest-wechat'; servicio constante = nuevo MobileService();
getAccessToken público (código: cadena, appId: cadena, secreto: cadena): Promesa<AxiosResponse<MobileAppAccessTokenResult, cualquiera>>;
refresco públicoAccessToken (appId: cadena, refrescoToken: cadena): Promesa<AxiosResponse<MobileAppAccessTokenResult, cualquiera>>;
checkAccessToken público (openId: cadena, accessToken: cadena): Promesa<AxiosResponse<DefaultRequestResult, cualquiera>>;
pay.jsapi (orden: TransactionOrder, serialNo: string, privateKey: Buffer | string): Promesa<{prepay_id: string}>;
pay.getTransactionById (id: cadena, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena): Promesa<Comercio>;
pay.getTransactionByOutTradeNo (outTradeNo: cadena, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena): Promesa<Comercio>;
pay.close (outTradeNo: cadena, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.refund (reembolso: RequireOnlyOne<RefundParameters, 'transaction_id' | 'out_trade_no'>, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena): Promesa<RefundResult>;
pay.getRefund (outRefundNo: cadena, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena): Promesa<RefundResult>;
pay.buildMiniProgramPayment (appId: cadena, prepayId: cadena, privateKey: Buffer | cadena): MiniProgramPaymentParameters;
pay.paidCallback (publicKey: Buffer | cadena, apiKey: cadena, req: Solicitud, res: Respuesta): Promesa<Comercio>;
pay.refundedCallback (certificados: Mapa<cadena, cadena>, apiKey: cadena, req: Solicitud, res: Respuesta): Promesa<RefundNotifyResult>;
pay.fapiaoDevConfig (datos: DevelopmentConfigRequest, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.getFapiaoDevConfig (mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.createCardTemplate (datos: CreateCardTemplateRequest, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.fapiaoCallback (certificados: Mapa<cadena, cadena>, apiKey: cadena, req: Solicitud, res: Respuesta): Promesa<FapiaoNotifyResult>;
pay.getUserTitle (parámetros: GetUserTitleParams, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.issueFapiao (datos: IssueFapiaoRequest, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.getIssueFapiao (fapiaoApplyId: cadena, fapiaoId: cadena, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.reverseFapiao (fapiaoApplyId: cadena, datos: ReverseFapiaoRequest, mchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
pay.rsaEncryptOAEP (texto: cadena, publicKey: Buffer | cadena);
pay.rsaDecryptOAEP (texto cifrado: cadena, clave privada: búfer | cadena);
No hay comerciantes de prueba disponibles y la prueba no fue exitosa. Pruébelo usted mismo. Si tiene alguna pregunta, envíe un problema.
La prueba puede ejecutar pruebas unitarias por sí sola (es necesario modificar la configuración)
npm ejecuta prueba lib/wepay.hb.spec.ts
pay.sendRedPack(redPack: RedPackData, appId: cadena, mchId: cadena, apiKey: cadena, publicKey: Buffer | cadena, privateKey: Buffer | cadena, grupo = false): Promise<AxiosResponse<string, any>>;
pay.sendGroupRedPack(redPack: GroupRedPackData, appId: cadena, mchId: cadena, apiKey: cadena, publicKey: Buffer | cadena, privateKey: Buffer | cadena): Promise<AxiosResponse<string, any>>;
pay.getHbInfo(billNO: cadena, appId: cadena, mchId: cadena, apiKey: cadena, publicKey: Buffer | cadena, privateKey: Buffer | cadena): Promise<AxiosResponse<string, any>>;
Documentación de referencia
jsapiOfPartner (orden: TransactionOrderOfPartner, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
Cree una interfaz para llamar a los parámetros de pago de WeChat
buildJSAPIParameters (appId: cadena, prepayId: cadena, privateKey: Buffer | cadena): MiniProgramPaymentParameters;
Documentación de referencia
pagadoCallbackOfPartner (certificados: Mapa<cadena, cadena>, apiKey: cadena, req: Solicitud, res: Respuesta): Promesa<TradeOfPartner>;
Documentación de referencia
closeOfPartner (outTradeNo: cadena, spMchId: cadena, subMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
getTransactionByIdOfPartner (id: cadena, spMchId: cadena, subMchid: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
getTransactionByOutTradeNoOfPartner (outTradeNo: cadena, spMchId: cadena, subMchid: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
refundOfPartner (reembolso: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>, spMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
getRefundOfPartner (outRefundNo: cadena, spMchId: cadena, subMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
refundedCallbackOfPartner (certificados: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResultOfPartner>;
Documentación de referencia
createCardTemplateOfPartner (datos: CreateCardTemplateRequestOfPartner, spMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
fapiaoDevConfigOfPartner (datos: DevelopmentConfigRequestOfPartner, spMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
getFapiaoDevConfigOfPartner (spMchId: cadena, subMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
fapiaoCallbackOfPartner (certificados: Mapa<cadena, cadena>, apiKey: cadena, req: Solicitud, res: Respuesta): Promesa<FapiaoNotifyResultOfPartner>;
Documentación de referencia
getUserTitleOfPartner (parámetros: GetUserTitleParams, spMchId: cadena, subMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
issuesFapiaoOfPartner (datos: IssueFapiaoRequestOfPartner, spMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena, platformSerial: cadena);
Documentación de referencia
getIssueFapiaoOfPartner (fapiaoApplyId: cadena, fapiaoId: cadena | nulo | indefinido, spMchId: cadena, subMchid: cadena, serialNo: cadena, privateKey: Buffer | cadena);
Documentación de referencia
reverseFapiaoOfPartner (fapiaoApplyId: cadena, datos: ReverseFapiaoRequestOfPartner, spMchId: cadena, serialNo: cadena, privateKey: Buffer | cadena);
descifrarTextocifrado
decryptCipherText<T> (apiKey: cadena, cifrado: cadena, datos asociados: cadena, nonce: cadena): T |
Documentación de referencia
importar {MensajeCrypto} de 'nest-wechat';const sha1 = MessageCrypto.sha1('cadena a hash');
Método estático:
sha1 (...args: cadena[]): cadena;
md5 (texto: cadena): cadena;
getAESKey (codificaciónAESKey: cadena): Búfer;
getAESKeyIV (aesKey: Búfer): Búfer;
PKCS7Encoder (buff: Búfer): Búfer;
PKCS7Decoder (buff: Búfer): Búfer;
descifrar (aesKey: Buffer, iv: Buffer, str: cadena): cadena;
cifrar (aesKey: búfer, iv: búfer, mensaje: cadena, appId: cadena): cadena;
createNonceStr (longitud = 16): cadena;
encryptMessage (appId: cadena, token: cadena, codificaciónAESKey: cadena, mensaje: cadena, marca de tiempo: cadena, nonce: cadena): cadena;
decryptMessage (token: cadena, codificaciónAESKey: cadena, firma: cadena, marca de tiempo: cadena, nonce: cadena, encryptXml: cadena);
decryptMessage (token: cadena, codificaciónAESKey: cadena, firma: cadena, marca de tiempo: cadena, nonce: cadena, encryptXml: cadena);
checkSignature (firma: cadena, marca de tiempo: cadena, nonce: cadena, token: cadena);
Cree el archivo .env.test.local y guarde su aplicación de prueba y su secreto en el archivo.
TEST_APPID=your/test/appid
TEST_SECRET=your/test/secret
TEST_JSSDK_URL=https://your/website/url
TEST_TOKEN=your/token
TEST_AESKEY=your/aeskey
REDIS_HOST=your/redis/host
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
REDIS_TTL=600
Ejecute la prueba e2e.
prueba de ejecución de npm: e2e
Ejecute la prueba unitaria.
npm ejecuta la prueba wechat.service.userinfo.spec.ts
Iniciar pruebas de servicio
npx ts-nodo -T pruebas/e2e/wechat-app.main.ts
Configuración de envío de mensajes de cuenta pública (plataforma de prueba pública WeChat), después de activar la prueba de servicio anterior, puede pasar la verificación de configuración
URL: http://tu/url/wechat/push, como por ejemplo: http://113.22.11.2:3001/wechat/push
Token: prueba de pam
Obtenga access_token de la herramienta de depuración de la interfaz de la plataforma pública WeChat
cuerpo
{ "grant_type": "credencial_cliente", "appid": "tu/appid", "secreto": "tu/secreto", "force_refresh": falso}
Herramientas de depuración en la plataforma abierta WeChat: herramientas de depuración para pruebas de envío de mensajes para probar el envío