WeChat 公式アカウント、WeChat プログラム開発、WeChat ミニゲーム、WeChat 支払い、エンタープライズ WeChat およびその他のサーバー側 API の nestjs モジュールのカプセル化。ツール クラスとして直接使用することもできます。
必要な API がまだ利用できない場合は、nest-wechat は私に問題を送信していただければ、できるだけ早く対応させていただきます。
中国語のドキュメント
npm i --save nest-wechat
registerメソッドの登録
import { モジュール } from '@nestjs/common';import { WeChatModule } from 'nest-wechat';@Module({ imports: [WeChatModule.register({appId: 'アプリ ID', シークレット: 'あなたのシークレット'})],})エクスポート クラス AppModule {}
forRoot構成の登録
import { CACHE_MANAGER, Module } from '@nestjs/common';import { ConfigModule, ConfigService } from '@nestjs/config';import { Cache } from 'cache-manager';import { RedisCache, WeChatModule } from 'nest-wechat ';@モジュール({ imports: [ConfigModule.forRoot({ envFilePath: '.env.test.local',}),WeChatModule.forRootAsync({ imports: [ConfigModule]、inject: [ConfigService, CACHE_MANAGER]、useFactory: (configService: ConfigService、cache:キャッシュ) => ({appId: configService.get('WX_APPID')、シークレット: configService.get('WX_SECRET')、トークン: configService.get('WX_TOKEN')、encodingAESKey: configService.get('WX_AESKEY')、cacheAdapter: 新しい RedisCache(キャッシュ)、デバッグ: true、})、})、 ]})エクスポート クラス AppModule {}
import { WeChatService } from 'nest-wechat';const service = new WeChatService({ appId: 'あなたのアプリ ID', Secret: 'あなたのシークレット'});
/** * キャッシュ インターフェイス。キャッシュをカスタマイズする必要がある場合は、このインターフェイスを実装してください。 * * キャッシュ インターフェイス。必要に応じて、このインターフェイスを実装してください。 get<T> (キー: 文字列): Promise<T>; // eslint-disable-next-line @typescript-eslint/no-explicit-any set (キー: 文字列、値: 任意): void; 削除 (キー: 文字列): ブール値; 閉じる(): 無効;}
読み取りおよび書き込みプロパティを構成します。「WeChatModuleOptions」と入力します。
キャッシュ アダプターの読み取りおよび書き込み属性、タイプ: ICache、デフォルトは Map によって実装されたキャッシュです
public async getAccessTokenByCode (code: string, _appId?: string, _secret?: string): Promise<UserAccessTokenResult>;
正しく返す
{ "access_token":"ACCESS_TOKEN"、"expires_in":7200、"refresh_token":"REFRESH_TOKEN"、"openid":"OPENID"、"scope":"SCOPE" }
エラーリターン
{"エラーコード": 40029,"errmsg": "無効なコード"}
参考資料
公式アカウントがユーザー情報を取得
public async getUserInfo (accessToken: string, openid: string, lang: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promise<UserInfoResult>;
正しく返す
{ "openid": "OPENID"、"ニックネーム": ニックネーム、 "性別": 1、"都道府県":"PROVINCE"、"市":"CITY"、"国":"COUNTRY"、 "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibXXSCfHe/46", "特権":[ "PRIVILEGE1" "PRIVILEGE2" ]、"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
エラーリターン
{ "エラーコード":40003、"errmsg":" 無効な openid "}
public async getAccountAccessToken (_appId?: string, _secret?: string): Promise<AccountAccessTokenResult>;
正しく返す
{ "アクセストークン": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", "有効期限": 7200}
エラーリターン
{ "エラーコード": 40013、"errmsg": "無効なアプリ ID"}
参考資料
public async getStableAccessToken (_appId?: 文字列、_secret?: 文字列、force = false): Promise<AccountAccessTokenResult>;
参考資料
public async getJSApiTicket (_appId?: string, _secret?: string): Promise<TicketResult>;
戻りデータ
{ "errcode": 0, "errmsg": "ok", "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in": 7200}
参考資料
public async jssdkSignature (url: string): Promise<SignatureResult>; public async jssdkSignature (url: string, appId: string, secret:string): Promise<SignatureResult>;
参考資料
public async sendTemplateMessage (message: TemplateMessage, appId?: string, secret?: string): Promise<DefaultRequestResult & { msgid: string }>;
参考資料
public async createQRCode (データ: AccountCreateQRCode、appId?: 文字列、シークレット?: 文字列): Promise<AccountCreateQRCodeResult>;
参考資料
public showQRCode (チケット: 文字列): Promis<バッファ>;
参考資料
WeChatService.checkSignatureExpress (req: リクエスト、res: レスポンス);
使用法:
@Get('push')async PushTest (@Req() req: リクエスト、@Res() res: レスポンス) { this.service.checkSignatureExpress(req, res);}
参考資料
// 暗号化モード WeChatService.messagePushExpressHandler (req: Request, res?: Response, resText?: string); // 平文モード WeChatService.plainMessagePushExpressHandler (req: Request, res?: Response, resText?: string);
使用法:
@Post('push')async officialPushTest (@Req() req: リクエスト、@Res() res: レスポンス) { const decrypt = await this.service.messagePushExpressHandler(req, res);}
参考資料
public getAccessToken (appId?: 文字列、秘密?: 文字列): Promise<AccessTokenResult>;
const service = new WeChatService({ appId: 'あなたのアプリ ID', 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: 文字列、appId?: 文字列、secret?: 文字列): Promise<SessionResult>;
戻りデータ
{ "openid": "openid"、"session_key": "キー"、"unionid": "unionid"、"errcode": 0、"errmsg": "ok"、 }
参考資料
public async getPhoneNumber (コード: 文字列、アクセストークン: 文字列);
参考資料
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 & {cheme_info:SchemeInfo,scheme_quota:SchemeQuota }>;
public generatedScheme (params: GenerateScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string >;
public generatedNFCScheme (params: GenerateNFCScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string }>;
public generatedUrlLink (params: GenerateUrlLink, accessToken: string): Promise<DefaultRequestResult & { url_link: string }>;
public queryUrlLink (urlLink: 文字列、accessToken: 文字列): Promise<UrlLinkResult>;
public generatedShortLink (パラメータ: GenerateShortLink, accessToken: string): Promise<DefaultRequestResult & { link: string }>;
public sendUniformMessage (パラメータ: SendUniformMessage、accessToken: string): Promise<DefaultRequestResult>;
public createActivityId (パラメータ: CreateActivityId、accessToken: string): Promise<ActivityIdResult>;
public setUpdatableMsg (params: UpdatableMsg、accessToken: string): Promise<DefaultRequestResult>;
public deleteMessageTemplate (priTmplId: 文字列、accessToken: 文字列): Promise<DefaultRequestResult>;
public getCategory (accessToken: string): Promise<DefaultRequestResult & { data: {id: 数値, 名前: 文字列}[] }>;
public getPubTemplateKeyWordsById (tid: 数値、accessToken: 文字列): 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 }>;
モジュールのインポート
import { モジュール } from '@nestjs/common';import { WeChatMobileModule } from 'nest-wechat';@Module({ インポート: [WeChatMobileModule.register()],})エクスポート クラス AppModule {}
ツールの紹介
import { MobileService } from 'nest-wechat';const service = new MobileService();
public getAccessToken (コード: 文字列、appId: 文字列、シークレット: 文字列): Promise<AxiosResponse<MobileAppAccessTokenResult, any>>;
public freshAccessToken (appId: string,freshToken: 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: 文字列、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列): Promise<Trade>;
pay.getTransactionByOutTradeNo (outTradeNo: 文字列、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列): Promise<Trade>;
pay.close (outTradeNo: 文字列、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
pay.refund (refund: RequireOnlyOne<RefundParameters, 'transaction_id' | 'out_trade_no'>、mchId: string、serialNo: string、privateKey: Buffer | string): Promise<RefundResult>;
pay.getRefund (outRefundNo: 文字列、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列): Promise<RefundResult>;
pay.buildMiniProgramPayment (appId: 文字列、prepayId: 文字列、privateKey: バッファ | 文字列): MiniProgramPaymentParameters;
pay.paidCallback (publicKey: バッファ | 文字列、apiKey: 文字列、req: リクエスト、res: レスポンス): Promise<Trade>;
pay.refundedCallback (certs: Map<string, string>, apiKey: string, req: リクエスト、res: Response): Promise<RefundNotifyResult>;
pay.fapiaoDevConfig (データ: DevelopmentConfigRequest、mchId: 文字列、シリアル番号: 文字列、privateKey: バッファ | 文字列);
pay.getFapiaoDevConfig (mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
pay.createCardTemplate (データ: CreateCardTemplateRequest、mchId: 文字列、シリアル番号: 文字列、privateKey: バッファ | 文字列);
pay.fapiaoCallback (certs: Map<string, string>, apiKey: string, req: リクエスト、res: Response): Promise<FapiaoNotifyResult>;
pay.getUserTitle (params: GetUserTitleParams、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
pay.issueFapiao (データ: IssueFapiaoRequest、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
pay.getIssueFapiao (fapiaoApplyId: 文字列、fapiaoId: 文字列、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
pay.reverseFapiao (fapiaoApplyId: 文字列、データ: ReverseFapiaoRequest、mchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
pay.rsaEncryptOAEP (テキスト: 文字列、公開キー: バッファ | 文字列);
pay.rsaDecryptOAEP (cipherText: 文字列、privateKey: バッファ | 文字列);
利用可能なテスト マーチャントがありません。テストは成功しませんでした。ご質問がある場合は、問題を送信してください。
テストは単体テストを実行できます (構成を変更する必要があります)
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>>;
参考資料
jsapiOfPartner (order: TransactionOrderOfPartner、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
WeChat 支払いパラメーターを呼び出すためのインターフェイスを構築する
buildJSAPIParameters (appId: 文字列、prepayId: 文字列、privateKey: バッファ | 文字列): MiniProgramPaymentParameters;
参考資料
paidCallbackOfPartner (証明書: Map<string, string>、apiKey: string、req: リクエスト、res: レスポンス): Promise<TradeOfPartner>;
参考資料
closeOfPartner (outTradeNo: 文字列、spMchId: 文字列、subMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
getTransactionByIdOfPartner (id: 文字列、spMchId: 文字列、subMchid: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
getTransactionByOutTradeNoOfPartner (outTradeNo: 文字列、spMchId: 文字列、subMchid: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
返金OfPartner (返金: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>、spMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
getRefundOfPartner (outRefundNo: 文字列、spMchId: 文字列、subMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
refundedCallbackOfPartner (certs: Map<string, string>, apiKey: string, req: リクエスト、res: Response): Promise<RefundNotifyResultOfPartner>;
参考資料
createCardTemplateOfPartner (データ: CreateCardTemplateRequestOfPartner、spMchId: 文字列、シリアル番号: 文字列、privateKey: バッファー | 文字列);
参考資料
fapiaoDevConfigOfPartner (データ: DevelopmentConfigRequestOfPartner、spMchId: 文字列、シリアル番号: 文字列、privateKey: バッファ | 文字列);
参考資料
getFapiaoDevConfigOfPartner (spMchId: 文字列、subMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
fapiaoCallbackOfPartner (証明書: Map<string, string>、apiKey: string、req: 要求、res: 応答): Promise<FapiaoNotifyResultOfPartner>;
参考資料
getUserTitleOfPartner (params: GetUserTitleParams、spMchId: 文字列、subMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
issueFapiaoOfPartner (データ: IssueFapiaoRequestOfPartner、spMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列、platformSerial: 文字列);
参考資料
getIssueFapiaoOfPartner (fapiaoApplyId: 文字列、fapiaoId: 文字列 | null | 未定義、spMchId: 文字列、subMchid: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
参考資料
reverseFapiaoOfPartner (fapiaoApplyId: 文字列、データ: ReverseFapiaoRequestOfPartner、spMchId: 文字列、serialNo: 文字列、privateKey: バッファ | 文字列);
暗号化テキストを復号化する
decryptCipherText<T> (apiKey: 文字列、暗号: 文字列、associatedData: 文字列、nonce: 文字列): T | 文字列;
参考資料
import { MessageCrypto } from 'nest-wechat';const sha1 = MessageCrypto.sha1('文字列からハッシュ');
静的メソッド:
sha1 (...引数: 文字列[]): 文字列;
md5 (テキスト: 文字列): 文字列;
getAESKey (encodingAESKey: string): バッファ;
getAESKeyIV (aesKey: バッファ): バッファ;
PKCS7Encoder (バフ: バッファ): バッファ。
PKCS7Decoder (バフ: バッファ): バッファ。
復号化 (aesKey: バッファ、iv: バッファ、str: 文字列): 文字列;
encrypt (aesKey: バッファ、iv: バッファ、msg: 文字列、appId: 文字列): 文字列;
createNonceStr (長さ = 16): 文字列;
encryptMessage (appId: 文字列、トークン: 文字列、encodingAESKey: 文字列、メッセージ: 文字列、タイムスタンプ: 文字列、ノンス: 文字列): 文字列;
decryptMessage (トークン: 文字列、encodingAESKey: 文字列、署名: 文字列、タイムスタンプ: 文字列、ノンス: 文字列、encryptXml: 文字列);
decryptMessage (トークン: 文字列、encodingAESKey: 文字列、署名: 文字列、タイムスタンプ: 文字列、ノンス: 文字列、encryptXml: 文字列);
checkSignature (署名: 文字列、タイムスタンプ: 文字列、ノンス: 文字列、トークン: 文字列);
.env.test.local ファイルを作成し、テストのアプリ ID とシークレットをファイルに保存します。
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
e2e テストを実行します。
npm 実行テスト:e2e
単体テストを実行します。
npm 実行テスト wechat.service.userinfo.spec.ts
サービステストを開始する
npx ts-node -T テスト/e2e/wechat-app.main.ts
パブリック アカウント メッセージ プッシュ構成 (WeChat パブリック テスト プラットフォーム)。上記のサービス テストをオンにした後、構成検証に合格できます。
URL: http://your/url/wechat/push、例: http://113.22.11.2:3001/wechat/push
トークン: pamtest
WeChat パブリック プラットフォーム インターフェイス デバッグ ツールから access_token を取得します。
体
{ "grant_type": "client_credential", "appid": "あなたの/appid", "秘密": "あなたの/秘密", "force_refresh": false}
WeChat オープン プラットフォーム上のデバッグ ツール - メッセージ プッシュ テストからテスト プッシュ用のデバッグ ツール