WeChat 공식 계정, WeChat 프로그램 개발, WeChat 미니 게임, WeChat 결제 및 기업 WeChat 및 기타 서버 측 API Nestjs 모듈 캡슐화. 도구 클래스로 직접 사용할 수도 있습니다.
Nest-wechat은 자영업을 위한 패키지입니다. 사용해야 하는 API가 아직 제공되지 않는 경우, 저에게 문제를 제출해 주시면 최대한 빨리 해결해 드리겠습니다.
중국어 문서
npm i --nest-wechat 저장
등록방법 등록
import { 모듈 } from '@nestjs/common';import { WeChatModule } from 'nest-wechat';@Module({ imports: [WeChatModule.register({appId: 'your app id', secret: 'your secret'})],})export class AppModule {}
forRoot 구성 등록
'@nestjs/common'에서 가져오기 { CACHE_MANAGER, 모듈 }; '@nestjs/config'에서 가져오기 { ConfigModule, ConfigService }; 'cache-manager'에서 가져오기 { 캐시 }; 'nest-wechat에서 가져오기 { RedisCache, WeChatModule } ';@기준 치수({ 가져오기: [ConfigModule.forRoot({ envFilePath: '.env.test.local',}),WeChatModule.forRootAsync({ 가져오기: [ConfigModule], 주입: [ConfigService, CACHE_MANAGER], useFactory: (configService: ConfigService, 캐시: 캐시) => ({appId: configService.get('WX_APPID'), 비밀: configService.get('WX_SECRET'), 토큰: configService.get('WX_TOKEN'), 인코딩AESKey: configService.get('WX_AESKEY'), 캐시 어댑터: 새로운 RedisCache(캐시), 디버그: 사실, }),}), ]}) 내보내기 클래스 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 설정(키: 문자열, 값: 임의): void; 제거(키: 문자열): 부울; 닫기(): 무효;}
읽기 및 쓰기 속성을 구성하고 다음을 입력합니다. WeChatModuleOptions
캐시 어댑터 읽기 및 쓰기 속성, 유형: ICache, 기본값은 Map에 의해 구현된 캐시입니다.
공용 비동기 getAccessTokenByCode(코드: 문자열, _appId?: 문자열, _secret?: 문자열): Promise<UserAccessTokenResult>;
올바르게 반환
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
오류 반환
{"errcode": 40029,"errmsg": "잘못된 코드"}
참조 문서
공식 계정은 사용자 정보를 가져옵니다
public async getUserInfo (accessToken: 문자열, openid: 문자열, lang: 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN'): Promise<UserInfoResult>;
올바르게 반환
{ "openid": "OPENID", "닉네임": NICKNAME, "성별": 1, "지방":"PROVINCE", "도시":"CITY", "국가":"국가", "headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "권한":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
오류 반환
{ "errcode":40003, "errmsg":" 잘못된 openid "}
public async getAccountAccessToken (_appId?: 문자열, _secret?: 문자열): Promise<AccountAccessTokenResult>;
올바르게 반환
{ "액세스_토큰": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", "expires_in": 7200}
오류 반환
{ "errcode": 40013, "errmsg": "잘못된 앱 ID"}
참조 문서
public async getStableAccessToken (_appId?: 문자열, _secret?: 문자열, force = false): Promise<AccountAccessTokenResult>;
참조 문서
공용 비동기 getJSApiTicket (_appId?: 문자열, _secret?: 문자열): Promise<TicketResult>;
데이터 반환
{ "errcode": 0, "errmsg": "ok", "티켓": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in": 7200}
참조 문서
public async jssdkSignature(url: string): Promise<SignatureResult>; public async jssdkSignature(url: string, appId: string, secret:string): Promise<SignatureResult>;
참조 문서
공용 비동기 sendTemplateMessage(메시지: TemplateMessage, appId?: 문자열, 비밀?: 문자열): Promise<DefaultRequestResult & { msgid: string }>;
참조 문서
공개 비동기 createQRCode(데이터: AccountCreateQRCode, appId?: 문자열, 비밀?: 문자열): Promise<AccountCreateQRCodeResult>;
참조 문서
공개 showQRCode(티켓: 문자열): Promis<Buffer>;
참조 문서
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')asyncofficialPushTest (@Req() req: 요청, @Res() res: 응답) { const decrypt = this.service.messagePushExpressHandler(req, res)를 기다립니다.}
참조 문서
public getAccessToken (appId?: 문자열, secret?: 문자열): Promise<AccessTokenResult>;
const service = new WeChatService({ appId: '앱 ID', 비밀: '비밀'}); const res = wait service.mp.getAccessToken();console.log(res.data.access_token);
공용 비동기 getRid(rid: 문자열, accessToken: 문자열): Promise<RidInfo>;
public async getPluginOpenPId (code: string, accessToken: string): Promise<DefaultRequestResult & { openpid: string }>;
공개 비동기 code2Session(코드: 문자열, appId?: 문자열, 비밀?: 문자열): Promise<SessionResult>;
데이터 반환
{ "openid": "openid", "session_key": "key", "unionid": "unionid", "errcode": 0, "errmsg": "ok", }
참조 문서
공개 비동기 getPhoneNumber(코드: 문자열, accessToken: 문자열);
참조 문서
공개 비동기 getQRCode(매개변수: QRCode, accessToken: 문자열): Promise<DefaultRequestResult & { contentType: 문자열, 버퍼: Buffer }>;
공개 getUnlimitedQRCode (매개변수: GetUnlimitedQRCode, accessToken: 문자열): Promise<DefaultRequestResult & { buffer: Buffer }>;
공개 비동기 createQRCode(매개변수: CreateQRCode, accessToken: 문자열): Promise<DefaultRequestResult & { contentType: 문자열, 버퍼: Buffer }>;
public async queryScheme (scheme: string, accessToken: string): Promise<DefaultRequestResult & {cheme_info: SchemeInfo,cheme_quota: SchemeQuota }>;
공용 generateScheme(매개변수: 생성Scheme, accessToken: 문자열): Promise<DefaultRequestResult & { openlink: 문자열 >;
공개 generateNFCScheme(매개변수: GenerationNFCScheme, accessToken: 문자열): Promise<DefaultRequestResult & { openlink: string }>;
공개 generateUrlLink(매개변수: generateUrlLink, accessToken: 문자열): Promise<DefaultRequestResult & { url_link: string }>;
public queryUrlLink(urlLink: 문자열, accessToken: 문자열): Promise<UrlLinkResult>;
public generateShortLink(매개변수: generateShortLink, accessToken: 문자열): Promise<DefaultRequestResult & { link: string }>;
공용 sendUniformMessage(매개변수: SendUniformMessage, accessToken: 문자열): Promise<DefaultRequestResult>;
공개 createActivityId(매개변수: CreateActivityId, accessToken: 문자열): Promise<ActivityIdResult>;
공개 setUpdatableMsg(매개변수: UpdatableMsg, accessToken: 문자열): Promise<DefaultRequestResult>;
공개 deleteMessageTemplate(priTmplId: 문자열, accessToken: 문자열): Promise<DefaultRequestResult>;
public getCategory (accessToken: string): Promise<DefaultRequestResult & { data: {id: number, name: string}[] }>;
public getPubTemplateKeyWordsById (tid: 숫자, accessToken: 문자열): Promise<PubTemplateKeyWords>;
공개 getPubTemplateTitleList(매개변수: PubTemplateTitleList, accessToken: 문자열): Promise<PubTemplateTitleListResult>;
공용 getMessageTemplateList(accessToken: 문자열): Promise<MessageTemplateListResult>;
공개 sendMessage(매개변수: SendMessage, accessToken: 문자열): Promise<DefaultRequestResult>;
공개 addMessageTemplate(매개변수: MessageTemplate, accessToken: 문자열): 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 RefreshAccessToken (appId: 문자열, RefreshToken: 문자열): Promise<AxiosResponse<MobileAppAccessTokenResult, any>>;
public checkAccessToken (openId: 문자열, accessToken: 문자열): Promise<AxiosResponse<DefaultRequestResult, any>>;
pay.jsapi(주문: TransactionOrder, serialNo: 문자열, privateKey: Buffer | 문자열): Promise<{prepay_id: 문자열}>;
pay.getTransactionById (id: 문자열, mchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열): Promise<Trade>;
pay.getTransactionByOutTradeNo (outTradeNo: 문자열, mchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열): Promise<Trade>;
pay.close (outTradeNo: 문자열, mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.refund (환불: RequireOnlyOne<RefundParameters, 'transaction_id' | 'out_trade_no'>, mchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열): Promise<RefundResult>;
pay.getRefund (outRefundNo: 문자열, mchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열): Promise<RefundResult>;
pay.buildMiniProgramPayment(appId: 문자열, prepayId: 문자열, privateKey: Buffer | 문자열): MiniProgramPaymentParameters;
pay.paidCallback (publicKey: Buffer | string, apiKey: string, req: 요청, res: 응답): Promise<Trade>;
pay.refundedCallback (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResult>;
pay.fapiaoDevConfig(데이터: DevelopmentConfigRequest, mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.getFapiaoDevConfig (mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.createCardTemplate(데이터: CreateCardTemplateRequest, mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.fapiaoCallback (certs: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<FapiaoNotifyResult>;
pay.getUserTitle(매개변수: GetUserTitleParams, mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.issueFapiao(데이터: IssueFapiaoRequest, mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.getIssueFapiao (fapiaoApplyId: 문자열, fapiaoId: 문자열, mchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
pay.reverseFapiao (fapiaoApplyId: 문자열, 데이터: ReverseFapiaoRequest, mchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열);
pay.rsaEncryptOAEP(텍스트: 문자열, 공개 키: 버퍼 | 문자열);
pay.rsaDecryptOAEP(cipherText: 문자열, privateKey: 버퍼 | 문자열);
사용 가능한 테스트 판매자가 없으며 테스트가 성공하지 못했습니다. 궁금한 사항이 있으면 문제를 제출해 주세요.
테스트는 자체적으로 단위 테스트를 실행할 수 있습니다(구성을 수정해야 함).
npm 실행 테스트 lib/wepay.hb.spec.ts
pay.sendRedPack(redPack: RedPackData, appId: 문자열, mchId: 문자열, apiKey: 문자열, publicKey: Buffer | string, privateKey: Buffer | string, group = false): Promise<AxiosResponse<string, any>>;
pay.sendGroupRedPack(redPack: GroupRedPackData, appId: 문자열, mchId: 문자열, apiKey: 문자열, publicKey: Buffer | string, privateKey: Buffer | string): Promise<AxiosResponse<string, any>>;
pay.getHbInfo(billNO: 문자열, appId: 문자열, mchId: 문자열, apiKey: 문자열, publicKey: Buffer | string, privateKey: Buffer | string): Promise<AxiosResponse<string, any>>;
참조 문서
jsapiOfPartner(순서: TransactionOrderOfPartner, serialNo: 문자열, privateKey: 버퍼 | 문자열);
참조 문서
WeChat 결제 매개변수 호출을 위한 인터페이스 구축
buildJSAPIParameters(appId: 문자열, prepayId: 문자열, privateKey: Buffer | 문자열): MiniProgramPaymentParameters;
참조 문서
paidCallbackOfPartner(인증서: Map<string, string>, apiKey: 문자열, req: 요청, res: 응답): Promise<TradeOfPartner>;
참조 문서
closeOfPartner (outTradeNo: 문자열, spMchId: 문자열, subMchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
참조 문서
getTransactionByIdOfPartner(id: 문자열, spMchId: 문자열, subMchid: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
참조 문서
getTransactionByOutTradeNoOfPartner (outTradeNo: 문자열, spMchId: 문자열, subMchid: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열);
참조 문서
RefundOfPartner(환불: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>, spMchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열);
참조 문서
getRefundOfPartner (outRefundNo: 문자열, spMchId: 문자열, subMchId: 문자열, serialNo: 문자열, privateKey: Buffer | 문자열);
참조 문서
환불된CallbackOfPartner(인증서: Map<string, string>, apiKey: 문자열, req: 요청, res: 응답): Promise<RefundNotifyResultOfPartner>;
참조 문서
createCardTemplateOfPartner(데이터: CreateCardTemplateRequestOfPartner, spMchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
참조 문서
fapiaoDevConfigOfPartner(데이터: DevelopmentConfigRequestOfPartner, spMchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
참조 문서
getFapiaoDevConfigOfPartner (spMchId: 문자열, subMchId: 문자열, serialNo: 문자열, privateKey: 버퍼 | 문자열);
참조 문서
fapiaoCallbackOfPartner(인증서: Map<string, string>, apiKey: 문자열, req: 요청, res: 응답): Promise<FapiaoNotifyResultOfPartner>;
참조 문서
getUserTitleOfPartner(매개변수: 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('string to hash');
정적 방법:
sha1 (...args: 문자열[]): 문자열;
md5(텍스트: 문자열): 문자열;
getAESKey(인코딩AESKey: 문자열): 버퍼;
getAESKeyIV(aesKey: 버퍼): 버퍼;
PKCS7Encoder(버프: 버퍼): 버퍼;
PKCS7Decoder(버프: 버퍼): 버퍼;
해독(aesKey: 버퍼, iv: 버퍼, str: 문자열): 문자열;
암호화(aesKey: 버퍼, iv: 버퍼, msg: 문자열, appId: 문자열): 문자열;
createNonceStr(길이 = 16): 문자열;
encryptMessage(appId: 문자열, 토큰: 문자열, 인코딩AESKey: 문자열, 메시지: 문자열, 타임스탬프: 문자열, nonce: 문자열): 문자열;
decryptMessage(토큰: 문자열, 인코딩AESKey: 문자열, 서명: 문자열, 타임스탬프: 문자열, nonce: 문자열, encryptXml: 문자열);
decryptMessage(토큰: 문자열, 인코딩AESKey: 문자열, 서명: 문자열, 타임스탬프: 문자열, nonce: 문자열, encryptXml: 문자열);
checkSignature(서명: 문자열, 타임스탬프: 문자열, nonce: 문자열, 토큰: 문자열);
.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": 거짓}
WeChat 개방형 플랫폼의 디버깅 도구 - 푸시 테스트를 위한 메시지 푸시 테스트용 디버깅 도구