You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
myworkspace (Team ID: T123ABC456)
User ID: U123ABC456
Last updated: 2024-02-04 12:00:00 -07:00
Authorization Level: Workspace
window.paypal
.Buttons({
style: {
shape: "rect",
layout: "vertical",
},
async createSubscription() {
try {
const response = await fetch("/api/paypal/create-subscription", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ userAction: "SUBSCRIBE_NOW" }),
});
const data = await response.json();
if (data?.id) {
resultMessage(Successful subscription...<br><br>);
return data.id;
} else {
console.error(
{ callback: "createSubscription", serverResponse: data },
JSON.stringify(data, null, 2),
);
// (Optional) The following hides the button container and shows a message about why checkout can't be initiated
const errorDetail = data?.details?.[0];
resultMessage( Could not initiate PayPal Subscription...<br><br>${ errorDetail?.issue || "" } ${errorDetail?.description || data?.message || ""} +
(data?.debug_id ? (${data.debug_id}) : ""),
{ hideButtons: true },
);
}
} catch (error) {
console.error(error);
resultMessage( Could not initiate PayPal Subscription...<br><br>${error},
);
}
},
onApprove(data) {
/*
No need to activate manually since SUBSCRIBE_NOW is being used.
Learn how to handle other user actions from our docs: https://developer.paypal.com/docs/api/subscriptions/v1/#subscriptions_create
*/
if (data.orderID) {
resultMessage( You have successfully subscribed to the plan. Your subscription id is: ${data.subscriptionID},
);
} else {
resultMessage( Failed to activate the subscription: ${data.subscriptionID},
);
}
},
})
.render("#paypal-button-container"); // Renders the PayPal button
// Example function to show a result to the user. Your site's UI library can be used instead.
function resultMessage(message) {
const container = document.querySelector("#result-message");
container.innerHTML = message;
}
window.paypal
.Buttons({
style: {
shape: "rect",
layout: "vertical",
},
async createOrder() {
try {
const response = await fetch("/api/orders", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
// use the "body" param to optionally pass additional order information
// like product ids and quantities
body: JSON.stringify({
cart: [
{
id: "YOUR_PRODUCT_ID",
quantity: "YOUR_PRODUCT_QUANTITY",
},
],
}),
});
const orderData = await response.json();
if (orderData.id) {
return orderData.id;
} else {
const errorDetail = orderData?.details?.[0];
const errorMessage = errorDetail
? `${errorDetail.issue} ${errorDetail.description} (${orderData.debug_id})`
: JSON.stringify(orderData);
throw new Error(errorMessage);
}
} catch (error) {
console.error(error);
resultMessage(`Could not initiate PayPal Checkout...<br><br>${error}`);
}
},
async onApprove(data, actions) {
try {
const response = await fetch(`/api/orders/${data.orderID}/capture`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
});
const orderData = await response.json();
// Three cases to handle:
// (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
// (2) Other non-recoverable errors -> Show a failure message
// (3) Successful transaction -> Show confirmation or thank you message
const errorDetail = orderData?.details?.[0];
if (errorDetail?.issue === "INSTRUMENT_DECLINED") {
// (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
// recoverable state, per https://developer.paypal.com/docs/checkout/standard/customize/handle-funding-failures/
return actions.restart();
} else if (errorDetail) {
// (2) Other non-recoverable errors -> Show a failure message
throw new Error(`${errorDetail.description} (${orderData.debug_id})`);
} else if (!orderData.purchase_units) {
throw new Error(JSON.stringify(orderData));
} else {
// (3) Successful transaction -> Show confirmation or thank you message
// Or go to another URL: actions.redirect('thank_you.html');
const transaction =
orderData?.purchase_units?.[0]?.payments?.captures?.[0] ||
orderData?.purchase_units?.[0]?.payments?.authorizations?.[0];
resultMessage(
`Transaction ${transaction.status}: ${transaction.id}<br><br>See console for all available details`,
);
console.log(
"Capture result",
orderData,
JSON.stringify(orderData, null, 2),
);
}
} catch (error) {
console.error(error);
resultMessage(
`Sorry, your transaction could not be processed...<br><br>${error}`,
);
}
},
})
.render("#paypal-button-container");
// Example function to show a result to the user. Your site's UI library can be used instead.
function resultMessage(message) {
const container = document.querySelector("#result-message");
container.innerHTML = message;
} https://www.facebook.com/share/r/e6q9dMD4yYw69Gi4/?mibextid=saVFRoimport express from "express";
import fetch from "node-fetch";
import "dotenv/config";
import path from "path";
const { PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PORT = 8888 } = process.env;
const base = "https://api-m.sandbox.paypal.com";
const app = express();
const data = await response.json();
return data.access_token;
} catch (error) {
console.error("Failed to generate Access Token:", error);
}
};
/**
Create an order to start the transaction.
@seehttps://developer.paypal.com/docs/api/orders/v2/#orders_create
*/
const createOrder = async (cart) => {
// use the cart information passed from the front-end to calculate the purchase unit details
console.log(
"shopping cart information passed from the frontend createOrder() callback:",
cart,
);
📋 Run the following slash command in any Slack channel or DM
This will open a modal with user permissions for you to approve
Once approved, a challenge code will be generated in Slack
$ slack auth list
myworkspace (Team ID: T123ABC456)
User ID: U123ABC456
Authorization Level: Workspace
window.paypal
.Buttons({
style: {
shape: "rect",
layout: "vertical",
},
async createSubscription() {
try {
const response = await fetch("/api/paypal/create-subscription", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ userAction: "SUBSCRIBE_NOW" }),
});
const data = await response.json();
if (data?.id) {
resultMessage(
Successful subscription...<br><br>);return data.id;
} else {
console.error(
{ callback: "createSubscription", serverResponse: data },
JSON.stringify(data, null, 2),
);
// (Optional) The following hides the button container and shows a message about why checkout can't be initiated
const errorDetail = data?.details?.[0];
resultMessage(
Could not initiate PayPal Subscription...<br><br>${ errorDetail?.issue || "" } ${errorDetail?.description || data?.message || ""}+(data?.debug_id ?
(${data.debug_id}): ""),{ hideButtons: true },
);
}
} catch (error) {
console.error(error);
resultMessage(
Could not initiate PayPal Subscription...<br><br>${error},);
}
},
onApprove(data) {
/*
No need to activate manually since SUBSCRIBE_NOW is being used.
Learn how to handle other user actions from our docs:
https://developer.paypal.com/docs/api/subscriptions/v1/#subscriptions_create
*/
if (data.orderID) {
resultMessage(
You have successfully subscribed to the plan. Your subscription id is: ${data.subscriptionID},);
} else {
resultMessage(
Failed to activate the subscription: ${data.subscriptionID},);
}
},
})
.render("#paypal-button-container"); // Renders the PayPal button
// Example function to show a result to the user. Your site's UI library can be used instead.
function resultMessage(message) {
const container = document.querySelector("#result-message");
container.innerHTML = message;
}
window.paypal
.Buttons({
style: {
shape: "rect",
layout: "vertical",
},
async createOrder() {
try {
const response = await fetch("/api/orders", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
// use the "body" param to optionally pass additional order information
// like product ids and quantities
body: JSON.stringify({
cart: [
{
id: "YOUR_PRODUCT_ID",
quantity: "YOUR_PRODUCT_QUANTITY",
},
],
}),
});
})
.render("#paypal-button-container");
// Example function to show a result to the user. Your site's UI library can be used instead.
function resultMessage(message) {
const container = document.querySelector("#result-message");
container.innerHTML = message;
}
https://www.facebook.com/share/r/e6q9dMD4yYw69Gi4/?mibextid=saVFRoimport express from "express";
import fetch from "node-fetch";
import "dotenv/config";
import path from "path";
const { PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PORT = 8888 } = process.env;
const base = "https://api-m.sandbox.paypal.com";
const app = express();
// host static files
app.use(express.static("client"));
// parse post params sent in body in json format
app.use(express.json());
/**
Generate an OAuth 2.0 access token for authenticating with PayPal REST APIs.
@see https://developer.paypal.com/api/rest/authentication/
*/
const generateAccessToken = async () => {
try {
if (!PAYPAL_CLIENT_ID || !PAYPAL_CLIENT_SECRET) {
throw new Error("MISSING_API_CREDENTIALS");
}
const auth = Buffer.from(
PAYPAL_CLIENT_ID + ":" + PAYPAL_CLIENT_SECRET,
).toString("base64");
const response = await fetch(
${base}/v1/oauth2/token, {method: "POST",
body: "grant_type=client_credentials",
headers: {
Authorization:
Basic ${auth},},
});
const data = await response.json();
return data.access_token;
} catch (error) {
console.error("Failed to generate Access Token:", error);
}
};
/**
*/
const createOrder = async (cart) => {
// use the cart information passed from the front-end to calculate the purchase unit details
console.log(
"shopping cart information passed from the frontend createOrder() callback:",
cart,
);
const accessToken = await generateAccessToken();
const url =
${base}/v2/checkout/orders;const payload = {
intent: "CAPTURE",
purchase_units: [
{
amount: {
currency_code: "USD",
value: "100.00",
},
},
],
};
const response = await fetch(url, {
headers: {
"Content-Type": "application/json",
Authorization:
Bearer ${accessToken},// Uncomment one of these to force an error for negative testing (in sandbox mode only). Documentation:
// https://developer.paypal.com/tools/sandbox/negative-testing/request-headers/
// "PayPal-Mock-Response": '{"mock_application_codes": "MISSING_REQUIRED_PARAMETER"}'
// "PayPal-Mock-Response": '{"mock_application_codes": "PERMISSION_DENIED"}'
// "PayPal-Mock-Response": '{"mock_application_codes": "INTERNAL_SERVER_ERROR"}'
},
method: "POST",
body: JSON.stringify(payload),
});
return handleResponse(response);
};
/**
*/
const captureOrder = async (orderID) => {
const accessToken = await generateAccessToken();
const url =
${base}/v2/checkout/orders/${orderID}/capture;const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization:
Bearer ${accessToken},// Uncomment one of these to force an error for negative testing (in sandbox mode only). Documentation:
// https://developer.paypal.com/tools/sandbox/negative-testing/request-headers/
// "PayPal-Mock-Response": '{"mock_application_codes": "INSTRUMENT_DECLINED"}'
// "PayPal-Mock-Response": '{"mock_application_codes": "TRANSACTION_REFUSED"}'
// "PayPal-Mock-Response": '{"mock_application_codes": "INTERNAL_SERVER_ERROR"}'
},
});
return handleResponse(response);
};
async function handleResponse(response) {
try {
const jsonResponse = await response.json();
return {
jsonResponse,
httpStatusCode: response.status,
};
} catch (err) {
const errorMessage = await response.text();
throw new Error(errorMessage);
}
}
app.post("/api/orders", async (req, res) => {
try {
// use the cart information passed from the front-end to calculate the order amount detals
const { cart } = req.body;
const { jsonResponse, httpStatusCode } = await createOrder(cart);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to create order:", error);
res.status(500).json({ error: "Failed to create order." });
}
});
app.post("/api/orders/:orderID/capture", async (req, res) => {
try {
const { orderID } = req.params;
const { jsonResponse, httpStatusCode } = await captureOrder(orderID);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to create order:", error);
res.status(500).json({ error: "Failed to capture order." });
}
});
// serve index.html
app.get("/", (req, res) => {
res.sendFile(path.resolve("./client/checkout.html"));
});
app.listen(PORT, () => {
console.log(
Node server listening at http://localhost:${PORT}/);});{
"KPlugin": {
"Authors": [
{
"Name": "various"
}
],
"Category": "Application Launchers",
"Description": "Search Applications and more",
"EnabledByDefault": true,
"Icon": "start-here-kde",
"Id": "org.kde.plasma.simplekickoff",
"License": "GPL-2.0+",
"Name": "Simple Application Launcher",
"ServiceTypes": [
"Plasma/Applet"
],
"Version": "2.5"
},
"X-Plasma-Provides": [
"org.kde.plasma.launchermenu"
],
"X-Plasma-RequiredExtensions": [
"LaunchApp"
]
}
Error
Error while processing login response: { "errorMessage": "", "errorCode": 512 }.address.
Code: REG-PAYGO-UPGRADE-ATSA7PBB2ZPC1Code: REG-PAYGO-UPGRADE-BTZMHDT82LPC5 #Copy .env.example to .env:
📋 Run the following slash command in any Slack channel or DM
This will open a modal with user permissions for you to approve
Once approved, a challenge code will be generated in Slack
/slackauthticket ABC123defABC123defABC123defABC123defXYZ
? Enter challenge code
? Enter challenge code eXaMpLeCoDe
✅ You've successfully authenticated! 🎉
Authorization data was saved to ~/.slack/credentials.json
💡 Get started by creating a new app with slack create my-app
Explore the details of available commands with slack help
$ slack auth list
myworkspace (Team ID: T123ABC456)
User ID: U123ABC456
Last updated: 2023-01-01 12:00:00 -07:00
Authorization Level: Workspace
slack create my-app --template https://github.com/slack-samples/deno-starter-template
? Choose a local environment