|
@@ -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 由于客户提出的争议而撤销了先前批准的退款。如果您的应用程序因相关退款而撤销了内容或服务,则需要恢复这些内容或服务。
|