قبل استخدام هذا الإطار ، يُنصح أن يكون هناك بعض الفهم لمستندات تطوير حساب WeChat العام ، ولكن يمكن أن يؤدي استخدام هذا الإطار دون فهم مستندات الحساب العام أيضًا إلى إكمال حساب WeChat العام البسيط.
متوافق حاليًا مع Spring Boot 1.4+ و Spring Boot 2.x. كل شخص مرحب به لذكر القضية والمساهمة ، ويرحب أيضًا بالانضمام إلى المجموعة لمناقشة 627254793. يجب مشاركة المشاريع المفتوحة المصدر من قبل الجميع. شكرا لك ~
رابط تطبيق الحساب الرسمي لاختبار WeChat
<!-- 支持1.4.0.RELEASE及以上,包括2.x -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<!-- fastbootWeixin的核心依赖 -->
<dependency>
<groupId>com.mxixm</groupId>
<artifactId>fastboot-weixin</artifactId>
<version>0.6.2</version>
</dependency>
<!-- SpringBoot的web项目,必须 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 暂时只能使用apache的http,后续可加入其它http支持 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
قم بإنشاء تطبيق ملف تكوين جديد.
رمز الاختبار:
package com.mxixm.fastboot.weixin;
import com.mxixm.fastboot.weixin.annotation.WxApplication;
import com.mxixm.fastboot.weixin.annotation.WxAsyncMessage;
import com.mxixm.fastboot.weixin.annotation.WxButton;
import com.mxixm.fastboot.weixin.module.web.WxRequest;
import com.mxixm.fastboot.weixin.module.event.WxEvent;
import com.mxixm.fastboot.weixin.module.message.WxMessage;
import com.mxixm.fastboot.weixin.module.message.WxMessageBody;
import com.mxixm.fastboot.weixin.module.user.WxUser;
import com.mxixm.fastboot.weixin.mvc.annotation.WxController;
import com.mxixm.fastboot.weixin.mvc.annotation.WxEventMapping;
import com.mxixm.fastboot.weixin.mvc.annotation.WxMessageMapping;
import org.springframework.boot.SpringApplication;
@WxApplication
@WxController
public class WxApp {
public static void main(String[] args) throws Exception {
SpringApplication.run(WxApp.class, args);
}
/**
* 定义微信菜单
*/
@WxButton(group = WxButton.Group.LEFT, main = true, name = "左")
public void left() {
}
/**
* 定义微信菜单
*/
@WxButton(group = WxButton.Group.RIGHT, main = true, name = "右")
public void right() {
}
/**
* 定义微信菜单,并接受事件
*/
@WxButton(type = WxButton.Type.CLICK,
group = WxButton.Group.LEFT,
order = WxButton.Order.FIRST,
name = "文本消息")
public String leftFirst(WxRequest wxRequest, WxUser wxUser) {
return "测试文本消息";
}
/**
* 定义微信菜单,并接受事件
*/
@WxButton(type = WxButton.Type.VIEW,
group = WxButton.Group.LEFT,
order = WxButton.Order.SECOND,
url = "http://baidu.com",
name = "点击链接")
@WxAsyncMessage
public WxMessage link() {
return WxMessage.newsBuilder().addItem("测试图文消息", "测试", "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white.png", "http://baidu.com").build();
}
/**
* 接受微信事件
* @param wxRequest
* @param wxUser
*/
@WxEventMapping(type = WxEvent.Type.UNSUBSCRIBE)
public void unsubscribe(WxRequest wxRequest, WxUser wxUser) {
System.out.println(wxUser.getNickName() + "退订了公众号");
}
/**
* 接受用户文本消息,异步返回文本消息
* @param content
* @return the result
*/
@WxMessageMapping(type = WxMessage.Type.TEXT)
@WxAsyncMessage
public String text(WxRequest wxRequest, String content) {
WxSession wxSession = wxRequest.getWxSession();
if (wxSession != null && wxSession.getAttribute("last") != null) {
return "上次收到消息内容为" + wxSession.getAttribute("last");
}
return "收到消息内容为" + content;
}
/**
* 接受用户文本消息,同步返回图文消息
* @param content
* @return the result
*/
@WxMessageMapping(type = WxMessage.Type.TEXT, wildcard = "1*")
public WxMessage message(WxSession wxSession, String content) {
wxSession.setAttribute("last", content);
return WxMessage.newsBuilder()
.addItem(WxMessageBody.News.Item.builder().title(content).description("随便一点")
.picUrl("http://k2.jsqq.net/uploads/allimg/1702/7_170225142233_1.png")
.url("http://baidu.com").build())
.addItem(WxMessageBody.News.Item.builder().title("第二条").description("随便二点")
.picUrl("http://k2.jsqq.net/uploads/allimg/1702/7_170225142233_1.png")
.url("http://baidu.com").build())
.build();
}
/**
* 接受用户文本消息,异步返回文本消息
* @param content
* @return the result
*/
@WxMessageMapping(type = WxMessage.Type.TEXT, wildcard = "2*")
@WxAsyncMessage
public String text2(WxRequestBody.Text text, String content) {
boolean match = text.getContent().equals(content);
return "收到消息内容为" + content + "!结果匹配!" + match;
}
}
نظرًا لأن حسابات WeChat العامة تحتاج إلى تكوين واجهة الخادم الخاصة بها ، يمكنك استخدام الاختبارات المحلية مباشرة أثناء الاختبار. يمكن أن يتيح استخدام اختراق إنترانت منصات WeChat العامة للوصول إلى الخادم المحلي الخاص بك.
يمكن للبرنامج استخدام NGROK أو NATAPP. يرجى الرجوع إلى المستندات الرسمية لكليهما.
يمكن تكوين عنوان عنوان URL لاسم المجال الذي تم إنشاؤه بعد بدء التشغيل في wx.callback-url لمصادقة OAUTH2. يجب أيضًا تكوين اسم المجال في عنوان URL الذي تم إنشاؤه أعلاه في اسم المجال لصفحة رد الاتصال.
املأ اسم المجال الذي تم إنشاؤه في الخطوة 4 في معلومات تكوين الواجهة للحساب الرسمي للاختبار. يستخدم الرمز المميز الرمز المميز في ملف التكوين. بعد الادخار ، إذا لم يحدث شيء غير متوقع ، فيجب التحقق منه بنجاح. إذا كان لديك أي أسئلة ، فيرجى تقديم ملاحظات في الوقت المناسب.


