Conta oficial do WeChat, desenvolvimento do programa WeChat, minijogos WeChat, pagamento WeChat e WeChat corporativo e outros encapsulamentos de módulo API nestjs do lado do servidor. Também pode ser usado diretamente como uma classe de ferramenta.
nest-wechat é um pacote para negócios de uso próprio. Se a API que você precisa usar ainda não estiver disponível, você pode enviar problemas para mim e eu resolverei isso o mais rápido possível.
Documentação chinesa
npm i --save ninho-wechat
registrar método de registro
importar { Módulo } de '@nestjs/common';importar { WeChatModule } de 'nest-wechat';@Module({ importa: [WeChatModule.register({appId: 'seu ID do aplicativo', segredo: 'seu segredo'})],})export class AppModule {}
registro de configuração forRoot
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({ importações: [ConfigModule.forRoot({ envFilePath: '.env.test.local',}),WeChatModule.forRootAsync({ importações: [ConfigModule], injetar: [ConfigService, CACHE_MANAGER], useFactory: (configService: ConfigService, cache: Cache) => ({appId: configService.get('WX_APPID'), segredo: configService.get('WX_SECRET'), token: configService.get('WX_TOKEN'), encodingAESKey: configService.get('WX_AESKEY'), cacheAdapter: novo RedisCache(cache), depuração: verdadeiro, }),}), ]})exportar classe AppModule {}
import { WeChatService } from 'nest-wechat'; const service = new WeChatService ({ appId: 'seu ID do aplicativo', secret: 'seu segredo'});
/** * Interface de cache, implemente esta interface se precisar personalizar o cache * * interface de cache, implemente esta interface se precisar. get<T> (chave: string): Promessa<T>; // eslint-disable-next-line @typescript-eslint/no-explicit-any set (chave: string, valor: qualquer): void; remover (chave: string): booleano; fechar(): vazio;}
Configure propriedades de leitura e gravação, digite: WeChatModuleOptions
Atributos de leitura e gravação do adaptador de cache, tipo: ICache, o padrão é um cache implementado pelo Map
getAccessTokenByCode assíncrono público (código: string, _appId?: string, _secret?: string): Promise<UserAccessTokenResult>;
Retorne corretamente
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
retorno de erro
{"errcode": 40029,"errmsg": "código inválido"}
Documentação de referência
Conta oficial extrai informações do usuário
getUserInfo assíncrono público (accessToken: string, openid: string, lang: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promise<UserInfoResult>;
Retorne corretamente
{ "openid": "OPENID", "apelido": NICKNAME, "sexo": 1, "província":"PROVÍNCIA", "cidade":"CIDADE", "país":"PAÍS", "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUFpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilégio":[ "PRIVILEGE1" "PRIVILEGE2"], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
retorno de erro
{ "errcode":40003, "errmsg":"openid inválido"}
getAccountAccessToken assíncrono público (_appId?: string, _secret?: string): Promise<AccountAccessTokenResult>;
Retorne corretamente
{ "token_acesso": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", "expira_em": 7200}
retorno de erro
{ "código de erro": 40013, "errmsg": "aplicativo inválido"}
Documentação de referência
public async getStableAccessToken (_appId?: string, _secret?: string, force = false): Promise<AccountAccessTokenResult>;
Documentação de referência
getJSApiTicket assíncrono público (_appId?: string, _secret?: string): Promise<TicketResult>;
Dados de retorno
{ "errcode": 0, "errmsg": "ok", "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in": 7200}
Documentação de referência
public async jssdkSignature (url: string): Promise<SignatureResult>; public async jssdkSignature (url: string, appId: string, secret:string): Promise<SignatureResult>;
Documentação de referência
public async sendTemplateMessage (mensagem: TemplateMessage, appId?: string, secret?: string): Promise<DefaultRequestResult & { msgid: string }>;
Documentação de referência
createQRCode assíncrono público (dados: AccountCreateQRCode, appId?: string, secret?: string): Promise<AccountCreateQRCodeResult>;
Documentação de referência
public showQRCode (ticket: string): Promis<Buffer>;
Documentação de referência
WeChatService.checkSignatureExpress (req: Solicitação, res: Resposta);
Uso:
@Get('push')async pushTest (@Req() req: Request, @Res() res: Response) { this.service.checkSignatureExpress(req, res);}
Documentação de referência
// Modo criptografado WeChatService.messagePushExpressHandler (req: Request, res?: Response, resText?: string); // Modo de texto simples WeChatService.plainMessagePushExpressHandler (req: Request, res?: Response, resText?: string);
Uso:
@Post('push')async oficialPushTest (@Req() req: Request, @Res() res: Response) { const decrypt = aguarde this.service.messagePushExpressHandler (req, res);}
Documentação de referência
public getAccessToken (appId?: string, secret?: string): Promise<AccessTokenResult>;
const service = new WeChatService({appId: 'seu ID do aplicativo', secret: 'seu segredo'});
getRid assíncrono público (livrar: string, accessToken: string): Promise<RidInfo>;
public async getPluginOpenPId (código: string, accessToken: string): Promise<DefaultRequestResult & { openpid: string }>;
code2Session assíncrono público (código: string, appId?: string, segredo?: string): Promise<SessionResult>;
Dados de retorno
{ "openid": "openid", "session_key": "chave", "unionid": "unionid", "errcode": 0, "errmsg": "ok", }
Documentação de referência
getPhoneNumber assíncrono público (código: string, accessToken: string);
Documentação de referência
getQRCode assíncrono público (parâmetros: QRCode, accessToken: string): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
public getUnlimitedQRCode (parâmetros: GetUnlimitedQRCode, accessToken: string): Promise<DefaultRequestResult & { buffer: Buffer }>;
public async createQRCode (parâmetros: CreateQRCode, accessToken: string): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
queryScheme assíncrono público (esquema: string, accessToken: string): Promise<DefaultRequestResult & {esquema_info: SchemeInfo, esquema_quota: SchemeQuota }>;
public generateScheme (parâmetros: GenerateScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string >;
public generateNFCScheme (parâmetros: GenerateNFCScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string }>;
public generateUrlLink (parâmetros: GenerateUrlLink, accessToken: string): Promise<DefaultRequestResult & { url_link: string }>;
consulta públicaUrlLink (urlLink: string, accessToken: string): Promise<UrlLinkResult>;
public generateShortLink (parâmetros: GenerateShortLink, accessToken: string): Promise<DefaultRequestResult & { link: string }>;
public sendUniformMessage (parâmetros: SendUniformMessage, accessToken: string): Promise<DefaultRequestResult>;
public createActivityId (parâmetros: CreateActivityId, accessToken: string): Promise<ActivityIdResult>;
public setUpdatableMsg (parâmetros: UpdatableMsg, accessToken: string): Promise<DefaultRequestResult>;
public deleteMessageTemplate (priTmplId: string, accessToken: string): Promise<DefaultRequestResult>;
public getCategory (accessToken: string): Promise<DefaultRequestResult & {dados: {id: número, nome: string}[] }>;
public getPubTemplateKeyWordsById (tid: número, accessToken: string): Promise<PubTemplateKeyWords>;
public getPubTemplateTitleList (parâmetros: PubTemplateTitleList, accessToken: string): Promise<PubTemplateTitleListResult>;
public getMessageTemplateList (accessToken: string): Promise<MessageTemplateListResult>;
public sendMessage (parâmetros: SendMessage, accessToken: string): Promise<DefaultRequestResult>;
public addMessageTemplate (parâmetros: MessageTemplate, accessToken: string): Promise<DefaultRequestResult & { priTmplId: string }>;
Importação de módulo
importar { Módulo } de '@nestjs/common';importar { WeChatMobileModule } de 'nest-wechat';@Module({ importações: [WeChatMobileModule.register()],})exportar classe AppModule {}
Introdução de ferramentas
importar {MobileService} de 'nest-wechat';const service = new MobileService();
public getAccessToken (código: string, appId: string, segredo: string): Promise<AxiosResponse<MobileAppAccessTokenResult, any>>;
public refreshAccessToken (appId: string, refreshToken: string): Promise<AxiosResponse<MobileAppAccessTokenResult, any>>;
checkAccessToken público (openId: string, accessToken: string): Promise<AxiosResponse<DefaultRequestResult, any>>;
pay.jsapi (pedido: TransactionOrder, serialNo: string, privateKey: Buffer | string): Promise<{prepay_id: string}>;
pay.getTransactionById (id: string, mchId: string, serialNo: string, privateKey: Buffer | string): Promise<Trade>;
pay.getTransactionByOutTradeNo (outTradeNo: string, mchId: string, serialNo: string, privateKey: Buffer | string): Promise<Trade>;
pay.close (outTradeNo: string, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.refund (reembolso: RequireOnlyOne<RefundParameters, 'transaction_id' | 'out_trade_no'>, mchId: string, serialNo: string, privateKey: Buffer | string): Promise<RefundResult>;
pay.getRefund (outRefundNo: string, mchId: string, serialNo: string, privateKey: Buffer | string): Promise<RefundResult>;
pay.buildMiniProgramPayment (appId: string, prepayId: string, privateKey: Buffer | string): MiniProgramPaymentParameters;
pay.paidCallback (publicKey: Buffer | string, apiKey: string, req: Solicitação, res: Resposta): Promise<Trade>;
pay.refundedCallback (certificados: Mapa<string, string>, apiKey: string, req: Solicitação, res: Resposta): Promise<RefundNotifyResult>;
pay.fapiaoDevConfig (dados: DevelopmentConfigRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.getFapiaoDevConfig (mchId: string, serialNo: string, privateKey: Buffer | string);
pay.createCardTemplate (dados: CreateCardTemplateRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.fapiaoCallback (certificados: Mapa<string, string>, apiKey: string, req: Solicitação, res: Resposta): Promise<FapiaoNotifyResult>;
pay.getUserTitle (parâmetros: GetUserTitleParams, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.issueFapiao (dados: IssueFapiaoRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.getIssueFapiao (fapiaoApplyId: string, fapiaoId: string, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.reverseFapiao (fapiaoApplyId: string, dados: ReverseFapiaoRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.rsaEncryptOAEP (texto: string, publicKey: Buffer | string);
pay.rsaDecryptOAEP (cipherText: string, privateKey: Buffer | string);
Não há comerciantes de teste disponíveis e o teste não foi bem-sucedido. Teste você mesmo. Se você tiver alguma dúvida, envie um problema.
O teste pode executar testes unitários sozinho (é necessário modificar a configuração)
npm executa teste lib/wepay.hb.spec.ts
pay.sendRedPack(redPack: RedPackData, appId: string, mchId: string, apiKey: string, publicKey: Buffer | string, privateKey: Buffer | string, group = false): Promise<AxiosResponse<string, any>>;
pay.sendGroupRedPack (redPack: GroupRedPackData, appId: string, mchId: string, apiKey: string, publicKey: Buffer | string, privateKey: Buffer | string): Promise<AxiosResponse<string, any>>;
pay.getHbInfo(billNO: string, appId: string, mchId: string, apiKey: string, publicKey: Buffer | string, privateKey: Buffer | string): Promise<AxiosResponse<string, any>>;
Documentação de referência
jsapiOfPartner (pedido: TransactionOrderOfPartner, serialNo: string, privateKey: Buffer | string);
Documentação de referência
Crie uma interface para chamar parâmetros de pagamento do WeChat
buildJSAPIParameters (appId: string, prepayId: string, privateKey: Buffer | string): MiniProgramPaymentParameters;
Documentação de referência
pagoCallbackOfPartner (certificados: Mapa<string, string>, apiKey: string, req: Solicitação, res: Resposta): Promise<TradeOfPartner>;
Documentação de referência
closeOfPartner (outTradeNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
getTransactionByIdOfPartner (id: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
getTransactionByOutTradeNoOfPartner (outTradeNo: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
refundOfPartner (reembolso: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>, spMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
getRefundOfPartner (outRefundNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
refundedCallbackOfPartner (certificados: Mapa<string, string>, apiKey: string, req: Solicitação, res: Resposta): Promise<RefundNotifyResultOfPartner>;
Documentação de referência
createCardTemplateOfPartner (dados: CreateCardTemplateRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
fapiaoDevConfigOfPartner (dados: DevelopmentConfigRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
getFapiaoDevConfigOfPartner (spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
fapiaoCallbackOfPartner (certificados: Mapa<string, string>, apiKey: string, req: Solicitação, res: Resposta): Promise<FapiaoNotifyResultOfPartner>;
Documentação de referência
getUserTitleOfPartner (parâmetros: GetUserTitleParams, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
issueFapiaoOfPartner (dados: IssueFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string, platformSerial: string);
Documentação de referência
getIssueFapiaoOfPartner (fapiaoApplyId: string, fapiaoId: string | nulo | indefinido, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Documentação de referência
reverseFapiaoOfPartner (fapiaoApplyId: string, dados: ReverseFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
descriptografarCipherText
decryptCipherText<T> (apiKey: string, cifra: string, AssociateData: string, nonce: string): T |
Documentação de referência
importar {MessageCrypto} de 'nest-wechat'; const sha1 = MessageCrypto.sha1('string para hash');
Método estático:
sha1 (...args: string[]): string;
md5 (texto: string): string;
getAESKey (encodingAESKey: string): Buffer;
getAESKeyIV (aesKey: Buffer): Buffer;
PKCS7Encoder (buff: Buffer): Buffer;
PKCS7Decoder (buff: Buffer): Buffer;
descriptografar (aesKey: Buffer, iv: Buffer, str: string): string;
criptografar (aesKey: Buffer, iv: Buffer, msg: string, appId: string): string;
createNonceStr (comprimento = 16): string;
encryptMessage (appId: string, token: string, encodingAESKey: string, mensagem: string, timestamp: string, nonce: string): string;
decryptMessage (token: string, encodingAESKey: string, assinatura: string, timestamp: string, nonce: string, encryptXml: string);
decryptMessage (token: string, encodingAESKey: string, assinatura: string, timestamp: string, nonce: string, encryptXml: string);
checkSignature (assinatura: string, carimbo de data/hora: string, nonce: string, token: string);
Crie o arquivo .env.test.local e salve seu appid e segredo de teste no arquivo.
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
Execute o teste e2e.
teste de execução npm: e2e
Execute o teste de unidade.
npm executa teste wechat.service.userinfo.spec.ts
Iniciar teste de serviço
npx ts-node -T testes/e2e/wechat-app.main.ts
Configuração push de mensagem de conta pública (plataforma de teste público WeChat), após ativar o teste de serviço acima, você pode passar na verificação de configuração
URL: http://seu/url/wechat/push, como: http://113.22.11.2:3001/wechat/push
Token: pamtest
Obtenha access_token da ferramenta de depuração da interface da plataforma pública WeChat
corpo
{ "grant_type": "client_credential", "appid": "seu/appid", "segredo": "seu/segredo", "force_refresh": falso}
Ferramentas de depuração na plataforma aberta WeChat - ferramentas de depuração para teste de envio de mensagens para teste de envio