WeChat-Django bertujuan untuk menyediakan enkapsulasi fungsi pembayaran WeChat dan WeChat yang nyaman dan dukungan manajemen backend dasar bagi pengembang Django yang mengakses platform publik WeChat.
Alamat proyek resmi: https://github.com/Xavier-Lam/wechat-django
Ekstensi ini didasarkan pada wechatpy, dan versi minimum Django yang didukung adalah 1.11. WeChat-Django hanya versi pratinjau, mungkin terdapat banyak bug dan API serta struktur data dapat berubah, harap perhatikan CHANGELOG).
USE_TZ = True
Pada titik ini, Anda dapat mulai menggunakan wechat_django dengan mudah. Proyek belum menyediakan dokumen penggunaan khusus. Jika Anda memerlukan persyaratan khusus, harap baca kodenya terlebih dahulu.
Jika Anda ingin menggunakan fitur terbaru atau mengedit kodenya sendiri, Anda dapat mengkloning proyek ini dan menggunakan pip install -e untuk memasangnya langsung ke direktori proyek Django Anda.
Secara umum, konfigurasi default sudah cukup
Nama parameter | nilai bawaan | menjelaskan |
---|---|---|
WECHAT_SITE_HOST | Tidak ada | Nama domain default yang digunakan untuk menerima panggilan balik WeChat |
WECHAT_SITE_HTTPS | BENAR | Terima panggilan balik WeChat apakah nama domainnya https |
WECHAT_PATCHADMINSITE | BENAR | Apakah akan mengganti situs admin bawaan Django dengan situs admin bawaan wechat_Django, pengganti bawaan |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | Objek wechatpy.session.SessionStorage digunakan untuk menyimpan data seperti accesstoken WeChat, atau metode pabrik yang menerima objek wechat_django.models.WeChatApp dan menghasilkan instance-nya |
WECHAT_MESSAGETIMEOFFSET | 180 | Saat WeChat meminta pesan, permintaan yang stempel waktunya berbeda dengan waktu server lebih dari nilai ini akan dibuang. |
WECHAT_MESSAGENOREPEATNONCE | BENAR | Apakah akan memeriksa anti-pemutaran ulang pesan WeChat secara default |
penebang | menjelaskan |
---|---|
wechat.admin.{nama aplikasi} | Pengecualian admin mencatat peringatan tingkat terendah |
wechat.api.{nama aplikasi} | api log debug tingkat terendah |
wechat.handler.{nama aplikasi} | Log pemrosesan pesan debugging tingkat terendah |
wechat.oauth.{nama aplikasi} | Tingkat terendah dari log pengecualian otorisasi halaman web adalah peringatan. |
wechat.site.{nama aplikasi} | Log pengecualian tampilan situs (seperti proksi material) peringatan tingkat terendah |
Otorisasi halaman web dapat dilakukan melalui dekorator wechat_django.oauth.wechat_auth
. Setelah otorisasi, permintaan akan dilampirkan dengan objek wechat_django.oauth.WeChatOAuthInfo
wechat_django.models.WeChatUser
wechat. .permintaan.wechat.app Dapatkan contoh wechat_django.models.WeChatApp
, berikut adalah contoh dasar
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
Jika Anda tidak puas dengan perilaku pengalihan default, Anda dapat menyesuaikan responsnya. Untuk deskripsi parameter spesifik, lihat dokumen dekorator wechat_django.oauth.wechat_auth
.
Untuk tampilan berbasis kelas, Anda dapat mewarisi kelas wechat_django.oauth.WeChatOAuthView
, lihat kode untuk detailnya
Otorisasi melalui wechat_django.models.WeChatApp.auth
, masukkan kode dari klien, dan keluarkan objek pengguna dan respons asli. Metode ini hanya bisa mendapatkan openid dan unionid pengguna.
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
Untuk session_key yang diperoleh setelah otorisasi, kerangka kerja akan disimpan ke database, dan Anda kemudian dapat melakukan operasi terkait dengan memanggil wechat_django.models.WeChatUser.session
.
Metode autentikasi juga berlaku untuk otorisasi halaman web. Parameter kedua mengisi cakupan otorisasi halaman web. Defaultnya adalah dasar.
Bagi pengguna yang telah mengotorisasi program mini dan yang session_key-nya belum kedaluwarsa, Anda dapat menggunakan wechat_django.models.Session.decrypt_message
untuk mendekripsi data sensitif yang dikirim dari klien.
encrypted_data = ""
iv = ""
try:
data = user.session.decrypt_message(
encrypted_data, iv)
except ValueError:
pass # 无法正确解密数据 session_key可能过期了
Anda juga dapat menggunakan wechat_django.models.Session.validate_message
untuk memverifikasi data yang dikirim dari klien
from wechatpy.exceptions import InvalidSignatureException
signature = ""
raw_data = ""
try:
data = user.session.validate_message(raw_data, signature)
except InvalidSignatureException:
pass # 签名错误 session_key可能过期了
Klien memanggil wx.getUserInfo
untuk meneruskan rawData dan tanda tangan ke backend. Backend memperbarui informasi pengguna dengan memanggil wechat_django.models.Session.validate_message
dan 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)
Perbarui data pengguna menggunakan metode pembaruan
user.update(data)
from wechat_django.models import WeChatApp
app = WeChatApp.get_by_name("your app name")
data = app.client.user.get_followers()
Untuk instruksi spesifik tentang cara menggunakan klien, silakan merujuk ke dokumentasi wechatpy.
Konfigurasikan balasan khusus di latar belakang dan isi jalur kode pemrosesan balasan khusus. Kode harus dihiasi oleh wechat_django.handler.message_handler
Metode terkait menerima objek wechat_django.models.WeChatMessageInfo
dan mengembalikan string atau wechatpy.replies.BaseReply
objek.
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())
Untuk menggunakan pembayaran WeChat, Anda perlu menambahkan wechat_django.pay
setelah wechat_django
di 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)
Lewati parameter jsapi ke ujung depan
jsapi_params = order.jsapi_params(prepay["prepay_id"])
Periksa status pesanan secara aktif
order.sync()
Ketika pesanan diperbarui, sinyal wechat_django.pay.signals.order_updated
akan dipancarkan. Pengirim menyediakan 4 variabel untuk pesanan wechat_django.utils.func.Static("{appname}.{payname}")
variabel | menjelaskan |
---|---|
hasil | Hasil pesanan ( wechat_django.pay.models.UnifiedOrderResult ) |
memesan | Pesanan yang diperbarui ( wechat_django.pay.models.UnifiedOrder ) |
negara | Status pesanan ( wechat_django.pay.models.UnifiedOrderResult.State ) |
menempel | Informasi terlampir pada hasil (lampirkan ke server WeChat saat membuat pesanan) |
Contoh penggunaan
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
Perhatian! Sinyal akan dikirim untuk setiap panggilan aktif, notifikasi WeChat, atau pemicu ulang latar belakang. Harap pastikan bahwa logika sinyal keberhasilan pesanan hanya dijalankan satu kali!
Otorisasi OAuth berbasis kelas proyek ini kompatibel dengan Django-rest-framework.
wechat_django.oauth.WeChatOAuthViewMixin
;appname
di kelas tampilan;permission_classes
sesuai kebutuhan (jika sumber daya harus diotorisasi sebelum akses, harap tambahkan wechat_django.oauth.WeChatAuthenticated
di izin_kelas);rest_framework.exceptions.NotAuthenticated
dalam metode handle_exception
, dan tangani sendiri.Anda dapat melihat file rest.py dari proyek contoh.
Lihat dokumen pengenalan penggunaan latar belakang manajemen
Silakan merujuk ke folder contoh proyek ini
Xavier-Lam@NetDragon