綠界ECPAY平台串接 – Payment API

更新於 發佈於 閱讀時間約 14 分鐘

※ 在前端畫面顯示ECPay:

● 優化前端:views → index.ejs

<!-- 新增按鈕 -->
<div>
<button>綠界支付</button>
</div>


● 在Vue 組件的資料定義中,新增buyItem來存儲購買的項目和數量:javascripts → index.js

createApp({
data() {
return {
serverDomain: 'http://localhost:30000',
buyItem: {}, //{"1":8, "2": 5/"id":"amount"}
products: []
}
},

}).mount('#app');

程式碼解說:

  • serverDomain
    • serverDomain: 'http://localhost:30000' 用於設定伺服器的域名,這樣可以在其他方法中使用這個變數來構建請求 URL。
  • buyItem
    • buyItem: {} 初始化為一個空物件,用於存儲購買的項目及其數量。例如,{"1":8, "2":5} 表示產品 ID 為 1 的項目購買了 8 件,產品 ID 為 2 的項目購買了 5 件。
  • products
    • products: [] 初始化為一個空陣列,用於存儲產品的詳細信息。這個陣列會在後續的操作中被填充,例如從伺服器獲取產品列表。


● 使用 {{ buyItem }} ,在模板中顯示資料:views → index.ejs

<body>
<div id="app">
{{buyItem}}
</div>
</body>

● 使用v-model 綁定元件,讓產品資料即時更新和顯示:views → index.ejs

  <td>
<input v-model="buyItem[product.id]" type="number" min="0" max="100" step="1">
</td>


● 結果:

raw-image


● 根據購買項目生成詳細的產品資料:javascripts → index.js

createApp({
data() {
return {
buyItem: {}, //{"1":8, "2": 5/"id":"amount"}
products: []
}
},

methods: {
getItemDetailByBuyItem() {
return Object.entries(this.buyItems).map(([id, amount]) => ({
productId: Number(id),
price: this.products.find(product => product.id === Number(id)).price,
amount: Number(amount)
})); //[{productId:1, price: 100, amount: 9}]
}
}

}).mount('#app');

程式碼解說:

getItemDetailByBuyItem 方法:
  • 這個方法返回一個新陣列,陣列中的每個項目都包含購買的產品詳情(productId、price 和 amount)。

Object.entries(this.buyItems)
  • 將 buyItems 物件轉換為一個由鍵值(keyvalue)組合的陣列。
  • buyItems 物件結構類似 { "1": 8, "2": 5 },轉換後的陣列為 [ ["1", 8], ["2", 5] ]。在這個陣列中,每個元素都是一個陣列,其中包含兩個值:第一個值是鍵(產品ID),第二個值是對應的值(購買數量)。

  • .map(([id, amount]) => ({...}))
    • 使用 map 方法遍歷 buyItems 的每一個鍵值對(即產品 ID 和購買數量)。
    • 把每個鍵值對轉換成一個包含產品細節的物件。
  • Number(id)
    • 將產品 ID 從字串轉換為數字。

this.products.find(product => product.id === Number(id)).price

  • 在 products 陣列中尋找對應 ID 的產品,並獲取其價格。

Number(amount)

  • 將購買數量從字串轉換為數字。

●發送付款請求:javascripts → index.js

createApp({
data() {
return {
buyItem: {}, //{"1":8, "2": 5/"id":"amount"}
products: []
}
},
//打API
async sendPayment(url, date) {
try {
fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
cors: 'no-cors',
body: JSON.stringify(data)
})
.then((res) => {

            if (res.ok) return res.json();

            return res.json().then((json) => Promise.reject(json));

          });

        return result;


} catch (e) {
console.error('~ file: index.js ~ line 32 ~ sendPayment ~ e', e)
throw new Error(e)
}
}

}

}).mount('#app');

