WeChat-Django มุ่งหวังที่จะมอบฟังก์ชันการชำระเงิน WeChat และ WeChat ที่สะดวกสบาย และ การสนับสนุนการจัดการแบ็กเอนด์ ขั้นพื้นฐานสำหรับนักพัฒนา Django ที่เข้าถึงแพลตฟอร์มสาธารณะ WeChat
ที่อยู่โครงการอย่างเป็นทางการ: https://github.com/Xavier-Lam/wechat-django
ส่วนขยายนี้อิงจาก wechatpy และเวอร์ชันขั้นต่ำของ Django ที่รองรับคือ 1.11 WeChat-Django เป็นเพียงเวอร์ชันตัวอย่างเท่านั้น อาจมีข้อบกพร่องมากมาย และ API และโครงสร้างข้อมูลอาจมีการเปลี่ยนแปลง โปรดใส่ใจกับ CHANGELOG อย่างใกล้ชิด)
USE_TZ = True
ณ จุดนี้ คุณสามารถเริ่มใช้งาน wechat_django ได้อย่างง่ายดาย โครงการยังไม่ได้จัดเตรียมเอกสารการใช้งานที่เฉพาะเจาะจง หากคุณต้องการข้อกำหนดที่กำหนดเอง โปรดอ่านโค้ดก่อน
หากคุณต้องการใช้คุณสมบัติล่าสุดหรือแก้ไขโค้ดด้วยตนเอง คุณสามารถโคลนโปรเจ็กต์นี้และใช้ pip install -e เพื่อติดตั้งลงในไดเร็กทอรีโปรเจ็กต์ Django ของคุณโดยตรง
โดยทั่วไปแล้ว การกำหนดค่าเริ่มต้นก็เพียงพอแล้ว
ชื่อพารามิเตอร์ | ค่าเริ่มต้น | แสดงให้เห็น |
---|---|---|
WECHAT_SITE_HOST | ไม่มี | ชื่อโดเมนเริ่มต้นที่ใช้ในการรับการติดต่อกลับ WeChat |
WECHAT_SITE_HTTPS | จริง | รับการติดต่อกลับ WeChat ไม่ว่าชื่อโดเมนจะเป็น https หรือไม่ |
WECHAT_PATCHADMINSITE | จริง | ไม่ว่าจะแทนที่ adminsite เริ่มต้นของ django ด้วย adminsite เริ่มต้นของ wechat_django หรือไม่ การแทนที่เริ่มต้น |
WECHAT_SESSIONSTORAGE | "django.core.cache.cache" | ออบเจ็กต์ wechatpy.session.SessionStorage ที่ใช้ในการจัดเก็บข้อมูล เช่น โทเค็นการเข้าถึง WeChat หรือวิธีการจากโรงงานที่รับออบเจ็กต์ wechat_django.models.WeChatApp และสร้างอินสแตนซ์ |
WECHAT_MESSAGEเวลาออฟเซ็ต | 180 | เมื่อ WeChat ร้องขอข้อความ คำขอที่มีการประทับเวลาแตกต่างจากเวลาของเซิร์ฟเวอร์มากกว่าค่านี้จะถูกละทิ้ง |
WECHAT_MESSAGENOREPEATNONCE | จริง | จะตรวจสอบการป้องกันการเล่นซ้ำของข้อความ WeChat ตามค่าเริ่มต้นหรือไม่ |
คนตัดไม้ | แสดงให้เห็น |
---|---|
wechat.admin.{ชื่อแอป} | ข้อยกเว้นของผู้ดูแลระบบบันทึกคำเตือนระดับต่ำสุด |
wechat.api.{ชื่อแอป} | API บันทึกการดีบักระดับต่ำสุด |
wechat.handler.{appname} | การประมวลผลข้อความบันทึกการดีบักระดับต่ำสุด |
wechat.oauth.{ชื่อแอป} | ระดับต่ำสุดของบันทึกข้อยกเว้นการอนุญาตหน้าเว็บคือคำเตือน |
wechat.site.{appname} | บันทึกข้อยกเว้นการดูไซต์ (เช่น พร็อกซีวัสดุ) คำเตือนระดับต่ำสุด |
การอนุญาตหน้าเว็บสามารถทำได้ผ่านเครื่องมือตกแต่ง wechat_django.oauth.wechat_auth
หลังจากการอนุญาต คำขอจะถูกแนบไปกับออบเจ็กต์ wechat_django.oauth.WeChatOAuthInfo
ชื่อ wechat_django.models.WeChatUser
สามารถรับได้ผ่าน request.wechat.user . ขอ.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
หากคุณไม่พอใจกับพฤติกรรมการเปลี่ยนเส้นทางเริ่มต้น คุณสามารถปรับแต่งการตอบกลับได้ สำหรับคำอธิบายพารามิเตอร์เฉพาะ โปรดดูที่ docstring ของ wechat_django.oauth.wechat_auth
decorator
สำหรับมุมมองแบบคลาส คุณสามารถสืบทอดคลาส wechat_django.oauth.WeChatOAuthView
ได้ โปรดดูโค้ดเพื่อดูรายละเอียด
อนุญาตผ่าน wechat_django.models.WeChatApp.auth
ป้อนรหัสจากไคลเอนต์ และส่งออกอ็อบเจ็กต์ผู้ใช้และการตอบกลับดั้งเดิม วิธีนี้จะรับได้เฉพาะ openid และ unionid ของผู้ใช้เท่านั้น
from wechat_django.models import WeChatApp
app = WeChatApp.objects.get_by_name("your app name")
user, data = app.auth(code)
สำหรับ session_key ที่ได้รับหลังจากการอนุญาต เฟรมเวิร์กจะยังคงอยู่ในฐานข้อมูล จากนั้นคุณสามารถดำเนินการที่เกี่ยวข้องได้โดยการเรียก wechat_django.models.WeChatUser.session
วิธีการรับรองความถูกต้องยังใช้ได้กับการอนุญาตหน้าเว็บด้วย พารามิเตอร์ที่สองกรอกในขอบเขตของการอนุญาตหน้าเว็บ
สำหรับผู้ใช้ที่อนุญาตมินิโปรแกรมแล้วและ session_key ยังไม่หมดอายุ คุณสามารถใช้ 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
เพื่อส่ง rawData และลายเซ็นไปยังแบ็กเอนด์ แบ็กเอนด์จะอัปเดตข้อมูลผู้ใช้โดยการเรียก 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-framework
wechat_django.oauth.WeChatOAuthViewMixin
;appname
ในคลาสมุมมอง;permission_classes
ตามความจำเป็น (หากทรัพยากรต้องได้รับอนุญาตก่อนเข้าถึง โปรดเพิ่ม wechat_django.oauth.WeChatAuthenticated
ใน Permission_classes)rest_framework.exceptions.NotAuthenticated
ในเมธอด handle_exception
และจัดการด้วยตัวเองคุณสามารถดูไฟล์ rest.py ของโปรเจ็กต์ตัวอย่างได้
ดูเอกสารแนะนำการใช้งานพื้นหลังการจัดการ
โปรดดูโฟลเดอร์ตัวอย่างของโครงการนี้
ซาเวียร์-แลม@เน็ตดราก้อน