Compte officiel WeChat, développement du programme WeChat, mini-jeux WeChat, paiement WeChat et entreprise WeChat et autre encapsulation de modules nestjs API côté serveur. Il peut également être utilisé directement comme classe d’outils.
nest-wechat est un package destiné aux entreprises à usage personnel. Si l'API que vous devez utiliser n'est pas encore disponible, vous pouvez me soumettre des problèmes et je le rattraperai dès que possible.
Documentation chinoise
npm i --save nid-wechat
enregistrement de la méthode d'enregistrement
importer { Module } depuis '@nestjs/common'; importer { WeChatModule } depuis 'nest-wechat';@Module({ importations : [WeChatModule.register({appId : 'votre identifiant d'application', secret : 'votre secret'})],})export class AppModule {}
Enregistrement de la configuration forRoot
importer { CACHE_MANAGER, Module } depuis '@nestjs/common'; importer { ConfigModule, ConfigService } depuis '@nestjs/config'; importer { Cache } depuis 'cache-manager'; importer { RedisCache, WeChatModule } depuis 'nest-wechat ';@Module({ importations : [ConfigModule.forRoot({ envFilePath : '.env.test.local',}),WeChatModule.forRootAsync({ importations : [ConfigModule], injecter : [ConfigService, CACHE_MANAGER], useFactory : (configService : ConfigService, cache : Cache) => ({appId : configService.get('WX_APPID'), secret : configService.get('WX_SECRET'), jeton : configService.get('WX_TOKEN'), encodingAESKey : configService.get('WX_AESKEY'), cacheAdapter : nouveau RedisCache(cache), débogage : vrai, }),}), ]})classe d'exportation AppModule {}
importer { WeChatService } depuis 'nest-wechat'; const service = new WeChatService ({ appId : 'votre identifiant d'application', secret : 'votre secret'});
/** * Interface de cache, veuillez implémenter cette interface si vous avez besoin de personnaliser le cache * * Interface de cache, veuillez implémenter cette interface si vous en avez besoin. get<T> (clé : chaîne) : Promise<T> ; // eslint-disable-next-line @typescript-eslint/no-explicit-any set (clé : chaîne, valeur : any) : void ; supprimer (clé : chaîne) : booléen ; fermer (): vide;}
Configurez les propriétés de lecture et d'écriture, tapez : WeChatModuleOptions
Attributs de lecture et d'écriture de l'adaptateur de cache, tapez : ICache, la valeur par défaut est un cache implémenté par Map
public async getAccessTokenByCode (code : chaîne, _appId ? : chaîne, _secret ? : chaîne) : Promise<UserAccessTokenResult> ;
Retourner correctement
{ "access_token": "ACCESS_TOKEN", "expires_in": 7200, "refresh_token": "REFRESH_TOKEN", "openid": "OPENID", "scope": "SCOPE" }
retour d'erreur
{"errcode": 40029,"errmsg": "code invalide"}
Documentation de référence
Le compte officiel extrait les informations des utilisateurs
public async getUserInfo (accessToken : chaîne, openid : chaîne, lang : 'zh_CN' | 'zh_TW' | 'en' = 'zh_CN') : Promise<UserInfoResult> ;
Retourner correctement
{ "openid": "OPENID", "nickname": NICKNAME, "sexe": 1, "province": "PROVINCE", "ville": "VILLE", "pays": "PAYS", "headimgurl": https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilège":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
retour d'erreur
{ "errcode": 40003, "errmsg": "openid invalide"}
public async getAccountAccessToken (_appId ? : chaîne, _secret ? : chaîne) : Promise<AccountAccessTokenResult> ;
Retourner correctement
{ "access_token": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ", "expires_in": 7200}
retour d'erreur
{ "errcode": 40013, "errmsg": "appid invalide"}
Documentation de référence
public async getStableAccessToken (_appId ? : string, _secret ? : string, force = false) : Promise<AccountAccessTokenResult> ;
Documentation de référence
public async getJSApiTicket (_appId ? : chaîne, _secret ? : chaîne) : Promise<TicketResult> ;
Renvoyer les données
{ "errcode": 0, "errmsg": "ok", "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in": 7200}
Documentation de référence
public async jssdkSignature (url : chaîne) : Promise<SignatureResult> ; public async jssdkSignature (url : chaîne, appId : chaîne, secret : chaîne) : Promise<SignatureResult> ;
Documentation de référence
public async sendTemplateMessage (message : TemplateMessage, appId ? : string, secret ? : string) : Promise<DefaultRequestResult & { msgid : string }> ;
Documentation de référence
public async createQRCode (données : AccountCreateQRCode, appId ? : string, secret ? : string) : Promise<AccountCreateQRCodeResult> ;
Documentation de référence
public showQRCode (ticket : chaîne) : Promis<Buffer> ;
Documentation de référence
WeChatService.checkSignatureExpress (req : demande, res : réponse) ;
Usage:
@Get('push')async pushTest (@Req() req : Requête, @Res() res : Réponse) { this.service.checkSignatureExpress(req, res);}
Documentation de référence
// Mode crypté WeChatService.messagePushExpressHandler (req : Request, res ? : Response, resText ? : string) ; // Mode texte brut WeChatService.plainMessagePushExpressHandler (req : Request, res ? : Response, resText ? : string) ;
Usage:
@Post('push')async officialPushTest (@Req() req : Requête, @Res() res : Réponse) { const décrypter = attendre this.service.messagePushExpressHandler(req, res);}
Documentation de référence
public getAccessToken (appId ? : chaîne, secret ? : chaîne) : Promise<AccessTokenResult> ;
const service = new WeChatService({ appId : 'votre identifiant d'application', secret : 'votre secret'}); const res = wait service.mp.getAccessToken();console.log(res.data.access_token);
public async getRid (rid : string, accessToken : string) : Promise<RidInfo> ;
public async getPluginOpenPId (code : chaîne, accessToken : chaîne) : Promise<DefaultRequestResult & { openpid : chaîne }> ;
code2Session asynchrone public (code : chaîne, appId ? : chaîne, secret ? : chaîne) : Promise<SessionResult> ;
Renvoyer les données
{ "openid": "openid", "session_key": "key", "unionid": "unionid", "errcode": 0, "errmsg": "ok", }
Documentation de référence
public async getPhoneNumber (code : chaîne, accessToken : chaîne) ;
Documentation de référence
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 : chaîne, accessToken : chaîne) : Promise<UrlLinkResult> ;
public generateShortLink (params : GenerateShortLink, accessToken : string) : Promise<DefaultRequestResult & { link: string }> ;
public sendUniformMessage (paramètres : SendUniformMessage, accessToken : string) : Promise<DefaultRequestResult> ;
public createActivityId (params : CreateActivityId, accessToken : string) : Promise<ActivityIdResult> ;
public setUpdatableMsg (params : UpdatableMsg, accessToken : string) : Promise<DefaultRequestResult> ;
public deleteMessageTemplate (priTmplId : chaîne, accessToken : chaîne) : Promise<DefaultRequestResult> ;
public getCategory (accessToken : string) : Promise<DefaultRequestResult & { data : {id : number, name : string}[] }>;
public getPubTemplateKeyWordsById (tid : numéro, accessToken : chaîne) : Promise<PubTemplateKeyWords> ;
public getPubTemplateTitleList (paramètres : PubTemplateTitleList, accessToken : string) : Promise<PubTemplateTitleListResult> ;
public getMessageTemplateList (accessToken : string) : Promise<MessageTemplateListResult> ;
public sendMessage (paramètres : SendMessage, accessToken : string) : Promise<DefaultRequestResult> ;
public addMessageTemplate (params : MessageTemplate, accessToken : string) : Promise<DefaultRequestResult & { priTmplId : string }> ;
Importation de modules
importer { Module } depuis '@nestjs/common'; importer { WeChatMobileModule } depuis 'nest-wechat';@Module({ importations : [WeChatMobileModule.register()],})classe d'exportation AppModule {}
Présentation des outils
importer { MobileService } depuis 'nest-wechat'; const service = new MobileService ();
public getAccessToken (code : chaîne, appId : chaîne, secret : chaîne) : Promise<AxiosResponse<MobileAppAccessTokenResult, any>> ;
public rafraîchirAccessToken (appId : chaîne, rafraîchirToken : chaîne) : Promise<AxiosResponse<MobileAppAccessTokenResult, any>> ;
public checkAccessToken (openId : string, accessToken : string) : Promise<AxiosResponse<DefaultRequestResult, any>> ;
pay.jsapi (ordre : TransactionOrder, SerialNo : chaîne, privateKey : Buffer | chaîne) : Promise<{prepay_id : chaîne}> ;
pay.getTransactionById (id : chaîne, mchId : chaîne, numéro de série : chaîne, privateKey : Buffer | chaîne) : Promise<Trade> ;
pay.getTransactionByOutTradeNo (outTradeNo : chaîne, mchId : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) : Promise<Trade> ;
pay.close (outTradeNo : chaîne, mchId : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne );
pay.refund (remboursement : 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 : chaîne, prepayId : chaîne, privateKey : Buffer | chaîne) : 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 (données : DevelopmentConfigRequest, mchId : chaîne, numéro de série : chaîne, privateKey : Buffer | chaîne );
pay.getFapiaoDevConfig (mchId : chaîne, numéro de série : chaîne, privateKey : Buffer | chaîne) ;
pay.createCardTemplate (données : CreateCardTemplateRequest, mchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne );
pay.fapiaoCallback (certs : Map<string, string>, apiKey : string, req : Request, res : Response) : Promise<FapiaoNotifyResult> ;
pay.getUserTitle (paramètres : GetUserTitleParams, mchId : chaîne, numéro de série : chaîne, privateKey : Buffer | chaîne );
pay.issueFapiao (données : IssueFapiaoRequest, mchId : chaîne, numéro de série : chaîne, privateKey : Buffer | chaîne );
pay.getIssueFapiao (fapiaoApplyId : chaîne, fapiaoId : chaîne, mchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne) ;
pay.reverseFapiao (fapiaoApplyId : chaîne, données : ReverseFapiaoRequest, mchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne) ;
pay.rsaEncryptOAEP (texte : chaîne, publicKey : Buffer | chaîne) ;
pay.rsaDecryptOAEP (cipherText : chaîne, privateKey : Buffer | chaîne) ;
Aucun marchand test n'est disponible et le test n'a pas réussi. Veuillez tester par vous-même. Si vous avez des questions, veuillez soumettre un problème.
Le test peut exécuter des tests unitaires tout seul (nécessité de modifier la configuration)
npm exécuter le 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 : chaîne, mchId : chaîne, apiKey : chaîne, publicKey : Buffer | chaîne, privateKey : Buffer | chaîne) : Promise<AxiosResponse<string, any>> ;
pay.getHbInfo (billNO : chaîne, appId : chaîne, mchId : chaîne, apiKey : chaîne, publicKey : Buffer | chaîne, privateKey : Buffer | chaîne) : Promise<AxiosResponse<string, any>> ;
Documentation de référence
jsapiOfPartner (ordre : TransactionOrderOfPartner, SerialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
Créer une interface pour appeler les paramètres de paiement WeChat
buildJSAPIParameters (appId : chaîne, prepayId : chaîne, privateKey : Buffer | chaîne) : MiniProgramPaymentParameters ;
Documentation de référence
paidCallbackOfPartner (certs : Map<string, string>, apiKey : string, req : Request, res : Response) : Promise<TradeOfPartner> ;
Documentation de référence
closeOfPartner (outTradeNo : chaîne, spMchId : chaîne, subMchId : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
getTransactionByIdOfPartner (id : chaîne, spMchId : chaîne, subMchid : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
getTransactionByOutTradeNoOfPartner (outTradeNo : chaîne, spMchId : chaîne, subMchid : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
returnOfPartner (remboursement : RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>, spMchId : string, serialNo : string, privateKey : Buffer | string) ;
Documentation de référence
getRefundOfPartner (outRefundNo : chaîne, spMchId : chaîne, subMchId : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
rembourséCallbackOfPartner (certificats : Map<string, string>, apiKey : string, req : Request, res : Response) : Promise<RefundNotifyResultOfPartner> ;
Documentation de référence
createCardTemplateOfPartner (données : CreateCardTemplateRequestOfPartner, spMchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
fapiaoDevConfigOfPartner (données : DevelopmentConfigRequestOfPartner, spMchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne );
Documentation de référence
getFapiaoDevConfigOfPartner (spMchId : chaîne, subMchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
fapiaoCallbackOfPartner (certs : Map<string, string>, apiKey : string, req : Request, res : Response) : Promise<FapiaoNotifyResultOfPartner> ;
Documentation de référence
getUserTitleOfPartner (params : GetUserTitleParams, spMchId : chaîne, subMchId : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
issueFapiaoOfPartner (données : IssueFapiaoRequestOfPartner, spMchId : chaîne, SerialNo : chaîne, privateKey : Buffer | chaîne, platformSerial : chaîne) ;
Documentation de référence
getIssueFapiaoOfPartner (fapiaoApplyId : chaîne, fapiaoId : chaîne | null | non défini, spMchId : chaîne, subMchid : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
Documentation de référence
reverseFapiaoOfPartner (fapiaoApplyId : chaîne, données : ReverseFapiaoRequestOfPartner, spMchId : chaîne, serialNo : chaîne, privateKey : Buffer | chaîne) ;
décrypterCipherText
decryptCipherText<T> (apiKey : chaîne, chiffrement : chaîne, AssociatedData : chaîne, nonce : chaîne) : T |
Documentation de référence
importer { MessageCrypto } depuis 'nest-wechat'; const sha1 = MessageCrypto.sha1('string to hash');
Méthode statique :
sha1 (...args : string[]) : chaîne ;
md5 (texte : chaîne) : chaîne ;
getAESKey (encodageAESKey : chaîne) : Tampon ;
getAESKeyIV (aesKey : Buffer) : Tampon ;
PKCS7Encoder (buff : Tampon) : Tampon ;
PKCS7Decoder (buff : Buffer) : Tampon ;
décrypter (aesKey : Buffer, iv : Buffer, str : string) : chaîne ;
chiffrer (aesKey : Buffer, iv : Buffer, msg : string, appId : string) : chaîne ;
createNonceStr (longueur = 16) : chaîne ;
encryptMessage (appId : chaîne, jeton : chaîne, encodingAESKey : chaîne, message : chaîne, horodatage : chaîne, nonce : chaîne) : chaîne ;
decryptMessage (jeton : chaîne, encodingAESKey : chaîne, signature : chaîne, horodatage : chaîne, nonce : chaîne, encryptXml : chaîne) ;
decryptMessage (jeton : chaîne, encodingAESKey : chaîne, signature : chaîne, horodatage : chaîne, nonce : chaîne, encryptXml : chaîne) ;
checkSignature (signature : chaîne, horodatage : chaîne, nom occasionnel : chaîne, jeton : chaîne) ;
Créez le fichier .env.test.local et enregistrez votre application de test et votre secret dans le fichier.
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
Exécutez le test e2e.
npm exécuter le test : e2e
Exécutez un test unitaire.
npm exécuter le test wechat.service.userinfo.spec.ts
Démarrer les tests de service
npx ts-node -T tests/e2e/wechat-app.main.ts
Configuration push des messages de compte public (plateforme de test publique WeChat), après avoir activé le test de service ci-dessus, vous pouvez réussir la vérification de la configuration
URL : http://votre/url/wechat/push, telle que : http://113.22.11.2:3001/wechat/push
Jeton : pamtest
Obtenez access_token à partir de l'outil de débogage de l'interface de la plateforme publique WeChat
corps
{ "grant_type": "client_credential", "appid": "votre/appid", "secret": "votre/secret", "force_refresh": faux}
Outils de débogage sur la plateforme ouverte WeChat - outils de débogage pour les tests push de messages pour tester le push