حساب WeChat الرسمي، وتطوير برنامج WeChat، وألعاب WeChat المصغرة، ودفع WeChat، وWeChat للمؤسسات، وتغليف وحدة API Nestjs الأخرى من جانب الخادم. ويمكن أيضًا استخدامه مباشرة كفئة أداة.
Nest-wechat عبارة عن حزمة للأعمال ذات الاستخدام الذاتي. إذا لم تكن واجهة برمجة التطبيقات (API) التي تحتاج إلى استخدامها متاحة بعد، فيمكنك إرسال المشكلات إليّ وسأقوم بحلها في أقرب وقت ممكن.
الوثائق الصينية
npm i --حفظ Nest-wechat
تسجيل طريقة التسجيل
استيراد {الوحدة النمطية} من '@nestjs/common'؛استيراد {WeChatModule} من 'nest-wechat'؛@Module({ الواردات: [WeChatModule.register({appId: "معرف التطبيق الخاص بك"، السر: "سرك"})]،})تصدير فئة AppModule {}
لتسجيل تكوين الجذر
استيراد { CACHE_MANAGER، الوحدة } من '@nestjs/common'؛ استيراد { ConfigModule، ConfigService } من '@nestjs/config'؛ استيراد { ذاكرة التخزين المؤقت } من 'مدير ذاكرة التخزين المؤقت'؛ استيراد { RedisCache، WeChatModule } من 'nest-wechat ';@الوحدة النمطية({ imports: [ConfigModule.forRoot({ envFilePath: '.env.test.local',}),WeChatModule.forRootAsync({ imports: [ConfigModule], inject: [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: 'your app id', Secret: 'your Secret'});
/** * واجهة ذاكرة التخزين المؤقت، يرجى تنفيذ هذه الواجهة إذا كنت بحاجة إلى تخصيص ذاكرة التخزين المؤقت * * واجهة ذاكرة التخزين المؤقت، يرجى تنفيذ هذه الواجهة إذا كنت بحاجة إليها * */export Interface ICache {. الحصول على<T> (المفتاح: سلسلة): وعد<T>؛ // eslint-تعطيل-السطر التالي @typescript-eslint/no-explicit-any مجموعة (مفتاح: سلسلة، القيمة: أي): باطل؛ إزالة (مفتاح: سلسلة): منطقية؛ إغلاق (): باطل؛}
قم بتكوين خصائص القراءة والكتابة، واكتب: 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"، "اللقب": NICKNAME، "الجنس": 1، "المقاطعة": "المقاطعة"، "المدينة": "المدينة"، "البلد": "البلد"، "headimgurl":https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46"، "امتياز":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
عودة الخطأ
{ "errcode":40003، "errmsg": "معرف مفتوح غير صالح"}
public async getAccountAccessToken (_appId?: string, _secret?: string): Promise<AccountAccessTokenResult>;
العودة بشكل صحيح
{ "access_token": "52_s0Mcl3E3DBKs12rthjxG8_DOvsIC4puV9A34WQR6Bhb_30TW9W9BjhUxDRkyph-hY9Ab2QS03Q8w ZBe5UkA1k0q0hc17eUDZ7vAWItl4iahnhq_57dCoKc1dQ3AfiHUKGCCMJ2NcQ0BmbBRIKBEgAAAPGJ"، "expires_in": 7200}
عودة الخطأ
{ "رمز الخطأ": 40013، "errmsg": "معرف التطبيق غير صالح"}
الوثائق المرجعية
public async getStableAccessToken (_appId?: string, _secret?: string, force = false): Promise<AccountAccessTokenResult>;
الوثائق المرجعية
getJSApiTicket العام غير المتزامن (_appId؟: سلسلة، _secret؟: سلسلة): Promise<TicketResult>;
إرجاع البيانات
{ "errcode": 0، "errmsg": "ok"، "ticket": "bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA"، "expires_in": 7200}
الوثائق المرجعية
jssdkSignature غير المتزامن العام (عنوان url: سلسلة): Promise<SignatureResult>;
الوثائق المرجعية
إرسالTemplateMessage غير متزامن عام (الرسالة: TemplateMessage، appId؟: سلسلة، سر؟: سلسلة): Promise<DefaultRequestResult & { msgid: string }>;
الوثائق المرجعية
إنشاء QRCode غير متزامن عام (البيانات: AccountCreateQRCode، appId؟: سلسلة، سر؟: سلسلة): Promise<AccountCreateQRCodeResult>;
الوثائق المرجعية
showQRCode العام (التذكرة: سلسلة): Promis<Buffer>;
الوثائق المرجعية
WeChatService.checkSignatureExpress (الطلب: طلب، القرار: الاستجابة)؛
الاستخدام:
@Get('push')async PushTest (@Req() req: طلب، @Res() res: Response) { 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: Response) { const decrypt = انتظار this.service.messagePushExpressHandler(req, res);}
الوثائق المرجعية
getAccessToken العام (appId؟: سلسلة، سر؟: سلسلة): Promise<AccessTokenResult>;
const Service = new WeChatService({ appId: "معرف تطبيقك"، سر: "سرك"}); const res = انتظار Service.mp.getAccessToken();console.log(res.data.access_token);
getRid غير المتزامن العام (rid: سلسلة، AccessToken: سلسلة): Promise<RidInfo>;
getPluginOpenPId غير المتزامن العام (رمز: سلسلة، AccessToken: سلسلة): Promise<DefaultRequestResult & { openpid: string }>;
Code2Session العام غير المتزامن (الكود: سلسلة، معرف التطبيق؟: سلسلة، سر؟: سلسلة): Promise<SessionResult>;
إرجاع البيانات
{ "openid": "openid"، "session_key": "key"، "unionid": "unionid"، "errcode": 0، "errmsg": "ok"، }
الوثائق المرجعية
getPhoneNumber العام غير المتزامن (الرمز: سلسلة، AccessToken: سلسلة)؛
الوثائق المرجعية
getQRCode غير المتزامن العام (المعلمات: QRCode، AccessToken: سلسلة): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
getUnlimitedQRCode العام (المعلمات: GetUnlimitedQRCode، AccessToken: سلسلة): Promise<DefaultRequestResult & { buffer: Buffer }>;
إنشاء QRCode غير متزامن عام (المعلمات: CreateQRCode، AccessToken: سلسلة): Promise<DefaultRequestResult & { contentType: string, buffer: Buffer }>;
استعلام عام غير متزامن (مخطط: سلسلة، AccessToken: سلسلة): Promise<DefaultRequestResult & { مخطط_info: SchemeInfo, مخطط_quota: SchemeQuota }>;
public generatorScheme (params: GenerateScheme, accessToken: string): Promise<DefaultRequestResult & { openlink: string >;
public generatorNFCScheme (params: GenerateNFCScheme, AccessToken: string): Promise<DefaultRequestResult & { openlink: string }>;
public generatorUrlLink (params: GenerateUrlLink, accessToken: string): Promise<DefaultRequestResult & { url_link: string }>;
استعلام عام UrlLink (urlLink: سلسلة، AccessToken: سلسلة): Promise<UrlLinkResult>;
public generatorShortLink (المعاملات: GenerateShortLink, AccessToken: سلسلة): Promise<DefaultRequestResult & { link: string }>;
public sendUniformMessage (params: SendUniformMessage, accessToken: string): Promise<DefaultRequestResult>;
createActivityId العام (المعاملات: CreateActivityId، AccessToken: سلسلة): Promise<ActivityIdResult>;
public setUpdatableMsg (params: UpdatableMsg, accessToken: string): Promise<DefaultRequestResult>;
حذف MessageTemplate العام (priTmplId: سلسلة، AccessToken: سلسلة): Promise<DefaultRequestResult>;
getCategory العامة (accessToken: سلسلة): Promise<DefaultRequestResult & { data: {id: number, name: string}[] }>;
getPubTemplateKeyWordsById العام (tid: number، accessToken: string): Promise<PubTemplateKeyWords>;
getPubTemplateTitleList العامة (المعاملات: PubTemplateTitleList، AccessToken: سلسلة): Promise<PubTemplateTitleListResult>;
getMessageTemplateList العام (accessToken: سلسلة): Promise<MessageTemplateListResult>;
إرسال رسالة عامة (المعاملات: SendMessage، AccessToken: سلسلة): Promise<DefaultRequestResult>;
public addMessageTemplate (params: messageTemplate, accessToken: string): Promise<DefaultRequestResult & { priTmplId: string }>;
استيراد الوحدة النمطية
استيراد {الوحدة النمطية} من '@nestjs/common'؛استيراد {WeChatMobileModule} من 'nest-wechat'؛@Module({ الواردات: [WeChatMobileModule.register()],}) تصدير فئة AppModule {}
مقدمة من الأدوات
import { MobileService } from 'nest-wechat';const Service = new MobileService();
getAccessToken العام (الرمز: سلسلة، معرف التطبيق: سلسلة، السر: سلسلة): Promise<AxiosResponse<MobileAppAccessTokenResult,any>>;
RefreshAccessToken العام (معرف التطبيق: سلسلة، RefreshToken: سلسلة): Promise<AxiosResponse<MobileAppAccessTokenResult,any>>;
checkAccessToken العام (openId: سلسلة، AccessToken: سلسلة): Promise<AxiosResponse<DefaultRequestResult, Any>>;
pay.jsapi (الطلب: TransactionOrder، الرقم التسلسلي: سلسلة، المفتاح الخاص: المخزن المؤقت | سلسلة): Promise<{prepay_id: string}>;
pay.getTransactionById (المعرف: سلسلة، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة): 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 (استرداد: RequireOnlyOne<RefundParameters, 'transaction_id' | 'out_trade_no'>، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: Buffer | سلسلة): Promise<RefundResult>;
pay.getRefund (outRefundNo: string, mchId: string, serialNo: string, PrivateKey: Buffer | string): Promise<RefundResult>;
pay.buildMiniProgramPayment (معرف التطبيق: سلسلة، معرف الدفع المسبق: سلسلة، المفتاح الخاص: المخزن المؤقت | سلسلة): MiniProgramPaymentParameters؛
pay.payCallback (publicKey: Buffer | string، apiKey: string، req: Request، res: Response): Promise<Trade>;
pay.refundedCallback (الشهادات: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResult>;
pay.fapiaoDevConfig (البيانات: DevelopmentConfigRequest، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
pay.getFapiaoDevConfig (mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
pay.createCardTemplate (البيانات: CreateCardTemplateRequest، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
pay.fapiaoCallback (الشهادات: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<FapiaoNotifyResult>;
pay.getUserTitle (المعلمات: GetUserTitleParams، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
pay.issueFapiao (البيانات: IssueFapiaoRequest، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
pay.getIssueFapiao (fapiaoApplyId: سلسلة، fapiaoId: سلسلة، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: المخزن المؤقت | سلسلة)؛
pay.reverseFapiao (fapiaoApplyId: سلسلة، البيانات: ReverseFapiaoRequest، mchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: المخزن المؤقت | سلسلة)؛
pay.rsaEncryptOAEP (النص: سلسلة، publicKey: Buffer | سلسلة)؛
pay.rsaDecryptOAEP (cipherText: string, PrivateKey: Buffer | string);
لا يوجد تجار اختبار متاحون ولم يكن الاختبار ناجحًا، يرجى الاختبار بنفسك إذا كانت لديك أية أسئلة، فيرجى إرسال مشكلة.
يمكن للاختبار تنفيذ اختبارات الوحدة بنفسه (يحتاج إلى تعديل التكوين)
اختبار تشغيل npm 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 (الترتيب: TransactionOrderOfPartner، الرقم التسلسلي: سلسلة، المفتاح الخاص: المخزن المؤقت | سلسلة)؛
الوثائق المرجعية
أنشئ واجهة لاستدعاء معلمات دفع WeChat
buildJSAPIParameters (معرف التطبيق: سلسلة، معرف الدفع المسبق: سلسلة، المفتاح الخاص: المخزن المؤقت | سلسلة): MiniProgramPaymentParameters؛
الوثائق المرجعية
PaidCallbackOfPartner (الشهادات: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<TradeOfPartner>;
الوثائق المرجعية
CloseOfPartner (outTradeNo: string، spMchId: string، subMchId: string، serialNo: string، PrivateKey: Buffer | string)؛
الوثائق المرجعية
getTransactionByIdOfPartner (المعرف: سلسلة، spMchId: سلسلة، subMchid: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
الوثائق المرجعية
getTransactionByOutTradeNoOfPartner (outTradeNo: string، spMchId: string، subMchid: string، serialNo: string، PrivateKey: Buffer | string)؛
الوثائق المرجعية
RefundOfPartner (استرداد: RequireOnlyOne<RefundParametersOfPartner, 'transaction_id' | 'out_trade_no'>، spMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: المخزن المؤقت | سلسلة)؛
الوثائق المرجعية
getRefundOfPartner (outRefundNo: string، spMchId: string، subMchId: string، serialNo: string، PrivateKey: Buffer | string)؛
الوثائق المرجعية
RefundedCallbackOfPartner (الشهادات: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<RefundNotifyResultOfPartner>;
الوثائق المرجعية
createCardTemplateOfPartner (البيانات: CreateCardTemplateRequestOfPartner، spMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
الوثائق المرجعية
fapiaoDevConfigOfPartner (البيانات: DevelopmentConfigRequestOfPartner، spMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
الوثائق المرجعية
getFapiaoDevConfigOfPartner (spMchId: سلسلة، subMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
الوثائق المرجعية
fapiaoCallbackOfPartner (الشهادات: Map<string, string>, apiKey: string, req: Request, res: Response): Promise<FapiaoNotifyResultOfPartner>;
الوثائق المرجعية
getUserTitleOfPartner (المعلمات: GetUserTitleParams، spMchId: سلسلة، subMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
الوثائق المرجعية
IssueFapiaoOfPartner (البيانات: IssueFapiaoRequestOfPartner، spMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة، منصةSerial: سلسلة)؛
الوثائق المرجعية
getIssueFapiaoOfPartner (fapiaoApplyId: سلسلة، fapiaoId: سلسلة | null | غير محدد، spMchId: سلسلة، subMchid: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: مخزن مؤقت | سلسلة)؛
الوثائق المرجعية
عكس FapiaoOfPartner (fapiaoApplyId: سلسلة، البيانات: ReverseFapiaoRequestOfPartner، spMchId: سلسلة، رقم تسلسلي: سلسلة، مفتاح خاص: المخزن المؤقت | سلسلة)؛
decryptCipherText
decryptCipherText<T> (apiKey: سلسلة، التشفير: سلسلة، البيانات المرتبطة: سلسلة، nonce: سلسلة): T |
الوثائق المرجعية
استيراد {MessageCrypto} من 'nest-wechat'؛const sha1 = messageCrypto.sha1('string to hash');
الطريقة الثابتة:
sha1 (...args: string[]): string;
MD5 (نص: سلسلة): سلسلة؛
getAESKey (ترميزAESKey: سلسلة): المخزن المؤقت؛
getAESKeyIV (aesKey: Buffer): Buffer؛
PKCS7Encoder (برتقالي: Buffer): Buffer؛
PKCS7Decoder (برتقالي: Buffer): Buffer؛
فك التشفير (aesKey: Buffer، iv: Buffer، str: string): string;
تشفير (aesKey: Buffer، iv: Buffer، msg: string، appId: string): string؛
createNonceStr (الطول = 16): سلسلة؛
encryptMessage (معرف التطبيق: سلسلة، الرمز المميز: سلسلة، تشفير AESKey: سلسلة، رسالة: سلسلة، الطابع الزمني: سلسلة، nonce: سلسلة): سلسلة؛
decryptMessage (الرمز المميز: سلسلة، تشفير AESKey: سلسلة، التوقيع: سلسلة، الطابع الزمني: سلسلة، nonce: سلسلة، encryptXml: سلسلة)؛
decryptMessage (الرمز المميز: سلسلة، تشفير AESKey: سلسلة، التوقيع: سلسلة، الطابع الزمني: سلسلة، nonce: سلسلة، encryptXml: سلسلة)؛
checkSignature (التوقيع: سلسلة، الطابع الزمني: سلسلة، nonce: سلسلة، رمز مميز: سلسلة)؛
أنشئ ملف .env.test.local، واحفظ معرف التطبيق والسر الخاصين بالاختبار في الملف.
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
الرمز المميز: بامتيست
احصل على Access_token من أداة تصحيح أخطاء واجهة النظام الأساسي العام WeChat
جسم
{ "نوع_المنحة": "بيانات اعتماد_العميل"، "appid": "التطبيق/الخاص بك"، "سر": "الخاص بك/السر"، "force_refresh": خطأ}
أدوات تصحيح الأخطاء على منصة WeChat المفتوحة - أدوات تصحيح الأخطاء لاختبار دفع الرسائل لاختبار الدفع