بعد بدء المثال أعلاه ، يرجى الانتباه إلى حسابك الرسمي. في هذا الوقت ، يجب أن تحتوي قائمة الحساب الرسمي على قوائم رئيسية: اليسار واليمين ، وهناك قائمة فرعية على اليسار: رسالة نصية وانقر فوق الرابط.
عند النقر فوق قائمة الرسائل النصية ، ستتلقى رسالة نصية ، وهي: اختبار رسالة نصية.
عند النقر فوق رابط النقر الثاني ، ستقفز إلى Baidu وتلقي رسالة رسومية بعنوان Message of Test.
عند إرسال رسالة نصية إلى الحساب الرسمي ، إذا لم يبدأ محتوى الرسالة بـ 1 ، فستتلقى رد على الحساب الرسمي: "تم استلام محتوى الرسالة" + المحتوى المرسل.
أرسل رسالة نصية إلى الحساب الرسمي. عندما يبدأ محتوى الرسالة بـ 1 ، ستتلقى رد على الرسائل الرسومية والرسالة النصية.
عندما يقوم المستخدم بإلغاء الاشتراك في الحساب الرسمي ، سيتم طباعة لقب المستخدم في System.out + "إلغاء الاشتراك في الحساب الرسمي"
يتم استخدام التعليق التوضيحي @wxapplication لإعلان التطبيق كتطبيق WeChat والبدء في استخدام SpringApplication. إذا كان لديك بالفعل بيئة Springboot ، فيرجى إضافة التعليق التوضيحي enablewxmvc إلى فئة springapplication الخاصة بك ، يكون التأثير هو نفسه. يمكنك رؤية رمز المصدر.
يتم استخدام التعليقات التوضيحية @wxcontroller لإعلان أن الفصل هو وحدة تحكم WeChat. فقط عندما يتم الإعلان عن هذا التعليق التوضيحي ، فسيتم ربط خريطة طلب خادم WeChat ، وإلا سيتم تجاهل الفصل.
التعليق التوضيحي @wxbutton (group = wxbutton.group.left ، main = true ، name = "left") يستخدم لإعلان مربع زر. تمثل المجموعة مجموعة ، مع ثلاث مجموعات على اليسار والوسط واليمين ، تقابل قوائم WeChat الثلاثة من المستوى الأول. Main هي قيمة منطقية ، مما يعني ما إذا كان عنصر القائمة هو قائمة المستوى الأول. الاسم هو اسم القائمة.
التعليق التوضيحي @wxbutton (type = wxbutton.type.click ، group = wxbutton.group.left ، order = wxbutton.order.first ، name = "text message") يستخدم لإعلان اللفة الفرعية للتجميع الأيسر. يمثل الترتيب الترتيب ، هنا هو الأول.
السلسلة العامة LeftFirst (WxRequest wxRequest ، wxuser wxuser) {return "Test Text Message" ؛ } هناك ثلاث نقاط هنا:
wxbutton (type = wxbutton.type.view ، group = wxbutton.group.left ، order = wxbutton.order.second ، url = "http://baidu.com" ، name = "انقر على الرابط") هذا التعليق هو نفسه أعلاه ، والنوع يصبح العرض. بالنسبة لمحتوى محدد ، يمكنك الرجوع إلى شرح التعليق أو وثيقة الحساب الرسمية. لاحظ أن كل نوع قائمة له حدوده الخاصة. يرجى الرجوع إلى الوثائق. إذا لم يتم استيفاء الشروط ، فسيحدث استثناء عند بدء بدء التشغيل.
يشير التعليق التوضيحي @wxasyncmessage إلى أنه يتم الرد على الرسالة بشكل غير متزامن ، والرجوع إلى رسالة خدمة العملاء ، ولا يتم توفير أي دعم لخدمة العملاء المتعددة في الوقت الحالي.
wxmessage.news.builder (). في فئة WXMessage ، هناك فصول داخلية ثابتة وبنائهم. من خلال المنشئ ، يمكن بناء أنواع مختلفة من رسائل WeChat بسهولة. يرجى الرجوع إلى رسائل الرد السلبي ورسائل خدمة العملاء.
التعليق التوضيحي @wxeventmapping (type = wxevent.type.unsubscribe) يربط حدث إلغاء الاشتراك. عندما يتفوق المستخدم ، سيتم إدخال المنطق الموجود أسفل هذا التعليق. هناك نقطة أخرى يجب الإشارة إليها وهي أنه سيتم إرسال جميع محتويات الرد على WxeventMapping إلى المستخدم بشكل غير متزامن.
التعليقات التوضيحية @wxmessagemapping (type = wxmessage.type.text) يعني ربط الرسالة النصية المرسلة من قبل المستخدم إلى منطق الطريقة التالية ، نص السلسلة العامة (محتوى السلسلة) {return "الرسالة المستلمة" + محتوى ؛ }. سيتم تعيين المحتوى تلقائيًا إلى محتوى النص الذي أرسله المستخدم.
التعليق التوضيحي @wxmessagemapping (type = wxmessage.type.text ، wildcard = "1*") هو نفسه كما هو مذكور أعلاه. الفرق هو طابع البرية البرية. هذه الشخصية البرية تدعم محتوى Wildcard. سيؤدي التغلب على منطق Wildcard إلى إدخال منطق التنفيذ أدناه.
متكامل تمامًا مع الحذاء الربيعي. إذا لم يكن لديك مشروع Springboot وترغب في استخدام هذا الإطار لإنشاء حساب عام ، فيمكنك استخدام wxapplication مباشرة لتمييز فئة بدء التشغيل. يدعم هذا الشروح المعلمة: MenuaUtocreate ، الافتراضي صحيح. وهذا يعني أنه يتم إنشاء قائمة WeChat تلقائيًا ، ويمكن ضبطها على خطأ لإيقاف سلوك إنشاء القائمة تلقائيًا. إذا كان لديك بالفعل مشروع SPRING BOOT وترغب في تقديم هذا الإطار ، فما عليك سوى وضع علامة على enablewxmvc على أي فئة تكوين ، والمعلمات هي نفسها أعلاه.
هناك ثلاثة أنواع من التعيينات مدعومة:
ملاحظة: يجب إعلان الفئة التي تربطها باسم wxController
يتم دعم الأنواع التالية من المعلمات:
يرتبط المعلمة حاليا هذه الأنواع. إذا كان هناك حل أفضل يحتاج إلى دعمه ، فيمكنك أيضًا طرح الآراء والاقتراحات مباشرة ، وسوف أتعامل معها في الوقت المناسب.
تدعم قيمة الإرجاع الأنواع التالية:
يتم إرسال الرسائل غير المتزامنة أعلاه باستخدام WXMESSAGETEMPHING ، وهو موضح أدناه.
يوفر هذا الإطار WXMessageTemplate لإرسال الرسائل ، وفي الوقت نفسه يوفر دعم WXMessageProcessor في القالب ، وهو معالجة الرسائل قبل إرسالها.
على سبيل المثال ، عند إرجاع الرسائل بشكل متزامن ، تحتاج إلى كتابة حقل FromuserName ، وهو حقل اسم TouserName عند إرسال الرسالة. ليست هناك حاجة للسماح لمستخدمي الإطار بمعالجة هذا الحقل. تتم معالجة هذا الحقل في معالج WxCommonMessageProcessor. إذا كنت مهتمًا ، فيمكنك الرجوع إلى رمز المصدر.
كما يدعم التحويل التالي: بالنسبة للرسائل من نوع الوسائط ، يمكنك استخدام MediaUrl أو MediaPath مباشرة لكتابة مسار المواد ، ويدير محول الرسائل تلقائيًا المادة من خلال WXMediAmanager للحصول على معرف المواد اللازم. (اكتب أدناه حول WxMediAmanager)
ملاحظة: عند معالجة الرسائل النصية ، يوصى باستخدام منشئ محتوى الرسالة المقابل في WXMessage لإنشاءها!
يوفر هذا الإطار WXMediAmanager لإدارة المواد ، ويستخدم أيضًا قاعدة البيانات المدمجة لحفظ المراسلات بين المواد والملفات المحلية. على الرغم من أنني أكملت هذا الجزء من الوظيفة في الوقت الحالي ، إلا أنني أشعر دائمًا أن هناك مشكلة كبيرة. آمل أن يتمكن شخص ما من مساعدتي في رؤيته ويعطيني بعض الاقتراحات.
يتم بالفعل تنفيذ الوسائط في الرسالة أعلاه التي يتم إرسالها من خلال مدير المواد.
يعمل إصدار 0.2.0.alpha على تحسين التخزين ، باستخدام الواجهة WXMediastore لإدارة تخزين الوسائط ، يمكن للمطورين تطبيق هذه الواجهة بأنفسهم والتسجيل كحبة Spring لاستبدال MAPDBWXMediastore الافتراضي. للاستخدام المحدد لكل واجهة ، يرجى الرجوع إلى MAPDBWXMediaStore. يمكن أيضًا توفير تطبيق قائم على الذاكرة هنا لاستبدال MAPDB.
يوفر هذا الإطار واجهة WctokenStore لتخزين الرموز ويوفر تنفيذًا افتراضيًا قائمًا على الذاكرة لـ MemoryWxtokenStore. إذا كنت بحاجة إلى توزيعها ، فيمكنك تنفيذ هذه الواجهة بنفسك وحقن فئة التنفيذ في فصل الربيع كحبة.
استخدم واجهة WXAPIINVOKESPI وفئة مصنع WXINVOKERPROXYFACTORY لإنشاء وكيل استدعاء واجهة WeChat تلقائيًا. ما عليك سوى إعلان الأساليب والشروح. بشكل افتراضي ، يتم استخدام واجهة استدعاء httpcomponent. يمكن للأصدقاء المهتمين التحقق من رمز المصدر. لا أكتبها جيدًا ، لذلك إذا كان لديك أي اقتراحات أفضل ، فلا تتردد في طرحها.
في الوقت نفسه ، يتم إجراء تحليل أولي لقيمة الإرجاع. إذا لم يكن رمز الخطأ للمحتوى الذي تم إرجاعه للواجهة 0 ، فسيتم إلقاؤه كاستثناء. نظام الاستثناء هو WXException ومساحاته الفرعية.
ملاحظة: يمكنك أيضًا استخدام هذه الطريقة لإنشاء واجهة استدعاء الوكيل الخاصة بك في الإرادة. سأضيف الوثائق في المستقبل ، لذلك أنا كسول في الوقت الحالي. . .
يمكنك تشغيل وإيقاف التشغيل ، وإنشاء بنية القائمة من خلال التعليق التوضيحي لـ wxbutton ، والاتصال تلقائيًا بالواجهة لتحديد ما إذا كانت القائمة تتغير ، وإنشاء وتحديث القائمة تلقائيًا.
يمكن أن يستجيب بشكل صحيح للتحقق الرمزي الذي أرسله WeChat ، وهو مريح وسريع.
لن يكون لاستخدام هذا الإطار أي تأثير على رسم الخرائط الأصلية الخاصة بـ SpringMVC ، ولن يشغل أي علاقة رسم خرائط فريدة (باستثناء طلب المصادقة). في حالة هذا الإطار ، يمكنك استخدام أي وظائف أصلية لـ SpringMVC ، بما في ذلك طلبات دليل الجذر ، ولن يشغلها خادم WeChat وحده.
إذا كنت ترغب في استخدام عنوان منفصل كعنوان استدعاء API WeChat ، فيرجى تكوين WX.Path كمعلومات المسار ، والتي يجب أن تكون متسقة مع مسار URL في معلومات تكوين الواجهة في إدارة الواجهة الخلفية للحساب الرسمي WeChat.
قم بتوفير اعتراض مصادقة WeChat OAUTH2 ، قم بملء اسم مجال رد الاتصال OAUTH2 من خلال تكوين WX.Callback-domain ، وتكوين wx.mvc.interceptor.includepatterns و wx.mvc.Interceptor.excludepatterns لتكوين العنوان المستهدف للداخل. يمكنك توفير فئة تنفيذ واجهة WXOAuth2Callback كحبة ، وسيتم حقن هذه الفول تلقائيًا في WXOAuth2Interceptor ، والاتصال بعد (WXOAuth2Context بعد تمرير مصادقة الويب WeChat. يمكنك الحصول على السياق wxwebuser في هذه الطريقة وتحويل wxwebuser إلى wxuser من خلال wxusermanager. للحصول على معلومات تفصيلية للعلاقة ، يرجى الرجوع إلى: WeChat Web Ouditization.
منذ الإصدار 0.3.6 ، يتم توفير خاصية بديلة wx.callback-url من wx.callback-domain ، والذي يتم استخدامه لتعيين عنوان URL الخاص بالاستدعاء ، بما في ذلك اسم مجال رد الاتصال ونوع البروتوكول. هناك المزيد من أنواع البروتوكول من WX.Callback-Domain ، يرجى استخدام هذا التكوين لاستبدال تكوين مجال رد الاتصال.
الوظيفة الإضافية 1: عرض نوع WXButton ، والذي يحدد تلقائيًا ما إذا كان عنوان URL ينتمي إلى العنوان تحت اسم مجال رد الاتصال المعتمد ، ويتعامل تلقائيًا باعتباره عنوان UAUTH2 حسب الحاجة. يمكن استخدام المعترض الافتراضي لتحقيق وظيفة الحصول على معلومات المستخدم على عنوان URL في القائمة. في الوقت نفسه ، إلى جانب وظيفة wx.callback-url ، فإنه يدعم تكوين المسارات النسبية في القائمة دون حمل اسم مجال.
وظيفة إضافية 2: حدد تلقائيًا ما إذا كان عنوان URL في الرسالة يحتاج إلى إضافة إعادة توجيه OAUTH ، يرجى الرجوع إلى WXREDIRECTUTILS.
في الكود ، يمكنك استخدام WXJSticketManager للحصول على WXJSTICKET
@Autowired
WxJsTicketManager wxJsTicketManager;
الرجوع إلى طريقة الاستخدام التفصيلي
تكوين wx.encrypt = true ، wx.encodingaeskey = Aeskey تعيين في خلفية الحساب الرسمي ، أي ، تمكين تشفير الرسائل ووضع فك التشفير
لاحظ أنه عند تشغيل تشفير الرسائل وفك التشفير ، تحتاج إلى تشغيل أذونات JCE غير المحدودة.
jdk7 عنوان التنزيل:
jdk8 عنوان التنزيل:
بعد التنزيل ، يمكنك رؤية local_policy.jar و us_export_policy.jar و readme.txt. إذا تم تثبيت JRE ، فضع ملفين اثنين في دليل JRE_HOME ٪ lib الأمان لكتابة الملف الأصلي. إذا تم تثبيت JDK ، فيجب عليك أيضًا وضع ملفين اثنين في دليل ٪ jdk_home ٪ jre lib security للكتابة فوق الملف الأصلي.
يمكنك إضافة الدعم لاحقًا واستخدام التعليقات التوضيحية لتحديد خدمة عملاء الرسائل ، على غرار rabbitListener
تصنيف مستخدم مزعج قليلاً
هل هناك تطبيق جيد لتجميع المستخدمين أو شيء من هذا القبيل؟ لا يوجد طلب بعد
مثل الدفع ، إلخ.
النسخة الأولية
تحسين ربط معلمة الرسائل ، أضف ربط جسم الرسائل المحدد ، راجع wxRequestBody
تحميل مستودع Maven المركزي ، وتوليد Javadoc ، وسلسلة من التطبيع
انضم إلى Apache Copyright ، كل Delombok
آخر مرة انضممت إلى حقوق الطبع والنشر ، حذفت بطريق الخطأ تعليقات الرأس لجميع الملفات. لقد ملأت بعضهم الآن. بعد كل شيء ، سأضيف وظيفة قسيمة بطاقة WeChat وأصدر إصدار الإصدار