<!--顯示paypal 按鈕-->
<div id="paypal-area"></div>
<!--使用paypal JavaScript SDK -->
<script src="https://www.paypal.com/sdk/js?client-id=YOUR_CLIENT_ID"></script>
<script src="https://www.paypal.com/sdk/js?client-id=<%= pay_pal_client_id %>"></script>
router.get('/', function (_req, res, _next) {
logger.info('hello Express');
res.render('index', { title: 'Express', pay_pal_client_id: process.env.PAYPAL_CLIENT_ID,
});
});
程式碼說明:
為確保PayPal 客戶端 ID不會直接在代碼中顯示,pay_pal_client_id設置為 process.env環境變數。
PAYPAL_CLIENT_ID = 你的client-id
PAYPAL_CLIENT_SECRET = 你的CLIENT_SECRET KEY
將PayPal按鈕放在mounted裡面:畫面被渲染前先去執行抓API的動作
async mounted() {
this.products = await fetch(`${serverDomain}/products/list`)
.then((res) => res.json());
paypal.Buttons({
createOrder: (data, actions)=> {
//串接我們自己的server code.
//從購買項目中獲取詳細訊息,並將這些訊息存儲在 items
const items = this.getItemDetailByBuyItems();
const result = await this.sendPayment(`${this.serverDomain}/orders/create`,
{
paymentProvider: "PAYPAL",
paymentWay: "PAYPAL",
contents: items,
});
console.log("🚀 ~ mounted ~ result:", result);
//提取數據
return result.data;
},
},
onApprove: (data, actions) => {
console.log("🚀 ~ mounted ~ data:", data)
return actions.order.capture();
}
}).render('#paypal-area');//渲染到指定位置
},
程式碼說明:
=>
) 代替傳統的函數表達式,可以使代碼更簡潔易讀,同時保持上下文的 this
綁定。paypal.Buttons
函數:這個函數初始化網頁上的 PayPal 按鈕。createOrder
函數:當用戶點擊 PayPal 按鈕時,這個函數會被調用。它應該返回一個 Promise,該 Promise 會解決想要創建的訂單 ID。onApprove: (data, actions)
是一個回調函數,它在用戶完成支付批准後被調用。data
參數:這個參數包含了有關交易的訊息,例如訂單 ID。actions
參數:這個參數提供了一些方法來處理交易。 actions.order.capture()
是用來「完成交易並確認付款」。render
方法:這個用在網頁的特定元素上顯示 PayPal 按鈕(#paypal-area
)。1. const items = this.getItemDetailByBuyItems();
這行代碼的作用是從某個方法(getItemDetailByBuyItems
)中獲取購買項目的詳細訊息,並將其存儲在 items
常量中。用於處理訂單、顯示購買項目的詳情或進行其他相關操作。
2. const result = await this.sendPayment(
${this.serverDomain}/orders/create, { ... })
:
請求的 payload 包含三個欄位:paymentProvider(支付提供者,設為 "PAYPAL"),paymentWay(支付方式,設為 "PAYPAL"),以及 contents(購買項目的詳細信息,存儲在 items 中)。
3.return result.data
:
4.
result.data
:從伺服器回應對象中提取的數據部分。伺服器回應的數據部分通常包含應用程序需要使用的實際內容,例如訂單詳情、支付訊息等。
export const paymentDispatcher = async ({
paymentProvider,
paymentWay,
payload,
}: {
...
}) => {
const ecpay = new ECPayAdapter();
if (paymentProvider === PaymentProvider.ECPAY) {
...
} else if (paymentProvider === PaymentProvider.PAYPAL) {
//TODO
return "1";//想要空字串
}
};