Google Pay Cordova Integration
August 7, 2025 · AI Conversations
—
### ✅ OVERVIEW
You’ll use:
– Google Pay API (for Android)
– Cordova plugin to access native functionality
– A backend endpoint to generate a payment token and process the payment
– (Optional) QR code scanning if you want to scan the customer's Google Pay QR
—
## 🚀 SCENARIO: You want your staff to enter an amount, generate a Google Pay payment request, and let the customer pay via tap/QR.
—
## 1. ✅ Prerequisites
– **Cordova Android platform**
– Google Play Services installed on device
– Google Merchant Account with a **Google Pay Business profile**: https://pay.google.com/business/console
– SHA1 of your app uploaded in Google Pay Console (for production)
—
## 2. 📦 Install Required Cordova Plugins
You’ll need:
cordova plugin add cordova-plugin-androidx
cordova plugin add cordova-plugin-androidx-adapter
cordova plugin add cordova-plugin-inappbrowser
If you're using QR scan:
cordova plugin add phonegap-plugin-barcodescanner
—
## 3. ⚙️ Setup Google Pay API
### Add the Google Pay API JavaScript
In your `index.html`:
<script async src="https://pay.google.com/gp/p/js/pay.js"></script>
—
## 4. 📄 Payment Configuration Example
Create a JS function:
const paymentsClient = new google.payments.api.PaymentsClient({ environment: 'TEST' });
const paymentDataRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [{
type: 'CARD',
parameters: {
allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
allowedCardNetworks: ['VISA', 'MASTERCARD'],
},
tokenizationSpecification: {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'example', // Use 'stripe', 'adyen', etc.
gatewayMerchantId: 'your-merchant-id'
}
}
}],
transactionInfo: {
totalPriceStatus: 'FINAL',
totalPrice: '10.00', // dynamically set
currencyCode: 'USD'
},
merchantInfo: {
merchantId: 'your-merchant-id',
merchantName: 'Fossetts Circus'
}
};
—
## 5. 📲 Launch Payment Sheet
paymentsClient.loadPaymentData(paymentDataRequest).then(function(paymentData) {
// send paymentData.paymentMethodData.tokenizationData.token to your server
console.log('Payment success', paymentData);
}).catch(function(err) {
console.error('Payment failed', err);
});
—
## 6. 🖼 QR Code Generation (optional)
If you want to show a QR that the user can scan to pay:
– Generate a payment link (e.g., via Stripe or your backend)
– Use any JS QR generator like:
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<canvas id="qrcode"></canvas>
<script>
var qr = new QRious({
element: document.getElementById('qrcode'),
value: 'https://your-payment-link.com/abc123',
size: 200
});
</script>
—
## 7. 🛠 Backend Server
You must handle the token from Google Pay and process it via Stripe/Adyen etc.
Example with Node.js:
const stripe = require('stripe')('your-secret-key');
app.post('/pay', async (req, res) => {
const { token } = req.body;
const charge = await stripe.charges.create({
amount: 1000, // cents
currency: 'usd',
source: token,
description: 'Fossetts payment'
});
res.send(charge);
});
—
## 8. 🧪 Test Your Integration
– Use Google Pay test cards: https://developers.google.com/pay/api/android/guides/resources/test-card-suite
– Make sure app is signed and SHA1 is set in your Google Pay profile
—
## ✅ Bonus: If You Want to Scan Customer’s Google Pay QR
Use `phonegap-plugin-barcodescanner` to scan QR and parse URL/token.
—
## 🔒 Security Notes
– Don’t process payments on the frontend.
– Always verify Google Pay tokens server-side before capturing payment.
—
If you want a minimal working sample code or integration with Stripe/PayPal, let me know which payment processor you're using.
—
## ✅ Option 1: **Use a Payment Gateway (like Stripe, Razorpay, etc.) to Generate the QR**
These gateways support **custom metadata or dynamic amounts** in the QR.
### 🛠 Example with Stripe:
You generate a payment link with a custom amount and attach custom metadata (like order ID or user ID):
curl https://api.stripe.com/v1/payment_links
-u sk_test_...:
-d "line_items[0][price_data][currency]"="usd"
-d "line_items[0][price_data][product_data][name]"="Circus Ticket"
-d "line_items[0][price_data][unit_amount]"="500"
-d "line_items[0][quantity]"=1
-d "metadata[order_id]"="123456"
Then create a QR code using that link:
var qr = new QRious({
element: document.getElementById('qrcode'),
value: 'https://buy.stripe.com/test_5kAaFG5xxx...', // Stripe payment link with metadata
size: 200
});
👉 When the user scans it and pays, Stripe sends the `order_id` back to your webhook.
—
## ✅ Option 2: **Custom Web Link + Google Pay Button**
If you're handling the flow manually (without Stripe), you can:
1. Create a custom URL like:
https://yourdomain.com/pay?amount=2500&order_id=ABC123
2. Generate a QR code from this URL:
var qr = new QRious({
element: document.getElementById('qrcode'),
value: 'https://yourdomain.com/pay?amount=2500&order_id=ABC123',
size: 200
});
3. On that URL, show the **Google Pay button** and use the amount from the query.
This gives you full control. After payment, you store the `order_id` and Google Pay token together.
—
## 🚫 Can You Embed Custom Value *Inside* a Google Pay QR Code?
Not directly.
– **Google Pay static QR codes** (like UPI in India) follow strict formats.
– If the QR is issued by Google Pay itself (e.g., merchant QR), you can't inject values into it.
– But if **you generate the QR**, then you can include any custom data in the **URL or payload**.
—
## ✅ TL;DR
| Goal | Can You Do It? | How |
|————————————–|—————-|———————————————————————-|
| Add custom value (e.g., order ID) | ✅ Yes | Use custom URLs or metadata in payment gateway |
| Modify existing Google Pay QR | ❌ No | Not possible – it’s static from Google |
| Use custom QR with Google Pay flow | ✅ Yes | Show Google Pay button after scan and pass custom data via link |
—
Let me know if you want a working example using **Stripe**, **Razorpay**, or a custom Node.js/PHP backend.
> ✅ **Google Pay doesn’t support embedding arbitrary metadata (like order ID) directly into their QR codes**, because the QR format is standardized and typically used for **merchant UPI** or **Google Pay-specific tokens**.
But you can work around this by generating your **own QR code** that links to a **custom payment page** where the order ID is embedded in the URL or payload. Here's how:
—
## ✅ Recommended Solution: Use a Payment URL + Google Pay Button + Custom Order ID
### 🔁 Flow:
1. Staff enters amount & order ID in the app.
2. App generates a payment link like:
https://yourdomain.com/pay?amount=500&order_id=ABC123
3. Generate a QR code for this link.
4. Customer scans the QR → Opens the page with Google Pay button.
5. You pass the `order_id` to the backend when payment is confirmed.
—
### 🔧 Step-by-Step in Cordova
#### 1. 🔹 Generate Payment Link
Example link:
const orderId = 'ORD12345';
const amount = '500'; // in your currency minor unit like paise or cents
const payLink = `https://yourdomain.com/pay?amount=${amount}&order_id=${orderId}`;
#### 2. 🔹 Generate QR Code in Cordova App
<canvas id="qrcode"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script>
var qr = new QRious({
element: document.getElementById('qrcode'),
value: payLink,
size: 200
});
</script>
#### 3. 🔹 Create Payment Page (`/pay`)
On `https://yourdomain.com/pay`, read the query params and show a **Google Pay button** with the correct amount and order ID:
const urlParams = new URLSearchParams(window.location.search);
const amount = urlParams.get('amount');
const orderId = urlParams.get('order_id');
// use these in the Google Pay API transaction object
const paymentRequest = {
transactionInfo: {
totalPriceStatus: 'FINAL',
totalPrice: amount,
currencyCode: 'INR'
},
merchantInfo: {
merchantName: 'Fossetts Circus'
},
// ... other config
};
—
### 🧠 Why This Works
– **Google Pay QR** itself cannot be modified to hold custom metadata.
– But by using your own QR + payment page, you **control the logic**.
– Once the customer pays, your server captures the token and order ID together.
—
### 🔒 Optional: Add `order_id` in Payment Gateway Metadata (e.g. Stripe, Razorpay)
If you’re using:
– **Stripe**: Add `metadata: { order_id: "ORD12345" }`
– **Razorpay**: Add `notes: { order_id: "ORD12345" }` when creating payment request
—
### ✅ Result
You achieve:
– Dynamic amount entry
– Order ID tracking
– Google Pay checkout
– QR scan-to-pay experience
—
Let me know your **payment processor** (Stripe, Razorpay, Paytm, or custom backend), and I’ll give you **exact working code**.
When you **add a ticket to Google Wallet (formerly Google Pay Passes API)**, here’s how **QR codes are handled**:
—
## ✅ Short Answer:
> **You supply the QR code data when creating the ticket**.
> Google Wallet will generate and display the QR code based on the data you provide — **you control what’s in it**.
—
## 🔍 Details
### 📌 When you create a **ticket pass (event ticket, boarding pass, etc.)**, you send a JSON payload to Google’s Passes API like this:
"barcode": {
"type": "QR_CODE",
"value": "TICKET123|ORDER456|CUSTOMER789",
"alternateText": "Show this QR at the gate"
}
### 🔄 Google Wallet will:
– **Render a QR code** from the `value` you provide
– Show it on the pass when the user opens it
– Let scanners read the QR code directly from the phone
—
## ✅ What You Can Include in the QR Code:
– Order ID
– Ticket ID
– User ID
– Event date/time
– Encrypted payload or token
> **You decide the format**, e.g., `ORD123`, `event:music|seat:A2`, or even a **URL** (`https://yourdomain.com/validate?token=abc123`).
—
## 🚫 What You *Can't* Do:
– You **cannot change the QR code after the ticket is added** unless you **update the pass** via API.
– You **cannot inject logic** into the QR — it’s just data.
—
## 📦 Summary
| Feature | Supported? | Notes |
|—————————————-|————|——-|
| You control QR code value | ✅ | Supplied in JSON (`barcode.value`) |
| QR code shown on ticket | ✅ | Rendered by Google Wallet UI |
| QR code auto-generated by Google | ✅ | But only from the value *you* provide |
| Updating QR after pass is added | ✅ | Use Google Wallet API to update |
| Injecting custom fields into QR later | ❌ | Must be done upfront or via pass update |
—
### 💡 Example Use Case
If you want to **add Order ID to the ticket and QR**, do this:
"barcode": {
"type": "QR_CODE",
"value": "ORDER_ID:ORD9876",
"alternateText": "Order: ORD9876"
}
And store the value on your server so your scanner app can verify it.
—
Let me know if you’re already using the Google Wallet API or need help building the JSON pass class/object.
—
## ✅ GOAL
> **Allow customer to pay from their phone inside a Cordova app** using **Google Pay**, either by tapping or scanning, and **your staff enters the amount** to generate the request.
—
## 💡 You Have Two Options:
### **OPTION 1: Use Google Pay API in Cordova App (Direct Integration)**
Works for **in-app payments** (Android only) using a payment processor like Stripe, Razorpay, etc.
### **OPTION 2: Generate a Payment Link (with Order ID) + QR Code**
Works **cross-platform**, even for web, and is easier to implement in Cordova.
—
## 🛠 OPTION 1: Native Google Pay API Integration (Recommended for Tap-to-Pay)
### ✅ Step 1: Prerequisites
– Cordova Android App
– Stripe/Razorpay/Mollie/Midtrans/etc.
– Merchant ID registered with Google Pay Console
– Add SHA1 key of your app in Google Pay Business Console
—
### ✅ Step 2: Install Cordova Plugins
cordova plugin add cordova-plugin-inappbrowser
cordova plugin add cordova-plugin-androidx
cordova plugin add cordova-plugin-androidx-adapter
—
### ✅ Step 3: Load Google Pay JavaScript
In `index.html`:
<script async src="https://pay.google.com/gp/p/js/pay.js"></script>
—
### ✅ Step 4: Configure Payment Data
const paymentsClient = new google.payments.api.PaymentsClient({ environment: 'TEST' });
const paymentRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [{
type: 'CARD',
parameters: {
allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
allowedCardNetworks: ['VISA', 'MASTERCARD'],
},
tokenizationSpecification: {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'stripe', // or your gateway
gatewayMerchantId: 'your-merchant-id'
}
}
}],
transactionInfo: {
totalPriceStatus: 'FINAL',
totalPrice: '10.00', // dynamic from form input
currencyCode: 'USD'
},
merchantInfo: {
merchantName: 'Fossetts Circus'
}
};
—
### ✅ Step 5: Launch the Payment Sheet
paymentsClient.loadPaymentData(paymentRequest)
.then(paymentData => {
const token = paymentData.paymentMethodData.tokenizationData.token;
// send token to your server for processing (via Stripe, etc.)
console.log('Payment token:', token);
})
.catch(err => console.error('Payment Error', err));
—
## 🛠 OPTION 2: Generate Dynamic Payment Link + QR Code
More flexible if you don't want to use full Google Pay API.
### 🔹 Staff Enters Amount + Order ID → App generates link:
const payURL = `https://yourdomain.com/pay?amount=500&order_id=ORD123`;
### 🔹 Convert to QR code:
var qr = new QRious({
element: document.getElementById('qrcode'),
value: payURL,
size: 200
});
### 🔹 On that URL, show a Google Pay button using Google Pay JS and charge the user.
> Works best if you have a backend that integrates Stripe or Razorpay.
—
## 🔐 Important Security Notes
– Never process Google Pay tokens or card details directly in your app.
– Always send the payment token to your **server** for processing securely.
– For QR-based payments, verify order ID on your server after transaction.
—
## ✅ What’s Next?
If you tell me:
– Which **payment gateway** you’re using (Stripe, Razorpay, Paytm, etc.)
– Whether you prefer **QR scan** or **tap-to-pay**
– Whether you want to **charge fixed amounts or dynamic input**
I can give you **copy-paste Cordova code** tailored for your flow.
I want when staff enter amount and press pay now button then a qr code will show ,user needs to pay from their phone by scaning this code
1. 🧑💼 **Staff enters the amount** in the Cordova app
2. 📲 App generates a **QR code** that the customer scans
3. 💰 Customer pays via **Google Pay on their own phone**
4. 🔔 Your backend receives the payment confirmation, linked to the order
—
## ✅ Best Way to Do This in 2025
### ✅ **Use a Payment Gateway** like:
– **Stripe**
– **Razorpay**
– **Paytm**
– **Cashfree**
– **PhonePe Business API** *(for India)*
These services let you:
– Generate dynamic **payment links or UPI intents**
– Accept **Google Pay / UPI** when the QR is scanned
– Add **order ID / metadata**
– Get **real-time webhook notifications**
—
## 🛠 HOW TO IMPLEMENT THIS IN CORDOVA (Step-by-step)
—
### ✅ Step 1: Setup Backend to Generate Payment Link (Example: Razorpay)
Create a server-side endpoint like:
// payment.php
$order_id = 'ORD' . time();
$amount = $_GET['amount']; // in paise
$paymentData = [
"amount" => $amount,
"currency" => "INR",
"receipt" => $order_id,
"payment_capture" => 1,
"notes" => ["source" => "Cordova", "order_id" => $order_id]
];
$response = razorpay_api('/v1/orders', $paymentData); // use cURL or SDK
$payment_link = "upi://pay?pa={$response['upi_id']}&pn=Fossetts&am={$amount / 100}&cu=INR"; // OR get payment_link from Razorpay
echo json_encode(['link' => $payment_link]);
—
### ✅ Step 2: In Cordova App – Form Input & Generate QR
<input type="number" id="amount" placeholder="Enter amount in INR" />
<button id="pay-now">Pay Now</button>
<canvas id="qrcode"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script>
document.getElementById('pay-now').addEventListener('click', function () {
const amount = document.getElementById('amount').value;
if (!amount) return alert("Enter amount");
fetch(`https://yourserver.com/payment.php?amount=${amount * 100}`)
.then(res => res.json())
.then(data => {
new QRious({
element: document.getElementById('qrcode'),
value: data.link,
size: 250
});
});
});
</script>
—
### ✅ Step 3: Customer Scans QR → Pays via Google Pay (UPI) on Their Phone
> When scanned, Google Pay opens with pre-filled:
– Amount
– Merchant name
– UPI ID
—
### ✅ Step 4: Payment Confirmation
Use a **webhook endpoint** on your backend to get notified when payment succeeds:
– Razorpay: `/webhooks` with `payment.captured`
– Stripe: `checkout.session.completed`
– Paytm: IPN URL
Then update the order status using `order_id` from metadata.
—
## 🧠 BONUS: QR Code with Deep Link Format
If your gateway doesn’t support links, build the UPI link manually:
let upiID = 'fossetts@icici';
let amount = 250.00;
let orderId = 'ORD9876';
let url = `upi://pay?pa=${upiID}&pn=Fossetts&am=${amount}&cu=INR&tn=Order ${orderId}`;
Then use this in the QR code generator.
—
## 🔐 Security & Notes
– Never hardcode merchant keys in Cordova — always use a secure backend
– Always validate payment status using gateway’s API/webhook, not frontend
– Always map `order_id` to payment ID for traceability
—
## ✅ Summary
| Feature | Use This |
|————————|———-|
| Dynamic QR code | `qrious` in Cordova |
| Google Pay via scan | UPI deep link or Razorpay payment link |
| Metadata (order ID) | In URL or payment gateway notes |
| Confirm payment | Webhook on server |
—
Let me know your **gateway** (Razorpay, Stripe, etc.), and I’ll give you exact backend + frontend code.
—
## ✅ Your Goal
– Staff enters an amount (e.g. $10.00)
– App generates a QR code
– Customer scans it and pays using **Google Pay** on their own device (international version)
– Payment is tracked using an `order_id`
—
## 🌍 Google Pay (International) Supports:
✅ Card payments via Google Pay
✅ Tokenized payments via gateways like **Stripe**, **Adyen**, **Checkout.com**, **Square**, etc.
❌ **QR scan for person-to-person payments is not natively supported** in Google Pay globally — **but** we can use a **payment link + QR workaround**
—
## ✅ Best Approach for International Clients
### Use a payment processor that supports:
| Feature | Requirement |
|—————————-|————-|
| Dynamic payment links | ✅ Yes |
| Google Pay support | ✅ Yes |
| Metadata (e.g., order ID) | ✅ Yes |
| Webhook support | ✅ Yes |
—
### ✅ Recommended Gateways
| Gateway | Supports Google Pay | Dynamic QR | International |
|————-|———————|————|—————-|
| **Stripe** | ✅ Yes | ✅ Yes (via links) | 🌍 |
| **Adyen** | ✅ Yes | ✅ Yes | 🌍 |
| **Square** | ✅ Yes (some regions) | ✅ Yes | 🌍 |
| **Mollie** | ✅ Yes | ✅ Yes | EU |
| **Checkout.com** | ✅ Yes | ✅ Yes | 🌍 |
—
## 🛠 Example: Stripe Payment Link + QR Flow in Cordova
### 🔹 Step 1: On Server – Create Payment Link
// server/create-payment-link.php
require 'vendor/autoload.php';
StripeStripe::setApiKey('sk_test_xxx');
$amount = $_GET['amount']; // in dollars
$order_id = 'ORD' . time();
$paymentLink = StripePaymentLink::create([
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => 'Fossetts Ticket'],
'unit_amount' => $amount * 100, // cents
],
'quantity' => 1,
]],
'metadata' => ['order_id' => $order_id]
]);
echo json_encode(['link' => $paymentLink->url]);
—
### 🔹 Step 2: Cordova App – Staff Enters Amount & Generates QR
<input id="amount" placeholder="Enter amount" />
<button id="generate">Generate QR</button>
<canvas id="qrcode"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script>
document.getElementById('generate').addEventListener('click', function () {
let amount = document.getElementById('amount').value;
fetch(`https://yourdomain.com/create-payment-link.php?amount=${amount}`)
.then(res => res.json())
.then(data => {
new QRious({
element: document.getElementById('qrcode'),
value: data.link,
size: 250
});
});
});
</script>
—
### 🔹 Step 3: Customer Scans QR → Pays via Google Pay (or card)
Stripe handles:
– Google Pay button
– Payment form
– Order ID tracking (via metadata)
—
### 🔹 Step 4: Handle Webhook for Confirmation
On your server:
// server/webhook.php
$payload = @file_get_contents("php://input");
$event = json_decode($payload, true);
if ($event['type'] === 'checkout.session.completed') {
$orderId = $event['data']['object']['metadata']['order_id'];
// mark order as paid in your database
}
—
## ✅ Summary
| Step | Action |
|——|——–|
| 1 | Staff enters amount in Cordova |
| 2 | App calls server to create Stripe payment link |
| 3 | App generates QR code for that link |
| 4 | Customer scans → opens Stripe-hosted Google Pay page |
| 5 | Stripe processes payment & notifies your server via webhook |
—
Would you like me to provide:
– Stripe webhook handler code?
– Laravel or Node.js version?
– Adyen or Checkout.com flow instead?
Let me know your preferred gateway and backend tech (PHP, Node.js, etc.) and I’ll tailor the code.
—
## 🧾 Where is **Google Pay's role** in the Stripe QR code payment flow?
> 🔹 **Google Pay is used as the customer's payment method** — when they scan the QR and open the Stripe-hosted page, they are offered **Google Pay as one of the payment options**.
—
### ✅ Flow Recap — Stripe + Google Pay:
1. 🔢 Staff enters amount in Cordova app
2. 📡 App hits backend → creates **Stripe Payment Link**
3. 📷 QR code generated from that payment link
4. 📲 Customer scans QR with phone → opens Stripe Checkout page
5. 🧾 **Google Pay** is shown as a payment method if:
– The customer has Google Pay set up
– The device + browser supports Google Pay (e.g. Chrome + Android)
6. ✅ User taps **Google Pay** → payment is processed
7. 🔔 Stripe webhook tells your server the order is paid
—
### 🖼️ Visual Breakdown:
[Cordova App (Staff)]
⇓
[Stripe Payment Link (with metadata like order_id)]
⇓
[QR Code Displayed in App]
⇓
[Customer Scans with Phone → Stripe Checkout Page]
⇓
[Google Pay Button Shown if Supported]
⇓
[Payment via Google Pay]
⇓
[Stripe Confirms Payment → Webhook → Your DB]
—
### ✅ Why Use This Flow?
– **Google Pay handles card tokenization & secure checkout**
– **Stripe handles compliance, processing, and metadata**
– You don’t need to implement Google Pay SDK in Cordova
– Works across all platforms and regions supported by Stripe
—
### 🧠 Important:
You are **not generating a Google Pay QR code** directly. Instead:
– You're generating a **Stripe Payment URL**
– That page **shows Google Pay** as an option to the customer
So:
– **Your Cordova app never talks directly to Google Pay**
– **Google Pay is used by the customer when opening the Stripe page**
—
If your international client wants:
– **A QR code that only opens Google Pay directly**, that’s only possible in very **limited, region-specific cases (like UPI in India)**
– Otherwise, using a payment processor that supports **Google Pay in hosted pages** is the cleanest and most scalable solution
—
Would you like:
– A live demo link?
– Full working backend code for Stripe (PHP or Node)?
– Other payment provider suggestions?
Let me know and I’ll give you exactly what fits your app.
– Accepts an amount from staff
– Generates a Stripe payment link (which supports Google Pay)
– Displays a QR code the customer can scan to pay
– Processes the payment and updates your server via webhook
—
## 🧩 Folder Structure Overview
project/
├── backend/ # PHP backend (like CodeIgniter controller)
│ ├── create_payment.php
│ └── webhook.php
├── www/ # Cordova frontend
│ ├── index.html
│ └── js/
│ └── app.js
—
## 🔹 Step 1: Backend – `create_payment.php` (Stripe API)
<?php
require 'vendor/autoload.php'; // composer require stripe/stripe-php
StripeStripe::setApiKey('sk_test_xxx'); // Use your actual secret key
$amount = (int) $_GET['amount']; // in dollars
$order_id = 'ORD' . time();
$paymentLink = StripePaymentLink::create([
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => 'Fossetts Ticket'],
'unit_amount' => $amount * 100, // cents
],
'quantity' => 1,
]],
'metadata' => ['order_id' => $order_id],
]);
echo json_encode(['link' => $paymentLink->url]);
—
## 🔹 Step 2: Backend – `webhook.php` (Stripe Webhook)
<?php
require 'vendor/autoload.php';
$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$endpoint_secret = 'whsec_XXX'; // your webhook secret
try {
$event = StripeWebhook::constructEvent(
$payload, $sig_header, $endpoint_secret
);
if ($event->type == 'checkout.session.completed') {
$session = $event->data->object;
$order_id = $session->metadata->order_id;
// ✅ Update your DB to mark order as paid
file_put_contents("paid_orders.log", "$order_idn", FILE_APPEND);
}
http_response_code(200);
} catch (Exception $e) {
http_response_code(400);
exit();
}
—
## 🔹 Step 3: Cordova App `www/index.html`
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Pay with Google Pay</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script src="js/app.js"></script>
</head>
<body>
<h3>Enter Amount</h3>
<input id="amount" type="number" placeholder="Amount in USD">
<button onclick="generateQRCode()">Pay Now</button>
<br><br>
<canvas id="qrcode"></canvas>
</body>
</html>
—
## 🔹 Step 4: Cordova App JS `www/js/app.js`
function generateQRCode() {
const amount = document.getElementById('amount').value;
if (!amount) return alert("Enter amount");
fetch(`https://yourdomain.com/backend/create_payment.php?amount=${amount}`)
.then(res => res.json())
.then(data => {
new QRious({
element: document.getElementById('qrcode'),
value: data.link,
size: 250
});
})
.catch(err => alert("Error generating QR code: " + err.message));
}
—
## 🔔 Notes
– ✅ Stripe will automatically show **Google Pay** to customers if:
– They are using Chrome
– They have Google Pay enabled
– ✅ This works in all international regions supported by Stripe
– ✅ Stripe handles currency, PCI compliance, and fraud checks
—
## ✅ To Deploy:
1. Add your webhook endpoint in Stripe dashboard
2. Upload backend to your server (Apache/Nginx)
3. Replace `https://yourdomain.com/backend/create_payment.php` in the JS with your actual path
4. Build your Cordova app for Android:
cordova build android
—
Would you like:
– A full CodeIgniter controller version of `create_payment.php`?
– A sample MySQL table for logging order payments?
Let me know and I’ll expand this for production use.
<script>
</script>
You're asking why we didn't use:
<script async src="https://pay.google.com/gp/p/js/pay.js"></script>
in the Cordova QR-based payment approach. Here's the **honest and technical reason**:
—
## ❌ Not Needed in Your Flow
The “ is only used when you want to:
> 🔹 Embed the **Google Pay button directly in your app or website**
> 🔹 Use **Google Pay API directly in JavaScript** to collect payment tokens in real time
That’s useful **only when the customer is paying inside your app or web app** (i.e., you show the Google Pay button and process the response).
—
### 🧾 In Your Flow:
> 🧑💼 Staff enters amount → app creates a Stripe payment link → QR code is generated →
> 📲 Customer scans QR on their **own device**, opens Stripe-hosted checkout → **Google Pay button appears on Stripe page** if supported.
✅ **That Stripe-hosted page already uses Google's JavaScript SDK internally**, and **renders the Google Pay button for you**.
So:
– You don’t need to load `pay.js` in your Cordova app
– You're not handling Google Pay tokens or buttons yourself
– You're offloading the secure parts (PCI, tokenization) to Stripe
—
## ✅ When Should You Use `pay.js`?
Use this script **only if you're building your own Google Pay checkout page** (i.e., not using Stripe/Adyen/etc.).
For example, this is needed if you want to:
– Embed a Google Pay button like:
<button id="google-pay-button"></button>
– Use code like:
const paymentsClient = new google.payments.api.PaymentsClient({ environment: 'TEST' });
– Process the token and amount yourself and send it to your server
This requires more effort and PCI-compliant backend logic.
—
## ✅ Summary
| Use Case | Load `pay.js`? |
|—————————————–|—————-|
| QR code → Stripe page with Google Pay | ❌ No |
| Google Pay button directly in your app | ✅ Yes |
| Stripe Checkout with auto-rendered GPay | ❌ No |
| Fully custom payment form | ✅ Yes |
—
Since you're using **QR + Stripe Checkout**, you're already getting the **Google Pay button with zero extra work or script**. That's a win for performance and security.
Let me know if you want to build a **native in-app Google Pay sheet** instead — then `pay.js` would come into play.
But how customer will pay when staff enter amount in app
—
## 🔄 Updated Flow
1. ✅ Staff enters an amount in the Cordova app
2. 📲 Customer is handed the same phone (or scans from another)
3. 🧾 A **Google Pay sheet** opens inside the app
4. 💳 Customer pays via card or wallet
5. ✅ Your **PHP backend** (CodeIgniter) is notified
6. 📦 Order status is updated in your DB
—
## 🚨 Important Notes
– Google Pay **cannot show QR** to be scanned for card payments
– It **only supports a payment sheet UI** where the customer taps a **Google Pay button**
– You must use a **payment gateway** that supports Google Pay (like Stripe)
—
## ✅ Recommended Solution
Use the **Google Pay API + Stripe** (or similar) inside your Cordova app.
### 👉 Staff enters amount → Google Pay sheet opens → Customer pays inside app → Token is sent to your backend → Stripe processes payment → Your DB updates
—
## 🛠 Step-by-Step Implementation
### ✅ 1. Add Required Cordova Plugin
Install the InAppBrowser plugin (for fallback if needed):
cordova plugin add cordova-plugin-inappbrowser
—
### ✅ 2. Load Google Pay Script in `index.html`
<script async src="https://pay.google.com/gp/p/js/pay.js"></script>
—
### ✅ 3. Add Google Pay Button and Script
<div id="container"></div>
<script>
const paymentsClient = new google.payments.api.PaymentsClient({ environment: 'TEST' });
const paymentRequest = {
apiVersion: 2,
apiVersionMinor: 0,
allowedPaymentMethods: [{
type: 'CARD',
parameters: {
allowedAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
allowedCardNetworks: ['VISA', 'MASTERCARD']
},
tokenizationSpecification: {
type: 'PAYMENT_GATEWAY',
parameters: {
gateway: 'stripe', // or 'adyen', 'checkout.com'
gatewayMerchantId: 'your-stripe-merchant-id'
}
}
}],
transactionInfo: {
totalPriceStatus: 'FINAL',
totalPrice: '10.00', // replace dynamically
currencyCode: 'USD'
},
merchantInfo: {
merchantName: 'Fossetts Circus'
}
};
const button = paymentsClient.createButton({
onClick: onGooglePayClicked
});
document.getElementById('container').appendChild(button);
function onGooglePayClicked() {
paymentsClient.loadPaymentData(paymentRequest).then(function(paymentData) {
const token = paymentData.paymentMethodData.tokenizationData.token;
// Send token + order info to your PHP backend
fetch('https://yourdomain.com/payment/charge', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: token,
order_id: 'ORD123',
amount: 1000 // cents
})
}).then(res => res.json())
.then(result => {
alert('Payment success');
});
}).catch(err => {
alert('Payment failed');
console.error(err);
});
}
</script>
—
### ✅ 4. Backend: `payment/charge` (PHP CodeIgniter Controller Example)
public function charge() {
$input = json_decode(file_get_contents('php://input'), true);
$token = $input['token'];
$amount = $input['amount']; // cents
$order_id = $input['order_id'];
StripeStripe::setApiKey('sk_test_xxx');
try {
$charge = StripeCharge::create([
'amount' => $amount,
'currency' => 'usd',
'source' => $token,
'description' => 'Fossetts order ' . $order_id,
'metadata' => ['order_id' => $order_id]
]);
// ✅ Update DB as paid
$this->db->where('order_id', $order_id)->update('orders', ['status' => 'paid']);
echo json_encode(['status' => 'success']);
} catch (Exception $e) {
http_response_code(400);
echo json_encode(['error' => $e->getMessage()]);
}
}
—
## ✅ Summary
| Component | Role |
|——————|——————————————-|
| Cordova + GPay | Shows payment sheet in-app |
| Stripe | Handles real payments via card / GPay |
| PHP Backend | Charges token & updates order in DB |
| Customer | Pays directly from Cordova app UI |
—
Would you like:
– CodeIgniter v4 controller structure?
– Laravel or Node version?
– Ready-made Cordova template with Stripe + Google Pay integration?
Let me know, and I’ll package it for your stack.
—
## ✅ Real Use Case
– 🎪 **Staff app**: Cordova app where staff enters the amount, and the app generates a **Google Pay-compatible QR code**
– 🧑💼 **Customer app**: Same Cordova app installed on the **customer's own phone**, where they scan the QR and **pay directly using Google Pay from their phone**
—
## ✅ Objective
> ✅ Staff enters amount → App generates a QR code →
> 📲 Customer opens their app → scans QR code → sees "Pay with Google Pay" button → pays →
> 🔔 Server updates payment status in DB
—
## ✅ Best Architecture (Two Apps or Roles in One)
| Role | Action |
|————–|——–|
| **Staff** | Enters amount + order ID → QR code is generated |
| **Customer** | Opens their app → scans QR → sees payment screen with Google Pay button |
Both users are using the **same app**, but with **different roles or flows**.
—
## ✅ Flow Breakdown (Stripe-based with Google Pay):
1. Staff generates a **Stripe Payment Link** (server-side)
2. That link is shown as a QR code
3. Customer scans QR code in their Cordova app
4. App opens that link in an **InAppBrowser**, or fetches metadata and opens a custom screen
5. Customer pays via Google Pay inside their app (via Stripe Checkout or your own payment screen)
6. Your backend is notified via webhook
7. Order marked as paid
—
## ✅ Implementation Plan
### 1. Staff Cordova UI
– Form to enter amount
– API call to backend: `/create-payment-link?amount=1000&order_id=ORD123`
– Backend returns a Stripe payment URL
– Generate a QR code from that URL
### 2. Customer Cordova UI
– Add **QR scanner** using Cordova Barcode Scanner plugin
– Scan QR → receive URL
– Open Stripe-hosted payment page using `cordova-plugin-inappbrowser`
### 3. Google Pay shows automatically inside that page if:
– Stripe supports it for your country
– Customer has Google Pay set up
—
## ✅ Full Working Example
### 🔹 Install Plugins
cordova plugin add phonegap-plugin-barcodescanner
cordova plugin add cordova-plugin-inappbrowser
—
### 🔹 Staff App Code (QR generator)
<input type="number" id="amount" placeholder="Amount">
<button onclick="generateQR()">Generate QR</button>
<canvas id="qrcode"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script>
function generateQR() {
let amount = document.getElementById('amount').value;
let orderId = 'ORD' + Date.now();
fetch(`https://yourdomain.com/create-payment.php?amount=${amount}&order_id=${orderId}`)
.then(res => res.json())
.then(data => {
new QRious({
element: document.getElementById('qrcode'),
value: data.link, // this is a Stripe payment link
size: 250
});
});
}
</script>
—
### 🔹 Customer App Code (QR scanner + in-app payment)
<button onclick="scanAndPay()">Scan & Pay</button>
<script>
function scanAndPay() {
cordova.plugins.barcodeScanner.scan(
function (result) {
if (!result.cancelled && result.text) {
cordova.InAppBrowser.open(result.text, '_blank', 'location=yes');
}
},
function (error) {
alert("Scanning failed: " + error);
}
);
}
</script>
—
### 🔹 Backend (PHP – Stripe Payment Link Generator)
<?php
require 'vendor/autoload.php';
StripeStripe::setApiKey('sk_test_xxx');
$amount = $_GET['amount'] * 100;
$order_id = $_GET['order_id'];
$paymentLink = StripePaymentLink::create([
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => 'Circus Ticket'],
'unit_amount' => $amount,
],
'quantity' => 1
]],
'metadata' => ['order_id' => $order_id],
]);
echo json_encode(['link' => $paymentLink->url]);
—
### 🔹 Backend Webhook to Mark Order as Paid
$payload = @file_get_contents("php://input");
$event = json_decode($payload, true);
if ($event['type'] === 'checkout.session.completed') {
$order_id = $event['data']['object']['metadata']['order_id'];
// Mark order as paid in your DB
}
—
## ✅ Summary
| Action | Cordova Side | Backend Side |
|—————————|————————–|————————–|
| Staff enters amount | `generateQR()` + QRious | `create-payment.php` uses Stripe |
| Customer scans QR | `scanAndPay()` + barcodeScanner | None |
| Customer pays via GPay | `InAppBrowser.open()` | Stripe checkout page |
| Payment confirmation | – | Stripe webhook updates DB |
—
## ✅ Benefits
– Same app for staff and customers
– Secure and PCI-compliant (Stripe handles card logic)
– Google Pay button shown only to eligible users
– Works globally
– Fully scalable for event ticketing, orders, etc.
—
Would you like me to bundle this into a full sample project or add CodeIgniter-style controller and route setup?
—
## ✅ Final Confirmed Use Case
– 🧑💼 **Staff** opens the app on **their phone**, enters the amount.
– 📱 A **QR code is shown** on the staff’s phone.
– 🧍♂️ **Customer** uses **Google Pay app on their own phone** to scan the QR code.
– 💳 Customer pays via **Google Pay (card or wallet)**.
– 📡 Your **PHP backend (e.g. CodeIgniter)** receives payment confirmation via webhook.
– 📦 Your DB is updated with the order as paid.
—
## ✅ What You Need to Know
### ❗ You **cannot generate a Google Pay QR code directly** for global card payments.
Google Pay does **not allow QR code generation** like:
://pay?...
outside India unless you're doing a **merchant-to-user UPI payment**.
—
## ✅ So How Do We Make It Work?
> You **use Stripe (or another gateway)** to generate a **hosted payment link**, and encode that **as a QR code**.
When the **customer scans the QR with their Google Pay app or browser**, they are redirected to Stripe Checkout — which **automatically shows a Google Pay button** if their device supports it.
—
## ✅ Technical Flow
1. **Staff app (Cordova)**:
– Enters amount
– Calls your backend: `create_payment.php?amount=1000&order_id=ORD123`
– Backend creates Stripe payment link
– App shows that link as a QR code
2. **Customer**:
– Uses phone camera or Google Pay app
– Scans QR
– Opens Stripe Checkout page
– Sees "Pay with Google Pay" option
– Pays → Stripe processes payment
3. **Your Backend**:
– Stripe triggers webhook (`checkout.session.completed`)
– Your CodeIgniter/PHP server updates the order as paid
—
## ✅ Full Example Code
### 🔹 Backend: `create_payment.php`
<?php
require 'vendor/autoload.php';
StripeStripe::setApiKey('sk_test_xxx');
$amount = $_GET['amount'] * 100; // in cents
$order_id = $_GET['order_id'];
$paymentLink = StripePaymentLink::create([
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => ['name' => 'Fossetts Ticket'],
'unit_amount' => $amount,
],
'quantity' => 1,
]],
'metadata' => ['order_id' => $order_id],
]);
echo json_encode(['link' => $paymentLink->url]);
—
### 🔹 Staff Cordova App (`index.html`)
<input type="number" id="amount" placeholder="Amount in USD" />
<button onclick="generateQR()">Generate QR</button>
<canvas id="qrcode"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script>
function generateQR() {
const amount = document.getElementById('amount').value;
const orderId = 'ORD' + Date.now();
fetch(`https://yourdomain.com/create_payment.php?amount=${amount}&order_id=${orderId}`)
.then(res => res.json())
.then(data => {
new QRious({
element: document.getElementById('qrcode'),
value: data.link,
size: 250
});
});
}
</script>
—
### 🔹 Webhook: `webhook.php`
require 'vendor/autoload.php';
StripeStripe::setApiKey('sk_test_xxx');
$payload = @file_get_contents("php://input");
$sig_header = $_SERVER["HTTP_STRIPE_SIGNATURE"];
$endpoint_secret = 'whsec_xxx';
try {
$event = StripeWebhook::constructEvent($payload, $sig_header, $endpoint_secret);
if ($event->type === 'checkout.session.completed') {
$session = $event->data->object;
$order_id = $session->metadata->order_id;
// ✅ Mark order as paid in DB
file_put_contents('orders_paid.log', "$order_idn", FILE_APPEND);
}
http_response_code(200);
} catch (Exception $e) {
http_response_code(400);
exit();
}
—
## 🧠 What Customer Sees When Scanning QR
– Opens Stripe checkout link
– Sees a page like:
Pay $10.00 to Fossetts Circus
[ Google Pay Button ]
[ Credit Card Form ]
– Taps Google Pay → completes payment securely
—
## ✅ Final Notes
– ✅ Google Pay works globally on Stripe checkout
– ✅ No need to implement Google Pay SDK
– ✅ Stripe handles fraud protection and PCI compliance
– ✅ Works on Android and iOS
– ✅ Order status is tracked via webhook (no need for polling)
—
Would you like:
– A full Cordova + PHP bundle zip?
– CodeIgniter controller + model for handling `create_payment` and `webhook`?
– Stripe Test Card + Google Pay test account instructions?
Let me know and I’ll give you the next steps.
But in your case, where you are:
> **Using Stripe (or another gateway) to handle Google Pay payments via hosted checkout pages**,
> and only showing the payment link as a **QR code**,
> then **you do NOT need a separate Google Pay developer account**.
—
## 🔍 Here’s the Difference:
### ✅ Option A: Stripe/Adyen/Mollie + Google Pay (Recommended for You)
| Do You Need Google Pay Developer Account? | ❌ No |
|——————————————|——|
| Why? Stripe handles the Google Pay setup, tokenization, compliance, etc.
| Google Pay will **automatically show up** on Stripe Checkout if:
– Customer is using Chrome (Android)
– They have Google Pay set up
– You're in a supported country and currency
🟢 *Just enable Google Pay in Stripe Dashboard → Settings → Payment Methods*
—
### ❌ Option B: You build your own custom Google Pay flow (Direct API)
| Do You Need Google Pay Developer Account? | ✅ Yes |
|——————————————-|——-|
| Why? You’re acting as the **merchant integrator**, using Google Pay JS SDK, so Google must:
– Approve your domain
– Verify your business
– Provide a Google Pay merchant ID
– Ensure you comply with PCI rules
🟡 *You must apply at https://pay.google.com/business/console*
—
## ✅ Summary
| Your Setup | Need Google Pay Dev Account? |
|————————————————–|——————————-|
| Stripe-hosted checkout with Google Pay | ❌ No |
| Showing QR that leads to Stripe Checkout | ❌ No |
| Building your own Google Pay checkout | ✅ Yes |
| Using Google Pay API directly in Cordova | ✅ Yes |
—
Since you are using the **QR + Stripe-hosted Google Pay flow**,
you can get started immediately — **no Google Pay developer account is needed**.
Let me know if you’d like help enabling Google Pay in your Stripe dashboard or testing Google Pay in sandbox mode.
> **Staff enters an amount on their phone (Cordova app)** →
> **Customer taps their phone (with Google Pay) to the staff phone** →
> **Payment is processed via Google Pay**
—
## ⚠️ Important Clarification
🛑 **Google Pay NFC tap-to-pay only works one way:**
> **Customer's phone with Google Pay → taps to a payment terminal (or supported merchant device)**
🟠 A **regular Android phone (like staff's)** cannot act as a **payment terminal** unless it has **Tap-to-Phone (SoftPOS)** technology enabled and certified.
—
## ✅ So What Are Your Real Options?
### Option 1: ✅ **Use Google Tap-to-Phone (SoftPOS)** (True "tap to pay" on staff phone)
| Feature | Description |
|—————————|————-|
| Staff phone acts as NFC terminal | Yes ✅ |
| Customer taps with Google Pay | Yes ✅ |
| Requires Google/EMV certification | Yes ⚠️ |
| Needs special SDK + merchant acquirer | Yes (e.g. Worldline, Stripe Terminal) |
🔹 **This is possible**, but only with **certified Tap-to-Phone SDKs** and a merchant payment provider like:
– **Stripe Terminal**
– **Worldline SoftPOS**
– **Fiserv Clover**
– **Visa/Mastercard SoftPOS Partners**
🟡 These are **not free** and require onboarding, contracts, and proper certification.
—
### Option 2: ✅ **Stick to QR Payment (Easy + Realistic)**
| Feature | Description |
|——————————-|——————————–|
| Staff enters amount | ✅ Supported in Cordova |
| Customer scans QR | ✅ Works with Stripe Checkout |
| Customer pays with Google Pay | ✅ Fully supported |
| Easy to implement | ✅ No NFC needed |
🟢 You can implement this in 1–2 days with Stripe (as described earlier) and it's reliable, secure, and globally supported.
—
### Option 3: ✅ NFC Payment Using Stripe Terminal SDK (for Tap-to-Phone)
If you **really want tap-to-pay**, you'll need to:
– Partner with Stripe Terminal or SoftPOS providers
– Use Android NFC with PCI-certified SDKs
– Likely leave Cordova (requires native Android integration)
📌 This is complex, requires business registration and Stripe Terminal onboarding.
—
## 🔧 Recommendation for You (Right Now)
> Build the **staff-facing Cordova app** that:
– Accepts an amount
– Generates a Stripe payment link
– Shows it as QR
– Optionally also shows a button: “Customer can tap to pay (coming soon)”
– Focus on QR flow (already supported by Google Pay)
—
## ✅ If You Still Want Tap-to-Pay
Let me know, and I can:
– Help you apply for **Stripe Terminal or SoftPOS partnership**
– Guide you in integrating a **native Android Tap-to-Phone SDK** outside Cordova
– Build a hybrid flow where **staff shows QR and NFC simultaneously**
—
Would you like:
– The Cordova QR code app with Stripe fully packaged?
– A roadmap to go live with SoftPOS in future?
Let’s move forward based on your preferred direction: **simple QR now or full Tap-to-Pay later**.