学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Django3.2 | クラウドソーシングアプリの構築 | 52 | 報酬支払いの実装

↓↓クリックして頂けると励みになります。


51 | PayPalアカウント】 << 【ホーム】 >> 【53 | Firebaseメッセージ


「core/admin.py」ファイルを編集します。


記述編集 【Desktop/crowdsource/core/admin.py】

from django.contrib import admin
from django.conf import settings
from paypalrestsdk import configure, Payout

from .models import *

configure({
  "mode": settings.PAYPAL_MODE,
  "client_id": settings.PAYPAL_CLIENT_ID,
  "client_secret": settings.PAYPAL_CLIENT_SECRET,
})

class CourierAdmin(admin.ModelAdmin):
  list_display = ['user_full_name', 'paypal_email', 'balance']

  def user_full_name(self, obj):
    return obj.user.get_full_name()

  def balance(self, obj):
    return round(sum(t.amount for t in Transaction.objects.filter(job__courier=obj, status=Transaction.IN_STATUS)) * 0.8)
  
class TransactionAdmin(admin.ModelAdmin):
  list_display = ['stripe_payment_intent_id', 'courier_paypal_email', 'customer', 'courier', 'job', 'amount', 'status', 'created_at']
  list_filter = ['status',]

  def customer(self, obj):
    return obj.job.customer

  def courier(self, obj):
    return obj.job.courier

  def courier_paypal_email(sefl, obj):
    return obj.job.courier.paypal_email if obj.job.courier else None

# Register your models here.
admin.site.register(Customer)
admin.site.register(Courier, CourierAdmin)
admin.site.register(Category)
admin.site.register(Job)
admin.site.register(Transaction, TransactionAdmin)



一度ブラウザを確認します。
http://127.0.0.1:8000/admin/core/courier/

管理サイト確認
管理サイト確認



引き続き「core/admin.py」ファイルを編集します。


記述編集 【Desktop/crowdsource/core/admin.py】

import random
import string
from django.contrib import admin, messages
from django.conf import settings
from paypalrestsdk import configure, Payout

from .models import *

configure({
  "mode": settings.PAYPAL_MODE,
  "client_id": settings.PAYPAL_CLIENT_ID,
  "client_secret": settings.PAYPAL_CLIENT_SECRET,
})

def payout_to_courier(modeladmin, request, queryset):
    payout_items = []
    transaction_querysets = []

    # Step 1 - すべての有効な配送者を取得します
    for courier in queryset:
        if courier.paypal_email:
            courier_in_transactions = Transaction.objects.filter(
                job__courier=courier,
                status=Transaction.IN_STATUS
            )

            if courier_in_transactions:
                transaction_querysets.append(courier_in_transactions)
                balance = sum(i.amount for i in courier_in_transactions)
                payout_items.append({
                "recipient_type": "EMAIL",
                    "amount": {
                        "value": int(balance * 0.8),
                        "currency": "JPY"
                    },
                    "receiver": courier.paypal_email,
                    "note": "配達ご苦労様でした。",
                    "sender_item_id": str(courier.id)
                })
 
    # Step 2 - 支払額をEメールで配送者に送信する
    sender_batch_id = ''.join(random.choice(string.ascii_uppercase) for i in range(12))
    payout = Payout({
        "sender_batch_header": {
            "sender_batch_id": sender_batch_id,
            "email_subject": "報酬をお支払いしました。"
        },
        "items": payout_items
    })

    # Step 3 - 支払いプロセスを実行し、トランザクションのステータスを「OUT」に更新
    try:
        if payout.create():
            for t in transaction_querysets:
                t.update(status=Transaction.OUT_STATUS)
                messages.success(request, "支払い[%s] が成功しました。" % (payout.batch_header.payout_batch_id))
        else:
            messages.error(request, payout.error)

    except Exception as e:
        messages.error(request, str(e))

payout_to_courier.short_description = "配送者に支払い"


class CourierAdmin(admin.ModelAdmin):
  list_display = ['user_full_name', 'paypal_email', 'balance']
  actions = [payout_to_courier]

  def user_full_name(self, obj):
    return obj.user.get_full_name()

  def balance(self, obj):
    return round(sum(t.amount for t in Transaction.objects.filter(job__courier=obj, status=Transaction.IN_STATUS)) * 0.8)
  
class TransactionAdmin(admin.ModelAdmin):
  list_display = ['stripe_payment_intent_id', 'courier_paypal_email', 'customer', 'courier', 'job', 'amount', 'status', 'created_at']
  list_filter = ['status',]

  def customer(self, obj):
    return obj.job.customer

  def courier(self, obj):
    return obj.job.courier

  def courier_paypal_email(sefl, obj):
    return obj.job.courier.paypal_email if obj.job.courier else None

# Register your models here.
admin.site.register(Customer)
admin.site.register(Courier, CourierAdmin)
admin.site.register(Category)
admin.site.register(Job)
admin.site.register(Transaction, TransactionAdmin)



配送者のPayPal EメールをPayPal Developerで作成したpersonalアカウントに変更します。

personalアカウント
personalアカウント
personalアカウントを保存
personalアカウントを保存



管理サイトで支払いを実行します。

支払い実行
支払い実行
支払い成功
支払い成功



PayPalのpersonalアカウントの「Login Info」でIDとパスワードをコピーし、そのアカウントでPayPalテストサイト(https://sandbox.paypal.com)にログインします。

テストサイトにログイン
テストサイトにログイン



支払いの詳細を見ることができます。

支払いの詳細確認
支払いの詳細確認



管理サイトで「Transactions」を確認すると、ステータスが「Out」になっていることが確認できます。
http://127.0.0.1:8000/admin/core/transaction/

ステータス「Out」
ステータス「Out」


↓↓クリックして頂けると励みになります。


51 | PayPalアカウント】 << 【ホーム】 >> 【53 | Firebaseメッセージ