iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
Software Development

做一支專屬自己學校的課程評價 LINE Bot 吧!系列 第 30

[Day 30] LINE PAY API V3 Python 金流串接指南 (下) - Confirm API

  • 分享至 

  • xImage
  •  

前情提要

付款之後呢?

若消費者成功付款,LINE 會自動將頁面跳轉至 confirmUrl 中的網址,在這個確認頁面中,開發者可以藉由呼叫 Confirm API 再次確認是否付款成功。
confirmUrl

confirmUrl 確認頁面示意圖,而 Confirm API 應被由後端呼叫,不可在前端呼叫 (會暴露金鑰資訊)。

Confirm API

  • [POST] /v3/payments/{transaction_id}/confirm
  • Confirm API 用來再次確認消費者是不是真的有付款成功,而不是餘額不足/跳掉網頁/刷卡失敗等情況。而官方說明為「在用戶確認付款後,商家可透過 confirmUrl,來完成交易。」

確認頁面 confirmUrl 中的網址帶有交易參數

LINE 會自動將頁面跳轉至 confirmUrl 中的網址其實會帶有如以下的參數格式:
https://{confirmUrl 網址}?transactionId=2024101402232131210&orderId=432458494weet4r8weqed3a_2errer2qe

仔細看裡面有 transactionId 以及 orderId 兩參數。transactionId 是 LINE 所提供的交易 ID,orderId 則是我們在 Request API 所宣告的訂單 ID。

編寫邏輯

confirmUrl 我們需要將 transactionIdorderId 從網址中抓取,並傳到後端成為 Confirm API 的 Input,有幾個參數需要注意:

  • 後端要準備好該筆訂單的總額 amount 放在 body 與 LINE 進行核對
class ConfirmView(APIView):
    def get(self, request):
        # 從網址中抓取 transactionId
        transaction_id = request.query_params.get("transactionId")
        
        # 從網址中抓取 orderId
        order_id = request.query_params.get("orderId")
        
        # 準備發送的 confirm API
        url = f"/v3/payments/{transaction_id}/confirm"
        request_url = f"{base_url}{url}"
        
        # 該筆訂單的總額與幣值
        body = {
            "amount": 30,
            "currency": "TWD",
        }
        body_json = json.dumps(body)
        
        # 呼叫 API Authentication 函式
        headers = generate_headers(body_json, channel_secret, url)
        response = requests.post(request_url, headers=headers, data=body_json)
        data = response.json()
        
        # 成功的代碼是 0000
        if data["returnCode"] == "0000":
            return Response({"detail": f"付款成功"}, status=200)
            
        # 這筆交易重複確認過了! 代碼是 1172
        elif data["returnCode"] == "1172":
            return Response(
                {"detail": f"1172 transaction repeat!"},
                status=500,
            )
            
        # 其他錯誤代碼
        else:
            return Response(
                {"detail": f"confirm to LINE failed: {data['returnCode']}"},
                status=500,
            )
     

如果回傳 0000,就可以導回首頁或是消費者訂單頁面。若為 1172 可能是消費者重複進入了這個網址,或是操作重新整理,此時就會報錯誤,此時建議跳轉回訂單頁面。若是其他錯誤可參考官方文件


覆盤

在這篇文章中,我們學會了:

  • LINE PAY Confirm API

鐵人賽二度參賽心得

這系列文章是將大學的專案稍作咀嚼整理的小小技術文章,撰寫期間也釐清了許多技術原理,起頭的有點衝動,寫到後面也甚是痛苦,放在心底總告訴自己求的是馬斯洛需求層次理論的最高階層。

換個角度想,如果能夠在這個世界上留下一些足跡,甚至幫助到人,或許這是件很浪漫的事情。

在彰化念大學的時候,曾擔任系學會會長的騰元學長跟我說,有機會念研到臺北看看,還不用到國外,你的視野就會很不一樣。他說的是千真萬確的,在這裡見過了在不同領域閃閃發亮的人,有的是同學、有的是學長姊,有的甚至是文化衝擊。

而這也是我想寫給大學生當作受眾的原因,特別是身處在相對沒有那麼繁華的城市,請記得 當你在做一件事情的時候,如果覺得自己很怪,但堅信自己做的事情是很有意義、很有熱情,請你繼續做下去。 很多時候只是因為只是你待的地方、遇到的人,不夠大、不夠多而已。

如有任何問題可至個人資訊中 Mail 找到我~
希望本系列文章對你有所幫助 !
2024.10.14


上一篇
[Day 29] LINE PAY API V3 Python 金流串接指南 (上) - Request API
系列文
做一支專屬自己學校的課程評價 LINE Bot 吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言