Support customers and handle refunds

RSS for tag

Discuss the WWDC21 session Support customers and handle refunds.

View Session

Posts under wwdc21-10175 tag

15 Posts
Sort by:
Post not yet marked as solved
0 Answers
127 Views
doc: https://developer.apple.com/documentation/appstoreserverapi/get_refund_history api doc tell me that "the API returns the complete list of the customer’s refunds for your app. " but in my case, we find that this api only return the leatest 50 refund transaction for us, how can we get the earlier refund transaction ? please help!
Posted Last updated
.
Post marked as solved
2 Answers
213 Views
In apple’s document: https://developer.apple.com/documentation/storekit/original_api_for_in-app_purchase/handling_refund_notifications memtion in document: Your server is responsible to parse and interpret all notifications from App Store Server. For the REFUND notification, identify the specific transaction, product ID, and relevant dates from the response: Find the most-recent transaction for the product_id in the unified_receipt.latest_receipt_info by checking the purchase_date to select the most-recent transaction. The date when App Store issued the refund is in the cancellation_date_ms field for this transaction. My problem is that , we find that unified_receipt.latest_receipt_info is an array, It contains multiple trasactions and these t'rascations all have ”cancellation_date_ms“ field . I would like to know if I should process all the trasactions have field ”cancellation_date_ms“ or just the latest one? please help!!
Posted Last updated
.
Post not yet marked as solved
0 Answers
216 Views
We tested the "Get Refund History" API (https://api.storekit.itunes.apple.com/inApps/v1/refund/lookup/originalTransactionId) and it returned some transactionIds which didn't store in our database and didn't find after queried the "Get Transaction History" API. Has anyone encountered a similar situation as us?
Posted
by CHIKSOUP.
Last updated
.
Post not yet marked as solved
0 Answers
285 Views
Hi, We are working on handling refunds for one time products on apple devices. In our scenario, we have two purchased products and we start refunding them, refund for item 1, then refund for item 2( in an interval of 2-3 minutes). We expect to get two apple receipts, first receipt containing both products, one active(item2) and one refunded(item1, cancellation properties set). The second receipt containing both products, both being refunded(having the cancellation_date_* properties set). This is not happening, we get the 2 receipts, both containing the same data about the refunded products, so both receipts have the cancellation dates set for both products. Is this a normal behavior? Should we assume that the processing of the refunds and sending out the notifications/receipts happens async, resulting in having both refunds already processed in the moment when the receipts/messages are sent out? Thanks, David
Posted Last updated
.
Post marked as solved
2 Answers
233 Views
Hi, We want to handle the Refund Notification in our webhook as we saw here: https://developer.apple.com/documentation/storekit/original_api_for_in-app_purchase/handling_refund_notifications However this part is not clear for us: "Refunded transactions are not present in the JSON response when you call the verifyReceipt endpoint with a receipt that contains refunded transactions, except for auto-renewable subscriptions." Does this mean that we should not send the received REFUND notification to the https://buy.itunes.apple.com/verifyReceipt endpoint for verification? We have tried to verify some REFUND notifications which we received in our webhook(for not auto-renewable products) and after sending it to the /verifyReceipt endpoint we got back the same data, the refunded transactions were present in the response. As a conclusion, is it ok to verify these refund receipts too?
Posted Last updated
.
Post not yet marked as solved
1 Answers
320 Views
Hello, I'm trying to develop the Server Notifications to receive an event when a user requests a refund after making an in-app purchase, so I can cancel the user's purchase in my app. But I did some tests and the notification did not come and I don't know how to proceed. I already checked the documentation and apparently everything is ok. Can someone please help me?
Posted Last updated
.
Post not yet marked as solved
2 Answers
394 Views
I am using SwiftUI for Mac OS and so far I have not been able to implement tap gestures. I want to double click on a row of the Table and have that perform an action using the contents of that row. Does anyone know if it is even possible to use the .onTapGesture or anything similar to a SwiftUI Table? Any help is appreciated! Thanks!
Posted Last updated
.
Post not yet marked as solved
1 Answers
322 Views
Hello, We detected some fraudulent activity in one of my app. The user purchases the in-app product, makes use of the service, and then returns it immediately. And he repeats this process every day. We have done some actions to prevent this, but this process continues by using clone app creators. How is the return process going, is there no control in this regard? Normally, if a user buys the same product for the second time, I think that he should not return it anymore.
Posted Last updated
.
Post not yet marked as solved
0 Answers
380 Views
Hey guys, quick question for you. I'm making some analysis regarding the refunds of our product. To my knowledge, a user is eligible to ask for a refund only within two months from the payment (may it be the first payment or the nth payment). The problem is that I've seen refunds happening even after this refund period, for which the whole payment has been refunded (not partial). I understand that this might happen for yearly subscriptions, in these cases it happens when a user asks for a switch to a new subscription. However, I can't explain myself how this also happens for weekly subscriptions. Moreover, it also happens for users who, almost surely, haven't made any other purchases to our app after having asked for the refund, thus the refund can't be considered as a switch. Do you have any idea on how I could interpret these refunds? Also, do you have any documents that explain more in details the regulation regarding the refunds? I couldn't find any online. Thanks everyone!
Posted
by Fabio951.
Last updated
.
Post not yet marked as solved
1 Answers
401 Views
As we know, the customer initiated a refund request for a consumable in-app purchase, the CONSUMPTION_REQUEST notification will be received on the developer server side. The developer could send consumption info to help the app store to do refund decisions. I want to make the refund have a greater chance of success. How could we send this consumption info? We try to send consumption info to indicate one inactive user as below AccountTenure: 1, AppAccountToken: "", ConsumptionStatus: 0, CustomerConsented: true, DeliveryStatus: 0, LifetimeDollarsPurchased: 0, LifetimeDollarsRefunded: 0, Platform: 1, PlayTime: 0, SampleContentProvided: false, UserStatus: 0, The app store failed to refund Then we try to send consumption info to indicate one active user as below AccountTenure: 1, AppAccountToken: "", ConsumptionStatus: 0, CustomerConsented: true, DeliveryStatus: 0, LifetimeDollarsPurchased: 0, LifetimeDollarsRefunded: 0, Platform: 1, PlayTime: 4, SampleContentProvided: false, UserStatus: 1, The app store refuses to refund again.
Posted
by zangw.
Last updated
.
Post not yet marked as solved
0 Answers
342 Views
Recently, some users of our apps ask us to do a refund, since they got the information that the developer refused to refund from app store. We think this Send Consumption Information could help us to make the refund have a greater chance of success. However, after testing this API with several cases and got the status 202 from this API, the app store still decline those refunds. We are confused now and want to know how to use this API correctly? As we know, the App Store uses the consumption information you provide to inform its refund decisions. It seems the app store ignore the information we provided through consumption info, and just make a refund decision as before. If so, why this API is created for developers? Here are some cases we have done case 1: The customer is an inactive user and our app failed to deliver IAP product to the customer and the customer did not consume this product, the content of ConsumptionRequest is below. AccountTenure: 1 AppAccountToken: "", ConsumptionStatus: 1, CustomerConsented: true, DeliveryStatus: 5, LifetimeDollarsPurchased: 2, LifetimeDollarsRefunded: 1, Platform: 1, PlayTime: 0, SampleContentProvided: false, UserStatus: 0, case 2: The customer is an active user and our app failed to deliver IAP product to the customer and the customer did not consume this product, the content of ConsumptionRequest is below. AccountTenure: 1 AppAccountToken: "", ConsumptionStatus: 1, CustomerConsented: true, DeliveryStatus: 5, LifetimeDollarsPurchased: 2, LifetimeDollarsRefunded: 1, Platform: 1, PlayTime: 4, SampleContentProvided: false, UserStatus: 1 case 3: The customer is an active user and our app delivers IAP product to the customer successfully and the customer did not consume this product, the content of ConsumptionRequest is below. AccountTenure: 1 AppAccountToken: "", ConsumptionStatus: 1, CustomerConsented: true, DeliveryStatus: 0, LifetimeDollarsPurchased: 2, LifetimeDollarsRefunded: 1, Platform: 1, PlayTime: 4, SampleContentProvided: false, UserStatus: 1
Posted
by zangw.
Last updated
.
Post marked as solved
2 Answers
906 Views
We try to use the customer order id lookup API of app store server API, like https://api.storekit.itunes.apple.com/inApps/v1/lookup/xxxxxxx However, we got 404, and the response body is empty. Here are the response through curl * Connection state changed (MAX_CONCURRENT_STREAMS updated)! < HTTP/2 404 < server: daiquiri/3.0.0 < date: Mon, 19 Jul 2021 12:03:24 GMT < content-length: 0 < x-apple-jingle-correlation-key: EJJPZLFC7B3NTSO3PLZNUVVIXY < x-apple-request-uuid: 2252fcac-a2f8-76d9-c9db-7af2da56a8be < b3: 2252fcaca2f876d9c9db7af2da56a8be-ad831e3618544a32 < x-b3-traceid: 2252fcaca2f876d9c9db7af2da56a8be < x-b3-spanid: ad831e3618544a32 < apple-seq: 0.0 < apple-tk: false < apple-originating-system: CommerceGateway < x-responding-instance: CommerceGateway:010116::: < apple-timing-app: 0 ms < strict-transport-security: max-age=31536000; includeSubDomains < x-daiquiri-instance: daiquiri:45824002:st44p00it-hyhk15104701:7987:21HOTFIX14 < How to debug this issue? or Is there anything am I missing? Thanks
Posted
by zangw.
Last updated
.
Post not yet marked as solved
0 Answers
545 Views
Now we got a CONSUMPTION_REQUEST notification_type and the content is {Environment:PROD NotificationType:CONSUMPTION_REQUEST Password:xxxx0b91b407f5xxxxxxxxx ExpirationIntent: AutoRenewAdamID: AutoRenewStatus: AutoRenewProductID: AutoRenewStatusChangeDate:{AutoRenewStatusChangeDate: AutoRenewStatusChangeDateMS: AutoRenewStatusChangeDatePST:} BID:com.boundle.id BVRS:89 UnifiedReceipt:{ Status:0 Environment:Production LatestReceipt:MIISegYJKoZIhvcNXXXXXXXXXX LatestReceiptInfo:[] PendingRenewalInfo:[] } } It seems there is no receipt transaction id which the customer asks for a refund. And then we try to get the receipt details through https://buy.itunes.apple.com/verifyReceipt with LatestReceipt of notification { receipt: { receipt_type: 'Production', adam_id: 125258871623, app_item_id: 125258871623, bundle_id: 'com.boundle.id', application_version: '89', download_id: null, version_external_identifier: 843111111, receipt_creation_date: '2021-07-18 04:48:20 Etc/GMT', receipt_creation_date_ms: '1626583700000', receipt_creation_date_pst: '2021-07-17 21:48:20 America/Los_Angeles', request_date: '2021-07-20 08:02:21 Etc/GMT', request_date_ms: '1626768141824', request_date_pst: '2021-07-20 01:02:21 America/Los_Angeles', original_purchase_date: '2021-07-07 00:03:57 Etc/GMT', original_purchase_date_ms: '1625616237000', original_purchase_date_pst: '2021-07-06 17:03:57 America/Los_Angeles', original_application_version: '87', in_app: [] }, environment: 'Production', status: 0 } { receipt_type: 'Production', adam_id: 125258871623, app_item_id: 125258871623, bundle_id: 'com.boundle.id', application_version: '89', download_id: null, version_external_identifier: 843111111, receipt_creation_date: '2021-07-18 04:48:20 Etc/GMT', receipt_creation_date_ms: '1626583700000', receipt_creation_date_pst: '2021-07-17 21:48:20 America/Los_Angeles', request_date: '2021-07-20 08:02:21 Etc/GMT', request_date_ms: '1626768141824', request_date_pst: '2021-07-20 01:02:21 America/Los_Angeles', original_purchase_date: '2021-07-07 00:03:57 Etc/GMT', original_purchase_date_ms: '1625616237000', original_purchase_date_pst: '2021-07-06 17:03:57 America/Los_Angeles', original_application_version: '87', in_app: [] } There is no refund receipt info either. Per doc, once received CONSUMPTION_REQUEST, we should send Consumption Information through API PUT https://api.storekit.itunes.apple.com/inApps/v1/transactions/consumption/{originalTransactionId} How could we get the originalTransactionId from notification?
Posted
by zangw.
Last updated
.