skills/mobile-payment-integration-specialist/SKILL.md
Mobile payment integration for Stripe, Apple Pay, Google Pay, in-app purchases, and subscription management. Activate on: mobile payments, Stripe SDK, Apple Pay, Google Pay, in-app purchase, StoreKit 2, Google Play Billing, subscription management, payment sheet. NOT for: backend payment processing (use api-architect), general e-commerce (use frontend-architect), financial compliance (use security-auditor).
npx skillsauth add curiositech/windags-skills mobile-payment-integration-specialistInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in integrating mobile payments including Stripe, Apple Pay, Google Pay, in-app purchases, and subscription lifecycle management.
Activate on: "mobile payments", "Stripe SDK mobile", "Apple Pay integration", "Google Pay", "in-app purchase", "StoreKit 2", "Google Play Billing", "subscription management", "payment sheet", "RevenueCat"
NOT for: Backend payment processing → api-architect | General e-commerce → frontend-architect | Financial compliance → security-auditor
| Domain | Technologies | |--------|-------------| | Direct Payments | Stripe Mobile SDK 23.x, Payment Sheet, Braintree | | iOS IAP | StoreKit 2, App Store Server API, Server Notifications V2 | | Android IAP | Google Play Billing 7.x, BillingClient, PurchaseFlow | | Subscriptions | RevenueCat, Superwall, Qonversion, custom server logic | | Express Pay | Apple Pay, Google Pay, Link (Stripe) |
What are you selling?
│
├─ Digital content consumed IN the app (stickers, coins, premium features)
│ └─ MUST use In-App Purchases (Apple/Google mandatory)
│ ├─ Apple: StoreKit 2 + App Store Server API
│ └─ Android: Google Play Billing Library
│
├─ Physical goods or real-world services (food, rides, consulting)
│ └─ CAN use direct payment (Stripe, Braintree)
│ └─ No 30% commission
│
└─ Reader/media apps (Netflix, Kindle, Spotify)
└─ CAN link to web for signup (US/EU/KR as of 2026)
└─ External purchase entitlement via App Store Server API
import { useStripe } from '@stripe/stripe-react-native';
function CheckoutScreen({ amount }: { amount: number }) {
const { initPaymentSheet, presentPaymentSheet } = useStripe();
async function checkout() {
// 1. Create PaymentIntent on your server
const { clientSecret, ephemeralKey, customerId } = await api.post(
'/create-payment-intent',
{ amount, currency: 'usd' }
);
// 2. Initialize Payment Sheet
const { error: initError } = await initPaymentSheet({
merchantDisplayName: 'My Store',
paymentIntentClientSecret: clientSecret,
customerEphemeralKeySecret: ephemeralKey,
customerId,
applePay: { merchantCountryCode: 'US' },
googlePay: { merchantCountryCode: 'US', testEnv: __DEV__ },
defaultBillingDetails: { name: 'Jane Doe' },
});
if (initError) return handleError(initError);
// 3. Present Payment Sheet
const { error: payError } = await presentPaymentSheet();
if (payError) {
if (payError.code === 'Canceled') return; // User dismissed
handleError(payError);
} else {
// Payment succeeded — server confirms via webhook
navigation.navigate('OrderConfirmation');
}
}
return <Button onPress={checkout} title={`Pay $${amount}`} />;
}
// Modern StoreKit 2 (async/await)
import StoreKit
class SubscriptionManager {
func purchase(_ product: Product) async throws -> Transaction {
let result = try await product.purchase()
switch result {
case .success(let verification):
let transaction = try checkVerified(verification)
await transaction.finish()
// Notify server of purchase for server-side validation
await api.verifyPurchase(transactionId: transaction.id)
return transaction
case .pending:
throw SubscriptionError.pendingApproval // Ask-to-Buy
case .userCancelled:
throw SubscriptionError.cancelled
@unknown default:
throw SubscriptionError.unknown
}
}
// Listen for subscription status changes
func observeTransactionUpdates() async {
for await result in Transaction.updates {
guard let transaction = try? checkVerified(result) else { continue }
await handleTransactionUpdate(transaction)
await transaction.finish()
}
}
}
[ ] Server-side payment verification via webhooks (never trust client)
[ ] Correct payment model chosen (IAP for digital, Stripe for physical)
[ ] Apple Pay and Google Pay configured as express checkout options
[ ] Subscription lifecycle handled: trial, renewal, cancellation, grace period
[ ] Pending transactions (Ask-to-Buy) handled gracefully
[ ] Product IDs fetched from store at runtime (not hardcoded)
[ ] Restore purchases implemented for app reinstalls
[ ] Receipt validation on server (App Store Server API / Google Developers API)
[ ] Refund handling via server notifications
[ ] Price displayed in user's local currency
[ ] Subscription management screen links to platform settings
[ ] PCI DSS compliance: no raw card data touches your servers (use Stripe tokenization)
data-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.