An integration of Stripe Terminal for iOS. (Unofficial).
ℹ️ This library is still in early stage of development and has only been tested on a WisePad3. Your feedback and contributions are very welcome.
Astral relies on Stripe Terminal iOS SDK to provide an out-of-the-box solution for handling payments:
- Graphical User Interface
- Connection and reconnections to Readers
- Handling of the payment process
- Management of errors
It is currently used in our Point-of-Sale app, incwo POS.
- Based on UIKit, so it can run on a version as low as iOS 11
- Adapted to iPhone and iPad
- Localized in: en, fr
- Supports ☀️ Light and 🌙 Dark modes
- Handling of updates, either automatic or manual
Are not supported yet:
- Refunds
- Wifi Readers (WisePOS E, Verifone P400)
- Canceling updates
Only Swift Package Manager is supported.
In Xcode, go to File > Add Packages
and paste https://github.com/incwo/Astral.
Since Astral relies on the Stripe Terminal SDK, your app needs be configured as described here. In particular, don't forget to set the keys in the app's Info.plist
.
Your backend needs to call Stripe's API to:
- provide a Connection Token
- capture the funds for a Payment Intent.
Stripe has an extensive documentation: https://stripe.com/docs/terminal/quickstart
Make a class (or struct) which conforms to the AstralApiClient
protocol. The methods of this object will be called when your app must send requests to your backend. See ExampleApiClient
for an example.
Set up the shared instance of Astral
, typically in your AppDelegate
:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Astral.initSharedInstance(apiClient: ExampleApiClient())
}
Then you can show settings:
Astral.shared?.presentSettings(from: viewController)
Or charge an amount:
Astral.shared?.charge(amount: 9.90, currency: "EUR", presentFrom: viewController) { result in
switch result {
case .success (let paymentInfo):
…
case .cancelation:
…
case .failure (let error):
…
}
}
Open Example/AstralExample.xcodeproj
for an example of integration. See below how to make it run.
The URL of the backend is set in ExampleApiClient.swift
.
One of the difficulties is that you will need a backend to test the example or your own integration. Stripe provides a very [simple example backend](https://github.com/stripe/example-terminal-backend https://github.com/stripe/example-terminal-backend).
The backend needs your Stripe account's secret API key. You can obtain it on Stripe's API key page. There are two keys — this is the one starting with sk_test
(you should begin in "Test mode").
In our example, we chose to deploy the sample back-end locally on our Mac using the Docker container. This should allow testing it quickly on the iOS simulator. However, if you want to test on a physical iOS device and a physical Reader, you'd either have to deploy on Heroku, or activate web sharing on your Mac.
Stripe should have sent you a number of Test Cards along with your Reader. Your backend must operate in test mode (see above) to try them.
Please note that the amount which is charged matters. The last two digits have a special meaning. For instance, paying an amount of 1.55, will cause an incorrect PIN error.
If you find Astral useful, you can help its development:
- Implement missing features
- Test on other models of Readers
- Add translations
- Generally, open GitHub issues.
See the Development documentation for a description of the architecture of Astral.
MIT License
Copyright (c) 2022 incwo
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.