## 取得用戶票券列表 #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/ticket/recipients ``` json Request: { "page": 0, "size": 5, "source": "PU", "userAccount": "jay" } Response: { "code": 200, "data": [ { # 票券夾ID "ticketRecipientId": "504228471577247745", # 票券名稱 "ticketItemName": "點數券", # 票券到期日 "ticketItemValidToDate": "2024/12/31", # 票券勾選類型(可複選、不可複選) "ticketItemSelectionType": "可複選", # 票券金額 "itemAmount": 5 }, { "ticketRecipientId": "504228471577247746", "ticketItemName": "點數券", "ticketItemValidToDate": "2024/12/31", "ticketItemSelectionType": "可複選", "itemAmount": 5 }, { "ticketRecipientId": "504228471577247747", "ticketItemName": "點數券", "ticketItemValidToDate": "2024/12/31", "ticketItemSelectionType": "可複選", "itemAmount": 5 }, { "ticketRecipientId": "504228471577247748", "ticketItemName": "點數券", "ticketItemValidToDate": "2024/12/31", "ticketItemSelectionType": "可複選", "itemAmount": 5 }, { "ticketRecipientId": "504228471577247749", "ticketItemName": "點數券", "ticketItemValidToDate": "2024/12/31", "ticketItemSelectionType": "可複選", "itemAmount": 5 } ] } ``` ## 取得票券兌換的QRCode #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/ticket/generateQRCode ```jsonld! Request: { # 票券夾 Ids "ticketRecipientIds": [ 504228471577247745, 504228471577247746 ] } Response: QRCode 圖檔 ``` #### 程式範例 ``` javascript import React, { useState } from 'react'; const QRCodeGenerator = () => { const [ticketRecipientIds, setTicketRecipientIds] = useState([]); const [qrCode, setQrCode] = useState(null); const handleGenerateQRCode = async () => { try { // 構建請求對象 const requestBody = { ticketRecipientIds: ticketRecipientIds, }; const response = await fetch('http://20.222.229.77/pu/ticket/generateQRCode', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify(requestBody), // 將請求對象轉換為 JSON 格式 }); if (!response.ok) { throw new Error('Error generating QR Code'); } // 將二進位數據轉換為可顯示的 Blob 格式 const blob = await response.blob(); const qrCodeUrl = URL.createObjectURL(blob); setQrCode(qrCodeUrl); } catch (error) { console.error('Error generating QR Code:', error); } }; return ( <div> <h2>QR Code Generator</h2> <input type="text" value={ticketRecipientIds.join(',')} onChange={(e) => setTicketRecipientIds(e.target.value.split(','))} placeholder="Enter ticket recipient IDs separated by commas" /> <button onClick={handleGenerateQRCode}>Generate QR Code</button> {qrCode && ( <div> <h3>Generated QR Code:</h3> <img src={qrCode} alt="Generated QR Code" /> </div> )} </div> ); }; export default QRCodeGenerator; ``` ## QRCode 解碼並回傳商品資訊 #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/ticket/decodeQRCode #### 前端程式範例 ```shell! npm install react-webcam ``` ```jsx! import React, { useRef, useState } from 'react'; import Webcam from 'react-webcam'; const QRCodeUploader = () => { const webcamRef = useRef(null); const [image, setImage] = useState(null); const [data, setData] = useState(null); const capture = () => { const imageSrc = webcamRef.current.getScreenshot(); setImage(imageSrc); }; const handleUpload = async () => { if (image) { try { // 將 base64 圖片轉為 blob 格式 const blob = await (await fetch(image)).blob(); // 將圖片上傳到後端 const formData = new FormData(); formData.append('file', blob, 'qrcode.png'); const response = await fetch('http://20.222.229.77/pu/ticket/decodeQRCode', { method: 'POST', headers: { 'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqYXkiLCJwaG9uZU51bWJlciI6IjA5MTIzNDU2NzgiLCJleHAiOjE3MzAwODMwMzMsImFjY291bnQiOiJqYXkifQ.D-eBzBKTc4okAHc26U2l6ftLT_M24ky_4h2-QUPO5V2j_gFgLYXJ5umpUKjFFRxvF3Wh7ozonhBIdrE8ZRY0Xw' }, body: formData, }); if (response.ok) { const result = await response.json(); setData(result.data); } else { console.error('Error decoding QR Code:', response.statusText); } } catch (error) { console.error('Error uploading QR Code:', error); } } }; return ( <div> <h2>QR Code Uploader</h2> <Webcam audio={false} ref={webcamRef} screenshotFormat="image/png" width={100} height={100} /> <button onClick={capture}>Capture QR Code</button> {image && ( <> <img src={image} alt="Captured QR Code" /> <button onClick={handleUpload}>Upload QR Code</button> </> )} {data && ( <div> <h3>Scan Result:</h3> <pre>{JSON.stringify(data, null, 2)}</pre> </div> )} </div> ); }; export default QRCodeUploader; ``` #### Response 說明 ```jsonld! { "code": 200, "data": [ { # 票券夾ID, 後續兌換 api 會使用 "ticketRecipientId": "504228471577247745", # 商家名稱 "storeName": "jayhung", # 票券編號 "ticketSerialId": 504211739416461314, # 品項名稱 "ticketItemName": "點數券", # 品項金額 "itemAmount": 5.00, # 票券效期(起) "ticketItemFromToDate": "2024/10/23", # 票券效期(迄) "ticketItemValidToDate": "2024/12/31", # 票券狀態 "ticketSerialStatus": "已發行可使用" }, { "ticketRecipientId": "504228471577247746", "storeName": "jayhung", "ticketSerialId": 504211739416461315, "ticketItemName": "點數券", "itemAmount": 5.00, "ticketItemFromToDate": "2024/10/23", "ticketItemValidToDate": "2024/12/31", "ticketSerialStatus": "可兌換(已歸戶到用戶票券夾)" } ] } ``` ## 用戶票券兌換 #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/ticket/redeem ```json Request: { # 客戶票券夾 id "ticketRecipientIds": [ "504228471577247745", "504228471577247746" ], # 兌換商家 userId(後台登入者) "redeemedStoreUserId": "496224360160296960" } Response: { "code": 200, "data": "票券兌換成功!" } ``` ## 取得用戶票券兌換紀錄 #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/ticket/used ```jsonld Request: { "page": 0, "size": 10, "source": "PU", "userAccount": "jay" } Response: { "code": 200, "data": [ { "ticketRecipientId": "504228471577247745", "ticketItemName": "點數券", "ticketItemStatus": "已兌換", "ticketItemValidToDate": "2024/12/31", "ticketItemSelectionType": null, "itemAmount": 5 }, { "ticketRecipientId": "504228471577247746", "ticketItemName": "點數券", "ticketItemStatus": "已兌換", "ticketItemValidToDate": "2024/12/31", "ticketItemSelectionType": null, "itemAmount": 5 } ] ``` ## 取得用戶票券 Detail #### 此 api 需在 request header 帶入 jwt #### 在 api url 最後面直接帶入 recipientId GET /pu/ticket/detail/{recipientId} ```jsonld # 票券已兌換 response: { "code": 200, "data": { "ticketRecipientId": "504228471577247745", # 票券名稱 "ticketItemName": "點數券", # 票券狀態 "ticketItemStatus": "已兌換", # 票券到期日 "ticketItemValidToDate": "2024/12/31", # 票券勾選類型(可複選、不可複選) "ticketItemSelectionType": "可複選", # 票券金額 "itemAmount": 5, # 消費時間 "redeemStoreName": "jayhung", # 消費地點 "redeemTime": "2024/10/25" } } # 票券已轉贈 response: { "code": 200, "data": { "ticketRecipientId": "504228471577247747", # 票券名稱 "ticketItemName": "點數券", # 票券狀態 "ticketItemStatus": "已轉贈", # 票券到期日 "ticketItemValidToDate": "2024/12/31", # 票券勾選類型(可複選、不可複選) "ticketItemSelectionType": "可複選", # 票券金額 "itemAmount": 5, # 票券轉贈對像名稱 "transToAccountName": "mavisliang", # 票券轉贈時間 "transToTime": "2024/10/28 08:17:04" } } ``` ## 模糊搜尋使用者帳號-by UserAccount or UserName #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/system/searchUserByNameOrAccount ```jsonld Request: { "condition": "m" } Response: { "code": 200, "data": { "records": [ { "userId": "499596945581408260", "userAccount": "mavis", "userName": "mavisliang" } ] } } ``` ## 用戶票券轉贈 #### 此 api 需在 request header 帶入 jwt POST http://20.222.229.77/pu/ticket/transfer ```json Request: { # 客戶票券夾 id "ticketRecipientIds": [ "505977150537465856" ], # 票券受贈者 "transToUserAccount": "jay" } Response: { "code": 200, "data": [ { "ticketRecipientId": "505977150537465856", # 票券名稱 "ticketItemName": "點數券", # 票券到期日 "ticketItemValidToDate": "2024/12/31", # 票券金額 "itemAmount": 5, # 票券贈送對像姓名 "transToAccountName": "jayhung", # 票券轉贈時間 "transToTime": "2024/10/28 13:35:48", # 票券勾選類型(可複選、不可複選) "ticketItemSelectionType": "可複選", } ] } ```