I am using a sandbox account, and I set United States in the region column (Settings>General>Language & Region>Region to US). I added test cards like (American Express and Visa) and the cards added successfully.
But I am trying to pay then I get an error like "Payment Not Completed".
Note: I am trying from India.
Please let me know what exactly i am doing mistake here
Following code i am using.
function onApplePayButtonClicked() {
if (!ApplePaySession) {
return;
}
// Define ApplePayPaymentRequest
const request = {
"countryCode": "US",
"currencyCode": "USD",
"merchantCapabilities": [
"supports3DS"
],
"supportedNetworks": [
"visa",
"masterCard",
"amex",
"discover"
],
"total": {
"label": "Demo (Card is not charged.)",
"type": "final",
"amount": "1.99"
}
};
// Create ApplePaySession
const session = new ApplePaySession(3, request);
session.onvalidatemerchant = event => {
// Call your own server to request a new merchant session.
var merchantSession = merchantValidation(event.validationURL);
session.completeMerchantValidation(merchantSession);
};
session.onpaymentmethodselected = event => {
// Define ApplePayPaymentMethodUpdate based on the selected payment method.
// No updates or errors are needed, pass an empty object.
const update = {};
session.completePaymentMethodSelection(update);
};
session.onshippingmethodselected = event => {
// Define ApplePayShippingMethodUpdate based on the selected shipping method.
// No updates or errors are needed, pass an empty object.
const update = {};
session.completeShippingMethodSelection(update);
};
session.onshippingcontactselected = event => {
// Define ApplePayShippingContactUpdate based on the selected shipping contact.
const update = {};
session.completeShippingContactSelection(update);
};
session.onpaymentauthorized = event => {
// Define ApplePayPaymentAuthorizationResult
const result = {
"status": ApplePaySession.STATUS_SUCCESS
};
session.completePayment(result);
};
session.oncouponcodechanged = event => {
// Define ApplePayCouponCodeUpdate
const newTotal = calculateNewTotal(event.couponCode);
const newLineItems = calculateNewLineItems(event.couponCode);
const newShippingMethods = calculateNewShippingMethods(event.couponCode);
const errors = calculateErrors(event.couponCode);
session.completeCouponCodeChange({
newTotal: newTotal,
newLineItems: newLineItems,
newShippingMethods: newShippingMethods,
errors: errors,
});
};
session.oncancel = event => {
// Payment canceled by WebKit
};
session.begin();
}
Apple Pay
RSS for tagDiscuss how to integrate Apple Pay into your app for secure and convenient payments.
Post
Replies
Boosts
Views
Activity
Hi there! My app supports one language by default Ukrainian (uk) and does not support multiple languages. In Xcode settings "Development Language" is set to Ukrainian by default also. I have a PKAddPassButton on a ViewController and "Add to Apple Wallet" always appears in Ukrainian (Tested on real device iOS 15/16/17). Apple's "Getting Started with Apple Pay: In-App Provisioning, Verification, Security, and Wallet Extensions” document states that "The Add to Apple Wallet button adapts to the device language and the light and dark appearances, but the issuer app needs to adapt the language of the row selector text." When I change device language to French the “Add to Apple Wallet” button does not change to French. I created a fresh swift app, added PKAddPassButton the "Add to Apple Wallet" button, General -> Language & Region changed the device language to French, etc, but the "Add to Apple Wallet" button is always in English. Has anyone run into the same issue? How to adapt the "Add to Apple Wallet" button to the device system language?
After logging into Apple Wallet and clicking the "+" button to add a card, if the "debit/credit card" option is selected, a list of banks appears.
**
When I select my bank's name from the list, I want the icon of the bank's mobile application to be displayed, just like in Revolut. **
**When the icon is clicked, I want to redirect the user to the application or the App Store version of the application. **
How can I set this up and where can I do it?
Has anyone experienced this before?
I am implementing apple wallet extension. As part of it I have developed UI and Non-UI extension. I have implemented status , pass entries and remote pass entries method to return as per apple standard. My problem is pass entries is showing correct list of cards/passes as it is able to match against phone wallet. But remote pass entries method is not able to access watch app/watch wallet to match the existing passes. Any help is appreciated. When we print passlibrary count it displays the count matching phone wallet. But it ignores watch wallet passes which belongs to our app.
Hi,
You're here because you've had issues with your implementation of Wallet Extensions for Apple Pay In-App Provisioning or In-App Verification. To prevent sending sensitive credentials in plain text, create a new report in Feedback Assistant to share the details requested below with the appropriate log profiles installed.
Gathering Required Information for Troubleshooting Apple Pay In-App Provisioning or In-App Verification Issues
While troubleshooting Apple Pay In-App Provisioning or In-App Verification, it is essential that the issuer is able to collect logs on their device and check those logs for error message. This is also essential when reporting issues to Apple. To gather the required data for your own debugging as well as reporting issues, please perform the following steps on the test device:
Install the Apple Pay and Wallet profiles on your iOS or watchOS device. If the issue occurs on Mac, continue to Step 2.
Reproduce the issue and make a note of the timestamp when the issue occurred, while optionally capturing screenshots or video.
Gather a sysdiagnose on the same iOS or watchOS device, or on macOS.
Create a Feedback Assistant report with the following information:
The bundle IDs
App bundle ID
Non-UI app extension bundle ID (if applicable)
UI app extension bundle ID (if applicable)
The serial number of the device.
For iOS and watchOS: Open Settings > General > About > Serial Number (tap and hold to copy).
For macOS: Open the Apple () menu > About This Mac > Serial Number.
The SEID (Secure Element Identifier) of the device, represented as a HEX encoded string.
For iOS and watchOS: Open Settings > General > About > SEID (tap and hold to copy).
For macOS: Open the Apple () menu > About This Mac > System Report > NVMExpress > Serial Number.
The sysdiagnose gathered after reproducing the issue.
The timestamp (including timezone) of when the issue was reproduced.
The type of provisioning failure (e.g., error at Terms & Conditions, error when adding a card, etc.)
The issuer/network/country of the provisioned card (e.g., Mastercard – US)
Last 4 digits of the FPAN
Last 4 digits of the DPAN (if available)
Was this test initiated from the Issuer App? (e.g., yes or no)
The type of environment (e.g., sandbox or production)
Screenshots or videos of errors and unexpected behaviors (optional).
Important: From the logs gathered above, you should be able to determine the cause of the failure from PassbookUIService, PassKit or PassKitCore, and by filtering for your SEID or bundle ID of your app or app extensions in the Console app.
Submitting your feedback
Before you submit to Feedback Assistant, please confirm the requested information above is included in your feedback. Failure to provide the requested information will only delay my investigation into the reported issue within your Apple Pay client.
After your submission to Feedback Assistant is complete, please respond in your existing Developer Forums post with the Feedback ID. Once received, I can begin my investigation and determine if this issue is caused by an error within your client, a configuration issue within your developer account, or an underlying system bug.
Cheers,
Paris X Pinkney | WWDR | DTS Engineer
Hi,
To ensure the issue is not caused by an error within your app or web service request, please review the Apple Pay Merchant Integration Guide. Additionally, please review the following technotes on Apple Pay:
TN3173: Troubleshooting issues with your Apple Pay merchant identifier configuration
TN3174: Diagnosing issues with the Apple Pay payment sheet on your website
TN3175: Diagnosing issues with displaying the Apple Pay button on your website
TN3176: Troubleshooting Apple Pay payment processing issues
If the resources above don’t help identify the cause of the error, please provide more information about your app or web services to get started. To prevent sending sensitive credentials in plain text, create a report in Feedback Assistant to share the details requested below. Additionally, if the error is something we need to investigate further, the appropriate engineering teams also have access to the same information and can communicate with you directly within Feedback Assistant for more information, as needed. Please follow the instructions below to submit your report.
For issues occurring with your native app or web service, perform the following steps:
Install the Apple Pay profile on your iOS or watchOS device. If the issue occurs on Mac, continue to Step 2.
Reproduce the issue and make a note of the timestamp when the issue occurred, while optionally capturing screenshots or video.
Gather a sysdiagnose on the same iOS or watchOS device, or on macOS.
Create a Feedback Assistant report with the following information:
The serial number of the device.
For iOS and watchOS: Open Settings > General > About > Serial Number (tap and hold to copy).
For macOS: Open the Apple () menu > About This Mac > Serial Number.
The SEID (Secure Element Identifier) of the device, represented as a HEX encoded string.
For iOS and watchOS: open Settings > General > About > SEID (tap and hold to copy).
For macOS: Open the Apple () menu > About This Mac > System Report > NVMExpress > Serial Number.
The sysdiagnose gathered after reproducing the issue.
The timestamp of when the issue was reproduced.
Screenshots or videos of errors and unexpected behaviors (optional).
Important: From the logs gathered above, you should be able to determine the cause of the failure from PassbookUIService, PassKit or PassKitCore, and by filtering for your SEID or merchant domain in the Safari Web Inspector. See Inspecting Safari on macOS to learn more.
Submitting your feedback
Before you submit to Feedback Assistant, please confirm the requested information above is included in your feedback. Failure to provide the requested information will only delay my investigation into the reported issue within your Apple Pay website.
After your submission to Feedback Assistant is complete, please respond in your existing Developer Forums post with the Feedback ID. Once received, I can begin my investigation and determine if this issue is caused by an error within your web implementation, a configuration issue within your developer account, or an underlying system bug.
Cheers,
Paris X Pinkney | WWDR | DTS Engineer
Hi,
I’m encountering an issue in my app’s Wallet Extension, specifically within the Non-UI Extension, where we are unable to retrieve payment passes bound to a user’s account. The same code that successfully retrieves these bound cards in the main app does not work when used in the Non-UI Extension.
Case-ID: 8932090
Steps to Reproduce:
Set up In-App Provisioning:
Ensure that the app has the necessary In-App Provisioning permissions. This functionality works correctly in the main app, confirming that the permissions are properly configured.
Configure Wallet Extensions:
Follow the Wallet Extensions documentation to configure the app, including all required settings for the Non-UI Extension.
Add Code to Retrieve Payment Passes:
In the main app’s LoginView, implement the following code in the handleLogin() method to retrieve payment passes:
// Get the identifiers of payment passes that already exist in Apple Pay.
paymentPassLibrary = self.passLibrary.passes(of: .secureElement)
for pass in paymentPassLibrary {
if let identifier = pass.secureElementPass?.primaryAccountIdentifier {
if pass.isRemotePass && pass.deviceName.localizedCaseInsensitiveContains("Apple Watch") {
remotePassIdentifiers.insert(identifier)
} else if !pass.isRemotePass {
passIdentifiers.insert(identifier)
}
}
}
Verify Functionality in Main App:
Run the app and verify that the code successfully retrieves the payment passes bound to the user’s account.
Implement Code in Non-UI Extension:
Add the same code to the Non-UI Extension, specifically in the WNonUIExtHandler class within the override func status(completion: @escaping (PKIssuerProvisioningExtensionStatus) -> Void) method.
Test in Wallet Extension:
Run the Wallet Extension and observe that the payment passes are not retrieved when the code is executed in the Non-UI Extension.
Has anyone encountered a similar issue or can provide insight into why the code might not work in the Non-UI Extension compared to the main app?
Support Information:
iOS Version: 17.5.1
Development environment: Xcode 15.4 (15F31d), macOS 14.3 (23D56)
Any help or suggestions would be greatly appreciated. Thank you!
Hi, We found that in same cases the StoreKit2 API Product.purchase() return an other transaction which is not what the user is purchasing.
We are confused that if the usage below could lead to this issue:
StoreKit2 and old StoreKit are used at the same time:
purchase by StoreKit2: Product.purchase();
in the callback method [SKPaymentTransactionObserver paymentQueue:updatedTransactions:], call the old API [[SKPaymentQueue defaultQueue] finishTransaction:] to finish transaction, but never call the new one Transaction.finish().
Your reply will help us a lot! Thank you.
Hello, my company plans to move some our clients to another jurisdiction and use for it the new server separate developer account, apple certificates, domain etc.
As i understand there is no way to issues two certificates with same PassTypeIdentifier ?
Does Apple provides any way to update PassTypeIdentifier for existing wallet so they can work with new server ?
Is there any step by step guide to do this right?
Hello,
I am developing an HCE-based contactless payment application for the European Economic Area. I want to detect when my application is not the default contactless app and forward the user to the iOS settings for selecting the default contactless app.
Question #1: How can I detect that my app is not the default contactless app?
Question #2: How can I forward the user directly to the default contactless app selection in iOS settings?
This line of code forwards the user to my app’s settings, which contains a reference to the default contactless app selection, but I couldn’t forward the user directly to the default contactless app selection view:
UIApplication.shared.open(URL(string: "app-settings:root=General")!)
There must be a way to jump directly to the default contactless app selection view as described in Apple's commitment to the EU (Case AT.40452, Chapter 3.8): "Apple will enable HCE Payment Applications to redirect users directly to the App’s page in settings and include a link which will take the user directly to the NFC settings page to easily set the default Payment Application for NFC In-Store Payments.
(https://ec.europa.eu/competition/antitrust/cases1/202428/AT_40452_10155330_9978_4.pdf)
I am working on a transit app that offers a digital ticketing product that is powered by a QR code being scanned. We have been successful in preventing the Apple Pay takeover experience from happening when a user tries to use this product next to the tap to pay terminals by making a call to PKPassLibrary.requestAutomaticPassPresentationSuppression(...) before the QR code is presented. However, our transit agency is piloting Express Transit on these turnstiles and we are noticing that this experience overrides the old NFC suppression. Is there a similar method available to us to suppress the express transit experience for users who are using these mobile ticketing products?
We have a requirement to include Apple Pay In-App Provisioning in our Mobile Application and we have an API from Backend to get the tokenReferenceID for a given Card. I want to query the passes from Apple Wallet to see if there are any matches to the given tokenReferenceID before I can decide whether to show the “Add to Apple Wallet” button or not.
I went through all PassKit APIs but couldn’t find a way to query for passes with tokenReferenceID. We have primaryAccountIdentifier, deviceAccountIdentifier but which one should be used to match with tokenReferenceID?
Can someone please help me how to query the Wallet passes with tokenReferenceID using PassKit?
When checking if the device supports Apple Pay and has an active card, a call is made to 'applePayCapabilities'.
The documentation indicates this method asynchronously contacts the Apple Pay servers as part of the verification process.
My understanding is that this is a client side call, from the device/OS to the Apple Server.
The application (Apple pay on the web) is behind a firewall. What domain should I whitelist for this verification to be a success?
Hi everyone,
I'm currently working on testing in-app purchases for my app, and I'm having issues with logging into a sandbox account on my iPhone.
Here's the situation:
I created a sandbox account via App Store Connect.
I signed out of my regular Apple ID from the App Store and attempted to log in with my sandbox account during an in-app purchase.
I receive a verification code on my phone, and it seems like the login is working. However, after entering the code, I keep getting redirected back to the "Sign in with Apple Account" screen. It doesn’t fully log me in.
I’ve tried resetting network settings, restarting the device, and even creating a new sandbox account, but nothing seems to work.
I'm running the app through Expo prebuild and attempting to test purchases, but without being able to log into the sandbox environment, I can’t move forward.
Has anyone encountered this issue before or know how to fix it? Any help would be greatly appreciated!
Thanks!
For transit passes I have notice they have the "Latest Transactions" under the card image. Is there a way to support this in other types of Passes such as a Store card?
Hello:
After integrating the in app SDK, I was able to request product lists and initiate payments normally. However, when running on the emulator and using a sandbox account for payment, I did not receive any callback from the app after successful payment, and the payment would be automatically initiated again. What caused this problem? Is it a problem with the sandbox account or the simulator?
I hope to receive a reply as soon as possible.
Thank you very much!
we want to get the last four digits of the real card number in apple Pay, and I found information about it in the document, link:
https://developer.apple.com/documentation/passkit_apple_pay_and_wallet/pksecureelementpass/3543366-primaryaccountnumbersuffix?language=objc
My question is how to use it,can you provide sample code? We are very anxious, thank you!
Our team want to transfer money to card with Apple Pay. I am iOS developer. I have access Admin. I created Merchant ID. I added domain. Our backend team uploaded .txt file to database. Url is working, you can see .txt file content when open it. But when I press verify I get error as following:
Domain verification failed. Unable to access verification file on server. Confirm that the file is in the correct location, proxies and redirects are not enabled, and the documented Apple Domain Verification IP addresses can access your server.
Please, help to fix this problem.
hello, apple send me this problem: We found that your in-app purchase products exhibited one or more bugs which create a poor user experience. Specifically, purchase feature was not responsive. Please review the details and resources below and complete the next steps.
we did everything. Our app should be paid for but is offered for free. Payment cannot be made, who can help us? The app is called DRACHMI
I am developing In-App Provisioning functionality within an iOS application. When I try to perform the process, the process fails and the following is displayed on the screen: "Your issuer does not yet offer support for this card".
The PassbookUIService logs show:
https://nc-pod8-smp device.apple.com:443/broker/v4/devices/xxxxxxxxxxxxxx/cards 200 Time profile: 0.25497 seconds
{
auxiliaryCapabilities = {
};
eligibilityStatus = 0;
sanitizedPrimaryAccountPrefix = "";
}
ProvisioningStepEligibility: received eligibility status: 0
Showing eligibility issue with reason: 2
ProvisioningOperationComposer: Step 'eligibility' failed with error (null)
Would like to seek your help to investigate the problem. Thanks