models.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #coding=utf-8
  2. from django.db import models
  3. from django.utils import timezone
  4. from apps.customer.models import Customer
  5. from apps.product_order.models import ProductOrder
  6. from apps.product.models import Product
  7. from apps.customer.models import CustomerWechat
  8. from utils.exceptions import CustomError
  9. from utils.wechatpay import WechatPay
  10. class Pay(models.Model):
  11. WAIT = 1
  12. CONFIRM = 2
  13. CLOSED = 3
  14. STATUS_CHOICES = (
  15. (WAIT, u'待付款'),
  16. (CONFIRM, u'已付款'),
  17. (CLOSED, u'已关闭'),
  18. )
  19. no = models.CharField(max_length=64, verbose_name=u"单号")
  20. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  21. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
  22. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"支付状态")
  23. precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
  24. amount = models.BigIntegerField(verbose_name=u"实际支付金额", null=True)
  25. class Meta:
  26. db_table = "pay"
  27. verbose_name = u"支付"
  28. ordering = ('-id',)
  29. index_together = (
  30. 'create_time',
  31. 'status',
  32. )
  33. unique_together = (
  34. 'no',
  35. )
  36. default_permissions = ()
  37. def payClosed(self):
  38. if self.status != Pay.WAIT:
  39. return
  40. self.status = Pay.CLOSED
  41. self.save()
  42. self.updateOrderStatus(ProductOrder.REVOKE)
  43. def payConfirm(self, amount):
  44. if self.status != Pay.WAIT:
  45. return
  46. self.status = Pay.CONFIRM
  47. self.amount = amount
  48. self.save()
  49. self.updateOrderStatus(ProductOrder.PAID)
  50. def updateOrderStatus(self, status):
  51. pay_order = PayProduct.objects.filter(main=self).first()
  52. pay_order.order.status = status
  53. pay_order.order.save()
  54. @staticmethod
  55. def getByNo(no):
  56. instance = Pay.objects.filter(no=no).first()
  57. if not instance:
  58. raise CustomError(u'未找到相应的支付单!')
  59. return instance
  60. @staticmethod
  61. def wechatPay(customer, amount, openid):
  62. instance = Pay._addnew(customer, amount)
  63. return instance, instance._wechatUnifiedOrder(openid)
  64. @staticmethod
  65. def _addnew(customer, amount):
  66. if amount <= 0:
  67. raise CustomError(u'无效的付款金额!')
  68. no = timezone.now().strftime('%y%m%d%H%M%S') + str(customer.id)
  69. instance = Pay.objects.create(
  70. no=no,
  71. customer=customer,
  72. status=Pay.WAIT,
  73. precreate_amount=amount
  74. )
  75. return instance
  76. def _wechatUnifiedOrder(self, openid):
  77. wechatpay = WechatPay(self.wechatapp.authorizer_appid, self.wechatapp.tenant_num, self.wechatapp.tenant_key)
  78. wechatpay.unifiedOrder(self.no, self.precreate_amount, openid)
  79. data = wechatpay.getAppString()
  80. return data
  81. class PayProduct(models.Model):
  82. main = models.OneToOneField(Pay, verbose_name=u'支付单', on_delete=models.PROTECT, related_name='pay_package_pay')
  83. order = models.OneToOneField(ProductOrder, verbose_name=u'商品订单', on_delete=models.PROTECT, related_name='pay_package_order')
  84. class Meta:
  85. db_table = "pay_package"
  86. verbose_name = u"支付商品"
  87. ordering = ('-id',)
  88. default_permissions = ()
  89. @staticmethod
  90. def addnew(order, openid):
  91. pay, query_string = Pay.wechatPay(order.customer, order.actual_amount, openid)
  92. instance = PayProduct.objects.create(main=pay, order=order)
  93. return instance, query_string