程式碼解說:

  • 非同步函數 (async):
    • 這是定義了一個名為 sendPayment 的非同步函數,表示在函數內部可以使用 await 關鍵字來等待非同步操作完成。
  • fetch 方法:
    • 用於向指定的 URL 發送 HTTP 請求。
    • 用於發送一個 POST 請求,並將 data 作為請求的主體。
  • 請求設置:
    • method: 'POST':指定請求方法為 POST。
    • headers: { 'Content-Type': 'application/json' }:設定請求標頭,表示請求內容的格式是 JSON。
    • cors: 'no-cors':設定跨域請求策略。(no-cors:禁止跨域請求訪問某些資源。)
    • body: JSON.stringify(data):將 data 物件轉換為 JSON 字符串,並作為請求體發送。

處理回應:

.then((res) => { ... }):處理 fetch 方法返回的 Promise。

  • if (res.ok):檢查回應的狀態。如果 res.ok 為 true,表示請求成功,返回解析後的 JSON。
  • return res.json().then((json) => Promise.reject(json)):如果請求失敗,返回解析後的 JSON 並將其作為被拒絕的 Promise。
  • 錯誤處理 (try...catch):
    • 如果發送請求時出現錯誤,會在控制台中記錄錯誤訊息,並拋出一個新的錯誤。

● ECPay支付:javascripts → index.js

async ECPay() {

//檢查 buyItems 是否為空

if (!Object.keys(this.buyItems).length) return alert('沒有選項')
// 處理 items 陣列中的每個產品詳細內容
const items = this.getItemDetailByBuyItem();
console.log('~ file: index.js ~ line 50 ~ ECPay ~ items', items);
//發送支付請求
const result = await this.sendPayment(`${this.serverDomain}/orders/create`),
{
paymentProvider: "ECPAY",
paymentWay: "CVS",
contents: items,
});
console.log(result);
}
}

程式碼解說:

非同步函數 (async)
  • async 關鍵字表示這是一個非同步函數,可以使用 await 關鍵字來等待非同步操作完成。

檢查 buyItems 是否為空

if (!Object.keys(this.buyItems).length) return alert('沒有選項');
    • 使用 Object.keys(this.buyItems) 來獲取 buyItems 物件的所有鍵(即項目ID)的陣列。
    • Object.keys(this.buyItems).length 返回這個陣列的長度。如果 buyItems 中沒有任何項目,這個長度將為 0。
  • 條件判斷
    • if (!Object.keys(this.buyItems).length) 判斷 buyItems 是否為空。如果是空的(長度為0),則條件為真。
  • 提示訊息
    • 如果條件為真,則執行 alert('沒有選項'),彈出一個提示框,顯示訊息「沒有選項」。

處理購物車項目

const items = this.getItemDetailByBuyItem();
console.log('~ file: index.js ~ line 50 ~ ECPay ~ items', items);
  • 調用 getItemDetailByBuyItem 方法,將 buyItems 中的每個項目轉換為詳細的產品資訊物件,並將結果賦值給 items 變數。
  • 使用 console.logitems 內容輸出到控制台以便檢查。

發送支付請求

const result = await this.sendPayment(`${this.serverDomain}/orders/create`, {
paymentProvider: "ECPAY",
paymentWay: "CVS",
contents: items,
});
console.log(result);
  • 使用 await 調用 sendPayment 方法,向 serverDomain/orders/create 發送一個支付請求。
  • sendPayment 方法會向 ${this.serverDomain}/orders/create 這個 URL 發送一個 HTTP POST 請求,包括支付提供者(paymentProvider)、支付方式(paymentWay)和購物車內容(contents)。
  • 將支付請求的結果賦值給 result 變數,並輸出到控制台。

● ECPay支付綁定到Button:views → index.ejs

 <!-- 新增按鈕 -->
<div>
<button @click="ECPay">綠界支付</button>
</div>

程式碼解說:

@click="ECPay" 表示當按鈕被點擊時會觸發 ECPay 方法,包括檢查購物車項目、獲取購買項目詳細資訊並發送支付請求。

@clickVue.js 中的事件綁定語法,等同於 v-on:click。它用來監聽按鈕的點擊事件,並在點擊時執行指定的方法。



● 成功畫面:

