Thực hiện xác thực token bằng pickle và Redis, xử lý bytes với utf-8 ignore, tích hợp thanh toán thử nghiệm từ Alipay và WeChat

Thiết lập hệ thống xác thực người dùng với Redis và pickle

Trong một ứng dụng Django REST Framework, việc lưu trữ token phiên đăng nhập hiệu quả cần sử dụng cơ sở dữ liệu nhanh như Redis. Dưới đây là cách triển khai một lớp xác thực tùy chỉnh sử dụng pickle để mã hóa đối tượng người dùng và lưu vào Redis.

from rest_framework.authentication import BaseAuthentication
from django_redis import get_redis_connection
import pickle
from app.models import User
from rest_framework import exceptions

class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # Lấy token từ query string
        token = request.GET.get('token')
        
        # Kết nối tới Redis
        conn = get_redis_connection()
        stored_token = conn.get('token')

        if not stored_token:
            raise exceptions.AuthenticationFailed('Token không tồn tại')

        # Giải mã token từ bytes sang object
        try:
            user_name = pickle.loads(stored_token)
        except Exception:
            raise exceptions.AuthenticationFailed('Token không hợp lệ')

        # Tìm người dùng trong cơ sở dữ liệu
        user = User.objects.filter(name=user_name).first()
        if user and str(user.name) == token:
            return user, token
        else:
            raise exceptions.AuthenticationFailed('Xác thực thất bại')

Xử lý dữ liệu byte khi nhận từ Redis

Khi đọc dữ liệu từ Redis, kết quả luôn là kiểu bytes. Việc chuyển đổi thành chuỗi UTF-8 cần chú ý đến các ký tự lỗi. Sử dụng decode('utf-8', 'ignore') giúp loại bỏ các ký tự không hợp lệ mà không làm lỗi toàn bộ quá trình.

# Ví dụ xử lý dữ liệu từ Redis
stored_data = conn.get('key')
if stored_data:
    decoded_str = stored_data.decode('utf-8', 'ignore')  # Bỏ qua ký tự lỗi
    print(decoded_str)

Tích hợp thanh toán thử nghiệm với Alipay Sandbox

Để kiểm thử tính năng thanh toán, bạn cần cấu hình môi trường sandbox của Alipay. Các thông tin cần thiết bao gồm:

  • App ID: 2016092500594669
  • URL trả về (return_url): http://42.56.89.12:80/page2/
  • URL thông báo (notify_url): http://42.56.89.12:80/page2/
  • Chìa khóa riêng (merchant_private_key_path): keys/app_private_2048.txt
  • Chìa khóa công khai (alipay_public_key_path): keys/alipay_public_2048.txt
from alipay import AliPay

alipay = AliPay(
    appid="2016092500594669",
    app_notify_url="http://42.56.89.12:80/page2/",
    return_url="http://42.56.89.12:80/page2/",
    app_private_key_path="keys/app_private_2048.txt",
    alipay_public_key_path="keys/alipay_public_2048.txt",
    debug=True  # Môi trường sandbox
)

Quy trình thanh toán Alipay

  1. Tạo đối tượng AliPay với các tham số đã cấu hình.
  2. Gọi phương thức direct_pay() truyền vào mô tả sản phẩm, mã đơn hàng, giá tiền.
  3. Nhận chuỗi URL được sinh ra, ghép vào cổng thanh toán của Alipay.
  4. Gửi yêu cầu GET đến cổng thanh toán để hiển thị trang thanh toán.
  5. Sau khi thanh toán thành công, Alipay sẽ gửi hai phản hồi:
    • GET callback: Hiển thị kết quả cho người dùng.
    • POST callback: Xác minh chữ ký và cập nhật trạng thái đơn hàng.
  6. Luôn kiểm tra chữ ký bằng alipay.verify() trước khi xử lý.

Tích hợp thông báo qua WeChat (Service Account)

WeChat cung cấp nhiều kênh thông báo: email, SMS, hoặc WeChat. Trong đó, Service Account cho phép gửi tin nhắn chủ động sau khi người dùng theo dõi.

Các bước triển khai:

  1. Người dùng quét mã QR để theo dõi Service Account.
  2. Mã QR chứa redirect_uri và tham số định danh người dùng.
  3. Khi người dùng xác nhận, WeChat gửi GET request đến endpoint của bạn (/callback/) với code và state.
  4. Sử dụng code để gọi API lấy access_token.
  5. Dùng access_token và openid để gửi tin nhắn (thông báo hoặc mẫu).
WECHAT_CONFIG = {
    'app_id': 'wx20d174effe1375c3',
    'appsecret': 'e679b86b37688423556027f6c0aa4e88',
    'redirect_uri': 'http://42.56.89.12/callback/'
}

Chú ý: Cập nhật app_id, appsecret và đảm bảo redirect_uri phù hợp với miền thực tế khi triển khai.

Phân biệt các loại tài khoản WeChat

  • Công chúng (Public Account): Không thể nhắn trực tiếp; giới hạn 1 bài/ngày nếu chưa xác thực.
  • Service Account: Yêu cầu giấy phép doanh nghiệp; có thể gửi tin nhắn chủ động.
  • Enterprise Account: Dành cho nội bộ doanh nghiệp, giao tiếp nội bộ.

Mọi mã QR đều đại diện cho một URL. Có thể chuyển đổi URL thành QR và ngược lại.

Thẻ: Redis pickle Django REST Framework Alipay sandbox WeChat service account

Đăng vào ngày 11 tháng 10 lúc 06:49