يهدف WeChat-Django إلى توفير تغليف مناسب لوظيفة الدفع WeChat وWeChat ودعم إدارة الواجهة الخلفية الأساسية لمطوري Django الذين يصلون إلى منصة WeChat العامة.
عنوان المشروع الرسمي: https://github.com/Xavier-Lam/wechat-django
يعتمد هذا الامتداد على wechatpy، والحد الأدنى لإصدار Django المدعوم هو 1.11. WeChat-Django هو مجرد إصدار معاينة، وقد يكون هناك العديد من الأخطاء وقد تتغير واجهة برمجة التطبيقات وبنية البيانات، يرجى الانتباه جيدًا إلى CHANGELOG).
USE_TZ = True
في هذه المرحلة، يمكنك البدء في استخدام wechat_django بسهولة. ولم يقدم المشروع بعد مستندات استخدام محددة. إذا كنت بحاجة إلى متطلبات مخصصة، فيرجى قراءة الكود أولاً.
إذا كنت تريد استخدام أحدث الميزات أو تعديل الكود بنفسك، فيمكنك استنساخ هذا المشروع واستخدام pip install -e لتثبيته مباشرة في دليل مشروع Django الخاص بك.
بشكل عام، التكوين الافتراضي يكفي
اسم المعلمة | القيمة الافتراضية | يوضح |
---|---|---|
WECHAT_SITE_HOST | لا أحد | اسم المجال الافتراضي المستخدم لتلقي ردود اتصال WeChat |
WECHAT_SITE_HTTPS | حقيقي | تلقي رد اتصال WeChat سواء كان اسم المجال هو https |
WECHAT_PATCHADMINSITE | حقيقي | ما إذا كان سيتم استبدال موقع الإدارة الافتراضي لـ Django بموقع الإدارة الافتراضي لـ wechat_Django، الاستبدال الافتراضي |
WECHAT_SESSIONSTORAGE | "جانغو.كور.cache.cache" | كائن wechatpy.session.SessionStorage المستخدم لتخزين البيانات مثل WeChat Accesstoken، أو طريقة المصنع التي تستقبل كائن wechat_django.models.WeChatApp وتنشئ مثيله |
WECHAT_MESSAGETIMEOFFSET | 180 | عندما يطلب WeChat رسائل، سيتم تجاهل الطلبات التي يختلف طابعها الزمني عن وقت الخادم بأكثر من هذه القيمة. |
WECHAT_MESSAGENOPEATNONCE | حقيقي | ما إذا كان سيتم التحقق من منع إعادة تشغيل رسائل WeChat افتراضيًا |
المسجل | يوضح |
---|---|
wechat.admin.{appname} | سجل استثناء المسؤول تحذير من أدنى مستوى |
wechat.api.{appname} | سجل API تصحيح المستوى الأدنى |
wechat.handler.{appname} | سجل معالجة الرسائل تصحيح الأخطاء على مستوى أدنى |
wechat.oauth.{appname} | أدنى مستوى لسجل استثناءات ترخيص صفحة الويب هو تحذير. |
wechat.site.{appname} | سجل استثناء عرض الموقع (مثل وكيل المواد) تحذير من أدنى مستوى |
يمكن إجراء ترخيص صفحة الويب من خلال مصمم الديكور wechat_django.oauth.wechat_auth
. بعد الترخيص، سيتم إرفاق الطلب بكائن wechat_django.oauth.WeChatOAuthInfo
المسمى wechat، ويمكن الحصول على مثيل wechat_django.models.WeChatUser
من خلال request.wechat.user. request.wechat.app احصل على نسخة wechat_django.models.WeChatApp
، وفيما يلي مثال أساسي
from wechat_django import wechat_auth
@wechat_auth("your_app_name")
def your_view(request, *args, **kwargs):
""":type request: wechat_django.requests.WeChatOAuthRequest"""
user = request.wechat.user
إذا لم تكن راضيًا عن سلوك إعادة التوجيه الافتراضي، فيمكنك تخصيص الاستجابة للحصول على أوصاف معلمات محددة، راجع سلسلة المستندات الخاصة بمصمم الديكور wechat_django.oauth.wechat_auth
.
بالنسبة للعرض المستند إلى الفصل الدراسي، يمكنك وراثة فئة wechat_django.oauth.WeChatOAuthView
، راجع الكود للحصول على التفاصيل
قم بالتفويض من خلال wechat_django.models.WeChatApp.auth
، وأدخل الرمز من العميل، وأخرج كائن المستخدم والاستجابة الأصلية، يمكن لهذه الطريقة الحصول على معرف المستخدم المفتوح ومعرف الاتحاد فقط.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
بالنسبة لمفتاح الجلسة الذي تم الحصول عليه بعد الترخيص، سيتم الاحتفاظ بإطار العمل في قاعدة البيانات، ويمكنك بعد ذلك إجراء العمليات ذات الصلة عن طريق استدعاء wechat_django.models.WeChatUser.session
.
تنطبق طريقة المصادقة أيضًا على ترخيص صفحة الويب. تملأ المعلمة الثانية نطاق ترخيص صفحة الويب.
بالنسبة للمستخدمين الذين قاموا بالفعل بترخيص البرنامج المصغر ولم تنته صلاحية مفتاح جلسة العمل الخاص بهم، يمكنك استخدام wechat_django.models.Session.decrypt_message
لفك تشفير البيانات الحساسة المرسلة من العميل.
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
يمكنك أيضًا استخدام wechat_django.models.Session.validate_message
للتحقق من البيانات المرسلة من العميل
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
يستدعي العميل wx.getUserInfo
لتمرير البيانات الأولية والتوقيع إلى الواجهة الخلفية. تقوم الواجهة الخلفية بتحديث معلومات المستخدم عن طريق الاتصال بـ wechat_django.models.Session.validate_message
و wechat_django.models.User.update
from django.http.response import HttpResponse
from wechatpy.exceptions import InvalidSignatureException
signature = request.POST["signature"]
raw_data = request.POST["rawData"]
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
return HttpResponse(status=401)
تحديث بيانات المستخدم باستخدام طريقة التحديث
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
للحصول على تعليمات محددة حول كيفية استخدام العميل، يرجى الرجوع إلى وثائق wechatpy.
قم بتكوين رد مخصص في الخلفية واملأ مسار رمز معالجة الرد المخصص. يجب تزيين الكود بواسطة wechat_django.handler.message_handler
تتلقى الطريقة المقابلة كائن wechat_django.models.WeChatMessageInfo
وترجع سلسلة أو wechatpy.replies.BaseReply
. كائن BaseReply.
from wechat_django import message_handler
@message_handler
def custom_business(message):
"""
:type message: wechat_django.models.WeChatMessageInfo
"""
user = message.user
msg = message.message
text = "hello, {0}! we received a {1} message.".format(
user, msg.type)
return TextReply(content=text.encode())
لاستخدام دفع WeChat، تحتاج إلى إضافة wechat_django.pay
بعد wechat_django
في INSTALLED_APP.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
order = app.pay.create_order(
user="user-instance", body="body", total_fee=1,
out_trade_no="***debug***20190613001") # 也可以用openid="openid"代替user参数
prepay = order.prepay(request)
قم بتمرير معلمات jsapi إلى الواجهة الأمامية
jsapi_params = order.jsapi_params(prepay["prepay_id"])
تحقق بنشاط من حالة الطلب
order.sync()
عندما يتم تحديث الطلب، سيتم إصدار إشارة wechat_django.pay.signals.order_updated
. يوفر المرسل 4 متغيرات للطلب wechat_django.utils.func.Static("{appname}.{payname}")
عامل | يوضح |
---|---|
نتيجة | نتيجة الطلب ( wechat_django.pay.models.UnifiedOrderResult ) |
طلب | طلب محدث ( wechat_django.pay.models.UnifiedOrder ) |
ولاية | حالة الطلب ( wechat_django.pay.models.UnifiedOrderResult.State ) |
إرفاق | المعلومات المرفقة بالنتيجة (يتم تمريرها إلى خادم WeChat عند إنشاء الطلب) |
مثال الاستخدام
from django.dispatch import receiver
from wechat_django.pay import signals
@receiver(signals.order_updated)
def order_updated(result, order, state, attach):
if state == UnifiedOrderResult.State.SUCCESS:
pass
انتبه! سيتم إرسال إشارة لكل مكالمة نشطة أو إشعار WeChat أو أداة إعادة تشغيل في الخلفية. يرجى التأكد من تنفيذ منطق إشارة نجاح الطلب مرة واحدة فقط!
يتوافق ترخيص OAuth المستند إلى فئة هذا المشروع مع إطار عمل Django-rest.
wechat_django.oauth.WeChatOAuthViewMixin
؛appname
في فئة العرض؛permission_classes
حسب الحاجة (إذا كان يجب ترخيص المورد قبل الوصول، فيرجى إضافة wechat_django.oauth.WeChatAuthenticated
في فئات الأذونات)؛rest_framework.exceptions.NotAuthenticated
في طريقة handle_exception
، وتعامل معها بنفسك.يمكنك رؤية ملف Rest.py الخاص بالمشروع النموذجي.
راجع مستند مقدمة استخدام خلفية الإدارة
يرجى الرجوع إلى المجلد النموذجي لهذا المشروع
كزافييه لام@NetDragon