Parcourir la source

添加内购退款代码

linhaohong il y a 1 an
Parent
commit
96011d90db
1 fichiers modifiés avec 44 ajouts et 4 suppressions
  1. 44 4
      Controller/InAppPurchaseController.py

+ 44 - 4
Controller/InAppPurchaseController.py

@@ -61,8 +61,8 @@ class InAppPurchaseView(View):
         @return: response
         """
         receipt = request_dict.get('receipt', None)
-        transaction_identifier = request_dict.get('transactionIdentifier', None)
-        original_transaction_identifier = request_dict.get('originalTransactionIdentifier', None)
+        transaction_identifier = request_dict.get('transactionIdentifier', "")
+        original_transaction_identifier = request_dict.get('originalTransactionIdentifier', "")
         order_id = request_dict.get('orderID', None)
         uid = request_dict.get('uid', None)
         lang = request_dict.get('lang', 'en')
@@ -71,7 +71,7 @@ class InAppPurchaseView(View):
         logger.info(
             f"transactionIdentifier:{transaction_identifier}, original_transaction_identifier:{original_transaction_identifier} ,订单orderId:{order_id}")
 
-        if not all([transaction_identifier, uid, channel, order_id]):
+        if not all([receipt, uid, channel, order_id]):
             return response.json(444)
 
         # redis加锁,防止订单重复
@@ -96,6 +96,9 @@ class InAppPurchaseView(View):
 
             client = AppStoreServerAPIClient(private_key, key_id, issuer_id, bundle_id, environment)
             transaction_id = transaction_identifier
+            if transaction_identifier == "":
+                receipt_util = ReceiptUtility()
+                transaction_id = receipt_util.extract_transaction_id_from_app_receipt(receipt)
 
             if transaction_id is None:
                 pay_result_url = CommonService.get_payment_status_url(lang, 'fail')
@@ -653,7 +656,44 @@ class InAppPurchaseView(View):
                 # 一种通知类型,表示 App Store 成功退还了消耗性应用内购买、非消耗性应用内购买、自动续订或不可续订的交易。
                 # revocationDate 包含退款交易的时间戳。originalTransactionId 和 productId 用于标识原始交易和产品。revocationReason 包含原因。
                 # 要请求客户所有退款交易的列表,请参阅 App Store 服务器 API 中的获取退款历史记录。
-                pass
+                # 1. 找套餐 使用 transaction_id 找orders
+                decoded_transaction_information = verifier.verify_and_decode_signed_transaction(
+                    decoded_payload.data.signedTransactionInfo)
+                transaction_id = decoded_transaction_information.transactionId
+                logger.info('App Store服务器通知退款, transaction_id:{}'.format(transaction_id))
+                orders_qs = Order_Model.objects.filter(transaction_id=transaction_id)
+                # 2. 查找云存套餐使用表 和 云存套餐
+                if orders_qs.exists():
+                    orders_qs.update(status=11)
+                    orderID = orders_qs[0].orderID
+                    uid = orders_qs[0].UID
+                    user_id = orders_qs[0].userID
+                    # 3. 未使用则删除未使用套餐表,已使用过则删除设备正在使用套餐,并关闭设备云存
+                    uid_bucket_qs = UID_Bucket.objects.filter(uid=uid, orderId=orderID, use_status=1,
+                                                              endTime__gt=int(time.time()))
+                    unused_uid_meal_qs = Unused_Uid_Meal.objects.filter(order_id=orderID)
+                    ai_service_qs = AiService.objects.filter(uid=uid, orderId=orderID, use_status=1,
+                                                             endTime__gt=int(time.time()))
+                    if unused_uid_meal_qs.exists():
+                        unused_uid_meal_qs.delete()
+                    if uid_bucket_qs.exists():
+                        uid_bucket_qs.update(status=0, use_status=2, endTime=int(time.time()),
+                                             updateTime=int(time.time()))
+                    if ai_service_qs.exists():
+                        ai_service_qs.update(detect_status=0, use_status=2, endTime=int(time.time()),
+                                             updTime=int(time.time()))
+                        # 关闭ai
+                        msg = {'commandType': 'AIDisable'}
+                        thing_name = CommonService.query_serial_with_uid(uid)  # 存在序列号则为使用序列号作为物品名
+                        topic_name = 'ansjer/generic/{}'.format(thing_name)
+                        req_success = CommonService.req_publish_mqtt_msg(thing_name, topic_name, msg)
+                        LOGGER.info(f'App Store服务器通知用户退款, 关闭AI:{req_success}')
+
+                    # 4.发送邮件告知用户退款
+                    email_content = f'用户{user_id}, 订单:{orderID}, 设备{uid}退款'
+                else:
+                    email_content = f'transaction_id:{transaction_id}退款, 未查询到订单'
+                S3Email().faEmail(email_content, 'servers@ansjer.com')
 
             elif str(decoded_payload.rawNotificationType) == "REFUND_DECLINED":
                 # 一种通知类型,表示 App Store 由于客户提出的争议而撤销了先前批准的退款。如果您的应用程序因相关退款而撤销了内容或服务,则需要恢复这些内容或服务。