1.前端畫面

raw-image

2.MySQL - ORDERS畫面

raw-image







留言
avatar-img
留言分享你的想法!
avatar-img
奧莉薇走在成為後端工程師之路上
18會員
138內容數
全端網頁開發專業知識分享
2025/04/26
※ 場景: 即時聊天應用: 設計一個支持多房間功能的即時聊天平台,像 WhatsApp、LINE或Facebook Messenger,提供文字、語音、視訊聊天功能,方便管理群組聊天。 功能亮點:加入特別功能,例如可加入多房間功能、使用者名單、表情符號支持、文件分享或訊息已讀未讀狀態。 展示
2025/04/26
※ 場景: 即時聊天應用: 設計一個支持多房間功能的即時聊天平台,像 WhatsApp、LINE或Facebook Messenger,提供文字、語音、視訊聊天功能,方便管理群組聊天。 功能亮點:加入特別功能,例如可加入多房間功能、使用者名單、表情符號支持、文件分享或訊息已讀未讀狀態。 展示
2025/04/26
※ 先建立基本的express後端服務: 1.建立新資料夾:Socket mkdir socket 2.進入資料夾:Socket cd ​bsocket 3. 安裝 Experss 到專案中 npm init -y //初始化專案,建立 package.json 檔 npm insta
Thumbnail
2025/04/26
※ 先建立基本的express後端服務: 1.建立新資料夾:Socket mkdir socket 2.進入資料夾:Socket cd ​bsocket 3. 安裝 Experss 到專案中 npm init -y //初始化專案,建立 package.json 檔 npm insta
Thumbnail
2025/04/10
※ 什麼是 Socket.io:一個基於傳統 WebSocket API 之上的框架。 ※ Socket.io常用功能: Custom Events:在 Socket.io 中,開發者可以創建自己的事件來處理特定的功能或需求。 Rooms:分組的功能。每個連接的用戶(或稱為 socket)可
Thumbnail
2025/04/10
※ 什麼是 Socket.io:一個基於傳統 WebSocket API 之上的框架。 ※ Socket.io常用功能: Custom Events:在 Socket.io 中,開發者可以創建自己的事件來處理特定的功能或需求。 Rooms:分組的功能。每個連接的用戶(或稱為 socket)可
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
※ 在前端畫面顯示ECPay: ● 優化前端:views → index.ejs <!-- 新增按鈕 --> <div> <button>綠界支付</button> </div> ● 在Vue 組件的資料定義中,新增buyItem來存儲購買的項目和數量:java
Thumbnail
※ 在前端畫面顯示ECPay: ● 優化前端:views → index.ejs <!-- 新增按鈕 --> <div> <button>綠界支付</button> </div> ● 在Vue 組件的資料定義中,新增buyItem來存儲購買的項目和數量:java
Thumbnail
※ 綠界科技API平台: https://www.ecpay.com.tw/ ● 進到開發者中心: ● API串接規格文件: ● 使用SDK來串接Node.JS 的WEB SERVICE: ● 綠界 全方位(All In One)金流介接Node.js 第一版: 載點:htt
Thumbnail
※ 綠界科技API平台: https://www.ecpay.com.tw/ ● 進到開發者中心: ● API串接規格文件: ● 使用SDK來串接Node.JS 的WEB SERVICE: ● 綠界 全方位(All In One)金流介接Node.js 第一版: 載點:htt
Thumbnail
本篇文章提供清晰的步驟與代碼,指導開發者如何在實際項目中設置和使用 CandyPay。無論是新手還是有經驗的開發者,您都可以輕鬆掌握如何將這一強大的支付工具無縫整合到應用中,並實現加密貨幣支付功能。文章中還介紹了 NFT-Based Discount 的設置方法,幫助商家擴展客戶忠誠度。
Thumbnail
本篇文章提供清晰的步驟與代碼,指導開發者如何在實際項目中設置和使用 CandyPay。無論是新手還是有經驗的開發者,您都可以輕鬆掌握如何將這一強大的支付工具無縫整合到應用中,並實現加密貨幣支付功能。文章中還介紹了 NFT-Based Discount 的設置方法,幫助商家擴展客戶忠誠度。
Thumbnail
CandyPay 是一個使用 Solana 區塊鏈的 Payment solution,企業只需撰寫幾行程式碼,即可將這個支付基礎設施整合到自己的應用中,並開始接受 Solana Payments。這使得企業能夠輕鬆利用 Solana 提供的快速、低成本的去中心化支付網路。 值得一提的是,Cand
Thumbnail
CandyPay 是一個使用 Solana 區塊鏈的 Payment solution,企業只需撰寫幾行程式碼,即可將這個支付基礎設施整合到自己的應用中,並開始接受 Solana Payments。這使得企業能夠輕鬆利用 Solana 提供的快速、低成本的去中心化支付網路。 值得一提的是,Cand
Thumbnail
本文指导如何添加自定义公链,介绍两种方法:通过 Chainlist 添加和手动设置,支持添加多种公链节点,包括以太坊、币安智能链、火币生态链等,方便用户在浏览器中使用自定义公链。 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码
Thumbnail
本文指导如何添加自定义公链,介绍两种方法:通过 Chainlist 添加和手动设置,支持添加多种公链节点,包括以太坊、币安智能链、火币生态链等,方便用户在浏览器中使用自定义公链。 🚀 币安 - 全球最大加密货币交易所 💥 独家优惠 💥 💰 注册即享 20% 手续费返佣 🔑 专属邀请码
Thumbnail
Wassup! This is 就這樣踏進Web3.0 & Economic 的路易斯。 前幾篇提供了 Solana Payment 以及 Stripe Payment 等相關介紹。 這次!電子支付巨頭PayPal也即將瓜分穩定幣的這塊大餅啦!!!!
Thumbnail
Wassup! This is 就這樣踏進Web3.0 & Economic 的路易斯。 前幾篇提供了 Solana Payment 以及 Stripe Payment 等相關介紹。 這次!電子支付巨頭PayPal也即將瓜分穩定幣的這塊大餅啦!!!!
Thumbnail
Wassup 各位,我是就這樣栽進Web3.0 & Economic的路易斯! 秉持著Simple Is Good,我會盡量簡單解釋接下來的內容。 上一篇談到說『企業主如何設置Stripe USDC』,講白一點就是 店家開始用Stripe平台提供顧客用USDC付款啦! 那比較傳統法幣呢?
Thumbnail
Wassup 各位,我是就這樣栽進Web3.0 & Economic的路易斯! 秉持著Simple Is Good,我會盡量簡單解釋接下來的內容。 上一篇談到說『企業主如何設置Stripe USDC』,講白一點就是 店家開始用Stripe平台提供顧客用USDC付款啦! 那比較傳統法幣呢?
Thumbnail
Wassup ! This is 就這樣栽進Web 3.0 & Economic 的路易斯。 秉持著Simple Is good,盡我所能讓讀者們看了就能理解。 這次就要來介紹: 『如果你是企業主,該如何設置 Stripe USDC?』
Thumbnail
Wassup ! This is 就這樣栽進Web 3.0 & Economic 的路易斯。 秉持著Simple Is good,盡我所能讓讀者們看了就能理解。 這次就要來介紹: 『如果你是企業主,該如何設置 Stripe USDC?』
Thumbnail
This is 就這樣栽進Web 3.0 &Economic 的路易斯啦!!!! 接續著上一篇的內容,還沒看過的,來吧!點開來吧嘿嘿~ Solana Payment:顛覆傳統的新世代低費用去中心化支付系統!Ep1. 秉持著Simple Is Good,一樣用簡單易懂的方式
Thumbnail
This is 就這樣栽進Web 3.0 &Economic 的路易斯啦!!!! 接續著上一篇的內容,還沒看過的,來吧!點開來吧嘿嘿~ Solana Payment:顛覆傳統的新世代低費用去中心化支付系統!Ep1. 秉持著Simple Is Good,一樣用簡單易懂的方式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News