若消費者成功付款,LINE 會自動將頁面跳轉至 confirmUrl
中的網址,在這個確認頁面中,開發者可以藉由呼叫 Confirm API 再次確認是否付款成功。
confirmUrl
確認頁面示意圖,而 Confirm API 應被由後端呼叫,不可在前端呼叫 (會暴露金鑰資訊)。
/v3/payments/{transaction_id}/confirm
confirmUrl
中的網址帶有交易參數LINE 會自動將頁面跳轉至 confirmUrl
中的網址其實會帶有如以下的參數格式:https://{confirmUrl 網址}?transactionId=2024101402232131210&orderId=432458494weet4r8weqed3a_2errer2qe
仔細看裡面有
transactionId
以及orderId
兩參數。transactionId
是 LINE 所提供的交易 ID,orderId
則是我們在 Request API 所宣告的訂單 ID。
在 confirmUrl
我們需要將 transactionId
與 orderId
從網址中抓取,並傳到後端成為 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 可能是消費者重複進入了這個網址,或是操作重新整理,此時就會報錯誤,此時建議跳轉回訂單頁面。若是其他錯誤可參考官方文件。
在這篇文章中,我們學會了:
這系列文章是將大學的專案稍作咀嚼整理的小小技術文章,撰寫期間也釐清了許多技術原理,起頭的有點衝動,寫到後面也甚是痛苦,放在心底總告訴自己求的是馬斯洛需求層次理論的最高階層。
換個角度想,如果能夠在這個世界上留下一些足跡,甚至幫助到人,或許這是件很浪漫的事情。
在彰化念大學的時候,曾擔任系學會會長的騰元學長跟我說,有機會念研到臺北看看,還不用到國外,你的視野就會很不一樣。他說的是千真萬確的,在這裡見過了在不同領域閃閃發亮的人,有的是同學、有的是學長姊,有的甚至是文化衝擊。
而這也是我想寫給大學生當作受眾的原因,特別是身處在相對沒有那麼繁華的城市,請記得 當你在做一件事情的時候,如果覺得自己很怪,但堅信自己做的事情是很有意義、很有熱情,請你繼續做下去。 很多時候只是因為只是你待的地方、遇到的人,不夠大、不夠多而已。
如有任何問題可至個人資訊中 Mail 找到我~
希望本系列文章對你有所幫助 !
2024.10.14