{"id":16988512,"url":"https://github.com/baaxl9vh/nest-wechat","last_synced_at":"2025-05-16T10:05:54.023Z","repository":{"id":40203968,"uuid":"441480656","full_name":"baaxl9vh/nest-wechat","owner":"baaxl9vh","description":"NestJS module for WeChat server-side API.","archived":false,"fork":false,"pushed_at":"2024-11-08T08:57:54.000Z","size":900,"stargazers_count":166,"open_issues_count":5,"forks_count":37,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-05-16T10:05:06.456Z","etag":null,"topics":["nestjs","typescript","wechat"],"latest_commit_sha":null,"homepage":"https://baaxl9vh.github.io/nest-wechat","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/baaxl9vh.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-24T14:04:21.000Z","updated_at":"2025-05-02T18:03:37.000Z","dependencies_parsed_at":"2024-07-08T18:19:53.575Z","dependency_job_id":"3e3e7f7e-240e-4413-a4bd-23081f0fc6e5","html_url":"https://github.com/baaxl9vh/nest-wechat","commit_stats":{"total_commits":269,"total_committers":5,"mean_commits":53.8,"dds":"0.022304832713754608","last_synced_commit":"6c61fe699ae57fc5d3eb0e09f182b026e4bae392"},"previous_names":[],"tags_count":53,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baaxl9vh%2Fnest-wechat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baaxl9vh%2Fnest-wechat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baaxl9vh%2Fnest-wechat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baaxl9vh%2Fnest-wechat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baaxl9vh","download_url":"https://codeload.github.com/baaxl9vh/nest-wechat/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254509477,"owners_count":22082891,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nestjs","typescript","wechat"],"created_at":"2024-10-14T03:04:12.866Z","updated_at":"2025-05-16T10:05:53.971Z","avatar_url":"https://github.com/baaxl9vh.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv\u003e\n  \u003cdiv align='center'\u003e\n    \u003ch1\u003enest-wechat\u003c/h1\u003e\n  \u003c/div\u003e\n  \u003cdiv\u003e\n    \u003cp\u003e微信公众号、微信程序开、微信小游戏、微信支付以及企业微信等服务端API nestjs 模块封装。也可以直接当工具类使用。\u003c/p\u003e\n    \u003cp\u003enest-wechat是自用业务的封装，如果你需要用到的api还没有，可以提 \u003ca href='https://github.com/baaxl9vh/nest-wechat/issues'\u003eissues\u003c/a\u003e 给我，我会尽快补上。\u003c/p\u003e\n    \u003cdiv align='center'\u003e\n      \u003cbr /\u003e\n      \u003csub\u003e\u003ca href='https://baaxl9vh.github.io/nest-wechat/'\u003e中文文档\u003ca/\u003e\u003c/sub\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n  \u003cbr /\u003e\n\u003c/div\u003e\n\n## 快速开始\n\n### 安装\n\n```shell\nnpm i --save nest-wechat\n```\n\n### nestjs 模块引入\n\n+ register方法注册\n\n```javascript\nimport { Module } from '@nestjs/common';\n\nimport { WeChatModule } from 'nest-wechat';\n\n@Module({\n  imports: [WeChatModule.register({appId: 'your app id', secret: 'your secret'})],\n})\nexport class AppModule {\n}\n```\n\n+ forRoot配置注册\n\n```javascript\nimport { CACHE_MANAGER, Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { Cache } from 'cache-manager';\nimport { RedisCache, WeChatModule } from 'nest-wechat';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot({\n      envFilePath: '.env.test.local',\n    }),\n    WeChatModule.forRootAsync({\n      imports: [ConfigModule],\n      inject: [ConfigService, CACHE_MANAGER],\n      useFactory: (configService: ConfigService, cache: Cache) =\u003e ({\n        appId: configService.get('WX_APPID'),\n        secret: configService.get('WX_SECRET'),\n        token: configService.get('WX_TOKEN'),\n        encodingAESKey: configService.get('WX_AESKEY'),\n        cacheAdapter: new RedisCache(cache),\n        debug: true,\n      }),\n    }),\n  ]\n})\nexport class AppModule {\n}\n```\n\n### 工具类引入\n\n```javascript\nimport { WeChatService } from 'nest-wechat';\nconst service = new WeChatService({ appId: 'your app id', secret: 'your secret'});\n```\n\n## 全局接口\n\n### ICache\n\n```javascript\n/**\n * 缓存接口，需要自定义缓存，请实现该接口\n * \n * cache interface, please implement this interface if you need.\n * \n */\nexport interface ICache {\n  get\u003cT\u003e (key: string): Promise\u003cT\u003e;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  set (key: string, value: any): void;\n  remove (key: string): boolean;\n  close (): void;\n}\n```\n\n## WeChatService 属性与方法\n\n### config: WeChatModuleOptions\n\n配置读写属性，类型：WeChatModuleOptions\n\n### cacheAdapter: ICache\n\n缓存适配器读写属性，类型：ICache，默认是一个Map实现的缓存\n\n## 微信公众号API\n\n### 网页授权\n\n#### getAccessTokenByCode\n\n```typescript\npublic async getAccessTokenByCode (code: string, _appId?: string, _secret?: string): Promise\u003cUserAccessTokenResult\u003e;\n```\n\n正确返回\n\n```json\n{\n  \"access_token\":\"ACCESS_TOKEN\",\n  \"expires_in\":7200,\n  \"refresh_token\":\"REFRESH_TOKEN\",\n  \"openid\":\"OPENID\",\n  \"scope\":\"SCOPE\" \n}\n```\n\n错误返回\n\n```json\n{\n    \"errcode\": 40029,\n    \"errmsg\": \"invalid code\"\n}\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html)\n\n#### getUserInfo\n\n公众号拉取用户信息\n\n```typescript\npublic async getUserInfo (accessToken: string, openid: string, lang: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promise\u003cUserInfoResult\u003e;\n```\n\n正确返回\n\n```json\n{   \n  \"openid\": \"OPENID\",\n  \"nickname\": NICKNAME,\n  \"sex\": 1,\n  \"province\":\"PROVINCE\",\n  \"city\":\"CITY\",\n  \"country\":\"COUNTRY\",\n  \"headimgurl\":\"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46\",\n  \"privilege\":[ \"PRIVILEGE1\" \"PRIVILEGE2\"     ],\n  \"unionid\": \"o6_bmasdasdsad6_2sgVt7hMZOPfL\"\n}\n```\n\n错误返回\n\n```json\n{\n  \"errcode\":40003,\n  \"errmsg\":\" invalid openid \"\n}\n```\n\n### 获取Access token\n\n#### getAccountAccessToken\n\n```typescript\npublic async getAccountAccessToken (_appId?: string, _secret?: string): Promise\u003cAccountAccessTokenResult\u003e;\n```\n\n正确返回\n\n```json\n{\n  \"access_token\": \"52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8wZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ\",\n  \"expires_in\": 7200\n}\n```\n\n错误返回\n\n```json\n{\n  \"errcode\": 40013,\n  \"errmsg\": \"invalid appid\"\n}\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html)\n\n### 获取稳定版接口调用凭据\n\n#### getStableAccessToken\n\n```typescript\npublic async getStableAccessToken (_appId?: string, _secret?: string, force = false): Promise\u003cAccountAccessTokenResult\u003e;\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/getStableAccessToken.html)\n\n### 获取jsapi_ticket\n\n#### getJSApiTicket\n\n```typescript\npublic async getJSApiTicket (_appId?: string, _secret?: string): Promise\u003cTicketResult\u003e;\n```\n\n返回数据\n\n```json\n{\n  \"errcode\": 0,\n  \"errmsg\": \"ok\",\n  \"ticket\": \"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA\",\n  \"expires_in\": 7200\n}\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62)\n\n### JS-SDK使用权限签名\n\n#### jssdkSignature\n\n```typescript\npublic async jssdkSignature (url: string): Promise\u003cSignatureResult\u003e;\npublic async jssdkSignature (url: string, appId: string, secret:string): Promise\u003cSignatureResult\u003e;\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#65)\n\n### 发送模板消息\n\n#### sendTemplateMessage\n\n```typescript\npublic async sendTemplateMessage (message: TemplateMessage, appId?: string, secret?: string): Promise\u003cDefaultRequestResult \u0026 { msgid: string }\u003e;\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#5)\n\n### 生成带参数的二维码\n\n#### createQRCode\n\n```typescript\npublic async createQRCode (data: AccountCreateQRCode, appId?: string, secret?: string): Promise\u003cAccountCreateQRCodeResult\u003e;\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html)\n\n### 通过ticket换取二维码\n\n#### showQRCode\n\n```typescript\npublic showQRCode (ticket: string): Promis\u003cBuffer\u003e;\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html)\n\n### 填写服务器配置\n\n#### checkSignatureExpress\n\n```typescript\nWeChatService.checkSignatureExpress (req: Request, res: Response);\n```\n\nUsage:\n\n```typescript\n@Get('push')\nasync pushTest (@Req() req: Request, @Res() res: Response) {\n  this.service.checkSignatureExpress(req, res);\n}\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html)\n\n### 接收事件推送\n\n#### messagePushExpressHandler\n\n```typescript\n// 加密模式\nWeChatService.messagePushExpressHandler (req: Request, res?: Response, resText?: string);\n// 明文模式\nWeChatService.plainMessagePushExpressHandler (req: Request, res?: Response, resText?: string);\n```\n\nUsage:\n\n```typescript\n@Post('push')\nasync officialPushTest (@Req() req: Request, @Res() res: Response) {\n  const decrypt = await this.service.messagePushExpressHandler(req, res);\n}\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html)\n\n## 微信小程序\n\n### 获取接口调用凭据\n\n```typescript\npublic getAccessToken (appId?: string, secret?: string): Promise\u003cAccessTokenResult\u003e;\n```\n\n```typescript\nconst service = new WeChatService({ appId: 'your app id', secret: 'your secret'});\nconst res = await service.mp.getAccessToken();\nconsole.log(res.data.access_token);\n```\n\n### 查询rid信息\n\n```typescript\npublic async getRid (rid: string, accessToken: string): Promise\u003cRidInfo\u003e;\n```\n\n### 获取插件用户openpid\n\n```typescript\npublic async getPluginOpenPId (code: string, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { openpid: string }\u003e;\n```\n\n### 登录code2Session\n\n```typescript\npublic async code2Session (code: string, appId?: string, secret?: string): Promise\u003cSessionResult\u003e;\n```\n\n返回数据\n\n```json\n{\n  \"openid\": \"openid\",\n  \"session_key\": \"key\",\n  \"unionid\": \"unionid\",\n  \"errcode\": 0,\n  \"errmsg\": \"ok\",\n}\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html)\n\n### 获取手机号码\n\n```javascript\npublic async getPhoneNumber (code: string, accessToken: string);\n```\n\n\u003e [参考文档](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html)\n\n### 获取小程序码\n\n```typescript\npublic async getQRCode (params: QRCode, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { contentType: string, buffer: Buffer }\u003e;\n```\n\n### 获取不限制的小程序码\n\n```typescript\npublic getUnlimitedQRCode (params: GetUnlimitedQRCode, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { buffer: Buffer }\u003e;\n```\n\n### 获取小程序二维码\n\n```typescript\npublic async createQRCode (params: CreateQRCode, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { contentType: string, buffer: Buffer }\u003e;\n```\n\n### 查询scheme码\n\n```typescript\npublic async queryScheme (scheme: string, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { scheme_info: SchemeInfo, scheme_quota: SchemeQuota }\u003e;\n```\n\n### 获取scheme码\n\n```typescript\npublic generateScheme (params: GenerateScheme, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { openlink: string \u003e;\n```\n\n### 获取NFC的小程序scheme\n\n```typescript\npublic generateNFCScheme (params: GenerateNFCScheme, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { openlink: string }\u003e;\n```\n\n### 获取URLLink\n\n```typescript\npublic generateUrlLink (params: GenerateUrlLink, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { url_link: string }\u003e;\n```\n\n### 查询URLLink\n\n```typescript\npublic queryUrlLink (urlLink: string, accessToken: string): Promise\u003cUrlLinkResult\u003e;\n```\n\n### 获取ShortLink\n\n```typescript\npublic generateShortLink (params: GenerateShortLink, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { link: string }\u003e;\n```\n\n### 下发统一消息\n\n```typescript\npublic sendUniformMessage (params: SendUniformMessage, accessToken: string): Promise\u003cDefaultRequestResult\u003e;\n```\n\n### 创建activity_id\n\n```typescript\npublic createActivityId (params: CreateActivityId, accessToken: string): Promise\u003cActivityIdResult\u003e;\n```\n\n### 修改动态消息\n\n```typescript\npublic setUpdatableMsg (params: UpdatableMsg, accessToken: string): Promise\u003cDefaultRequestResult\u003e;\n```\n\n### 删除模板\n\n```typescript\npublic deleteMessageTemplate (priTmplId: string, accessToken: string): Promise\u003cDefaultRequestResult\u003e;\n```\n\n### 获取类目\n\n```typescript\npublic getCategory (accessToken: string): Promise\u003cDefaultRequestResult \u0026 { data: {id: number, name: string}[] }\u003e;\n```\n\n### 获取关键词列表\n\n```typescript\npublic getPubTemplateKeyWordsById (tid: number, accessToken: string): Promise\u003cPubTemplateKeyWords\u003e;\n```\n\n### 获取所属类目下的公共模板\n\n```typescript\npublic getPubTemplateTitleList (params: PubTemplateTitleList, accessToken: string): Promise\u003cPubTemplateTitleListResult\u003e;\n```\n\n### 获取个人模板列表\n\n```typescript\npublic getMessageTemplateList (accessToken: string): Promise\u003cMessageTemplateListResult\u003e;\n```\n\n### 发送订阅消息\n\n```typescript\npublic sendMessage (params: SendMessage, accessToken: string): Promise\u003cDefaultRequestResult\u003e;\n```\n\n### 添加模板\n\n```typescript\npublic addMessageTemplate (params: MessageTemplate, accessToken: string): Promise\u003cDefaultRequestResult \u0026 { priTmplId: string }\u003e;\n```\n\n## 移动应用\n\nModule导入\n\n```typescript\nimport { Module } from '@nestjs/common';\n\nimport { WeChatMobileModule } from 'nest-wechat';\n\n@Module({\n  imports: [WeChatMobileModule.register()],\n})\nexport class AppModule {\n}\n```\n\n工具类引入\n\n```typescript\nimport { MobileService } from 'nest-wechat';\nconst service = new MobileService();\n```\n\n### 通过code获取access_token\n\n```typescript\npublic getAccessToken (code: string, appId: string, secret: string): Promise\u003cAxiosResponse\u003cMobileAppAccessTokenResult, any\u003e\u003e;\n```\n\n### 刷新或续期access_token\n\n```typescript\npublic refreshAccessToken (appId: string, refreshToken: string): Promise\u003cAxiosResponse\u003cMobileAppAccessTokenResult, any\u003e\u003e;\n```\n\n### 检验access_token\n\n```typescript\npublic checkAccessToken (openId: string, accessToken: string): Promise\u003cAxiosResponse\u003cDefaultRequestResult, any\u003e\u003e;\n```\n\n## 微信支付\n\n### 小程序\n\n#### JSAPI下单\n\n```javascript\npay.jsapi (order: TransactionOrder, serialNo: string, privateKey: Buffer | string): Promise\u003c{prepay_id: string}\u003e;\n```\n\n#### 商户订单号查询订单\n\n```javascript\npay.getTransactionById (id: string, mchId: string, serialNo: string, privateKey: Buffer | string): Promise\u003cTrade\u003e;\n```\n\n#### 微信支付订单号查询订单\n\n```javascript\npay.getTransactionByOutTradeNo (outTradeNo: string, mchId: string, serialNo: string, privateKey: Buffer | string): Promise\u003cTrade\u003e;\n```\n\n#### 关闭订单\n\n```javascript\npay.close (outTradeNo: string, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 申请请退\n\n```javascript\npay.refund (refund: RequireOnlyOne\u003cRefundParameters, 'transaction_id' | 'out_trade_no'\u003e, mchId: string, serialNo: string, privateKey: Buffer | string): Promise\u003cRefundResult\u003e;\n```\n\n#### 查询单笔退款\n\n```javascript\npay.getRefund (outRefundNo: string, mchId: string, serialNo: string, privateKey: Buffer | string): Promise\u003cRefundResult\u003e;\n```\n\n#### 构造小程序调起支付参数\n\n```javascript\npay.buildMiniProgramPayment (appId: string, prepayId: string, privateKey: Buffer | string): MiniProgramPaymentParameters;\n```\n\n#### 支付通知处理程序\n\n```javascript\npay.paidCallback (publicKey: Buffer | string, apiKey: string, req: Request, res: Response): Promise\u003cTrade\u003e;\n```\n\n#### 退款通知处理程序\n\n```javascript\npay.refundedCallback (certs: Map\u003cstring, string\u003e, apiKey: string, req: Request, res: Response): Promise\u003cRefundNotifyResult\u003e;\n```\n\n### 电子发票\n\n#### 配置开发选项\n\n```javascript\npay.fapiaoDevConfig (data: DevelopmentConfigRequest, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 查询商户配置的开发选项\n\n```javascript\npay.getFapiaoDevConfig (mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 创建电子发票卡券模板\n\n```javascript\npay.createCardTemplate (data: CreateCardTemplateRequest, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 微信发票通知\n\n```javascript\npay.fapiaoCallback (certs: Map\u003cstring, string\u003e, apiKey: string, req: Request, res: Response): Promise\u003cFapiaoNotifyResult\u003e;\n```\n\n#### 获取用户填写的抬头\n\n```javascript\npay.getUserTitle (params: GetUserTitleParams, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 开具电子发票\n\n```javascript\npay.issueFapiao (data: IssueFapiaoRequest, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 查询电子发票\n\n```javascript\npay.getIssueFapiao (fapiaoApplyId: string, fapiaoId: string, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 冲红电子发票\n\n```javascript\npay.reverseFapiao (fapiaoApplyId: string, data: ReverseFapiaoRequest, mchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n### 敏感信息加解密\n\n#### 加密\n\n```javascript\npay.rsaEncryptOAEP (text: string, publicKey: Buffer | string);\n```\n\n#### 解密\n\n```javascript\npay.rsaDecryptOAEP (cipherText: string, privateKey: Buffer | string);\n```\n\n### 现金红包\n\n没有可用测试商户，未做成功测试，请自行测试，有问题请提issue。\n\n测试可自行执行单元测试（需要修改配置）\n\n```bash\nnpm run test lib/wepay.hb.spec.ts\n```\n\n#### 发放红包\n\n```javascript\npay.sendRedPack(redPack: RedPackData, appId: string, mchId: string, apiKey: string, publicKey: Buffer | string, privateKey: Buffer | string, group = false): Promise\u003cAxiosResponse\u003cstring, any\u003e\u003e;\n```\n\n#### 发放裂变红包\n\n```javascript\npay.sendGroupRedPack(redPack: GroupRedPackData, appId: string, mchId: string, apiKey: string, publicKey: Buffer | string, privateKey: Buffer | string): Promise\u003cAxiosResponse\u003cstring, any\u003e\u003e;\n```\n\n#### 查询红包记录\n\n```javascript\npay.getHbInfo(billNO: string, appId: string, mchId: string, apiKey: string, publicKey: Buffer | string, privateKey: Buffer | string): Promise\u003cAxiosResponse\u003cstring, any\u003e\u003e;\n```\n\n### 微信支付服务商\n\n#### 服务商JSAPI下单\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/partner-jsons/partner-jsapi-prepay.html)\n\n```javascript\njsapiOfPartner (order: TransactionOrderOfPartner, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 服务商JSAPI调起支付\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/jsapi-transfer-payment.html)\n\n构建调起微信支付参数接口\n\n```javascript\nbuildJSAPIParameters (appId: string, prepayId: string, privateKey: Buffer | string): MiniProgramPaymentParameters;\n```\n\n#### 服务商支付通知\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/payment-notice.html)\n\n```javascript\npaidCallbackOfPartner (certs: Map\u003cstring, string\u003e, apiKey: string, req: Request, res: Response): Promise\u003cTradeOfPartner\u003e;\n```\n\n#### 服务商关闭订单\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/close-order.html)\n\n```javascript\ncloseOfPartner (outTradeNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 服务商微信支付订单号查询订单\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/query-by-wx-trade-no.html)\n\n```javascript\ngetTransactionByIdOfPartner (id: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 服务商商户订单号查询订单\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/query-by-out-trade-no.html)\n\n```javascript\ngetTransactionByOutTradeNoOfPartner (outTradeNo: string, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 服务商退款申请\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/create.html)\n\n```javascript\nrefundOfPartner (refund: RequireOnlyOne\u003cRefundParametersOfPartner, 'transaction_id' | 'out_trade_no'\u003e, spMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 服务商查询单笔退款\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/query-by-out-refund-no.html)\n\n```javascript\ngetRefundOfPartner (outRefundNo: string, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n#### 服务商退款结果通知\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/partner-jsapi-payment/refund-result-notice.html)\n\n```javascript\nrefundedCallbackOfPartner (certs: Map\u003cstring, string\u003e, apiKey: string, req: Request, res: Response): Promise\u003cRefundNotifyResultOfPartner\u003e;\n```\n\n#### 服务商电子发票\n\n##### 服务商创建电子发票卡券模板\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-card-template/create-fapiao-card-template.html)\n\n```javascript\ncreateCardTemplateOfPartner (data: CreateCardTemplateRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n##### 服务商配置开发选项\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-merchant/update-development-config.html)\n\n```javascript\nfapiaoDevConfigOfPartner (data: DevelopmentConfigRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n##### 服务商查询商户配置的开发选项\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-merchant/query-development-config.html)\n\n```javascript\ngetFapiaoDevConfigOfPartner (spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n##### 服务商微信发票通知\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-card-template/user-invoice-rise-write-notice.html)\n\n```javascript\nfapiaoCallbackOfPartner (certs: Map\u003cstring, string\u003e, apiKey: string, req: Request, res: Response): Promise\u003cFapiaoNotifyResultOfPartner\u003e;\n```\n\n##### 服务商获取用户填写的抬头\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/user-title/get-user-title.html)\n\n```javascript\ngetUserTitleOfPartner (params: GetUserTitleParams, spMchId: string, subMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n##### 服务商开具电子发票\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-applications/issue-fapiao-applications.html)\n\n```javascript\nissueFapiaoOfPartner (data: IssueFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string, platformSerial: string);\n```\n\n##### 服务商查询电子发票\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-applications/get-fapiao-applications.html)\n\n```javascript\ngetIssueFapiaoOfPartner (fapiaoApplyId: string, fapiaoId: string | null | undefined, spMchId: string, subMchid: string, serialNo: string, privateKey: Buffer | string);\n```\n\n##### 服务商冲红电子发票\n\n\u003e [参考文档](https://pay.weixin.qq.com/docs/partner/apis/fapiao/fapiao-applications/reverse-fapiao-applications.html)\n\n```javascript\nreverseFapiaoOfPartner (fapiaoApplyId: string, data: ReverseFapiaoRequestOfPartner, spMchId: string, serialNo: string, privateKey: Buffer | string);\n```\n\n### 微信支付工具函数\n\n#### 报文解密\n\ndecryptCipherText\n\n```javascript\ndecryptCipherText\u003cT\u003e (apiKey: string, cipher: string, associatedData: string, nonce: string): T | string;\n```\n\n\u003e [参考文档](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_2.shtml)\n\n## 微信消息加解密签名工具类\n\n```typescript\nimport { MessageCrypto } from 'nest-wechat';\nconst sha1 = MessageCrypto.sha1('string to hash');\n```\n\n静态方法：\n\n+ sha1 (...args: string[]): string;\n+ md5 (text: string): string;\n+ getAESKey (encodingAESKey: string): Buffer;\n+ getAESKeyIV (aesKey: Buffer): Buffer;\n+ PKCS7Encoder (buff: Buffer): Buffer;\n+ PKCS7Decoder (buff: Buffer): Buffer;\n+ decrypt (aesKey: Buffer, iv: Buffer, str: string): string;\n+ encrypt (aesKey: Buffer, iv: Buffer, msg: string, appId: string): string;\n+ createNonceStr (length = 16): string;\n+ encryptMessage (appId: string, token: string, encodingAESKey: string, message: string, timestamp: string, nonce: string): string;\n+ decryptMessage (token: string, encodingAESKey: string, signature: string, timestamp: string, nonce: string, encryptXml: string);\n+ decryptMessage (token: string, encodingAESKey: string, signature: string, timestamp: string, nonce: string, encryptXml: string);\n+ checkSignature (signature: string, timestamp: string, nonce: string, token: string);\n\n## Run Test\n\nCreate .env.test.local file, and save your test appid and secret in the file.\n\n```config\nTEST_APPID=your/test/appid\nTEST_SECRET=your/test/secret\nTEST_JSSDK_URL=https://your/website/url\nTEST_TOKEN=your/token\nTEST_AESKEY=your/aeskey\n\nREDIS_HOST=your/redis/host\nREDIS_PORT=6379\nREDIS_PASSWORD=\nREDIS_DB=0\nREDIS_TTL=600\n```\n\nRun e2e test.\n\n```shell\nnpm run test:e2e\n```\n\nRun unit test.\n\n```shell\nnpm run test wechat.service.userinfo.spec.ts\n```\n\n### 消息推送测试\n\n+ 开启服务测试\n\n```bash\nnpx ts-node -T tests/e2e/wechat-app.main.ts\n```\n\n+ 公众号消息推送配置（微信公众测试平台），开启上面服务测试后，可以通过配置验证\n\n+ URL: http://your/url/wechat/push，如：http://113.22.11.2:3001/wechat/push\n+ Token: pamtest\n\n+ 在[微信公众平台接口调试工具](https://mp.weixin.qq.com/debug/)获得access_token\n\nbody\n\n```json\n{\n  \"grant_type\": \"client_credential\", \n  \"appid\": \"your/appid\", \n  \"secret\": \"your/secret\", \n  \"force_refresh\": false\n}\n```\n\n+ 在[微信开放平台调试工具-消息推送测试](https://developers.weixin.qq.com/apiExplorer?type=messagePush)的调试工具测试推送\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaaxl9vh%2Fnest-wechat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaaxl9vh%2Fnest-wechat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaaxl9vh%2Fnest-wechat/lists"}