WeChat official account, WeChat program development, WeChat mini-games, WeChat payment and enterprise WeChat and other server-side API nestjs module encapsulation. It can also be used directly as a tool class.
nest-wechat is a package for self-use business. If the API you need to use is not available yet, you can submit issues to me and I will make it up as soon as possible.
Chinese documentation
npm i --save nest-wechat
register method registration
import { Module } from '@nestjs/common';import { WeChatModule } from 'nest-wechat';@Module({ imports: [WeChatModule.register({appId: 'your app id', secret: 'your secret'})],})export class AppModule {}
forRoot configuration registration
import { CACHE_MANAGER, Module } from '@nestjs/common';import { ConfigModule, ConfigService } from '@nestjs/config';import { Cache } from 'cache-manager';import { RedisCache, WeChatModule } from 'nest-wechat ';@Module({ imports: [ConfigModule.forRoot({ envFilePath: '.env.test.local',}),WeChatModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService, CACHE_MANAGER], useFactory: (configService: ConfigService, cache: Cache) => ({appId: configService.get('WX_APPID'), secret: configService.get('WX_SECRET'), token: configService.get('WX_TOKEN'), encodingAESKey: configService.get('WX_AESKEY'), cacheAdapter: new RedisCache(cache), debug: true, }),}), ]})export class AppModule {}
import { WeChatService } from 'nest-wechat';const service = new WeChatService({ appId: 'your app id', secret: 'your secret'});
/** * Cache interface, please implement this interface if you need to customize the cache * * cache interface, please implement this interface if you need. * */export interface ICache { get<T> (key: string): Promise<T>; // eslint-disable-next-line @typescript-eslint/no-explicit-any set (key: string, value: any): void; remove (key: string): boolean; close (): void;}
Configure read and write properties, type: WeChatModuleOptions
Cache adapter read and write attributes, type: ICache, the default is a cache implemented by Map
public async getAccessTokenByCode (code: string, _appId?: string, _secret?: string): Promise<UserAccessTokenResult>;
Return correctly
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
error return
{"errcode": 40029,"errmsg": "invalid code"}
Reference documentation
Official account pulls user information
public async getUserInfo (accessToken: string, openid: string, lang: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promise<UserInfoResult>;
Return correctly
{ "openid": "OPENID", "nickname": NICKNAME, "sex": 1, "province":"PROVINCE", "city":"CITY", "country":"COUNTRY", "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
error return
{ "errcode":40003, "errmsg":" invalid openid "}
public async getAccountAccessToken (_appId?: string, _secret?: string): Promise<AccountAccessTokenResult>;
Return correctly
{ "access_token": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", "expires_in": 7200}
error return
{ "errcode": 40013, "errmsg": "invalid appid"}
Reference documentation
public async getStableAccessToken (_appId?: string, _secret?: string, force = false): Promise<AccountAccessTokenResult>;
Reference documentation
public async getJSApiTicket (_appId?: string, _secret?: string): Promise<TicketResult>;
Return data
{ "errcode": 0, "errmsg": "ok", "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in": 7200}
Reference documentation
public async jssdkSignature (url: string): Promise<SignatureResult>; public async jssdkSignature (url: string, appId: string, secret:string): Promise<SignatureResult>;
Reference documentation
public async sendTemplateMessage (message: TemplateMessage, appId?: string, secret?: string): Promise<DefaultRequestResult & { msgid: string }>;
Reference documentation
public async createQRCode (data: AccountCreateQRCode, appId?: string, secret?: string): Promise<AccountCreateQRCodeResult>;
Reference documentation
public showQRCode (ticket: string): Promis<Buffer>;
Reference documentation
WeChatService.checkSignatureExpress (req: Request, res: Response);
Usage:
@Get('push')async pushTest (@Req() req: Request, @Res() res: Response) { this.service.checkSignatureExpress(req, res);}
Reference documentation
// Encrypted mode WeChatService.messagePushExpressHandler (req: Request, res?: Response, resText?: string); // Plain text mode WeChatService.plainMessagePushExpressHandler (req: Request, res?: Response, resText?: string);
Usage:
@Post('push')async officialPushTest (@Req() req: Request, @Res() res: Response) { const decrypt = await this.service.messagePushExpressHandler(req, res);}
Reference documentation
public getAccessToken (appId?: string, secret?: string): Promise<AccessTokenResult>;
const service = new WeChatService({ appId: 'your app id', secret: 'your secret'}); const res = await service.mp.getAccessToken();console.log(res.data.access_token);
public async getRid (rid: string, accessToken: string): Promise<RidInfo>;
public async getPluginOpenPId (code: string, accessToken: string): Promise<DefaultRequestResult & { openpid: string }>;
public async code2Session (code: string, appId?: string, secret?: string): Promise<SessionResult>;
Return data
{ "openid": "openid", "session_key": "key", "unionid": "unionid", "errcode": 0, "errmsg": "ok", }
Reference documentation
public async getPhoneNumber (code: string, accessToken: string);
Reference documentation
public async getQRCode (params: QRCode, accessToken: string): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
public getUnlimitedQRCode (params: GetUnlimitedQRCode, accessToken: string): Promise<DefaultRequestResult & { buffer: Buffer }>;
public async createQRCode (params: CreateQRCode, accessToken: string): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
public async queryScheme (scheme: string, accessToken: string): Promise<DefaultRequestResult & { scheme_info: SchemeInfo, scheme_quota: SchemeQuota }>;
public generateScheme (params: GenerateScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string >;
public generateNFCScheme (params: GenerateNFCScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string }>;
public generateUrlLink (params: GenerateUrlLink, accessToken: string): Promise<DefaultRequestResult & { url_link: string }>;
public queryUrlLink (urlLink: string, accessToken: string): Promise<UrlLinkResult>;
public generateShortLink (params: GenerateShortLink, accessToken: string): Promise<DefaultRequestResult & { link: string }>;
public sendUniformMessage (params: SendUniformMessage, accessToken: string): Promise<DefaultRequestResult>;
public createActivityId (params: CreateActivityId, accessToken: string): Promise<ActivityIdResult>;
public setUpdatableMsg (params: UpdatableMsg, accessToken: string): Promise<DefaultRequestResult>;
public deleteMessageTemplate (priTmplId: string, accessToken: string): Promise<DefaultRequestResult>;
public getCategory (accessToken: string): Promise<DefaultRequestResult & { data: {id: number, name: string}[] }>;
public getPubTemplateKeyWordsById (tid: number, accessToken: string): Promise<PubTemplateKeyWords>;
public getPubTemplateTitleList (params: PubTemplateTitleList, accessToken: string): Promise<PubTemplateTitleListResult>;
public getMessageTemplateList (accessToken: string): Promise<MessageTemplateListResult>;
public sendMessage (params: SendMessage, accessToken: string): Promise<DefaultRequestResult>;
public addMessageTemplate (params: MessageTemplate, accessToken: string): Promise<DefaultRequestResult & { priTmplId: string }>;
Module import
import { Module } from '@nestjs/common';import { WeChatMobileModule } from 'nest-wechat';@Module({ imports: [WeChatMobileModule.register()],})export class AppModule {}
Introduction of tools
import { MobileService } from 'nest-wechat';const service = new MobileService();
public getAccessToken (code: string, appId: string, secret: string): Promise<AxiosResponse<MobileAppAccessTokenResult, any>>;
public refreshAccessToken (appId: string, refreshToken: string): Promise<AxiosResponse<MobileAppAccessTokenResult, any>>;
public checkAccessToken (openId: string, accessToken: string): Promise<AxiosResponse<DefaultRequestResult, any>>;
pay.jsapi (order: 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 (refund: 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: Request, res: Response): Promise<Trade>;
pay.refundedCallback (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResult>;
pay.fapiaoDevConfig (data: DevelopmentConfigRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.getFapiaoDevConfig (mchId: string, serialNo: string, privateKey: Buffer | string);
pay.createCardTemplate (data: CreateCardTemplateRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.fapiaoCallback (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<FapiaoNotifyResult>;
pay.getUserTitle (params: GetUserTitleParams, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.issueFapiao (data: 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, data: ReverseFapiaoRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.rsaEncryptOAEP (text: string, publicKey: Buffer | string);
pay.rsaDecryptOAEP (cipherText: string, privateKey: Buffer | string);
There are no test merchants available and the test has not been successful. Please test by yourself. If you have any questions, please submit an issue.
The test can execute unit tests by itself (need to modify the configuration)
npm run test 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>>;
Reference documentation
jsapiOfPartner (order: TransactionOrderOfPartner, serialNo: string, privateKey: Buffer | string);
Reference documentation
Build an interface for calling WeChat payment parameters
buildJSAPIParameters (appId: string, prepayId: string, privateKey: Buffer | string): MiniProgramPaymentParameters;
Reference documentation
paidCallbackOfPartner (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<TradeOfPartner>;
Reference documentation
closeOfPartner (outTradeNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
getTransactionByIdOfPartner (id: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
getTransactionByOutTradeNoOfPartner (outTradeNo: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
refundOfPartner (refund: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>, spMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
getRefundOfPartner (outRefundNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
refundedCallbackOfPartner (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResultOfPartner>;
Reference documentation
createCardTemplateOfPartner (data: CreateCardTemplateRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
fapiaoDevConfigOfPartner (data: DevelopmentConfigRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
getFapiaoDevConfigOfPartner (spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
fapiaoCallbackOfPartner (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<FapiaoNotifyResultOfPartner>;
Reference documentation
getUserTitleOfPartner (params: GetUserTitleParams, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
issueFapiaoOfPartner (data: IssueFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string, platformSerial: string);
Reference documentation
getIssueFapiaoOfPartner (fapiaoApplyId: string, fapiaoId: string | null | undefined, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Reference documentation
reverseFapiaoOfPartner (fapiaoApplyId: string, data: ReverseFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
decryptCipherText
decryptCipherText<T> (apiKey: string, cipher: string, associatedData: string, nonce: string): T | string;
Reference documentation
import { MessageCrypto } from 'nest-wechat';const sha1 = MessageCrypto.sha1('string to hash');
Static method:
sha1 (...args: string[]): string;
md5 (text: string): string;
getAESKey (encodingAESKey: string): Buffer;
getAESKeyIV (aesKey: Buffer): Buffer;
PKCS7Encoder (buff: Buffer): Buffer;
PKCS7Decoder (buff: Buffer): Buffer;
decrypt (aesKey: Buffer, iv: Buffer, str: string): string;
encrypt (aesKey: Buffer, iv: Buffer, msg: string, appId: string): string;
createNonceStr (length = 16): string;
encryptMessage (appId: string, token: string, encodingAESKey: string, message: string, timestamp: string, nonce: string): string;
decryptMessage (token: string, encodingAESKey: string, signature: string, timestamp: string, nonce: string, encryptXml: string);
decryptMessage (token: string, encodingAESKey: string, signature: string, timestamp: string, nonce: string, encryptXml: string);
checkSignature (signature: string, timestamp: string, nonce: string, token: string);
Create .env.test.local file, and save your test appid and secret in the file.
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
Run e2e test.
npm run test:e2e
Run unit test.
npm run test wechat.service.userinfo.spec.ts
Start service testing
npx ts-node -T tests/e2e/wechat-app.main.ts
Public account message push configuration (WeChat public test platform), after turning on the above service test, you can pass the configuration verification
URL: http://your/url/wechat/push, such as: http://113.22.11.2:3001/wechat/push
Token: pamtest
Obtain access_token from the WeChat public platform interface debugging tool
body
{ "grant_type": "client_credential", "appid": "your/appid", "secret": "your/secret", "force_refresh": false}
Debugging tools on the WeChat open platform - debugging tools for message push testing to test push