提供給台大案英特拉線上繳費填寫發票資訊用
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

210 строки
10KB

  1. @page
  2. @model TestPostInvoiceModel
  3. @{
  4. ViewData["Title"] = "POST 轉頁測試";
  5. Layout = null;
  6. }
  7. <!DOCTYPE html>
  8. <html lang="zh-TW">
  9. <head>
  10. <meta charset="UTF-8">
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  12. <title>發票系統 POST 測試頁面</title>
  13. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  14. </head>
  15. <body>
  16. <div class="container mt-5">
  17. <div class="card">
  18. <div class="card-header bg-success text-white">
  19. <h3>發票系統 POST 轉頁測試</h3>
  20. </div>
  21. <div class="card-body">
  22. <form method="POST" action="/Invoice">
  23. @Html.AntiForgeryToken()
  24. <div class="row mb-3">
  25. <div class="col-md-6">
  26. <label class="form-label">開發票者統編 (Identifier) *</label>
  27. <input type="text"
  28. class="form-control"
  29. name="InvoiceData.Identifier"
  30. value="@(string.IsNullOrWhiteSpace(Model.CompanyTaxId) ? "" : Model.CompanyTaxId)"
  31. required>
  32. <small class="text-muted">8位數字</small>
  33. </div>
  34. <div class="col-md-6">
  35. <label class="form-label">發票交易日期 (TransDateTime) *</label>
  36. <input type="text"
  37. class="form-control"
  38. name="InvoiceData.TransDateTime"
  39. value="@Model.CurrentTransDateTime"
  40. required>
  41. </div>
  42. </div>
  43. <div class="row mb-3">
  44. <div class="col-md-6">
  45. <label class="form-label">發票交易金額 (TransAmount) *</label>
  46. <input type="text" class="form-control" name="InvoiceData.TransAmount" value="150" required>
  47. <small class="text-muted">最多6位數</small>
  48. </div>
  49. <div class="col-md-6">
  50. <label class="form-label">設備代號 (DeviceID) *</label>
  51. <input type="text" class="form-control" name="InvoiceData.DeviceID" value="NtuInvGateway" required>
  52. </div>
  53. </div>
  54. <div class="row mb-3">
  55. <div class="col-md-6">
  56. <label class="form-label">停車場站代號 (LocationID) *</label>
  57. <input type="text" class="form-control" name="InvoiceData.LocationID" value="1" maxlength="1" required>
  58. <small class="text-muted">1個字元</small>
  59. </div>
  60. <div class="col-md-6">
  61. <label class="form-label">車牌號碼 (CarPlateNum) *</label>
  62. <input type="text" class="form-control" name="InvoiceData.CarPlateNum" value="9M1234" required>
  63. </div>
  64. </div>
  65. <div class="row mb-3">
  66. <div class="col-md-6">
  67. <label class="form-label">訂單編號 (OrderID) *</label>
  68. <input type="text" class="form-control" name="InvoiceData.OrderID" value="@Model.CurrentOrderNo" required>
  69. </div>
  70. <div class="col-md-6">
  71. <label class="form-label">稅別 (TaxType) *</label>
  72. <select class="form-control" name="InvoiceData.TaxType" required>
  73. <option value="1">應稅</option>
  74. <option value="2">零稅率</option>
  75. <option value="3">免稅</option>
  76. </select>
  77. <small class="text-muted">1個字元</small>
  78. </div>
  79. </div>
  80. <hr>
  81. <h5 class="text-muted">選填欄位(可預填,留空則讓用戶填寫)</h5>
  82. <div class="row mb-3">
  83. <div class="col-md-6">
  84. <label class="form-label">消費者信箱 (Email)</label>
  85. <input type="email" class="form-control" name="InvoiceData.Email" placeholder="留空讓用戶填寫">
  86. </div>
  87. <div class="col-md-6">
  88. <label class="form-label">手機條碼 (CarrierID)</label>
  89. <input type="text" class="form-control" name="InvoiceData.CarrierID" placeholder="留空讓用戶填寫">
  90. </div>
  91. </div>
  92. <div class="row mb-3">
  93. <div class="col-md-6">
  94. <label class="form-label">購買者統編 (BuyerIdentifier)</label>
  95. <input type="text" class="form-control" name="InvoiceData.BuyerIdentifier" placeholder="留空讓用戶填寫">
  96. </div>
  97. <div class="col-md-6">
  98. <label class="form-label">捐贈碼 (LoveCode)</label>
  99. <input type="text" class="form-control" name="InvoiceData.LoveCode" placeholder="留空讓用戶填寫">
  100. </div>
  101. </div>
  102. <div class="d-grid gap-2">
  103. <button type="submit" class="btn btn-success btn-lg">
  104. POST 方式轉頁到發票頁面
  105. </button>
  106. </div>
  107. </form>
  108. <hr class="my-4">
  109. <div class="alert alert-info">
  110. <h5>POST 測試說明</h5>
  111. <ul>
  112. <li>所有必填欄位都會 POST 到發票頁面</li>
  113. <li>Email、手機條碼、購買者統編、捐贈碼如果留空,將在發票頁面讓用戶填寫</li>
  114. <li>如果預填了這四個欄位的其中一個,用戶將直接看到該預填值</li>
  115. <li>此頁面包含有效的防偽令牌(CSRF Token)</li>
  116. </ul>
  117. </div>
  118. <hr class="my-4">
  119. <div class="card border-primary">
  120. <div class="card-header bg-primary text-white">
  121. <h5>JSON POST 測試(符合規格要求)</h5>
  122. </div>
  123. <div class="card-body">
  124. <p class="text-success"><strong>✓ 此方式符合英特拉規格:Method: POST, 資料格式: JSON</strong></p>
  125. <button type="button" class="btn btn-primary btn-lg w-100" onclick="testJsonPost()">
  126. 發送 JSON POST 請求到發票頁面
  127. </button>
  128. <div id="jsonResult" class="mt-3"></div>
  129. </div>
  130. </div>
  131. <hr>
  132. <div class="card bg-light">
  133. <div class="card-body">
  134. <h6>比較:GET vs POST</h6>
  135. <a href="/TestInvoice.html" class="btn btn-outline-primary btn-sm">GET 測試頁面</a>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
  142. <script>
  143. async function testJsonPost() {
  144. const resultDiv = document.getElementById('jsonResult');
  145. resultDiv.innerHTML = '<div class="alert alert-info">發送中...</div>';
  146. const form = document.querySelector('form');
  147. if (!form) {
  148. resultDiv.innerHTML = '<div class="alert alert-danger">找不到表單元素</div>';
  149. return;
  150. }
  151. const formData = new FormData(form);
  152. const jsonData = {
  153. identifier: formData.get('InvoiceData.Identifier')?.toString() ?? '',
  154. transDateTime: formData.get('InvoiceData.TransDateTime')?.toString() ?? '',
  155. transAmount: formData.get('InvoiceData.TransAmount')?.toString() ?? '',
  156. deviceID: formData.get('InvoiceData.DeviceID')?.toString() ?? '',
  157. email: formData.get('InvoiceData.Email')?.toString() ?? '',
  158. carrierID: formData.get('InvoiceData.CarrierID')?.toString() ?? '',
  159. locationID: formData.get('InvoiceData.LocationID')?.toString() ?? '',
  160. carPlateNum: formData.get('InvoiceData.CarPlateNum')?.toString() ?? '',
  161. orderID: formData.get('InvoiceData.OrderID')?.toString() ?? '',
  162. buyerIdentifier: formData.get('InvoiceData.BuyerIdentifier')?.toString() ?? '',
  163. loveCode: formData.get('InvoiceData.LoveCode')?.toString() ?? '',
  164. taxType: formData.get('InvoiceData.TaxType')?.toString() ?? ''
  165. };
  166. try {
  167. const response = await fetch('/Invoice', {
  168. method: 'POST',
  169. headers: {
  170. 'Content-Type': 'application/json'
  171. },
  172. body: JSON.stringify(jsonData)
  173. });
  174. if (response.ok) {
  175. // JSON POST 成功,直接顯示返回的 HTML 頁面
  176. const html = await response.text();
  177. document.open();
  178. document.write(html);
  179. document.close();
  180. } else {
  181. resultDiv.innerHTML = `<div class="alert alert-danger">請求失敗: ${response.status}</div>`;
  182. }
  183. } catch (error) {
  184. resultDiv.innerHTML = `<div class="alert alert-danger">發生錯誤: ${error.message}</div>`;
  185. }
  186. }
  187. </script>
  188. </body>
  189. </html>