浏览代码

苹果内购接口

locky 1 年之前
父节点
当前提交
db7e6a8b67
共有 3 个文件被更改,包括 92 次插入3 次删除
  1. 3 1
      Ansjer/urls.py
  2. 87 0
      Controller/InAppPurchaseController.py
  3. 2 2
      Model/models.py

+ 3 - 1
Ansjer/urls.py

@@ -25,7 +25,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, PcInfo, PctestController, DeviceDebug, PaymentCycle, \
     DeviceLogController, CouponController, AiController, ShadowController, AppAccountManagement, InitController, \
-    WeatherControl, SmartReplyController
+    WeatherControl, SmartReplyController, InAppPurchaseController
 from Controller.Cron import CronTaskController
 from Controller.MessagePush import EquipmentMessagePush
 from Controller.SensorGateway import SensorGatewayController, EquipmentFamilyController
@@ -276,6 +276,8 @@ urlpatterns = [
     re_path('wsParam/(?P<operation>.*)', SmartReplyController.WsParamService.as_view()),
     re_path('customSubscription/(?P<operation>.*)', UserSubscriptionController.UserSubscriptionControllerView.as_view()),
     re_path(r'^basic/serialNo/(?P<operation>.*)', SerialNumberCheckController.SerialNumberView.as_view()),
+    re_path('inAppPurchase/(?P<operation>.*)', InAppPurchaseController.InAppPurchaseView.as_view()),
+
 
     # 后台界面接口 -------------------------------------------------------------------------------------------------------
     # 登录,用户信息,权限

+ 87 - 0
Controller/InAppPurchaseController.py

@@ -0,0 +1,87 @@
+# @Author    : Rocky
+# @File      : InAppPurchaseController.py
+# @Time      : 2024/6/21 9:10
+import time
+
+import itunesiap
+from django.views import View
+
+from Model.models import Order_Model, Store_Meal
+from Service.CommonService import CommonService
+
+
+class InAppPurchaseView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        if operation == 'AppStoreServerNotifications':  # App Store服务器通知
+            pass
+        token_code, user_id, response = CommonService.verify_token_get_user_id(request_dict, request)
+        if token_code != 0:
+            return response.json(token_code)
+        if operation == 'verifyTransaction':  # 获取商品列表
+            return self.verify_transaction(user_id, request_dict, response)
+
+    @staticmethod
+    def verify_transaction(user_id, request_dict, response):
+        """
+        认证交易
+        @param user_id: 用户id
+        @param request_dict: 请求参数
+        @request_dict receipt: 收据
+        @param response: 响应对象
+        @return: response
+        """
+        receipt = request_dict.get('receipt', None)
+        uid = request_dict.get('uid', None)
+        lang = request_dict.get('lang', 'en')
+        channel = request_dict.get('channel', None)
+        try:
+            order_id = CommonService.createOrderID()
+            verify_response = itunesiap.verify(receipt, env=itunesiap.env.sandbox)
+            print(verify_response.receipt.in_app[0]['product_id'])     # response.receipt.last_in_app.product_id
+            product_id = verify_response.receipt.in_app[0]['product_id']
+
+            pay_type = 4
+            now_time = int(time.time())
+
+            store_qs = Store_Meal.objects.filter(
+                product_id=product_id, lang__lang=lang, is_show=0).\
+                values(
+                'id', 'currency', 'price', 'lang__content', 'day', 'commodity_type', 'lang__title', 'expire',
+                'commodity_code', 'discount_price', 'bucket__mold', 'cycle_config_id', 'is_ai')
+            if not store_qs.exists():
+                return response.json(173)
+
+            rank_id = store_qs[0]['id']
+            currency = store_qs[0]['currency']
+            price = store_qs[0]['price']
+            is_ai = store_qs[0]['is_ai']
+            content = store_qs[0]['lang__content']
+            commodity_code = store_qs[0]['commodity_code']
+            commodity_type = store_qs[0]['commodity_type']
+            order_type = 1 if is_ai else 0
+            store_meal_qs = Store_Meal.objects.filter(id=rank_id, lang__lang='cn', is_show=0).\
+                values('lang__title', 'lang__content')
+            if store_meal_qs.exists():
+                store_meal_name = store_meal_qs[0]['lang__title'] + '-' + store_meal_qs[0]['lang__content']
+            else:
+                store_meal_name = '未知套餐'
+
+            Order_Model.objects.create(
+                orderID=order_id, UID=uid, channel=channel, userID_id=user_id, desc=content, payType=pay_type,
+                payTime=now_time, price=price, currency=currency, addTime=now_time, updTime=now_time,
+                order_type=order_type, commodity_code=commodity_code, commodity_type=commodity_type, rank_id=rank_id,
+                ai_rank_id=1, store_meal_name=store_meal_name)
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+

+ 2 - 2
Model/models.py

@@ -1667,7 +1667,7 @@ class Store_Meal(models.Model):
     expire = models.IntegerField(default=0, blank=True, verbose_name=u'有效期')  # 单位月
     # content = models.TextField(blank=True, null=True, verbose_name=u'描述')
     add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)
-    # type = models.SmallIntegerField(default=0, verbose_name='付款类型')  # 0是paypal,1为支付宝
+    # 1: PayPal, 2: 支付宝, 3: 微信, 4: 苹果支付, 5: 苹果内购, 10: 免费体验, 11: 激活码
     pay_type = models.ManyToManyField(to='Pay_Type', verbose_name='付款类型', db_table='store_meal_pay')
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
@@ -1860,7 +1860,7 @@ class Order_Model(models.Model):
     isSelectDiscounts = models.SmallIntegerField(default=0, verbose_name=u'用户是否选择了第二年优惠 [0=否,1是]')
     # 0: 待支付, 1:支付成功, 2: 取消支付, 4: 退款失败, 5: 全额退款, 6: 部分退款, 7: PayPal已退款, 9:处理中, 10:支付失败
     status = models.SmallIntegerField(default=0, verbose_name='付款状态')
-    # 1: PayPal, 2: 支付宝, 3: 微信, 10: 免费体验, 11: 激活码
+    # 1: PayPal, 2: 支付宝, 3: 微信, 4: 苹果支付, 5: 苹果内购, 10: 免费体验, 11: 激活码
     payType = models.SmallIntegerField(default=0, verbose_name='支付方式')
     payTime = models.IntegerField(verbose_name='支付成功时间', default=0)
     rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='关联云存套餐表')