WeChat-Django は、 WeChat パブリック プラットフォームにアクセスする Django 開発者に、便利な WeChat および 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 | 真実 | ドメイン名がhttpsであるかどうかにかかわらず、WeChatコールバックを受信します |
WECHAT_PATCHADMINSITE | 真実 | Django のデフォルト管理サイトを wechat_django のデフォルト管理サイトに置き換えるかどうか、デフォルトの置き換え |
WECHAT_SESSIONSTORAGE | 「ジャンゴ.コア.キャッシュ.キャッシュ」 | WeChat アクセストークンなどのデータを保存するために使用されるwechatpy.session.SessionStorage オブジェクト、またはwechat_django.models.WeChatApp オブジェクトを受け取り、そのインスタンスを生成するファクトリ メソッド |
WECHAT_MESSAGETIMEOFFSET | 180 | WeChat がメッセージをリクエストするとき、タイムスタンプがサーバー時間とこの値を超えて異なるリクエストは破棄されます。 |
WECHAT_MESSAGENOREPEATNONCE | 真実 | WeChat メッセージのアンチリプレイをデフォルトでチェックするかどうか |
ロガー | 説明する |
---|---|
wechat.admin.{アプリ名} | 管理例外ログの最低レベルの警告 |
wechat.api.{アプリ名} | API ログの最低レベルのデバッグ |
wechat.handler.{アプリ名} | メッセージ処理ログの最下位レベルのデバッグ |
wechat.oauth.{アプリ名} | Web ページ認証例外ログの最下位レベルは警告です。 |
wechat.site.{アプリ名} | サイトビュー例外ログ(マテリアルプロキシなど)の最低レベルの警告 |
Web ページの承認はwechat_django.oauth.wechat_auth
デコレーターを通じて実行できます。承認後、リクエストには wechat という名前のwechat_django.oauth.WeChatOAuthInfo
オブジェクトが添付されます。wechat_django.models.WeChatUser インスタンスは request.wechat.user を通じて取得できますwechat_django.models.WeChatUser
リクエスト.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
デコレーターの docstring を参照してください。
クラスベースのビューの場合、 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
を呼び出して関連操作を実行できます。
auth メソッドは、Web ページの認証にも適用されます。デフォルトは、Web ページの認証の範囲です。
すでにミニ プログラムを承認しており、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)
update メソッドを使用してユーザー データを更新する
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
オブジェクト。
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 決済を使用するには、INSTALLED_APP のwechat_django
の後にwechat_django.pay
を追加する必要があります。
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 通知、またはバックグラウンド再トリガーごとにシグナルが送信されます。注文成功シグナル ロジックは 1 回だけ実行されるようにしてください。
このプロジェクトのクラスベースの OAuth 認証は、django-rest-framework と互換性があります。
wechat_django.oauth.WeChatOAuthViewMixin
を継承するビュー クラスを構築します。appname
属性を定義します。permission_classes
を定義します (アクセスする前にリソースを承認する必要がある場合は、permission_classes にwechat_django.oauth.WeChatAuthenticated
を追加してください)。handle_exception
メソッドでrest_framework.exceptions.NotAuthenticated
をキャプチャし、自分でハンドリングします。サンプルプロジェクトのrest.pyファイルを確認できます。
管理バックグラウンドの使用方法の紹介ドキュメントを参照してください。
このプロジェクトのサンプルフォルダーを参照してください
ザビエル・ラム@NetDragon