Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
# Storefront details
STOREFRONT_DOMAIN=your-store.myshopify.com
STOREFRONT_ACCESS_TOKEN=your-public-storefront-access-token
# Optional Apple Pay merchant identifier used by accelerated checkout flows.
STOREFRONT_MERCHANT_IDENTIFIER=
# Optional Apple Pay merchant identifiers used by accelerated checkout flows.
# Will be read in sample apps as APPLE_PAY_MERCHANT_IDENTIFIER
REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER=
SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER=

# Apple team that signs the Swift samples. Set your own team id, or the Xcode build
# fails at signing. A blank value stays blank; setup applies no default team.
Expand Down
4 changes: 3 additions & 1 deletion config/secrets/demo.ejson
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"LAST_NAME": "EJ[1:COcqDoNiIoRpNVpn5RtY+/98SiWXneivqVxsvjS2j1M=:Y6D/bjRLXox1Ev2x1wzwYkCcnSzyRqQr:Jy1SP2wB1gcl3EejYjG+BN7qguQeyEM=]",
"PROVINCE": "EJ[1:COcqDoNiIoRpNVpn5RtY+/98SiWXneivqVxsvjS2j1M=:0TOrvPZDSNScmprg0GXGTCll0xiNg+sl:Y5zUNb4NN+0nUWUC/J1D0jjR]",
"ZIP": "EJ[1:COcqDoNiIoRpNVpn5RtY+/98SiWXneivqVxsvjS2j1M=:i2R2JMndnE4CNZyGFxRrHQb9XJoHvGSP:wdAactHwHtDOTAhjdJ+wR3T2LRQ6IkI=]",
"PHONE": "EJ[1:COcqDoNiIoRpNVpn5RtY+/98SiWXneivqVxsvjS2j1M=:03PvHIo8P/rTDTomdb8wS+PH651lcbWY:j1idH9SHYOeh9iocqGY/wE689kiBKoRpATLD]"
"PHONE": "EJ[1:COcqDoNiIoRpNVpn5RtY+/98SiWXneivqVxsvjS2j1M=:03PvHIo8P/rTDTomdb8wS+PH651lcbWY:j1idH9SHYOeh9iocqGY/wE689kiBKoRpATLD]",
"REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER": "EJ[1:bhiOcRbAtZO6Hx3yvpCxPekCoORmQ1SLbS6EzjpoYEc=:tlKW/3ULel0N4o/SNSZJyE2IQ/FNZBfj:PmjIjdGhazyKgikizSAgKapRApjF13mhnTiV9emAmDYVj6qwQEuWIVYTtdxUAyYOwWnyXshLfNUHrDp829R46A==]",
"SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER": "EJ[1:bhiOcRbAtZO6Hx3yvpCxPekCoORmQ1SLbS6EzjpoYEc=:qvUsEPq8EDTo9jo0SHAZODzj+PIQ52WT:Q1lUWz8YLQj7Um9twGTRlzb78c+LCgzPnsTEFW0CKlGxEGtm1yGXnB5+bzD6EWlxjVAMvZdLsGZG2A==]"
}
}
2 changes: 1 addition & 1 deletion platforms/react-native/sample/@types/env.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ declare module '@env' {
export const STOREFRONT_ACCESS_TOKEN: string;
export const API_VERSION: string | undefined;
export const STOREFRONT_VERSION: string | undefined;
export const STOREFRONT_MERCHANT_IDENTIFIER: string | undefined;
export const APPLE_PAY_MERCHANT_IDENTIFIER: string | undefined;

export const EMAIL: string;
export const ADDRESS_1: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
6AF2B3762B0BCA6600C6CE4F /* CheckoutKitReactNativeDemo-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CheckoutKitReactNativeDemo-Bridging-Header.h"; sourceTree = "<group>"; };
6AFAD2D12BA9DEF8001F9644 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Localizable.xcstrings; path = CheckoutKitReactNativeDemo/Localizable.xcstrings; sourceTree = "<group>"; };
6AFC2CB62B0D5814003B5A63 /* libShopifyCheckoutKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libShopifyCheckoutKit.a; sourceTree = BUILT_PRODUCTS_DIR; };
7A4F0E4A2E4B123400000001 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = CheckoutKitReactNativeDemo/LaunchScreen.storyboard; sourceTree = "<group>"; };
9E0AC43398437CA0E3D05DDF /* libPods-CheckoutKitReactNativeDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CheckoutKitReactNativeDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; };
ED728EF8BB9B5E9BA9D50EBE /* Pods-CheckoutKitReactNativeDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CheckoutKitReactNativeDemo.debug.xcconfig"; path = "Target Support Files/Pods-CheckoutKitReactNativeDemo/Pods-CheckoutKitReactNativeDemo.debug.xcconfig"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -88,6 +89,7 @@
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
7A4F0E4A2E4B123400000001 /* Config.xcconfig */,
6AB7C68F2AF197BE000DB11B /* Packages */,
13B07FAE1A68108700A75B9A /* CheckoutKitReactNativeDemo */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
Expand Down Expand Up @@ -456,6 +458,7 @@
};
83CBBA201A601CBA00E9B192 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7A4F0E4A2E4B123400000001 /* Config.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CC = "";
Expand Down Expand Up @@ -539,6 +542,7 @@
};
83CBBA211A601CBA00E9B192 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7A4F0E4A2E4B123400000001 /* Config.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CC = "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</array>
<key>com.apple.developer.in-app-payments</key>
<array>
<string>merchant.com.shopify.checkoutkit.reactnativedemo</string>
<string>$(APPLE_PAY_MERCHANT_IDENTIFIER)</string>
</array>
</dict>
</plist>
2 changes: 2 additions & 0 deletions platforms/react-native/sample/ios/Config.xcconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
APPLE_PAY_MERCHANT_IDENTIFIER =
#include? "Storefront.xcconfig"
6 changes: 3 additions & 3 deletions platforms/react-native/sample/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ log('STOREFRONT_DOMAIN:', configured(env.STOREFRONT_DOMAIN));
log('STOREFRONT_ACCESS_TOKEN:', configured(env.STOREFRONT_ACCESS_TOKEN));
log('API_VERSION:', configured(storefrontApiVersion));
log(
'STOREFRONT_MERCHANT_IDENTIFIER:',
configured(env.STOREFRONT_MERCHANT_IDENTIFIER),
'APPLE_PAY_MERCHANT_IDENTIFIER:',
configured(env.APPLE_PAY_MERCHANT_IDENTIFIER),
);
log('EMAIL:', configured(env.EMAIL));
log('PHONE:', configured(env.PHONE));
Expand Down Expand Up @@ -399,7 +399,7 @@ function AppWithCheckoutKit({children}: PropsWithChildren) {
ApplePayContactField.email,
ApplePayContactField.phone,
],
merchantIdentifier: env.STOREFRONT_MERCHANT_IDENTIFIER!,
merchantIdentifier: env.APPLE_PAY_MERCHANT_IDENTIFIER!,
},
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ final class InfoDictionary: Sendable {
let phone = infoPlist["Phone"] as? String,
let domain = infoPlist["StorefrontDomain"] as? String,
let accessToken = infoPlist["StorefrontAccessToken"] as? String,
let merchantIdentifier = infoPlist["StorefrontMerchantIdentifier"] as? String,
let merchantIdentifier = infoPlist["ApplePayMerchantIdentifier"] as? String,
let version = infoPlist["CFBundleShortVersionString"] as? String,
let buildNumber = infoPlist["CFBundleVersion"] as? String
else {
Expand Down
4 changes: 2 additions & 2 deletions platforms/swift/Samples/CheckoutKitSwiftDemo/project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ targets:
info:
path: CheckoutKitSwiftDemo/Info.plist
properties:
StorefrontMerchantIdentifier: $(STOREFRONT_MERCHANT_IDENTIFIER)
ApplePayMerchantIdentifier: $(APPLE_PAY_MERCHANT_IDENTIFIER)
StorefrontDomain: $(STOREFRONT_DOMAIN)
StorefrontAccessToken: $(STOREFRONT_ACCESS_TOKEN)
CustomerAccountApiClientId: $(CUSTOMER_ACCOUNT_API_CLIENT_ID)
Expand Down Expand Up @@ -132,7 +132,7 @@ targets:
path: CheckoutKitSwiftDemo/CheckoutKitSwiftDemo.entitlements
properties:
com.apple.developer.in-app-payments:
- merchant.com.shopify.checkoutkit.swiftdemo
- $(APPLE_PAY_MERCHANT_IDENTIFIER)
com.apple.developer.associated-domains:
- webcredentials:$(STOREFRONT_DOMAIN)?mode=developer
- applinks:$(STOREFRONT_DOMAIN)?mode=developer
Expand Down
58 changes: 45 additions & 13 deletions scripts/setup_storefront_env
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ ANDROID_ENV="${ROOT_DIR}/platforms/android/samples/CheckoutKitAndroidDemo/.env"
SWIFT_DEMO_XCCONFIG="${ROOT_DIR}/platforms/swift/Samples/CheckoutKitSwiftDemo/Storefront.xcconfig"
SWIFT_ACCELERATED_XCCONFIG="${ROOT_DIR}/platforms/swift/Samples/ShopifyAcceleratedCheckoutsApp/Storefront.xcconfig"
REACT_NATIVE_ENV="${ROOT_DIR}/platforms/react-native/sample/.env"
REACT_NATIVE_XCCONFIG="${ROOT_DIR}/platforms/react-native/sample/ios/Storefront.xcconfig"

DEFAULT_API_VERSION="2026-04"
DEFAULT_CUSTOMER_ACCOUNT_API_VERSION="2026-04"
Expand Down Expand Up @@ -225,7 +226,8 @@ root_has_canonical_keys() {
for key in \
STOREFRONT_DOMAIN \
STOREFRONT_ACCESS_TOKEN \
STOREFRONT_MERCHANT_IDENTIFIER \
REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER \
SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER \
DEVELOPMENT_TEAM \
API_VERSION \
CUSTOMER_ACCOUNT_API_CLIENT_ID \
Expand Down Expand Up @@ -257,7 +259,8 @@ optional_values_need_prompt() {
[[ "$prompt_optional_values" == "true" ]] &&
[[ -t 0 ]] &&
(
[[ -z "$STOREFRONT_MERCHANT_IDENTIFIER_VALUE" ]] ||
[[ -z "$REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE" ]] ||
[[ -z "$SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE" ]] ||
[[ -z "$CUSTOMER_ACCOUNT_API_CLIENT_ID_VALUE" ]] ||
[[ -z "$CUSTOMER_ACCOUNT_API_SHOP_ID_VALUE" ]]
)
Expand All @@ -267,10 +270,18 @@ fill_optional_values_from_environment() {
local value
local updated="false"

if [[ -z "$STOREFRONT_MERCHANT_IDENTIFIER_VALUE" ]]; then
value="$(env_fallback STOREFRONT_MERCHANT_IDENTIFIER)"
if [[ -z "$REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE" ]]; then
value="$(env_fallback REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER)"
if [[ -n "$value" ]] && ! is_placeholder_value "$value"; then
STOREFRONT_MERCHANT_IDENTIFIER_VALUE="$value"
REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE="$value"
updated="true"
fi
fi

if [[ -z "$SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE" ]]; then
value="$(env_fallback SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER)"
if [[ -n "$value" ]] && ! is_placeholder_value "$value"; then
SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE="$value"
updated="true"
fi
fi
Expand Down Expand Up @@ -418,10 +429,19 @@ load_values() {
"$(read_env_value API_VERSION "$SWIFT_ACCELERATED_XCCONFIG")" \
"$DEFAULT_API_VERSION")"

STOREFRONT_MERCHANT_IDENTIFIER_VALUE="$(root_or_source_value STOREFRONT_MERCHANT_IDENTIFIER \
REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE="$(root_or_source_value REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER \
"$(env_fallback REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER)" \
"$(read_env_value STOREFRONT_MERCHANT_IDENTIFIER "$ROOT_ENV")" \
"$(env_fallback STOREFRONT_MERCHANT_IDENTIFIER)" \
"$(read_env_value STOREFRONT_MERCHANT_IDENTIFIER "$ANDROID_ENV")" \
"$(read_env_value APPLE_PAY_MERCHANT_IDENTIFIER "$REACT_NATIVE_ENV")" \
"$(read_env_value STOREFRONT_MERCHANT_IDENTIFIER "$REACT_NATIVE_ENV")" \
"$(read_env_value APPLE_PAY_MERCHANT_IDENTIFIER "$REACT_NATIVE_XCCONFIG")")"

SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE="$(root_or_source_value SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER \
"$(env_fallback SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER)" \
"$(read_env_value STOREFRONT_MERCHANT_IDENTIFIER "$ROOT_ENV")" \
"$(env_fallback STOREFRONT_MERCHANT_IDENTIFIER)" \
"$(read_env_value APPLE_PAY_MERCHANT_IDENTIFIER "$SWIFT_DEMO_XCCONFIG")" \
"$(read_env_value STOREFRONT_MERCHANT_IDENTIFIER "$SWIFT_DEMO_XCCONFIG")")"

CUSTOMER_ACCOUNT_API_CLIENT_ID_VALUE="$(root_or_source_value CUSTOMER_ACCOUNT_API_CLIENT_ID \
Expand Down Expand Up @@ -473,8 +493,12 @@ collect_missing_values() {
STOREFRONT_ACCESS_TOKEN_VALUE="$(prompt_required "Storefront access token")"
fi

if [[ "$prompt_optional_values" == "true" && -z "$STOREFRONT_MERCHANT_IDENTIFIER_VALUE" ]]; then
STOREFRONT_MERCHANT_IDENTIFIER_VALUE="$(prompt_optional "Apple Pay merchant identifier")"
if [[ "$prompt_optional_values" == "true" && -z "$REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE" ]]; then
REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE="$(prompt_optional "React Native Apple Pay merchant identifier")"
fi

if [[ "$prompt_optional_values" == "true" && -z "$SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE" ]]; then
SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE="$(prompt_optional "Swift Apple Pay merchant identifier")"
fi

if [[ "$prompt_optional_values" == "true" && -z "$CUSTOMER_ACCOUNT_API_CLIENT_ID_VALUE" ]]; then
Expand Down Expand Up @@ -509,8 +533,9 @@ generate_root_env() {
EOF
write_env_assignment STOREFRONT_DOMAIN "$STOREFRONT_DOMAIN_VALUE"
write_env_assignment STOREFRONT_ACCESS_TOKEN "$STOREFRONT_ACCESS_TOKEN_VALUE"
echo "# Optional Apple Pay merchant identifier used by accelerated checkout flows."
write_env_assignment STOREFRONT_MERCHANT_IDENTIFIER "$STOREFRONT_MERCHANT_IDENTIFIER_VALUE"
echo "# Optional Apple Pay merchant identifiers used by accelerated checkout flows."
write_env_assignment REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER "$REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE"
write_env_assignment SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER "$SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE"
cat <<EOF

# Apple team that signs the Swift samples. Set your own team id, or the Xcode build
Expand Down Expand Up @@ -594,7 +619,7 @@ generate_react_native_env() {
generate_platform_env_header
write_quoted_env_assignment STOREFRONT_DOMAIN "$STOREFRONT_DOMAIN_VALUE"
write_quoted_env_assignment STOREFRONT_ACCESS_TOKEN "$STOREFRONT_ACCESS_TOKEN_VALUE"
write_quoted_env_assignment STOREFRONT_MERCHANT_IDENTIFIER "$STOREFRONT_MERCHANT_IDENTIFIER_VALUE"
write_quoted_env_assignment APPLE_PAY_MERCHANT_IDENTIFIER "$REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE"
write_quoted_env_assignment API_VERSION "$API_VERSION_VALUE"

cat <<EOF
Expand All @@ -621,12 +646,17 @@ EOF
write_quoted_env_assignment CUSTOMER_ACCOUNT_API_SHOP_ID "$CUSTOMER_ACCOUNT_API_SHOP_ID_VALUE"
}

generate_react_native_xcconfig() {
generate_xcconfig_header
write_xcconfig_assignment APPLE_PAY_MERCHANT_IDENTIFIER "$REACT_NATIVE_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE"
}

generate_swift_demo_xcconfig() {
generate_xcconfig_header
write_xcconfig_assignment DEVELOPMENT_TEAM "$DEVELOPMENT_TEAM_VALUE"
write_xcconfig_assignment STOREFRONT_DOMAIN "$STOREFRONT_DOMAIN_VALUE"
write_xcconfig_assignment STOREFRONT_ACCESS_TOKEN "$STOREFRONT_ACCESS_TOKEN_VALUE"
write_xcconfig_assignment STOREFRONT_MERCHANT_IDENTIFIER "$STOREFRONT_MERCHANT_IDENTIFIER_VALUE"
write_xcconfig_assignment APPLE_PAY_MERCHANT_IDENTIFIER "$SWIFT_APPLE_PAY_MERCHANT_IDENTIFIER_VALUE"
write_xcconfig_assignment API_VERSION "$API_VERSION_VALUE"

cat <<EOF
Expand Down Expand Up @@ -725,6 +755,7 @@ write_generated_files() {
generate_swift_demo_xcconfig >"$SWIFT_DEMO_XCCONFIG"
generate_swift_accelerated_xcconfig >"$SWIFT_ACCELERATED_XCCONFIG"
generate_react_native_env >"$REACT_NATIVE_ENV"
generate_react_native_xcconfig >"$REACT_NATIVE_XCCONFIG"

echo "Synced sample app storefront configuration files."
}
Expand Down Expand Up @@ -754,6 +785,7 @@ check_generated_files() {
check_generated_file "$SWIFT_DEMO_XCCONFIG" generate_swift_demo_xcconfig || failed="true"
check_generated_file "$SWIFT_ACCELERATED_XCCONFIG" generate_swift_accelerated_xcconfig || failed="true"
check_generated_file "$REACT_NATIVE_ENV" generate_react_native_env || failed="true"
check_generated_file "$REACT_NATIVE_XCCONFIG" generate_react_native_xcconfig || failed="true"

if [[ "$failed" == "true" ]]; then
exit 1
Expand Down
Loading
Loading