Offizielles WeChat-Konto, WeChat-Programmentwicklung, WeChat-Minispiele, WeChat-Zahlung und Enterprise-WeChat sowie andere serverseitige API-Kapselung von NestJS-Modulen. Es kann auch direkt als Werkzeugklasse verwendet werden.
Nest-Wechat ist ein Paket für den Eigengebrauch. Wenn die von Ihnen benötigte API noch nicht verfügbar ist, können Sie mir Probleme melden und ich werde sie so schnell wie möglich nachholen.
Chinesische Dokumentation
npm i --save nest-wechat
Registrieren Sie die Methodenregistrierung
import { Module } from '@nestjs/common';import { WeChatModule } from 'nest-wechat';@Module({ imports: [WeChatModule.register({appId: 'Ihre App-ID', Geheimnis: 'Ihr Geheimnis'})],})export class AppModule {}
forRoot-Konfigurationsregistrierung
import { CACHE_MANAGER, Module } from '@nestjs/common';import { ConfigModule, ConfigService } from '@nestjs/config';import { Cache } from 'cache-manager';import { RedisCache, WeChatModule } from 'nest-wechat ';@Modul({ 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'), Geheimnis: configService.get('WX_SECRET'), Token: configService.get('WX_TOKEN'), bindingAESKey: configService.get('WX_AESKEY'), CacheAdapter: new RedisCache(cache), debug: wahr, }),}), ]})Exportklasse AppModule {}
import { WeChatService } from 'nest-wechat';const service = new WeChatService({ appId: 'your app id', Secret: 'your Secret'});
/** * Cache-Schnittstelle, bitte implementieren Sie diese Schnittstelle, wenn Sie den Cache anpassen müssen * * Cache-Schnittstelle, bitte implementieren Sie diese Schnittstelle, wenn Sie sie benötigen * */export interface ICache { get<T> (Schlüssel: Zeichenfolge): Promise<T>; // eslint-disable-next-line @typescript-eslint/no-explicit-any set (Schlüssel: Zeichenfolge, Wert: beliebig): void; entfernen (Schlüssel: Zeichenfolge): boolean; close (): void;}
Konfigurieren Sie Lese- und Schreibeigenschaften und geben Sie Folgendes ein: WeChatModuleOptions
Lese- und Schreibattribute des Cache-Adapters, Typ: ICache, der Standardwert ist ein von Map implementierter Cache
public async getAccessTokenByCode (code: string, _appId?: string, _secret?: string): Promise<UserAccessTokenResult>;
Korrekt zurücksenden
{ „access_token“: „ACCESS_TOKEN“, „expires_in“:7200, „refresh_token“: „REFRESH_TOKEN“, „openid“: „OPENID“, „scope“: „SCOPE“ }
Fehlerrückgabe
{"errcode": 40029,"errmsg": "ungültiger Code"}
Referenzdokumentation
Das offizielle Konto ruft Benutzerinformationen ab
public async getUserInfo (accessToken: string, openid: string, lang: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promise<UserInfoResult>;
Korrekt zurücksenden
{ „openid“: „OPENID“, „nickname“: NICKNAME, „Geschlecht“: 1, „Provinz“: „PROVINZ“, „Stadt“: „STADT“, „Land“: „LAND“, „headimgurl“: „https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46“, „Privileg“:[ „PRIVILEGE1“ „PRIVILEGE2“ ], „unionid“: „o6_bmasdasdsad6_2sgVt7hMZOPfL“}
Fehlerrückgabe
{ „errcode“:40003, „errmsg“: „ungültige OpenID“}
public async getAccountAccessToken (_appId?: string, _secret?: string): Promise<AccountAccessTokenResult>;
Korrekt zurücksenden
{ "access_token": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", „expires_in“: 7200}
Fehlerrückgabe
{ „errcode“: 40013, „errmsg“: „ungültige App-ID“}
Referenzdokumentation
public async getStableAccessToken (_appId?: string, _secret?: string, force = false): Promise<AccountAccessTokenResult>;
Referenzdokumentation
public async getJSApiTicket (_appId?: string, _secret?: string): Promise<TicketResult>;
Daten zurückgeben
{ „errcode“: 0, „errmsg“: „ok“, „ticket“: „bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA“, „expires_in“: 7200}
Referenzdokumentation
public async jssdkSignature (url: string): Promise<SignatureResult>; public async jssdkSignature (url: string, appId: string, Secret:string): Promise<SignatureResult>;
Referenzdokumentation
public async sendTemplateMessage (message: TemplateMessage, appId?: string, Secret?: string): Promise<DefaultRequestResult & { msgid: string }>;
Referenzdokumentation
public async createQRCode (data: AccountCreateQRCode, appId?: string, Secret?: string): Promise<AccountCreateQRCodeResult>;
Referenzdokumentation
public showQRCode (ticket: string): Promis<Buffer>;
Referenzdokumentation
WeChatService.checkSignatureExpress (req: Request, res: Response);
Verwendung:
@Get('push')async pushTest (@Req() req: Request, @Res() res: Response) { this.service.checkSignatureExpress(req, res);}
Referenzdokumentation
// Verschlüsselter Modus WeChatService.messagePushExpressHandler (req: Request, res?: Response, resText?: string); // Klartextmodus WeChatService.plainMessagePushExpressHandler (req: Request, res?: Response, resText?: string);
Verwendung:
@Post('push')asyncofficialPushTest (@Req() req: Request, @Res() res: Response) { const decrypt = warte auf this.service.messagePushExpressHandler(req, res);}
Referenzdokumentation
public getAccessToken (appId?: string, Secret?: string): Promise<AccessTokenResult>;
const service = new WeChatService({ appId: 'Ihre App-ID', Geheimnis: 'Ihr Geheimnis'});
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>;
Daten zurückgeben
{ „openid“: „openid“, „session_key“: „key“, „unionid“: „unionid“, „errcode“: 0, „errmsg“: „ok“, }
Referenzdokumentation
öffentliches asynchrones getPhoneNumber (Code: String, AccessToken: String);
Referenzdokumentation
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 }>;
öffentliches asynchrones queryScheme (scheme: string, accessToken: string): Promise<DefaultRequestResult & { scheme_info: SchemeInfo, scheme_quota: SchemeQuota }>;
public genericScheme (params: GenerateScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string >;
public genericNFCScheme (params: GenerateNFCScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string }>;
public genericUrlLink (params: GenerateUrlLink, accessToken: string): Promise<DefaultRequestResult & { url_link: string }>;
public queryUrlLink (urlLink: string, accessToken: string): Promise<UrlLinkResult>;
public genericShortLink (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 }>;
Modulimport
import { Module } from '@nestjs/common';import { WeChatMobileModule } from 'nest-wechat';@Module({ Importe: [WeChatMobileModule.register()],})export class AppModule {}
Einführung von Werkzeugen
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 (Daten: DevelopmentConfigRequest, mchId: string, serialNo: string, privateKey: Buffer | string);
pay.getFapiaoDevConfig (mchId: string, serialNo: string, privateKey: Buffer | string);
pay.createCardTemplate (Daten: 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 (Daten: 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: Zeichenfolge, öffentlicher Schlüssel: Puffer | Zeichenfolge);
pay.rsaDecryptOAEP (cipherText: string, privateKey: Buffer | string);
Es sind keine Testhändler verfügbar und der Test war nicht erfolgreich. Wenn Sie Fragen haben, senden Sie bitte ein Problem.
Der Test kann Komponententests selbst ausführen (Konfiguration muss geändert werden).
npm test lib/wepay.hb.spec.ts ausführen
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>>;
Referenzdokumentation
jsapiOfPartner (order: TransactionOrderOfPartner, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
Erstellen Sie eine Schnittstelle zum Aufrufen von WeChat-Zahlungsparametern
buildJSAPIParameters (appId: string, prepayId: string, privateKey: Buffer | string): MiniProgramPaymentParameters;
Referenzdokumentation
paidCallbackOfPartner (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<TradeOfPartner>;
Referenzdokumentation
closeOfPartner (outTradeNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
getTransactionByIdOfPartner (id: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
getTransactionByOutTradeNoOfPartner (outTradeNo: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
returnOfPartner (refund: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>, spMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
getRefundOfPartner (outRefundNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
„refundedCallbackOfPartner“ (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResultOfPartner>;
Referenzdokumentation
createCardTemplateOfPartner (Daten: CreateCardTemplateRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
fapiaoDevConfigOfPartner (Daten: DevelopmentConfigRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
getFapiaoDevConfigOfPartner (spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
fapiaoCallbackOfPartner (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<FapiaoNotifyResultOfPartner>;
Referenzdokumentation
getUserTitleOfPartner (Parameter: GetUserTitleParams, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
issueFapiaoOfPartner (Daten: IssueFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string, platformSerial: string);
Referenzdokumentation
getIssueFapiaoOfPartner (fapiaoApplyId: string, fapiaoId: string | null | undefiniert, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);
Referenzdokumentation
reverseFapiaoOfPartner (fapiaoApplyId: string, data: ReverseFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);
decryptCipherText
decryptCipherText<T> (apiKey: string, cipher: string, connectedData: string, nonce: string): T |.
Referenzdokumentation
import { MessageCrypto } from 'nest-wechat';const sha1 = MessageCrypto.sha1('string to hash');
Statische Methode:
sha1 (...args: string[]): string;
md5 (Text: Zeichenfolge): Zeichenfolge;
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 (Länge = 16): string;
encryptMessage (AppId: String, Token: String, EncodingAESKey: String, Nachricht: String, Zeitstempel: String, Nonce: String): String;
decryptMessage (Token: String, EncryptAESKey: String, Signatur: String, Zeitstempel: String, Nonce: String, EncryptXml: String);
decryptMessage (Token: String, EncryptAESKey: String, Signatur: String, Zeitstempel: String, Nonce: String, EncryptXml: String);
checkSignature (Signatur: String, Zeitstempel: String, Nonce: String, Token: String);
Erstellen Sie die Datei .env.test.local und speichern Sie Ihre Test-App-ID und Ihr Geheimnis in der Datei.
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
Führen Sie den E2E-Test aus.
npm run test:e2e
Führen Sie einen Unit-Test durch.
npm führt den Test wechat.service.userinfo.spec.ts aus
Starten Sie den Servicetest
npx ts-node -T tests/e2e/wechat-app.main.ts
Push-Konfiguration für öffentliche Kontonachrichten (öffentliche WeChat-Testplattform). Nachdem Sie den oben genannten Diensttest aktiviert haben, können Sie die Konfigurationsüberprüfung bestehen
URL: http://your/url/wechat/push, wie zum Beispiel: http://113.22.11.2:3001/wechat/push
Token: pamtest
Rufen Sie access_token vom Debugging-Tool für die öffentliche WeChat-Plattformschnittstelle ab
Körper
{ "grant_type": "client_credential", „appid“: „Ihr/appid“, „secret“: „dein/geheimnis“, „force_refresh“: false}
Debugging-Tools auf der offenen WeChat-Plattform – Debugging-Tools für Nachrichten-Push-Tests zum Testen von Push