{"openapi":"3.1.0","info":{"title":"Foodiebro External Invoice API","version":"1.0.0-draft","description":"\u5b8c\u6574\u5951\u7d04\u8349\u6848\uff0c\u5c1a\u672a\u5be6\u4f5c\u6216\u90e8\u7f72\uff1b.invalid URL\u50c5\u793a\u610f\u3002\u50c5\u652f\u63f4OPay\uff0c\u96fb\u5b50\u767c\u7968\u898f\u683c\u6cbf\u7528Foodiebro\u65e2\u6709OPay\u6d41\u7a0b\uff1b\u5916\u90e8 v1 \u7a05\u5225\u56fa\u5b9a\u70ba taxable\uff0c\u4ea4\u4ed8\u6a21\u5f0f\u958b\u653e\u7d19\u672c\u3001\u624b\u6a5f\u8f09\u5177\u53ca donation\uff1b\u5176\u4ed6\u7a05\u5225\u4ecd\u7531\u65e2\u6709\u5f8c\u53f0\u8655\u7406\u3002\u9996\u7248profile\u7684\u5c0d\u5916\u6b04\u4f4d\u6620\u5c04\u8207\u5217\u5370\u6a21\u677f\u5f85\u6838\u5c0d\u6838\u51c6\u3002provider_accepted\u53caPROVIDER_*\u5747\u6307OPay\u7d50\u679c\uff0c\u4e0d\u63a5\u53d7\u5ee0\u5546\u6307\u5b9aprovider\u6216\u4e0a\u6e38\u6191\u8b49\u3002\u5169\u652fPOST\u4f5c\u696dAPI\u52a0\u4e00\u652fGET\u67e5\u8a62\uff1b\u5f8c\u53f0\u5efa\u7acb\u6838\u51c6\u5ee0\u5546\uff0c\u7121\u516c\u958b\u8a3b\u518aAPI\u3002\u9000\u8ca8\uff0f\u9000\u6b3e\u4e0d\u5728\u672c\u5c08\u6848\u7bc4\u570d\uff1b\u7d81\u5b9a\u5e97\u5bb6\u7684\u6388\u6b0a\u4eba\u54e1\u76f4\u63a5\u5728\u65e2\u6709Admin\u4f5c\u5ee2\uff0c\u4e0d\u5fc5\u5148\u806f\u7e6bFoodiebro\uff0c\u7121\u516c\u958b\u4f5c\u5ee2\uff0f\u6298\u8b93API\u6216\u5ee0\u5546\u5f8c\u53f0\u767b\u5165\u3002\u4f5c\u5ee2\u8fa6\u7406\u53ca\u7d50\u679c\u4ee5\u5e97\u5bb6\u5f8c\u53f0\u70ba\u6e96\uff0c\u67e5\u8a62\u7684\u4f5c\u5ee2\u6b04\u4f4d\u6620\u5c04\u5f85\u6838\u5c0d\uff0cprovider_accepted\u4e0d\u8868\u793a\u767c\u7968\u4ecd\u6709\u6548\u3002 \u5efa\u7acb\u8acb\u6c42\u4f7f\u7528\u65e2\u6709 store_hash_id \u5b9a\u4f4d\u7d81\u5b9a\u5e97\u5bb6\uff0c\u4ecd\u9808\u901a\u904e Token\u3001\u6574\u5408\u5e33\u865f\u3001\u74b0\u5883\u8207\u5e97\u5bb6\u6388\u6b0a\uff1b\u4e0d\u63a5\u53d7\u81ea\u8a02\u5e97\u5bb6\u4ee3\u865f\u6216\u5167\u90e8\u5e97\u5bb6\u6d41\u6c34\u865f\u3002\u4e0a\u50b3\u7570\u5e38\u50c5\u7531 Foodiebro Admin \u5f8c\u53f0\u76e3\u63a7\u8207\u8655\u7406\uff0c\u4e0d\u8981\u6c42\u5ee0\u5546\u8f2a\u8a62\u3001\u63a5\u6536 webhook\u3001\u806f\u7e6b\u6216\u91cd\u65b0\u958b\u7acb\uff1bGET \u4fdd\u7559\u70ba\u53ef\u9078\u67e5\u8a62\u4e26\u56de\u50b3\u771f\u5be6\u72c0\u614b\u3002 \u5df2\u78ba\u8a8d\u6642\u9593\u898f\u5247\uff1atransaction_at \u4fdd\u5b58\u5ee0\u5546\u5be6\u969b\u4ea4\u6613\u6642\u9593\uff1binvoice_date \u7531 Foodiebro \u5efa\u7acb\u767c\u7968\u6642\u4ee5 Asia\/Taipei \u6c7a\u5b9a\u4e26\u56fa\u5b9a\uff0c\u4e0d\u63a5\u53d7\u6307\u5b9a\u6b77\u53f2\u958b\u7acb\u65e5\u671f\u3002\u65e5\u671f\u3001\u671f\u5225\u3001\u5217\u5370\uff0f\u689d\u78bc\uff0fQR Code \u8207 OPay \u958b\u7acb\u6642\u9593\u5171\u7528\u540c\u4e00\u56fa\u5b9a\u6642\u9593\uff1b\u80cc\u666f\u4e0a\u50b3\u53ca\u8de8\u65e5\uff0f\u8de8\u671f\u6210\u529f\u91cd\u8a66\u4e0d\u6539\u539f\u865f\u78bc\u3001\u65e5\u671f\u6216\u671f\u5225\u3002\u9996\u6b21\u7533\u8acb\u4e0d\u8a2d\u6700\u5927\u4ea4\u6613\u5e74\u9f61\u6216\u96e2\u7dda\u88dc\u9001\u6642\u9593\u4e0a\u9650\uff0c\u4e0d\u56e0\u904e\u53bb\u4ea4\u6613\u8f03\u820a\u3001\u8de8\u65e5\u6216\u8de8\u671f\u62d2\u7d55\uff1b\u4fdd\u7559\u539ftransaction_at\uff0cFoodiebro\u4f9d\u5be6\u969b\u672c\u5730\u5efa\u7acb\u6642\u9593\u4ee5Asia\/Taipei\u958b\u7acb\u3001\u4f7f\u7528\u7576\u671f\u865f\u78bc\uff0c\u4e0d\u56de\u586b\u6b77\u53f2\u767c\u7968\u65e5\u671f\u3002\u6709\u6548\u8a8d\u8b49\u3001\u73fe\u884c\u5e97\u5bb6grant\uff0f\u767c\u7968\u5408\u7d04\u3001\u898f\u683c\u9a57\u8b49\u3001\u55ae\u5e97\u9023\u7e8c60\u79d25\u5f35\u53ca\u6301\u4e45\u51aa\u7b49\u4ecd\u9069\u7528\uff1b\u4fdd\u7559\u683c\u5f0f\u3001\u771f\u5be6\u65e5\u66c6\u65e5\u671f\u8207+08:00 offset\u9a57\u8b49\u3002\u771f\u6b63\u65b0\u7533\u8acbtransaction_at\u9808\u2264\u672c\u6b21Foodiebro\u4f3a\u670d\u5668\u63a5\u6536HTTP\u6642\u9593\u56fa\u5b9a\u5feb\u7167+300\u79d2\uff0c\u525b\u597d\u908a\u754c\u63a5\u53d7\uff0c\u8d85\u904e422 TRANSACTION_DATE_INVALID\/not_created\/fix_request\u4e14\u4e0d\u914d\u865f\uff0c\u4e0d\u4f9d\u5f8c\u7e8c\u8655\u7406\u8017\u6642\u91cd\u7b97\u57fa\u6e96\u3002\u539ftransaction_at\u539f\u6a23\u4fdd\u5b58\u3001\u4e0dclamp\u6216\u91cd\u5beb\uff1b5\u5206\u9418\u70ba\u696d\u52d9\u5bb9\u5dee\uff0c\u4e0d\u662f\u6cd5\u898f\u6216OPay\u50b3\u8f38\u671f\u9650\uff0c\u958b\u7acb\u6642\u9593\u4ecd\u70ba\u672c\u5730\u5be6\u969b\u5efa\u7acb\u6642\u9593\u3002\u6210\u529fKey\u91cd\u64ad\uff0f\u63dbKey\u540c\u4f86\u6e90\u540c\u5167\u5bb9\u5fa9\u7528\uff0c\u5148\u4f9d\u539f\u8eab\u4efd\u3001\u539f\u5167\u5bb9\u4e00\u81f4\u6027\u53ca\u73fe\u884c\u6388\u6b0a\u6062\u5fa9\u539f\u7968\uff0c\u4e0d\u91cd\u8dd1\u65b0\u7968\u6642\u9593\u9580\u6abb\uff1b\u540cKey\u6539\u5167\u5bb9\u4ecd\u4f9d\u65e2\u6709409\u885d\u7a81\u898f\u5247\u3002 \u6bcf\u7d44\u5ee0\u5546Token\u7531Foodiebro\u5f8c\u53f0\u500b\u5225\u8a2d\u5b9a\u5fc5\u586b\u751f\u6548\u53ca\u5230\u671f\u6642\u9593\uff08Asia\/Taipei\uff09\uff0c\u5230\u671f\u665a\u65bc\u751f\u6548\uff0c\u4e0d\u9810\u8a2d\u6c38\u4e45\u6709\u6548\u6216\u7d71\u4e00\u6709\u6548\u5929\u6578\uff1b\u751f\u6548\u6642\u9593\u2264\u9a57\u8b49\u7576\u4e0b\u6642\u9593<\u5230\u671f\u6642\u9593\u4e14\u672a\u64a4\u92b7\u624d\u901a\u904eToken\u6642\u9593\u6aa2\u67e5\u3002\u5c1a\u672a\u751f\u6548\u53ef\u56deAUTH_INVALID\uff0c\u5230\u671f\u8d77\u56deAUTH_EXPIRED\u3002\u6bcfrequest\u4ecd\u9a57\u8b49Token\u3001\u5ee0\u5546\uff0fclient\u3001\u74b0\u5883\u3001\u529f\u80fd\u8207grant\uff0c\u65b0\u958b\u7968\u53e6\u9a57\u6709\u6548\u767c\u7968\u5408\u7d04\u3002\u65b0Token\u751f\u6548\u4e0d\u4f7f\u820aToken\u81ea\u52d5\u5931\u6548\uff0c\u5404\u81ea\u4f9d\u5230\u671f\u53ca\u4eba\u5de5\u64a4\u92b7\u5224\u65b7\uff0c\u53ef\u8a2d\u5b9a\u91cd\u758a\u671f\u9593\u4e14\u7121\u56fa\u5b9a\u4ea4\u63a5\u6642\u6578\u4e0a\u9650\uff1b\u5f8c\u53f0\u53ef\u7acb\u5373\u64a4\u92b7\u3002\u8f2a\u66ff\u4e0d\u6539client\u3001\u539fKey\u6216\u65e2\u6709\u767c\u7968\uff0c\u4e5f\u4e0d\u4e2d\u6b62\u5df2\u53d6\u5f97\u8cc7\u683c\u7684\u80cc\u666f\u5de5\u4f5c\uff1b\u7b49\u5f85\u5217\u5370\u7684\u5916\u90e8\u7d19\u672c\u4e0d\u56e0\u6191\u8b49\u7570\u52d5\u81ea\u52d5\u653e\u884c\u3002 \u5916\u90e8API\u540c\u4e00\u5be6\u969b\u5e97\u5bb6\u6bcf\u9023\u7e8c60\u79d2\u6700\u591a5\u5f35\u6210\u529f\u65b0\u5efa\u672c\u5730\u767c\u7968\uff0c\u6309\u670d\u52d9\u53d7\u7406\u4e26\u4fdd\u7559\u540d\u984d\u6642\u9ede\u6b78\u5165\u6efe\u52d5\u7a97\u53e3\uff0c\u4e0d\u4ee5HTTP\u56de\u8986\u5230\u9054\u6216\u4fdd\u5b58\u5b8c\u6210\u77ac\u9593\u8a08\u7b97\uff1b\u540c\u5e97\u8de8client\uff0fToken\u5171\u7528\uff0cstore_hash_id\u7570\u52d5\u4e0d\u91cd\u7f6e\u3002\u540cKey\u6210\u529freplay\uff0f\u63dbKey\u540c\u4f86\u6e90\u5fa9\u7528\u4e0d\u91cd\u8a08\uff0c\u672c\u5730\u5df2\u5efa\u800c\u7d19\u672c\u5f85\u5217\u5370\uff0fOPay\u5f85\u9001\u4ecd\u8a08\uff1bGET\u3001print-events\u3001\u80cc\u666f\u4e0a\u50b3\u91cd\u8a66\u4e0d\u8a08\uff0c\u4e26\u975e\u6240\u6709HTTP\u6bcf\u5206\u9418\u53ea\u80fd5\u6b21\u3002\u4f5c\u5ee2\u4e0d\u9000\u8a08\u6578\uff0c\u5931\u6557\u4e14\u5b8c\u6574\u64a4\u56de\u672a\u5efa\u7968\u8005\u4e0d\u8a08\u3002\u53ea\u9650\u5916\u90e8API\u65b0\u7968\uff0cFoodiebro\u65e2\u6709POS\uff0fAdmin\u958b\u7968\u5165\u53e3\u4e0d\u5957\u7528\u6b64\u65b0\u589e\u5916\u90e8\u9650\u984d\uff1b\u5ee0\u5546POS\uff0f\u81ea\u52a9\u6a5f\u53f0\u7d93\u5916\u90e8API\u958b\u7968\u4ecd\u53d7\u9650\u5236\u3002\u9996\u7248\u4e0d\u8a2d\u6bcf\u65e5\u65b0\u958b\u7968\u7e3d\u5f35\u6578\u4e0a\u9650\uff0c\u4e0d\u505a\u6bcf\u65e5\u914d\u984d\u8a08\u6578\u3001\u65e5\u5207\u91cd\u7f6e\u6216\u6bcf\u65e5\u984d\u6eff\u62d2\u7d55\uff1b\u4e00\u822c\u6280\u8853\u8acb\u6c42\u4e0d\u53e6\u8a02 API \u696d\u52d9\u9650\u6d41\u6578\u503c\uff0c\u57fa\u790e\u9632\u8b77\u7531 WAF\uff0f\u53cd\u5411\u4ee3\u7406\u8655\u7406\uff0c\u6bcf\u65e5\u4e0d\u9650\u4e0d\u4ee3\u8868\u6240\u6709HTTP\u7121\u9650\u3002\u6709\u6548\u8a8d\u8b49\u3001\u73fe\u884cgrant\uff0f\u767c\u7968\u5408\u7d04\u3001\u898f\u683c\u9a57\u8b49\u3001\u53ef\u7528\u7576\u671f\u5b57\u8ecc\uff0f\u865f\u78bc\u53ca\u55ae\u5e97\u9023\u7e8c60\u79d25\u5f35\u4ecd\u9069\u7528\u3002QUOTA_EXCEEDED\u4fdd\u7559\u539f\u78bc\u4f46\u9996\u7248\u4e0d\u555f\u7528\u3001\u4e0d\u56de\u50b3\u3002 \u5916\u90e8API\u50c5\u56de\u5831\u7d19\u672c\u9996\u6b21\u5217\u5370\uff0c\u4e0d\u63d0\u4f9b\u5ee0\u5546\u88dc\u5370\u529f\u80fd\u3001\u88dc\u5370\u6838\u51c6\u6d41\u7a0b\u6216\u88dc\u5370\u56de\u5831\uff1b\u88dc\u5370\u6cbf\u65e2\u6709Foodiebro Admin\u529f\u80fd\u8207\u9650\u5236\uff0c\u4e0d\u56e0\u6b64\u5141\u8a31\u8f09\u5177\u76f4\u63a5\u88dc\u5370\u3002print_kind\u5fc5\u586b\u4e14\u50c5\u63a5\u53d7original\uff1bprint_summary\u50c5\u5f59\u6574\u5916\u90e8\u9996\u6b21\u5217\u5370\uff0c\u4e0d\u6df7\u5165Admin\u88dc\u5370\u6b77\u53f2\u3002 \u6b63\u5f0f\u63a5\u5165\u524d\u9808\u5728\u6838\u51c6\u6e2c\u8a66\u74b0\u5883\u5b8c\u6210\u4e32\u63a5\u9a57\u6536\uff0c\u7531Foodiebro\u78ba\u8a8d\u5404\u5957\u6574\u5408\u7cfb\u7d71\u6e2c\u8a66\u901a\u904e\u5f8c\uff0c\u900f\u904e\u5f8c\u53f0\u6838\u51c6\u6b63\u5f0fclient\u8207\u5e97\u5bb6\u6388\u6b0a\u4e26\u767c\u884c\u6b63\u5f0fToken\uff1b\u540c\u516c\u53f8\u5176\u4ed6\u7cfb\u7d71\u901a\u904e\u6216\u5ee0\u5546\u81ea\u884c\u5ba3\u544a\u6210\u529f\u4e0d\u4ee3\u66ff\u6838\u51c6\u3002\u6e2c\u8a66\u4e0d\u8017\u7528\u6b63\u5f0f\u767c\u7968\u865f\u78bc\uff0c\u4e5f\u4e0d\u4f7f\u7528\u6b63\u5f0fOPay\u6191\u8b49\u6216\u9001\u4ef6\u8a2d\u5b9a\u3002\u9a57\u6536\u662f\u5167\u90e8\u958b\u901a\u689d\u4ef6\uff0c\u7121\u516c\u958b\u9a57\u6536\u56de\u5831\u6216\u958b\u901aAPI\uff1b\u4e0d\u56e0\u6b64\u8981\u6c42\u65e2\u6709Token\u63db\u767c\u6216\u6bcf\u65b0\u589e\u5e97\u5bb6\u91cd\u6e2c\u6574\u5957\uff0c\u65b0\u589e\u5e97\u5bb6\u4ecd\u4f9d\u73fe\u884c\u6388\u6b0a\u6d41\u7a0b\u5be9\u6838\u3002 \u7d19\u672c\u4ea4\u4ed8\u9078\u5b9aJSON print_data\u52a0\u5217\u5370\u7248\u578b\u7bc4\u4f8b\uff0c\u7531\u5ee0\u5546\u4e32\u63a5\u81ea\u5df1\u7684POS\uff0f\u5370\u8868\u6a5f\uff1bFoodiebro\u56fa\u5b9a\u7522\u751f\u865f\u78bc\u3001\u65e5\u671f\u3001\u91d1\u984d\u3001\u689d\u78bc\u8207\u5de6\u53f3QR\u5167\u5bb9\uff0c\u5ee0\u5546\u50c5\u6e32\u67d3\uff0c\u4e0d\u91cd\u7b97\u91d1\u984d\u6216QR payload\uff0c\u4e0d\u6539\u52d5\u5efa\u7acb\u6642\u539f\u5feb\u7167\u3002\u9019\u4e0d\u662f\u4f3a\u670d\u5668PDF\u3001\u5217\u5370\u5716\u7247\u3001ESC\/POS\u6216\u98db\u9d5d\u6307\u4ee4\uff0c\u4e5f\u4e0d\u63a7\u5236\u5370\u8868\u6a5f\uff1b\u4e0d\u516c\u958bAES key\u7b49\u4e0a\u6e38\u79d8\u5bc6\u3002\u7248\u578b\u7bc4\u4f8b\u5217\u70ba\u4ea4\u4ed8\u7269\uff0c\u9808\u5148\u6838\u5c0d\u65e2\u6709OPay\u683c\u5f0f\u4e26\u6e2c\u8a66\u9a57\u6536\uff0c\u76ee\u524d\u50c5\u78ba\u8a8d\u5f62\u5f0f\uff0c\u5c1a\u672a\u88fd\u4f5c\u53ef\u7528\u7bc4\u672c\u6216\u5217\u5370\u6a94\u3002carrier\uff0fdonation\u7684print_data\u4ecd\u70banull\uff0c\u9996\u6b21\u5217\u5370\u56de\u5831\uff0fAdmin\u88dc\u5370\u908a\u754c\u4e0d\u8b8a\u3002 \u5408\u4f5c\u5834\u666f\u70ba\u5171\u540c\u5e97\u5bb6\u7684\u81ea\u52a9\u9ede\u9910\u6a5f\uff0c\u7531\u9867\u5ba2\u9ede\u9910\u5f8c\u767c\u8d77\u8cc7\u6599\u6d41\u300c\u81ea\u52a9\u9ede\u9910\u6a5f\u2192\u5ee0\u5546\u5f8c\u7aef\u2192Foodiebro\u65b0API\u300d\uff0c\u56fa\u5b9a\u767c\u7968\u8cc7\u6599\u53cd\u5411\u7d93\u5ee0\u5546\u5f8c\u7aef\u56de\u6a5f\u53f0\u5217\u5370\uff0c\u5be6\u969b\u9996\u6b21\u5217\u5370\u7d50\u679c\u4ea6\u7d93\u5ee0\u5546\u5f8c\u7aef\u9001print-events\u3002\u6b63\u5f0fFoodiebro Token\u50c5\u5728\u5ee0\u5546\u5f8c\u7aef\u4fdd\u5b58\u4f7f\u7528\uff0c\u4e0d\u4e0b\u767c\u6a5f\u53f0\uff0f\u700f\u89bd\u5668\uff0f\u524d\u7aef\uff1bstore_hash_id\u4e0d\u662f\u6388\u6b0a\u6191\u8b49\uff0c\u4ecd\u9010\u6b21\u6aa2\u67e5client\uff0f\u5be6\u969bstore grant\u3002\u5916\u90e8\u6a5f\u53f0\uff0f\u5ee0\u5546POS\u958b\u7968\u4ecd\u5c6c\u5916\u90e8API\u6d41\u91cf\uff0c\u540c\u5e97\u8de8\u6a5f\u53f0\u5171\u75285\u5f35\uff0f\u9023\u7e8c60\u79d2\uff1bFoodiebro\u65e2\u6709POS\uff0fAdmin\u5165\u53e3\u514d\u6b64\u5916\u90e8\u9650\u984d\u4e0d\u5305\u542b\u5ee0\u5546POS\u3002\u5ee0\u5546\u5f8c\u7aef\u78ba\u4fdd\u540cclient\uff0fstore\u7684external_invoice_id\u8de8\u6a5f\u53f0\u552f\u4e00\uff0c\u4e0d\u4f7f\u7528\u6703\u78b0\u649e\u7684\u672c\u6a5f\u6d41\u6c34\u865f\uff1b\u540c\u64cd\u4f5c\u91cd\u8a66\u6cbf\u539fKey\u3001\u539f\u8b58\u5225\u8207\u539f\u5167\u5bb9\u3002Foodiebro\u4e0d\u63a5\u7ba1\u5ee0\u5546\u8a02\u55ae\uff0f\u91d1\u6d41\uff0f\u8a2d\u5099\uff0c\u4e0d\u65b0\u589edevice API\u3001device Token\u6216\u6a5f\u53f0\u767b\u5165\u3002 \u7b2c\u4e00\u7248Swagger\u985e\u6587\u4ef6\u9801\u958b\u653esandbox Try it out\uff0c\u6838\u51c6\u5ee0\u5546\u4f7f\u7528\u5f8c\u53f0\u6838\u51c6\u4ea4\u4ed8\u7684\u6e2c\u8a66Token\u76f4\u63a5\u6e2c\u8a66create\/print-events\/GET\uff1b\u6e2c\u8a66\u8cc7\u6599\uff0f\u865f\u6c60\uff0fOPay\u8a2d\u5b9a\u9694\u96e2\uff0c\u4e0d\u8017\u7528\u6b63\u5f0f\u865f\u78bc\u3002\u6587\u4ef6UI\u53easandbox\u3001\u4e0d\u63d0\u4f9bproduction\u5207\u63db\u3001\u4e0d\u6536\u6b63\u5f0fToken\uff1b\u6b63\u5f0f\u6587\u4ef6\u9801\u53ea\u6709\u8aaa\u660e\u7bc4\u4f8b\uff0c\u4e0d\u958b\u6b63\u5f0fTry it out\uff0c\u9019\u4e0d\u662f\u628a\u6b63\u5f0fAPI\u6539\u70ba\u552f\u8b80\uff0c\u6838\u51c6\u5ee0\u5546\u5f8c\u7aef\u4ecd\u4f7f\u7528\u6b63\u5f0fAPI\u958b\u7968\u3002canonical OpenAPI\u74b0\u5883URL\u4f9b\u5ee0\u5546\u5f8c\u7aef\uff0fAPI\u5de5\u5177\u4f7f\u7528\uff0c\u4e0d\u56e0\u6587\u4ef6\u9801\u4e92\u52d5\u9650\u5236\u800c\u522a\u9664\uff1bsandbox\uff0fproduction \u4f7f\u7528\u4e0d\u540c base URL\uff0f\u90e8\u7f72\uff0cToken \u7d81\u5b9a environment\uff0c\u516c\u958b request \u4e0d\u63a5\u53d7 environment \u6b04\u4f4d\uff0csandbox Token \u547c\u53eb production URL \u76f4\u63a5\u62d2\u7d55\uff1b\u5360\u4f4dURL\u4ecd\u5f85\u66ff\u63db\u6838\u51c6\u5be6\u969b\u7db2\u5740\u3002sandbox Token\u7531Admin\u6838\u51c6\u4ea4\u4ed8\uff0c\u7121\u5ee0\u5546\u767b\u5165\u6216\u516c\u958bToken\u767c\u884cAPI\uff1b\u6587\u4ef6\u7db2\u7ad9\u53ca\u4e92\u52d5\u529f\u80fd\u5c1a\u672a\u5efa\u7f6e\u3002 \u5916\u90e8\u7d19\u672c\u672c\u5730\u914d\u865f\u3001\u5b8c\u6574\u4fdd\u5b58\u53ca\u56de\u56fa\u5b9a\u8cc7\u6599\u5f8c\uff0c\u6cbf\u65e2\u6709\u5217\u5370\u65d7\u6a19N\u7b49\u5f85\u5b8c\u6210\uff0c\u6301\u4e45\u9001\u4ef6\u5de5\u4f5c\u5c1a\u4e0d\u53ef\u57f7\u884c\uff1b\u6709\u6548printed\u5b8c\u6210\u8b49\u64da\u624d\u4ee5\u65e2\u6709Y\u8a9e\u610f\u53d6\u5f97\u8cc7\u683c\u4e26\u5b89\u6392\u80cc\u666f\u9001OPay\u3002submitted\u53ea\u662f\u9001\u5165\u8a2d\u5099\u4f47\u5217\uff0cfailed\/unknown\/\u672a\u56de\u5831\u5747\u4e0d\u653e\u884c\u3002\u624b\u6a5f\u8f09\u5177\uff0f\u611b\u5fc3\u78bc\u5148\u5728\u914d\u865f\u524d\u9a57\u8b49\uff1b\u901a\u904e\u5f8c\u8f09\u5177\u7167\u820a\u7121\u9808\u5217\u5370\u56de\u5831\u3001print\u65d7\u6a19\u4ecdN\u4f46\u672c\u5730\u5efa\u7968\u5f8c\u76f4\u63a5\u53d6\u5f97\u8cc7\u683c\uff0c\u4e0d\u80fd\u4e00\u5f8b\u4ee5N\u963b\u64cb\u3002\u6cbf\u7528\u65e2\u6709N\/Y\u53caupload0\/1\/-1\u503c\uff0c\u4e0d\u65b0\u589e\u516c\u958b\u65d7\u6a19\uff0f\u72c0\u614b\uff1bsubmission_status\u4ecdpending\uff0c\u53ef\u6db5\u84cb\u7b49\u5f85\u7d19\u672c\u5217\u5370\u6216\u5df2\u53d6\u5f97\u8cc7\u683c\u5f85\u4e0a\u50b3\u3002\u672c\u5730201\u8207\u56fa\u5b9a\u6210\u529fsnapshot\/\u539fKey\u6062\u5fa9\/\u65b0\u7968\u8a08\u6578\u4e0d\u56e0\u7b49\u5f85\u5217\u5370\u6539\u8b8a\u3002Admin\u65e2\u6709\u88dc\u5370\u53ea\u6cbf\u539f\u64cd\u4f5c\u88dc\u7d19\u672c\uff0c\u4e0d\u6539print_fg\u3001\u4e0d\u7522\u751f\u5916\u90e8\u4e8b\u4ef6\u3001\u4e0d\u89e3\u9664\u5916\u90e8\u7d19\u672c\u9001\u4ef6\u8cc7\u683c\uff1b\u5916\u90e8\u7968\u4ecd\u9808\u5ee0\u5546\u56de\u5831printed\uff0c\u4e0d\u8986\u5beb\u5916\u90e8summary\u3002\u5e97\u5bb6\u5728\u672aprinted\u6642\u4ecd\u53ef\u900f\u904e\u65e2\u6709Admin\u4e3b\u52d5\u4f5c\u5ee2\uff0c\u4f9d\u5148OfflineIssue\u5f8cOfflineInvalid\u7684\u4f5c\u5ee2\u5c08\u7528\u6d41\u7a0b\uff1b\u672a\u56de\u5831\u4e0d\u6703\u81ea\u52d5\u4f5c\u5ee2\uff0c\u4e0d\u6539print_fg\u3001\u4e0d\u7522\u751f\u5916\u90e8\u5217\u5370\u4e8b\u4ef6\u3001\u4e0d\u653e\u884c\u4e00\u822c\u958b\u7acboutbox\uff0c\u4f5c\u5ee2\u5f8c\u9072\u5230printed\u4e5f\u4e0d\u5f97\u653e\u884c\u3002\u4e00\u822c\u80cc\u666f\u958b\u7acb\uff0f\u4e00\u822c\u624b\u52d5\u9001\u4ef6\u4ecd\u9808\u6838\u5c0d\u5916\u90e8\u7d19\u672c\u8cc7\u683c\u3002\u7db2\u7ad9\u8207\u65b0\u6d41\u7a0b\u5c1a\u672a\u5be6\u4f5c\u3002"},"x-supported-providers":["opay"],"jsonSchemaDialect":"https:\/\/json-schema.org\/draft\/2020-12\/schema","servers":[{"url":"https:\/\/sandbox.foodiebro-api.example.invalid","description":"sandbox \u6e2c\u8a66\u5360\u4f4d\u7db2\u5740\uff0c\u4e0d\u662f\u53ef\u7528\u670d\u52d9\uff1b\u50c5\u4f7f\u7528 sandbox Token"},{"url":"https:\/\/api.foodiebro-api.example.invalid","description":"production \u6b63\u5f0f\u5360\u4f4d\u7db2\u5740\uff0c\u4e0d\u662f\u53ef\u7528\u670d\u52d9\uff1b\u50c5\u4f7f\u7528 production Token"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"\u767c\u7968"},{"name":"\u5217\u5370"}],"paths":{"\/api\/v1\/invoices":{"post":{"operationId":"createInvoice","tags":["\u767c\u7968"],"summary":"\u4fdd\u5b58\u5b8c\u6574\u8cc7\u6599\u4e26\u7acb\u5373\u56de\u865f\uff0c\u80cc\u666f\u9001\u4ef6","description":"\u9996\u6b21201\uff1b\u540cKey\u540c\u5167\u5bb9\u4fdd\u7559\u8a72Key\u9996\u6b21\u6210\u529fHTTP\/data\uff08\u539fKey201\uff0c\u5225\u540dKey200\uff09\uff0crequest_id\u70ba\u672c\u6b21\uff0cResource-Reused\u4fdd\u7559\u539f\u503c\u3002\u4e0d\u540cKey\u540c\u5916\u90e8\u8b58\u5225\u540c\u5167\u5bb9\u56de200\uff0cResource-Reused=true\u3002replay\u91cd\u65b0\u6aa2\u67e5\u539f\u8cc7\u6e90\u5e97\u5bb6grant\u8207\u7576\u524d\u80fd\u529b\u3002\u7acb\u5373\u56de\u865f\u4e0d\u7b49\u65bc\u4e0a\u6e38\u53d7\u7406\u6216\u5b58\u8b49\u3002\u672a\u914d\u865f422\u53ef\u4fee\u6b63\uff1b5xx\/\u65b7\u7dda\u7528\u539fKey\u539f\u5167\u5bb9\u6062\u5fa9\u3002 store_hash_id \u70ba\u65e2\u6709\u5e97\u5bb6\u8b58\u5225\uff0c\u975e\u7a7a\u5b57\u4e32\u3001\u6700\u591a255\u5b57\u5143\uff1b\u5b9a\u4f4d\u5e97\u5bb6\u5f8c\u4ecd\u6aa2\u67e5 Token\u3001client\u3001environment \u8207\u6709\u6548\u5e97\u5bb6\u6388\u6b0a\u3002\u7f3a\u5931\u6216\u683c\u5f0f\u578b\u5225\u9a57\u8b49\u4e0d\u7b26\u56de VALIDATION_FAILED\uff1b\u4e0d\u5b58\u5728\u3001\u5df2\u522a\u9664\u6216\u7121\u6709\u6548\u6388\u6b0a\u5747\u56de STORE_ACCESS_DENIED\uff0c\u4e0d\u63ed\u9732\u5dee\u7570\u3002 \u539fKey replay\u5148\u4f9d\u6301\u4e45\u7d00\u9304\u53ca\u539f\u767c\u7968\u7d81\u5b9a\u5e97\u5bb6\u6838\u5c0d\u73fe\u884c\u6388\u6b0a\uff0c\u56de\u56fa\u5b9adata\u53ca\u5efa\u7acb\u6642store_hash_id\u5feb\u7167\uff1b\u4e0d\u91cd\u65b0\u89e3\u6790\u820a\u8b58\u5225\u3001\u4e0d\u8f49\u7d81\u5e97\u5bb6\u6216\u518d\u914d\u865f\u3001\u4e0d\u8981\u6c42\u4fee\u6539\u539fpayload\u3002\u53ea\u6709\u65b0\u7533\u8acb\u89e3\u6790\u76ee\u524dstore_hash_id\uff1bToken\u6216grant\u64a4\u92b7\u4ecd\u62d2\u7d55\u3002 transaction_at \u50c5\u4fdd\u5b58\u5be6\u969b\u4ea4\u6613\u6642\u9593\uff0c\u4e0d\u6c7a\u5b9a\u958b\u7acb\u65e5\u671f\u6216\u671f\u5225\uff1bFoodiebro \u5efa\u7acb\u6642\u56fa\u5b9a Asia\/Taipei \u958b\u7acb\u6642\u9593\uff0c\u5217\u5370\uff0f\u689d\u78bc\uff0fQR Code \u8207 OPay \u4f7f\u7528\u540c\u4e00\u6642\u9593\u3002\u5df2\u6210\u529f\u7d50\u679c\u8de8\u65e5\uff0f\u8de8\u671f\u91cd\u8a66\u4ecd\u56de\u539f\u865f\u78bc\u3001\u65e5\u671f\u3001\u671f\u5225\u53ca\u5217\u5370\u8cc7\u6599\uff0c\u4e0d\u56e0\u539f\u4ea4\u6613\u8f03\u820a\u6216\u8de8\u65e5\u8de8\u671f\u800c\u62d2\u7d55\u6062\u5fa9\uff1b\u80cc\u666f\u4e0a\u50b3\u4e0d\u6539\u9019\u4e9b\u503c\u3002\u9996\u6b21\u7533\u8acb\u4e0d\u8a2d\u6700\u5927\u4ea4\u6613\u5e74\u9f61\u6216\u96e2\u7dda\u88dc\u9001\u6642\u9593\u4e0a\u9650\uff0c\u4e0d\u56e0\u904e\u53bb\u4ea4\u6613\u8f03\u820a\u3001\u8de8\u65e5\u6216\u8de8\u671f\u62d2\u7d55\uff1b\u4fdd\u7559\u539ftransaction_at\uff0cFoodiebro\u4f9d\u5be6\u969b\u672c\u5730\u5efa\u7acb\u6642\u9593\u4ee5Asia\/Taipei\u958b\u7acb\u3001\u4f7f\u7528\u7576\u671f\u865f\u78bc\uff0c\u4e0d\u56de\u586b\u6b77\u53f2\u767c\u7968\u65e5\u671f\u3002\u6709\u6548\u8a8d\u8b49\u3001\u73fe\u884c\u5e97\u5bb6grant\uff0f\u767c\u7968\u5408\u7d04\u3001\u898f\u683c\u9a57\u8b49\u3001\u55ae\u5e97\u9023\u7e8c60\u79d25\u5f35\u53ca\u6301\u4e45\u51aa\u7b49\u4ecd\u9069\u7528\uff1b\u4fdd\u7559\u683c\u5f0f\u3001\u771f\u5be6\u65e5\u66c6\u65e5\u671f\u8207+08:00 offset\u9a57\u8b49\u3002\u771f\u6b63\u65b0\u7533\u8acbtransaction_at\u9808\u2264\u672c\u6b21Foodiebro\u4f3a\u670d\u5668\u63a5\u6536HTTP\u6642\u9593\u56fa\u5b9a\u5feb\u7167+300\u79d2\uff0c\u525b\u597d\u908a\u754c\u63a5\u53d7\uff0c\u8d85\u904e422 TRANSACTION_DATE_INVALID\/not_created\/fix_request\u4e14\u4e0d\u914d\u865f\uff0c\u4e0d\u4f9d\u5f8c\u7e8c\u8655\u7406\u8017\u6642\u91cd\u7b97\u57fa\u6e96\u3002\u539ftransaction_at\u539f\u6a23\u4fdd\u5b58\u3001\u4e0dclamp\u6216\u91cd\u5beb\uff1b5\u5206\u9418\u70ba\u696d\u52d9\u5bb9\u5dee\uff0c\u4e0d\u662f\u6cd5\u898f\u6216OPay\u50b3\u8f38\u671f\u9650\uff0c\u958b\u7acb\u6642\u9593\u4ecd\u70ba\u672c\u5730\u5be6\u969b\u5efa\u7acb\u6642\u9593\u3002\u6210\u529fKey\u91cd\u64ad\uff0f\u63dbKey\u540c\u4f86\u6e90\u540c\u5167\u5bb9\u5fa9\u7528\uff0c\u5148\u4f9d\u539f\u8eab\u4efd\u3001\u539f\u5167\u5bb9\u4e00\u81f4\u6027\u53ca\u73fe\u884c\u6388\u6b0a\u6062\u5fa9\u539f\u7968\uff0c\u4e0d\u91cd\u8dd1\u65b0\u7968\u6642\u9593\u9580\u6abb\uff1b\u540cKey\u6539\u5167\u5bb9\u4ecd\u4f9d\u65e2\u6709409\u885d\u7a81\u898f\u5247\u3002 \u5efa\u7acb\u56de\u8986\u5206\u4e09\u7a2e\uff1a\u5df2\u6210\u529f\u4fdd\u5b58\u6642\u512a\u5148\u56de\u539f\u865f\u78bc\u3001\u65e5\u671f\u53ca\u56fa\u5b9a\u5217\u5370\u8cc7\u6599\uff0c\u66ab\u6642\u8655\u7406\u6a19\u8a18\u4e0d\u5f97\u84cb\u904e\u6210\u529f\u7d50\u679c\uff1b\u540cKey\u4fdd\u7559\u9996\u6b21\u6210\u529fHTTP\/data\u4e26\u6a19\u793aIdempotency-Replayed=true\uff0c\u63dbKey\u540c\u5e97\u5bb6\u5916\u90e8\u8b58\u5225\u540c\u5167\u5bb9\u56de200\u53caResource-Reused=true\u3002\u78ba\u8a8d\u4ecd\u8655\u7406\u4e2d\u4e14\u5c1a\u7121\u6210\u529f\u7d50\u679c\u6642\u7acb\u5373\u56de409 IDEMPOTENCY_IN_PROGRESS\uff0c\u9644Retry-After\u3001creation_state=unknown\u53caretry_action=retry_same_key\uff0c\u4e0d\u7b49\u5f85\u539f\u8acb\u6c42\u7d50\u675f\u6216\u53e6\u914d\u865f\u3002\u78ba\u8a8d\u672a\u5efa\u7acb\u4e14\u53ef\u5b89\u5168\u958b\u59cb\u6642\uff0c\u5728\u672c\u6b21\u540c\u6b65\u5b8c\u6210\u672c\u5730\u914d\u865f\u53ca\u5b8c\u6574\u767c\u7968\u63d0\u4ea4\u5f8c\u56de201\uff1b\u5916\u90e8\u7d19\u672c\u5f85\u5217\u5370\u5b8c\u6210\u6216OPay\u5f85\u9001\u4ecd\u5c6c\u672c\u5730\u5efa\u7acb\u6210\u529f\u3002commit\u7d50\u679c\u4e0d\u660e\u56de503 CREATION_RESULT_UNKNOWN\u4e26\u4fdd\u7559\u539fKey\u6062\u5fa9\uff0c\u4e0d\u80fd\u56e0\u4e00\u6b21\u67e5\u7121\u7d50\u679c\u800c\u7576\u4f5c\u672a\u5efa\u7acb\u3002\u4ee5\u4e0a\u4ecd\u9808\u5167\u5bb9\u4e00\u81f4\u53ca\u7576\u524d\u6b0a\u9650\u6709\u6548\uff0c\u4e0d\u6539\u885d\u7a81\u8655\u7406\u3002 \u5916\u90e8API\u540c\u4e00\u5be6\u969b\u5e97\u5bb6\u6bcf\u9023\u7e8c60\u79d2\u6700\u591a5\u5f35\u6210\u529f\u65b0\u5efa\u672c\u5730\u767c\u7968\uff0c\u6309\u670d\u52d9\u53d7\u7406\u4e26\u4fdd\u7559\u540d\u984d\u6642\u9ede\u6b78\u5165\u6efe\u52d5\u7a97\u53e3\uff0c\u4e0d\u4ee5HTTP\u56de\u8986\u5230\u9054\u6216\u4fdd\u5b58\u5b8c\u6210\u77ac\u9593\u8a08\u7b97\uff1b\u540c\u5e97\u8de8client\uff0fToken\u5171\u7528\uff0cstore_hash_id\u7570\u52d5\u4e0d\u91cd\u7f6e\u3002\u540cKey\u6210\u529freplay\uff0f\u63dbKey\u540c\u4f86\u6e90\u5fa9\u7528\u4e0d\u91cd\u8a08\uff0c\u672c\u5730\u5df2\u5efa\u800c\u7d19\u672c\u5f85\u5217\u5370\uff0fOPay\u5f85\u9001\u4ecd\u8a08\uff1bGET\u3001print-events\u3001\u80cc\u666f\u4e0a\u50b3\u91cd\u8a66\u4e0d\u8a08\uff0c\u4e26\u975e\u6240\u6709HTTP\u6bcf\u5206\u9418\u53ea\u80fd5\u6b21\u3002\u4f5c\u5ee2\u4e0d\u9000\u8a08\u6578\uff0c\u5931\u6557\u4e14\u5b8c\u6574\u64a4\u56de\u672a\u5efa\u7968\u8005\u4e0d\u8a08\u3002\u53ea\u9650\u5916\u90e8API\u65b0\u7968\uff0cFoodiebro\u65e2\u6709POS\uff0fAdmin\u958b\u7968\u5165\u53e3\u4e0d\u5957\u7528\u6b64\u65b0\u589e\u5916\u90e8\u9650\u984d\uff1b\u5ee0\u5546POS\uff0f\u81ea\u52a9\u6a5f\u53f0\u7d93\u5916\u90e8API\u958b\u7968\u4ecd\u53d7\u9650\u5236\u3002\u9996\u7248\u4e0d\u8a2d\u6bcf\u65e5\u65b0\u958b\u7968\u7e3d\u5f35\u6578\u4e0a\u9650\uff0c\u4e0d\u505a\u6bcf\u65e5\u914d\u984d\u8a08\u6578\u3001\u65e5\u5207\u91cd\u7f6e\u6216\u6bcf\u65e5\u984d\u6eff\u62d2\u7d55\uff1b\u4e00\u822c\u6280\u8853\u8acb\u6c42\u4e0d\u53e6\u8a02 API \u696d\u52d9\u9650\u6d41\u6578\u503c\uff0c\u57fa\u790e\u9632\u8b77\u7531 WAF\uff0f\u53cd\u5411\u4ee3\u7406\u8655\u7406\uff0c\u6bcf\u65e5\u4e0d\u9650\u4e0d\u4ee3\u8868\u6240\u6709HTTP\u7121\u9650\u3002\u6709\u6548\u8a8d\u8b49\u3001\u73fe\u884cgrant\uff0f\u767c\u7968\u5408\u7d04\u3001\u898f\u683c\u9a57\u8b49\u3001\u53ef\u7528\u7576\u671f\u5b57\u8ecc\uff0f\u865f\u78bc\u53ca\u55ae\u5e97\u9023\u7e8c60\u79d25\u5f35\u4ecd\u9069\u7528\u3002QUOTA_EXCEEDED\u4fdd\u7559\u539f\u78bc\u4f46\u9996\u7248\u4e0d\u555f\u7528\u3001\u4e0d\u56de\u50b3\u3002 \u8d85\u904e\u65b0\u7968\u901f\u7387\u56de429 RATE_LIMITED\u3001creation_state=not_created\u3001retry_action=retry_same_key\uff0cRetry-After\u8207retry_after_seconds\u70ba\u76f8\u540c\u7b49\u5f85\u79d2\u6578\uff1b\u7a0d\u5f8c\u91cd\u8a66\u539fKey\u53ca\u5167\u5bb9\u3002not_created\u53ea\u8868\u793a\u6b64\u6b21\u672a\u65b0\u5efa\uff0c\u4e0d\u63a8\u7ffb\u5148\u524d\u6210\u529f\uff1b\u5df2\u6210\u529f\u7d50\u679c\u512a\u5148\u6062\u5fa9\u4e14\u4e0d\u91cd\u8a08\u3002 \u7531\u81ea\u52a9\u9ede\u9910\u6a5f\u5c07\u8cc7\u6599\u4ea4\u7d66\u5ee0\u5546\u5f8c\u7aef\uff0c\u518d\u7531\u5ee0\u5546\u5f8c\u7aef\u6301\u6b63\u5f0fToken\u547c\u53eb\u672cAPI\uff1b\u56fa\u5b9a\u767c\u7968\u8cc7\u6599\u7d93\u5ee0\u5546\u5f8c\u7aef\u53cd\u5411\u50b3\u56de\u6a5f\u53f0\u81ea\u884c\u5217\u5370\uff0c\u6a5f\u53f0\u4e0d\u6301Foodiebro Token\u3002\u5ee0\u5546\u5f8c\u7aef\u7dad\u8b77\u540cclient\uff0fstore\u8de8\u6a5f\u53f0\u552f\u4e00external_invoice_id\uff0c\u540c\u4e00\u64cd\u4f5c\u7db2\u8def\u91cd\u8a66\u6cbf\u539fKey\uff0f\u8b58\u5225\uff0f\u5167\u5bb9\uff0c\u4e0d\u4f7f\u7528\u53ef\u80fd\u78b0\u649e\u7684\u672c\u6a5f\u6d41\u6c34\u865f\u3002\u540c\u5e97\u8de8\u6a5f\u53f0\u5171\u75285\u5f35\uff0f\u9023\u7e8c60\u79d2\uff1b\u6a5f\u53f0\uff0f\u5ee0\u5546POS\u5747\u5c6c\u5916\u90e8\u6d41\u91cf\u3002 \u7b2c\u4e00\u7248\u4e0d\u65b0\u589e\u5ee0\u5546\u6301\u4e45\u5f85\u8655\u7406\u4f47\u5217\u3001\u65b7\u7dda\u5f8c\u81ea\u52d5\u6062\u5fa9\u6216\u8a2d\u5099\u4f47\u5217\u4f5c\u70ba\u984d\u5916\u5fc5\u8981\u9a57\u6536\u9580\u6abb\u3002\u82e5Foodiebro\u5df2\u5efa\u7acb\u539f\u7968\u4f46\u5ee0\u5546\u672a\u53d6\u5f97\u56de\u61c9\uff0f\u6a5f\u53f0\u5217\u5370\u5931\u6557\uff0c\u7531\u8a72\u5e97\u5177\u6b0a\u9650\u4eba\u54e1\u5148\u5728\u65e2\u6709Admin\u67e5\u627e\u539f\u7968\uff0c\u518d\u6309\u65e2\u6709\u88dc\u5370\u529f\u80fd\u8207\u9650\u5236\u8655\u7406\uff0c\u6c92\u6709\u5ee0\u5546\u5f8c\u53f0\u767b\u5165\uff1b\u5916\u90e8\u7968\u7684Admin\u67e5\u627e\u8207\u88dc\u5370\u76f8\u5bb9\u6027\u4ecd\u9808\u9a57\u8b49\uff0c\u5c1a\u672a\u5be6\u4f5c\u5b8c\u6210\u3002Admin\u88dc\u5370\u4f7f\u7528\u539f\u7968\u3001\u4e0d\u65b0\u5efa\u3001\u4e0d\u8986\u5beb\u5916\u90e8\u9996\u6b21\u5217\u5370\u6458\u8981\uff0c\u4e0d\u8981\u6c42\u5ee0\u5546\u88dc\u9001\u5f8c\u53f0\u88dc\u5370\u4e8b\u4ef6\u3002\u672a\u6536\u5230\uff0f\u672a\u5efa\u7acb\u7121\u7968\u53ef\u88dc\u5370\uff0cAPI\u5931\u6557\u6216unknown\u4e0d\u4ee3\u8868\u5df2\u5efa\u7acb\uff1b\u539fKey\u9632\u91cd\u3001\u53ef\u6062\u5fa9API\u53ca\u56de\u61c9\u4e1f\u5931\uff0f\u63d0\u4ea4\u7d50\u679c\u4e0d\u660e\u9a57\u6536\u4ecd\u4fdd\u7559\uff0c\u4e0d\u5f97\u63db\u8b58\u5225\u91cd\u958b\u7968\u3002 \u5ee0\u5546\u9808\u8b93\u5e97\u5bb6\u5728\u5176\u756b\u9762\u6216\u55ae\u64da\u53d6\u5f97\u8207request\u5b8c\u5168\u76f8\u540c\u7684external_invoice_id\uff0c\u6bcf\u5f35\u5916\u90e8\u767c\u7968\u6c38\u4e45\u4e0d\u91cd\u7528\u3001\u540cclient\uff0fstore\u8de8\u6a5f\u53f0\u552f\u4e00\uff0c\u4e0d\u5f37\u5236\u7b49\u65bcorder ID\u3002\u7b2c\u4e00\u7248\u898f\u5283\u65e2\u6709Admin\u767c\u7968\u5217\u8868\u986f\u793a\u4f86\u6e90\u5ee0\u5546\uff0f\u6574\u5408\u7cfb\u7d71\u53caexternal_invoice_id\uff0c\u6388\u6b0a\u5e97\u5bb6\u4eba\u54e1\u4f9d\u4f86\u6e90\u8207\u8b58\u5225\u7cbe\u78ba\u67e5\u6838\u539f\u7968\uff0c\u5c1a\u672a\u62ff\u5230\u7968\u865f\u4ea6\u53ef\u63d0\u4f9b\u6b64\u8cc7\u8a0a\uff1b\u5916\u90e8\u7968\u67e5\u627e\uff0f\u88dc\u5370\u4ecd\u5f85\u5be6\u4f5c\u9a57\u6536\u3002\u9019\u662f\u65e2\u6709Admin\u5e97\u5bb6scope\u5167\u67e5\u627e\uff0c\u4e0d\u653e\u5bec\u6b0a\u9650\u3001\u7121\u5ee0\u5546Admin\u767b\u5165\uff0c\u4e0d\u65b0\u589e\u516c\u958bGET\u5916\u90e8\u8b58\u5225\u641c\u5c0b\u3001\u53c3\u6578\u6216\u6b04\u4f4d\uff1b\u672a\u5efa\u7acb\u7121\u7968\u53ef\u88dc\u5370\u53ca\u539fKey\u6062\u5fa9\u898f\u5247\u4e0d\u8b8a\u3002 \u5916\u90e8\u7d19\u672c\u672c\u5730\u914d\u865f\u3001\u5b8c\u6574\u4fdd\u5b58\u53ca\u56de\u56fa\u5b9a\u8cc7\u6599\u5f8c\uff0c\u6cbf\u65e2\u6709\u5217\u5370\u65d7\u6a19N\u7b49\u5f85\u5b8c\u6210\uff0c\u6301\u4e45\u9001\u4ef6\u5de5\u4f5c\u5c1a\u4e0d\u53ef\u57f7\u884c\uff1b\u6709\u6548printed\u5b8c\u6210\u8b49\u64da\u624d\u4ee5\u65e2\u6709Y\u8a9e\u610f\u53d6\u5f97\u8cc7\u683c\u4e26\u5b89\u6392\u80cc\u666f\u9001OPay\u3002submitted\u53ea\u662f\u9001\u5165\u8a2d\u5099\u4f47\u5217\uff0cfailed\/unknown\/\u672a\u56de\u5831\u5747\u4e0d\u653e\u884c\u3002\u8f09\u5177\u7167\u820a\u7121\u9808\u5217\u5370\u56de\u5831\u3001print\u65d7\u6a19\u4ecdN\u4f46\u672c\u5730\u5efa\u7968\u5f8c\u76f4\u63a5\u53d6\u5f97\u8cc7\u683c\uff0c\u4e0d\u80fd\u4e00\u5f8b\u4ee5N\u963b\u64cb\u3002\u6cbf\u7528\u65e2\u6709N\/Y\u53caupload0\/1\/-1\u503c\uff0c\u4e0d\u65b0\u589e\u516c\u958b\u65d7\u6a19\uff0f\u72c0\u614b\uff1bsubmission_status\u4ecdpending\uff0c\u53ef\u6db5\u84cb\u7b49\u5f85\u7d19\u672c\u5217\u5370\u6216\u5df2\u53d6\u5f97\u8cc7\u683c\u5f85\u4e0a\u50b3\u3002\u672c\u5730201\u8207\u56fa\u5b9a\u6210\u529fsnapshot\/\u539fKey\u6062\u5fa9\/\u65b0\u7968\u8a08\u6578\u4e0d\u56e0\u7b49\u5f85\u5217\u5370\u6539\u8b8a\u3002Admin\u65e2\u6709\u88dc\u5370\u53ea\u6cbf\u539f\u64cd\u4f5c\u88dc\u7d19\u672c\uff0c\u4e0d\u6539print_fg\u3001\u4e0d\u7522\u751f\u5916\u90e8\u4e8b\u4ef6\u3001\u4e0d\u89e3\u9664\u5916\u90e8\u7d19\u672c\u9001\u4ef6\u8cc7\u683c\uff1b\u5916\u90e8\u7968\u4ecd\u9808\u5ee0\u5546\u56de\u5831printed\uff0c\u4e0d\u8986\u5beb\u5916\u90e8summary\u3002\u5e97\u5bb6\u5728\u672aprinted\u6642\u4ecd\u53ef\u900f\u904e\u65e2\u6709Admin\u4e3b\u52d5\u4f5c\u5ee2\uff0c\u4f9d\u5148OfflineIssue\u5f8cOfflineInvalid\u7684\u4f5c\u5ee2\u5c08\u7528\u6d41\u7a0b\uff1b\u672a\u56de\u5831\u4e0d\u6703\u81ea\u52d5\u4f5c\u5ee2\uff0c\u4e0d\u6539print_fg\u3001\u4e0d\u7522\u751f\u5916\u90e8\u5217\u5370\u4e8b\u4ef6\u3001\u4e0d\u653e\u884c\u4e00\u822c\u958b\u7acboutbox\uff0c\u4f5c\u5ee2\u5f8c\u9072\u5230printed\u4e5f\u4e0d\u5f97\u653e\u884c\u3002\u4e00\u822c\u80cc\u666f\u958b\u7acb\uff0f\u4e00\u822c\u624b\u52d5\u9001\u4ef6\u4ecd\u9808\u6838\u5c0d\u5916\u90e8\u7d19\u672c\u8cc7\u683c\u3002\u7db2\u7ad9\u8207\u65b0\u6d41\u7a0b\u5c1a\u672a\u5be6\u4f5c\u3002 \u5916\u90e8 v1 \u53ea\u63a5\u53d7 taxable\uff1bdelivery \u53e6\u652f\u63f4 donation \u8207 love_code\u3002\u624b\u6a5f\u8f09\u5177\u5728\u914d\u865f\u524d\u65bc Redis\uff0fDB \u9396\u5916\u547c\u53eb OPay CheckBarcode\uff0c\u63a1 connect timeout 2 \u79d2\u3001request timeout 5 \u79d2\u53ca overall deadline 5 \u79d2\uff08\u4ee5\u8f03\u65e9\u8005\u70ba\u6e96\uff09\uff1b\u611b\u5fc3\u78bc\u5728\u914d\u865f\u524d\u67e5\u65e2\u6709 syscode\u3002\u9a57\u8b49\u4e0d\u901a\u904e\u5373\u4e0d\u914d\u865f\uff1b\u6350\u8d08\u4e0d\u5217\u5370\u3001\u4e0d\u56de\u5831 print-events\uff0c\u901a\u904e\u5f8c\u80cc\u666f\u4f9d\u65e2\u6709 OPay LoveCode\uff0fDonation mapping \u8655\u7406\u3002","x-required-ability":"invoices:create","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","description":"","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"\u56fa\u5b9a\u7533\u8acb\u8b58\u5225\uff0cscope\u70baclient\u53caoperation\uff1bToken\u8f2a\u66ff\u4e0d\u6539\u3002"}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CreateInvoiceRequest"},"examples":{"paper":{"value":{"store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0001","transaction_at":"2026-10-06T12:00:00+08:00","currency":"TWD","tax_type":"taxable","delivery":{"mode":"paper"},"items":[{"name":"\u5348\u9910\u5957\u9910","quantity":"1","unit":"\u4efd","unit_price":100,"line_amount":100}],"total_amount":100}},"carrier":{"value":{"store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0002","transaction_at":"2026-10-06T12:00:00+08:00","currency":"TWD","tax_type":"taxable","delivery":{"mode":"carrier","carrier_type":"mobile_barcode","carrier_id":"\/ABC1234"},"items":[{"name":"\u5348\u9910\u5957\u9910","quantity":"1","unit":"\u4efd","unit_price":100,"line_amount":100}],"total_amount":100}},"donation":{"value":{"store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0003","transaction_at":"2026-10-06T12:00:00+08:00","currency":"TWD","tax_type":"taxable","delivery":{"mode":"donation","love_code":"919"},"items":[{"name":"\u5348\u9910\u5957\u9910","quantity":"1","unit":"\u4efd","unit_price":100,"line_amount":100}],"total_amount":100}}}}}},"responses":{"201":{"description":"\u5b8c\u6574\u672c\u5730\u767c\u7968\u5df2\u63d0\u4ea4\u5f8c\u56de201\uff1b\u540c\u539fKey\u6210\u529freplay\u4fdd\u7559\u539f201\u8207\u56fa\u5b9adata\u4e26\u6a19\u793aIdempotency-Replayed=true\u3002\u5916\u90e8\u7d19\u672c\u4ecd\u7b49\u5f85\u5217\u5370\u5b8c\u6210\uff0c\u6216OPay\u5c1a\u5f85\u80cc\u666f\u9001\u4ef6\uff0c\u90fd\u5c6c\u672c\u5730\u5efa\u7acb\u6210\u529f\uff1b\u56fa\u5b9adata\u4ecdpending\uff0c\u4e0d\u8868\u793a\u9001\u4ef6\u5df2\u53ef\u57f7\u884c\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Location":{"description":"\u8a72\u8cc7\u6e90\u7684\u67e5\u8a62\u8def\u5f91\u3002","schema":{"type":"string","description":""}},"Idempotency-Replayed":{"description":"\u540c Key \u6216\u540c event ID \u7684\u6210\u529f replay\u3002","schema":{"type":"boolean"}},"Resource-Reused":{"description":"\u4e0d\u540c Key \u547d\u4e2d\u540c\u5916\u90e8\u8b58\u5225\u8207\u5167\u5bb9\u7684\u65e2\u6709\u8cc7\u6e90\u3002","schema":{"type":"boolean"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CreateInvoiceResponse"},"examples":{"paper":{"value":{"request_id":"req-example-001","data":{"invoice_id":"cb42a660-bded-4ca7-9561-58306f2e7cba","store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0001","invoice_number":"AB00001234","invoice_date":"2026-10-06T12:00:01+08:00","delivery_mode":"paper","print_required":true,"submission_status":"pending","carrier_status":"not_applicable","print_status":"not_reported","print_data":{"format_version":"tw-einvoice-paper-v1","seller":{"name":"\u793a\u7bc4\u9910\u5ef3","identifier":"00000000","address":"\u793a\u7bc4\u5730\u5740\uff1b\u975e\u6b63\u5f0f\u8cc7\u6599"},"buyer_identifier":null,"buyer_name":null,"invoice_number":"AB00001234","invoice_date":"2026-10-06T12:00:01+08:00","period":"2026-09\/2026-10","random_number":"1234","currency":"TWD","sales_amount":95,"tax_amount":5,"total_amount":100,"barcode":"EXAMPLE-ONLY-NOT-A-VALID-INVOICE","qr_left":"EXAMPLE-ONLY-NOT-A-VALID-QR","qr_right":"EXAMPLE-ONLY-NOT-A-VALID-QR","items":[{"name":"\u5348\u9910\u5957\u9910","quantity":"1","unit":"\u4efd","unit_price":100,"line_amount":100}],"remark":""}}}},"carrier":{"value":{"request_id":"req-example-002","data":{"invoice_id":"9ae39a6f-0ce4-4a2b-9e9b-db0b8a5d633f","store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0002","invoice_number":"AB00001235","invoice_date":"2026-10-06T12:00:01+08:00","delivery_mode":"carrier","print_required":false,"submission_status":"pending","carrier_status":"pending_upload","print_status":"not_required","print_data":null}}},"donation":{"value":{"request_id":"req-example-003","data":{"invoice_id":"3a0c6d9b-d5ed-42e5-8d59-1d1c117b1b3a","store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0003","invoice_number":"AB00001236","invoice_date":"2026-10-06T12:00:01+08:00","delivery_mode":"donation","print_required":false,"submission_status":"pending","carrier_status":"not_applicable","print_status":"not_required","print_data":null}}}}}}},"200":{"description":"\u4e0d\u540cKey\u547d\u4e2d\u540c\u5e97\u5bb6\u5916\u90e8\u767c\u7968\u8b58\u5225\u8207\u76f8\u540c\u5167\u5bb9\uff0c\u56de\u65e2\u6709\u56fa\u5b9a\u6210\u529f\u7d50\u679c\u53caResource-Reused=true\uff0c\u4e0d\u518d\u914d\u865f\uff1b\u8a72\u5225\u540dKey\u5f8c\u7e8creplay\u4fdd\u7559\u539f200\u8207data\u4e26\u6a19\u793aIdempotency-Replayed=true\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Location":{"description":"\u8a72\u8cc7\u6e90\u7684\u67e5\u8a62\u8def\u5f91\u3002","schema":{"type":"string","description":""}},"Idempotency-Replayed":{"description":"\u540c Key \u6216\u540c event ID \u7684\u6210\u529f replay\u3002","schema":{"type":"boolean"}},"Resource-Reused":{"description":"\u4e0d\u540c Key \u547d\u4e2d\u540c\u5916\u90e8\u8b58\u5225\u8207\u5167\u5bb9\u7684\u65e2\u6709\u8cc7\u6e90\u3002","schema":{"type":"boolean"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/CreateInvoiceResponse"},"examples":{"reused":{"value":{"request_id":"req-example-001","data":{"invoice_id":"cb42a660-bded-4ca7-9561-58306f2e7cba","store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0001","invoice_number":"AB00001234","invoice_date":"2026-10-06T12:00:01+08:00","delivery_mode":"paper","print_required":true,"submission_status":"pending","carrier_status":"not_applicable","print_status":"not_reported","print_data":{"format_version":"tw-einvoice-paper-v1","seller":{"name":"\u793a\u7bc4\u9910\u5ef3","identifier":"00000000","address":"\u793a\u7bc4\u5730\u5740\uff1b\u975e\u6b63\u5f0f\u8cc7\u6599"},"buyer_identifier":null,"buyer_name":null,"invoice_number":"AB00001234","invoice_date":"2026-10-06T12:00:01+08:00","period":"2026-09\/2026-10","random_number":"1234","currency":"TWD","sales_amount":95,"tax_amount":5,"total_amount":100,"barcode":"EXAMPLE-ONLY-NOT-A-VALID-INVOICE","qr_left":"EXAMPLE-ONLY-NOT-A-VALID-QR","qr_right":"EXAMPLE-ONLY-NOT-A-VALID-QR","items":[{"name":"\u5348\u9910\u5957\u9910","quantity":"1","unit":"\u4efd","unit_price":100,"line_amount":100}],"remark":""}}}}}}}},"400":{"description":"\u53ef\u80fd code\uff1aINVALID_JSON, IDEMPOTENCY_KEY_REQUIRED, IDEMPOTENCY_KEY_INVALID","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"INVALID_JSON":{"value":{"request_id":"req-error-example","error":{"code":"INVALID_JSON","message":"JSON \u7121\u6cd5\u89e3\u6790\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"IDEMPOTENCY_KEY_REQUIRED":{"value":{"request_id":"req-error-example","error":{"code":"IDEMPOTENCY_KEY_REQUIRED","message":"\u5efa\u7acb API \u7f3a\u5c11 Idempotency-Key\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"IDEMPOTENCY_KEY_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"IDEMPOTENCY_KEY_INVALID","message":"Key \u4e0d\u7b26\u5408 8\u2013128 ASCII \u82f1\u6578\u6216 ._:-\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["INVALID_JSON","IDEMPOTENCY_KEY_REQUIRED","IDEMPOTENCY_KEY_INVALID"]},"401":{"description":"\u53ef\u80fd code\uff1aAUTH_REQUIRED, AUTH_INVALID, AUTH_EXPIRED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"WWW-Authenticate":{"schema":{"type":"string","description":""},"description":"Bearer \u9a57\u8b49\u6311\u6230\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"AUTH_REQUIRED":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_REQUIRED","message":"\u7f3a\u5c11 Bearer Token\u3002","creation_state":"not_created","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}},"AUTH_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_INVALID","message":"Token \u7121\u6548\u3001\u5c1a\u672a\u751f\u6548\u3001\u5df2\u64a4\u92b7\u6216\u74b0\u5883\u4e0d\u7b26\uff1b\u4e0d\u63ed\u9732\u66f4\u591a\u6191\u8b49\u8cc7\u8a0a\u3002","creation_state":"not_created","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}},"AUTH_EXPIRED":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_EXPIRED","message":"Token \u5df2\u9054\u6216\u8d85\u904e\u81ea\u8eab\u5230\u671f\u6642\u9593\u3002","creation_state":"not_created","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["AUTH_REQUIRED","AUTH_INVALID","AUTH_EXPIRED"]},"403":{"description":"\u53ef\u80fd code\uff1aCLIENT_NOT_APPROVED, CLIENT_INACTIVE, SCOPE_DENIED, STORE_ACCESS_DENIED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"CLIENT_NOT_APPROVED":{"value":{"request_id":"req-error-example","error":{"code":"CLIENT_NOT_APPROVED","message":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u5c1a\u672a\u6838\u51c6\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"CLIENT_INACTIVE":{"value":{"request_id":"req-error-example","error":{"code":"CLIENT_INACTIVE","message":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u505c\u7528\uff0f\u7d50\u6848\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"SCOPE_DENIED":{"value":{"request_id":"req-error-example","error":{"code":"SCOPE_DENIED","message":"Token\/client\/grant \u7f3a\u5c11\u672c\u64cd\u4f5c\u80fd\u529b\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"STORE_ACCESS_DENIED":{"value":{"request_id":"req-error-example","error":{"code":"STORE_ACCESS_DENIED","message":"store_hash_id \u4e0d\u5b58\u5728\u3001\u5e97\u5bb6\u5df2\u522a\u9664\uff0c\u6216\u8a72\u6574\u5408\u5e33\u865f\u5728\u76ee\u524d\u74b0\u5883\u7121\u6709\u6548\u5e97\u5bb6\u6388\u6b0a\uff1b\u4e0d\u5340\u5206\u539f\u56e0\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["CLIENT_NOT_APPROVED","CLIENT_INACTIVE","SCOPE_DENIED","STORE_ACCESS_DENIED"]},"409":{"description":"\u53ef\u80fd code\uff1aIDEMPOTENCY_KEY_CONFLICT, IDEMPOTENCY_IN_PROGRESS, EXTERNAL_INVOICE_CONFLICT, INVOICE_NUMBER_UNAVAILABLE, INVOICE_PERIOD_UNAVAILABLE, INVOICE_SERVICE_NOT_ENABLED\uff1bIDEMPOTENCY_IN_PROGRESS\u50c5\u5728\u78ba\u8a8d\u539f\u7533\u8acb\u4ecd\u8655\u7406\u4e2d\u4e14\u5c1a\u7121\u6210\u529f\u7d50\u679c\u6642\u7acb\u5373\u56de\u8986\uff0c\u4e0d\u7b49\u5f85\u539f\u8acb\u6c42\u6216\u53e6\u914d\u865f\uff1b\u5df2\u4fdd\u5b58\u6210\u529f\u7d50\u679c\u512a\u5148\u6062\u5fa9\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"\u82e5\u53ef\u7b49\u5f85\u91cd\u8a66\uff0c\u5efa\u8b70\u7b49\u5f85\u79d2\u6578\uff1b\u9032\u884c\u4e2d\u8207429\u5fc5\u6709\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"IDEMPOTENCY_KEY_CONFLICT":{"value":{"request_id":"req-error-example","error":{"code":"IDEMPOTENCY_KEY_CONFLICT","message":"\u5df2\u53d7\u7406\u7684\u540c Key \u5167\u5bb9\u4e0d\u540c\uff1b\u6062\u5fa9\u539f\u5167\u5bb9\uff0c\u4e0d\u80fd\u4fee\u6539\u820a\u7533\u8acb\u3002","creation_state":"unknown","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"IDEMPOTENCY_IN_PROGRESS":{"value":{"request_id":"req-error-example","error":{"code":"IDEMPOTENCY_IN_PROGRESS","message":"\u540c Key\u3001\u540c\u5167\u5bb9\u78ba\u8a8d\u4ecd\u5728\u8655\u7406\u4e14\u5c1a\u7121\u6210\u529f\u7d50\u679c\uff1b\u7acb\u5373\u56de\u8986\u4e26\u9644 Retry-After\uff0c\u4e0d\u7b49\u5f85\u539f\u8acb\u6c42\u6216\u53e6\u914d\u865f\u3002","creation_state":"unknown","retry_action":"retry_same_key","retry_after_seconds":5,"details":[]}}},"EXTERNAL_INVOICE_CONFLICT":{"value":{"request_id":"req-error-example","error":{"code":"EXTERNAL_INVOICE_CONFLICT","message":"\u540c\u5e97\u5bb6\u5916\u90e8\u8b58\u5225\u5df2\u6709\u53e6\u4e00\u5167\u5bb9\u7684\u767c\u7968\uff1b\u4e0d\u65b0\u914d\u865f\u3002","creation_state":"created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"INVOICE_NUMBER_UNAVAILABLE":{"value":{"request_id":"req-error-example","error":{"code":"INVOICE_NUMBER_UNAVAILABLE","message":"\u7121\u53ef\u7528\u865f\u78bc\uff0f\u5269\u9918\u91cf\u4e0d\u8db3\uff1bFoodiebro \u88dc\u865f\u5f8c\u4ee5\u539f Key \u91cd\u8a66\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"INVOICE_PERIOD_UNAVAILABLE":{"value":{"request_id":"req-error-example","error":{"code":"INVOICE_PERIOD_UNAVAILABLE","message":"\u958b\u7acb\u671f\u5225\u7f3a\u5c11\u6709\u6548\u5b57\u8ecc\uff1b\u7ba1\u7406\u54e1\u8655\u7406\u5f8c\u4ee5\u539f Key \u91cd\u8a66\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"INVOICE_SERVICE_NOT_ENABLED":{"value":{"request_id":"req-error-example","error":{"code":"INVOICE_SERVICE_NOT_ENABLED","message":"\u5e97\u5bb6\u6709\u6548\u767c\u7968\u5408\u7d04\u6216\u767c\u7968\u8a2d\u5b9a\u672a\u5c31\u7dd2\uff1b\u4e0d\u63ed\u9732\u5167\u90e8\u6191\u8b49\u3002","creation_state":"not_created","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["IDEMPOTENCY_KEY_CONFLICT","IDEMPOTENCY_IN_PROGRESS","EXTERNAL_INVOICE_CONFLICT","INVOICE_NUMBER_UNAVAILABLE","INVOICE_PERIOD_UNAVAILABLE","INVOICE_SERVICE_NOT_ENABLED"]},"413":{"description":"\u53ef\u80fd code\uff1aPAYLOAD_TOO_LARGE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"PAYLOAD_TOO_LARGE":{"value":{"request_id":"req-error-example","error":{"code":"PAYLOAD_TOO_LARGE","message":"body \u8d85\u904e\u6838\u51c6\u4e0a\u9650\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["PAYLOAD_TOO_LARGE"]},"415":{"description":"\u53ef\u80fd code\uff1aUNSUPPORTED_MEDIA_TYPE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"UNSUPPORTED_MEDIA_TYPE":{"value":{"request_id":"req-error-example","error":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"POST \u975e application\/json\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["UNSUPPORTED_MEDIA_TYPE"]},"422":{"description":"\u53ef\u80fd code\uff1aVALIDATION_FAILED, AMOUNT_MISMATCH, TAX_CONFIGURATION_INVALID, TRANSACTION_DATE_INVALID, BUYER_IDENTIFIER_INVALID, CARRIER_INVALID, DELIVERY_MODE_INVALID, DONATION_INVALID","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"VALIDATION_FAILED":{"value":{"request_id":"req-error-example","error":{"code":"VALIDATION_FAILED","message":"\u6b04\u4f4d\u7f3a\u5c11\u3001\u578b\u5225\u3001\u9577\u5ea6\u6216\u672a\u77e5\u6b04\u4f4d\u7b49\u9a57\u8b49\u932f\u8aa4\uff1bdetails \u6307\u51fa\u6b04\u4f4d\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"AMOUNT_MISMATCH":{"value":{"request_id":"req-error-example","error":{"code":"AMOUNT_MISMATCH","message":"\u6578\u91cf\u00d7\u6574\u6578\u55ae\u50f9\u4e0d\u662f\u6574\u6578\u5143\u3001\u8207\u54c1\u9805\u91d1\u984d\u4e0d\u7b26\uff0c\u6216\u660e\u7d30\u5408\u8a08\u4e0d\u7b49\u65bc\u7e3d\u984d\uff1b\u4e0d\u81ea\u884c\u6368\u5165\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"TAX_CONFIGURATION_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"TAX_CONFIGURATION_INVALID","message":"\u4e0d\u652f\u63f4\u7684\u7a05\u5225\u6216\u91d1\u984d\u542b\u7a05\u8a2d\u5b9a\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"TRANSACTION_DATE_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"TRANSACTION_DATE_INVALID","message":"\u4ea4\u6613\u6642\u9593\u683c\u5f0f\uff0f\u65e5\u66c6\u65e5\u671f\u7121\u6548\u3001\u672a\u5e36 +08:00 offset\uff0c\u6216\u771f\u6b63\u65b0\u7533\u8acb\u8d85\u904e\u672c\u6b21\u4f3a\u670d\u5668\u63a5\u6536 HTTP \u6642\u9593\u56fa\u5b9a\u5feb\u7167\u52a0300\u79d2\uff1b\u904e\u53bb\u4ea4\u6613\u4e0d\u8a2d\u5e74\u9f61\u4e0a\u9650\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"BUYER_IDENTIFIER_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"BUYER_IDENTIFIER_INVALID","message":"\u8cb7\u65b9\u7d71\u7de8\u683c\u5f0f\uff0f\u7de8\u5be9\u4e0d\u7b26\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"CARRIER_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"CARRIER_INVALID","message":"\u624b\u6a5f\u8f09\u5177\u683c\u5f0f\u6216 OPay \u914d\u865f\u524d\u6709\u6548\u6027\u9a57\u8b49\u62d2\u7d55\uff1b\u4e0d\u914d\u865f\u3001\u4e0d\u81ea\u884c\u8f49\u7d19\u672c\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"DELIVERY_MODE_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"DELIVERY_MODE_INVALID","message":"\u7d19\u672c\u3001\u624b\u6a5f\u8f09\u5177\u3001\u6350\u8d08\u53ca\u8cb7\u65b9\u8cc7\u6599\u7d44\u5408\u4e0d\u7b26\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"DONATION_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"DONATION_INVALID","message":"\u611b\u5fc3\u78bc\u4e0d\u5b58\u5728\u65bc Foodiebro \u65e2\u6709 syscode \u767d\u540d\u55ae\uff1b\u4e0d\u914d\u865f\u3002","creation_state":"not_created","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["VALIDATION_FAILED","AMOUNT_MISMATCH","TAX_CONFIGURATION_INVALID","TRANSACTION_DATE_INVALID","BUYER_IDENTIFIER_INVALID","CARRIER_INVALID","DELIVERY_MODE_INVALID","DONATION_INVALID"]},"429":{"description":"\u53ef\u80fd code\uff1aRATE_LIMITED\uff1b\u5916\u90e8\u65b0\u7968\u55ae\u5e97\u6bcf\u9023\u7e8c60\u79d2\u6700\u591a5\u5f35\uff0c\u8de8client\uff0fToken\u5171\u7528\uff0c\u7b49\u5f85Retry-After\u5f8c\u4ee5\u539fKey\uff0f\u5167\u5bb9\u91cd\u8a66\uff0cnot_created\u50c5\u63cf\u8ff0\u672c\u6b21\u3002\u9996\u7248\u6bcf\u65e5\u65b0\u7968\u7e3d\u5f35\u6578\u4e0d\u9650\uff0cQUOTA_EXCEEDED\u70ba\u4fdd\u7559\u78bc\u4e0d\u555f\u7528\u3001\u4e0d\u56de\u50b3\uff1b\u4e00\u822c HTTP \u57fa\u790e\u6d41\u91cf\u9632\u8b77\u7531 WAF\uff0f\u53cd\u5411\u4ee3\u7406\u4f9d\u90e8\u7f72\u653f\u7b56\u8655\u7406\uff0c\u4e0d\u53e6\u8a02 API \u696d\u52d9\u9650\u6d41\u6578\u503c\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"429\u5fc5\u5e36\u7b49\u5f85\u79d2\u6578\uff0c\u8207JSON error.retry_after_seconds\u76f8\u540c\uff1b\u7b49\u5f85\u5f8c\u91cd\u8a66\u539f\u64cd\u4f5c\u8b58\u5225\uff0f\u5167\u5bb9\uff0cGET\u91cd\u505a\u539f\u67e5\u8a62\u3002\u6b64\u503c\u70ba\u7576\u4e0b\u5efa\u8b70\uff0c\u5176\u4ed6\u540c\u5e97\u8acb\u6c42\u4ecd\u53ef\u80fd\u5f71\u97ff\u5f8c\u7e8c\u53ef\u7528\u540d\u984d\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"RATE_LIMITED":{"value":{"request_id":"req-error-example","error":{"code":"RATE_LIMITED","message":"\u9054\u5916\u90e8\u65b0\u7968\u5e97\u7d1a\u901f\u7387\u9650\u5236\uff08\u55ae\u5e97\u6bcf\u9023\u7e8c60\u79d25\u5f35\uff09\uff1b\u7b49\u5f85 Retry-After\uff0c\u518d\u91cd\u9001\u539f POST\uff0f\u91cd\u65b0 GET\u3002","creation_state":"not_created","retry_action":"retry_same_key","retry_after_seconds":5,"details":[]}}}}}},"x-error-codes":["RATE_LIMITED"]},"500":{"description":"\u53ef\u80fd code\uff1aINTERNAL_ERROR","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"INTERNAL_ERROR":{"value":{"request_id":"req-error-example","error":{"code":"INTERNAL_ERROR","message":"\u975e\u9810\u671f\u932f\u8aa4\uff1b\u672c\u6b21\u5efa\u7acb\u7d50\u679c\u672a\u78ba\u5b9a\uff0c\u4e0d\u80fd\u63db Key\u3002","creation_state":"unknown","retry_action":"retry_same_key","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["INTERNAL_ERROR"]},"503":{"description":"\u53ef\u80fd code\uff1aCARRIER_VALIDATION_UNAVAILABLE, SERVICE_UNAVAILABLE, CREATION_RESULT_UNKNOWN\uff1bCREATION_RESULT_UNKNOWN\u4e0d\u4ee3\u8868\u672a\u5efa\u7acb\uff0c\u7dad\u6301\u539fKey\u8207\u5167\u5bb9\u6062\u5fa9\uff0c\u4e0d\u65b0\u914d\u865f\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"\u82e5\u53ef\u7b49\u5f85\u91cd\u8a66\uff0c\u5efa\u8b70\u7b49\u5f85\u79d2\u6578\uff1b\u9032\u884c\u4e2d\u8207429\u5fc5\u6709\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"CARRIER_VALIDATION_UNAVAILABLE":{"value":{"request_id":"req-error-example","error":{"code":"CARRIER_VALIDATION_UNAVAILABLE","message":"OPay CheckBarcode \u5728\u914d\u865f\u524d\u9a57\u8b49\u903e\u6642\u6216\u9a57\u8b49\u670d\u52d9\u4e0d\u53ef\u7528\uff08connect timeout 2 \u79d2\u3001request timeout 5 \u79d2\u3001overall deadline 5 \u79d2\uff0c\u4ee5\u8f03\u65e9\u8005\u70ba\u6e96\uff09\uff1b\u4e0d\u5728 Redis \u9396\u6216 DB transaction \u5167\u7b49\u5f85\uff0c\u5c1a\u672a\u914d\u865f\u3002","creation_state":"not_created","retry_action":"retry_same_key","retry_after_seconds":null,"details":[]}}},"SERVICE_UNAVAILABLE":{"value":{"request_id":"req-error-example","error":{"code":"SERVICE_UNAVAILABLE","message":"\u5fc5\u8981\u670d\u52d9\u4e0d\u53ef\u7528\uff1b\u9664\u975e\u8b49\u660e\u672a\u53d7\u7406\uff0c\u4fdd\u5b88\u8996\u70ba\u5efa\u7acb\u7d50\u679c\u4e0d\u660e\u3002","creation_state":"unknown","retry_action":"retry_same_key","retry_after_seconds":null,"details":[]}}},"CREATION_RESULT_UNKNOWN":{"value":{"request_id":"req-error-example","error":{"code":"CREATION_RESULT_UNKNOWN","message":"\u5167\u90e8 timeout\uff0fcommit \u7d50\u679c\u4e0d\u660e\uff1b\u4e0d\u80fd\u5224\u5b9a\u672a\u5efa\u7acb\u6216\u53e6\u914d\u865f\uff0c\u7528\u539f Key \u548c\u5167\u5bb9\u6062\u5fa9\u3002","creation_state":"unknown","retry_action":"retry_same_key","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["CARRIER_VALIDATION_UNAVAILABLE","SERVICE_UNAVAILABLE","CREATION_RESULT_UNKNOWN"]},"default":{"description":"\u5176\u4ed6\u670d\u52d9\u7aef\u932f\u8aa4\uff0c\u4f9d\u539f\u7533\u8acb\u8b58\u5225\u6062\u590d\uff1bgateway\u932f\u8aa4\u53ef\u80fd\u7121\u6b64JSON\u683c\u5f0f\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}}}},"\/api\/v1\/invoices\/{invoice_id}":{"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","description":"Foodiebro \u4e0d\u900f\u660e\u8cc7\u6e90\u8b58\u5225\u3002","format":"uuid"}}],"get":{"operationId":"getInvoice","tags":["\u767c\u7968"],"summary":"\u67e5\u8a62\u6700\u65b0\u9001\u4ef6\u8207\u4ea4\u4ed8\u72c0\u614b","x-required-ability":"invoices:read","description":"\u53ef\u9078\u67e5\u8a62\uff0c\u4f9d\u6574\u5408\u5e33\u865f\u53ca\u5e97\u5bb6\u6709\u6548\u6388\u6b0a\u56de\u50b3\u771f\u5be6\u6700\u65b0\u72c0\u614b\u3002\u80cc\u666f\u62d2\u7d55\u6216\u7d50\u679c\u4e0d\u660e\u4ecd200\uff0c\u7531submission_issue\u8868\u793a\uff0c\u4e0d\u80fd\u986f\u793a\u70ba\u5df2\u6210\u529f\u3002\u4e0a\u50b3\u7570\u5e38\u7531Foodiebro Admin\u5f8c\u53f0\u76e3\u63a7\u8207\u8655\u7406\uff0c\u4e0d\u8981\u6c42\u5ee0\u5546\u8f2a\u8a62\u3001\u63a5\u6536webhook\u3001\u806f\u7e6b\u6216\u91cd\u65b0\u958b\u7acb\u3002 \u672c\u64cd\u4f5c\u4e0d\u8a08\u5165\u55ae\u5e97\u9023\u7e8c60\u79d25\u5f35\u7684\u5916\u90e8\u65b0\u7968\u9650\u5236\uff1b\u4e00\u822c HTTP \u57fa\u790e\u6d41\u91cf\u9632\u8b77\u7531 WAF\uff0f\u53cd\u5411\u4ee3\u7406\u4f9d\u90e8\u7f72\u653f\u7b56\u8655\u7406\uff0c\u4e0d\u5c6c\u672c API \u65b0\u7968 RATE_LIMITED \u696d\u52d9\u898f\u5247\u3002 print_summary\u50c5\u63cf\u8ff0\u5916\u90e8\u9996\u6b21\u5217\u5370\uff0c\u4e0d\u4f75\u5165\u65e2\u6709Admin\u88dc\u5370\u6b77\u53f2\u7684\u8a08\u6578\u3001\u72c0\u614b\u6216\u9806\u5e8f\u3002 pending\u53ef\u8868\u793a\u5916\u90e8\u7d19\u672c\u7b49\u5f85\u5217\u5370\u5b8c\u6210\u6216\u5df2\u53d6\u5f97\u8cc7\u683c\u5f85\u4e0a\u50b3\uff1b\u7b49\u5f85\u5217\u5370\u672c\u8eab\u4e0d\u662fOPay issue\uff0c\u7121\u7570\u5e38\u6642submission_issue=null\u3002\u65e2\u6709Admin\u88dc\u5370\u4e0d\u6df7\u5165\u5916\u90e8print_summary\uff0c\u4e5f\u4e0d\u89e3\u9664\u5916\u90e8\u7d19\u672c\u9001\u4ef6\u8cc7\u683c\uff1b\u8f09\u5177\uff0f\u6350\u8d08\u4e0d\u8981\u6c42\u5217\u5370\u56de\u5831\uff0c\u672c\u5730\u5efa\u7acb\u5f8c\u76f4\u63a5\u5b89\u6392\u80cc\u666f\u9001\u4ef6\u3002","responses":{"200":{"description":"\u6700\u65b0\u72c0\u614b\u3002\u767c\u7968\u5546\u53d7\u7406\u8207\u5e73\u53f0\u5b58\u8b49\u5206\u958b\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InvoiceStatusResponse"},"examples":{"accepted":{"value":{"request_id":"req-example-004","data":{"invoice_id":"cb42a660-bded-4ca7-9561-58306f2e7cba","store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0001","invoice_number":"AB00001234","invoice_date":"2026-10-06T12:00:01+08:00","delivery_mode":"paper","print_required":true,"submission_status":"provider_accepted","carrier_status":"not_applicable","submission_issue":null,"platform_status":"unconfirmed","print_summary":{"status":"printed","attempt_count":1,"printed_attempt_count":1,"last_attempt_status":"printed"},"updated_at":"2026-10-06T12:01:00+08:00","confirmation_evidence":{"platform_source":null,"carrier_source":null,"platform_confirmed_at":null,"carrier_confirmed_at":null}}}},"unknown":{"value":{"request_id":"req-example-004","data":{"invoice_id":"cb42a660-bded-4ca7-9561-58306f2e7cba","store_hash_id":"q7m2x","external_invoice_id":"POSA-20261006-0001","invoice_number":"AB00001234","invoice_date":"2026-10-06T12:00:01+08:00","delivery_mode":"paper","print_required":true,"submission_status":"unknown","carrier_status":"not_applicable","submission_issue":{"code":"PROVIDER_RESULT_UNKNOWN","message":"\u4e0a\u6e38\u53ef\u80fd\u5df2\u53d7\u7406\uff0c\u7531 Foodiebro \u5f8c\u53f0\u67e5\u6838\u539f\u64cd\u4f5c\uff1b\u5ee0\u5546\u7121\u9808\u8f2a\u8a62\u6216\u806f\u7e6b\uff0c\u4e0d\u5f97\u91cd\u958b\u3002","retry_action":"none","occurred_at":"2026-10-06T12:01:00+08:00"},"platform_status":"unconfirmed","print_summary":{"status":"printed","attempt_count":1,"printed_attempt_count":1,"last_attempt_status":"printed"},"updated_at":"2026-10-06T12:01:00+08:00","confirmation_evidence":{"platform_source":null,"carrier_source":null,"platform_confirmed_at":null,"carrier_confirmed_at":null}}}}}}}},"401":{"description":"\u53ef\u80fd code\uff1aAUTH_REQUIRED, AUTH_INVALID, AUTH_EXPIRED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"WWW-Authenticate":{"schema":{"type":"string","description":""},"description":"Bearer \u9a57\u8b49\u6311\u6230\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"AUTH_REQUIRED":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_REQUIRED","message":"\u7f3a\u5c11 Bearer Token\u3002","creation_state":"not_applicable","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}},"AUTH_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_INVALID","message":"Token \u7121\u6548\u3001\u5c1a\u672a\u751f\u6548\u3001\u5df2\u64a4\u92b7\u6216\u74b0\u5883\u4e0d\u7b26\uff1b\u4e0d\u63ed\u9732\u66f4\u591a\u6191\u8b49\u8cc7\u8a0a\u3002","creation_state":"not_applicable","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}},"AUTH_EXPIRED":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_EXPIRED","message":"Token \u5df2\u9054\u6216\u8d85\u904e\u81ea\u8eab\u5230\u671f\u6642\u9593\u3002","creation_state":"not_applicable","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["AUTH_REQUIRED","AUTH_INVALID","AUTH_EXPIRED"]},"403":{"description":"\u53ef\u80fd code\uff1aCLIENT_NOT_APPROVED, CLIENT_INACTIVE, SCOPE_DENIED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"CLIENT_NOT_APPROVED":{"value":{"request_id":"req-error-example","error":{"code":"CLIENT_NOT_APPROVED","message":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u5c1a\u672a\u6838\u51c6\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"CLIENT_INACTIVE":{"value":{"request_id":"req-error-example","error":{"code":"CLIENT_INACTIVE","message":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u505c\u7528\uff0f\u7d50\u6848\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"SCOPE_DENIED":{"value":{"request_id":"req-error-example","error":{"code":"SCOPE_DENIED","message":"Token\/client\/grant \u7f3a\u5c11\u672c\u64cd\u4f5c\u80fd\u529b\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["CLIENT_NOT_APPROVED","CLIENT_INACTIVE","SCOPE_DENIED"]},"404":{"description":"\u53ef\u80fd code\uff1aRESOURCE_NOT_FOUND","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"RESOURCE_NOT_FOUND":{"value":{"request_id":"req-error-example","error":{"code":"RESOURCE_NOT_FOUND","message":"\u767c\u7968\u4e0d\u5b58\u5728\u6216\u5c0d\u8a72 client\/store \u4e0d\u53ef\u898b\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["RESOURCE_NOT_FOUND"]},"429":{"description":"\u53ef\u80fd code\uff1aRATE_LIMITED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"429\u5fc5\u5e36\u7b49\u5f85\u79d2\u6578\uff0c\u8207JSON error.retry_after_seconds\u76f8\u540c\uff1b\u7b49\u5f85\u5f8c\u91cd\u8a66\u539f\u64cd\u4f5c\u8b58\u5225\uff0f\u5167\u5bb9\uff0cGET\u91cd\u505a\u539f\u67e5\u8a62\u3002\u6b64\u503c\u70ba\u7576\u4e0b\u5efa\u8b70\uff0c\u5176\u4ed6\u540c\u5e97\u8acb\u6c42\u4ecd\u53ef\u80fd\u5f71\u97ff\u5f8c\u7e8c\u53ef\u7528\u540d\u984d\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"RATE_LIMITED":{"value":{"request_id":"req-error-example","error":{"code":"RATE_LIMITED","message":"\u9054\u5916\u90e8\u65b0\u7968\u5e97\u7d1a\u901f\u7387\u9650\u5236\uff08\u55ae\u5e97\u6bcf\u9023\u7e8c60\u79d25\u5f35\uff09\uff1b\u7b49\u5f85 Retry-After\uff0c\u518d\u91cd\u9001\u539f POST\uff0f\u91cd\u65b0 GET\u3002","creation_state":"not_applicable","retry_action":"retry_get","retry_after_seconds":5,"details":[]}}}}}},"x-error-codes":["RATE_LIMITED"]},"500":{"description":"\u53ef\u80fd code\uff1aINTERNAL_ERROR","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"INTERNAL_ERROR":{"value":{"request_id":"req-error-example","error":{"code":"INTERNAL_ERROR","message":"\u975e\u9810\u671f\u932f\u8aa4\uff1b\u672c\u6b21\u5efa\u7acb\u7d50\u679c\u672a\u78ba\u5b9a\uff0c\u4e0d\u80fd\u63db Key\u3002","creation_state":"not_applicable","retry_action":"retry_get","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["INTERNAL_ERROR"]},"503":{"description":"\u53ef\u80fd code\uff1aSERVICE_UNAVAILABLE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"\u82e5\u53ef\u7b49\u5f85\u91cd\u8a66\uff0c\u5efa\u8b70\u7b49\u5f85\u79d2\u6578\uff1b\u9032\u884c\u4e2d\u8207429\u5fc5\u6709\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"SERVICE_UNAVAILABLE":{"value":{"request_id":"req-error-example","error":{"code":"SERVICE_UNAVAILABLE","message":"\u5fc5\u8981\u670d\u52d9\u4e0d\u53ef\u7528\uff1b\u9664\u975e\u8b49\u660e\u672a\u53d7\u7406\uff0c\u4fdd\u5b88\u8996\u70ba\u5efa\u7acb\u7d50\u679c\u4e0d\u660e\u3002","creation_state":"not_applicable","retry_action":"retry_get","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["SERVICE_UNAVAILABLE"]},"default":{"description":"\u5176\u4ed6\u670d\u52d9\u7aef\u932f\u8aa4\uff0c\u4f9d\u539f\u7533\u8acb\u8b58\u5225\u6062\u590d\uff1bgateway\u932f\u8aa4\u53ef\u80fd\u7121\u6b64JSON\u683c\u5f0f\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}}}},"\/api\/v1\/invoices\/{invoice_id}\/print-events":{"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","description":"Foodiebro \u4e0d\u900f\u660e\u8cc7\u6e90\u8b58\u5225\u3002","format":"uuid"}}],"post":{"operationId":"reportPrintEvent","tags":["\u5217\u5370"],"summary":"\u56de\u5831\u7d19\u672c\u9996\u6b21\u5217\u5370\u7d50\u679c","x-required-ability":"invoices:print-report","description":"\u8f09\u5177\uff0f\u6350\u8d08\u4e0d\u56de\u5831\u3002\u540cevent ID\u540c\u5167\u5bb9\u56de\u539f201\u56fa\u5b9adata\uff1b\u4e0d\u540c\u5167\u5bb9409\u3002failed\u662f\u5408\u6cd5\u696d\u52d9\u4e8b\u4ef6\uff0c\u4e0d\u662fHTTP\u932f\u8aa4\u3002attempt\u5167\u6309\u5b8c\u6574sequence\u9a57\u8b49\uff1bprinted\/failed\u70ba\u7d42\u614b\uff0c\u4e4b\u5f8c\u4e0d\u80fd\u65b0\u589e\u8f03\u5927\u5e8f\u865f\u6216\u4e92\u63db\u7d42\u614b\uff0c\u5408\u6cd5\u8f03\u65e9\u4e8b\u4ef6\u53ef\u9072\u5230\u3002print_kind\u5fc5\u586b\u4e14\u50c5\u63a5\u53d7original\uff0c\u5176\u4ed6\u503c\u56de422 VALIDATION_FAILED\/details.out_of_range\u3002\u9996\u6b21\u5931\u6557\u4e14\u78ba\u8a8d\u672a\u5370\u51fa\u5f8c\uff0c\u5be6\u969b\u518d\u6b21\u5617\u8a66\u9996\u6b21\u5217\u5370\u53ef\u65b0\u5efaattempt\u4e26\u56de\u5831original\uff1bfailed\/unknown\u4e0d\u81ea\u52d5\u89f8\u767c\u91cd\u65b0\u5217\u5370\uff1bunknown\u5148\u78ba\u8a8d\u8a2d\u5099\u72c0\u6cc1\u4e26\u6062\u5fa9\u539fattempt\u7d50\u679c\uff0c\u4e0d\u76f2\u76ee\u65b0\u589e\u5217\u5370\u6216\u91cd\u958b\u7968\u3002\u56de\u5831\u53ea\u4fdd\u5b58\u5be6\u969b\u8b49\u64da\uff0c\u4e0d\u6388\u6b0a\u6216\u89f8\u767c\u518d\u6b21\u5217\u5370\uff1b\u5408\u6cd5\u9072\u5230\u9996\u6b21\u4e8b\u4ef6\u6cbf\u539fsequence\u898f\u5247\u63a5\u6536\uff0c\u4e0d\u56e0\u5df2\u6536\u5230\u5176\u4ed6attempt\u6210\u529f\u800c\u4e1f\u68c4\u4e8b\u5be6\u3002\u9996\u6b21\u6210\u529f\u5f8c\u518d\u6b21\u5370\u51fa\u5c6c\u88dc\u5370\uff0c\u6cbf\u65e2\u6709Admin\u5f8c\u53f0\u529f\u80fd\u8207\u9650\u5236\uff0c\u4e0d\u63d0\u4f9b\u5916\u90e8\u88dc\u5370\u6216\u6838\u51c6\u6d41\u7a0b\uff0c\u4e5f\u4e0d\u5141\u8a31\u6539\u7a31original\u898f\u907f\u3002\u5916\u90e8\u7d19\u672c\u53ea\u6709\u6709\u6548printed\u5b8c\u6210\u4e8b\u4ef6\u53ef\u53d6\u5f97\u9001\u4ef6\u8cc7\u683c\uff0csubmitted\/failed\/unknown\/\u672a\u56de\u5831\u4e0d\u653e\u884c\u3002 \u672c\u64cd\u4f5c\u4e0d\u8a08\u5165\u55ae\u5e97\u9023\u7e8c60\u79d25\u5f35\u7684\u5916\u90e8\u65b0\u7968\u9650\u5236\uff1b\u4e00\u822c HTTP \u57fa\u790e\u6d41\u91cf\u9632\u8b77\u7531 WAF\uff0f\u53cd\u5411\u4ee3\u7406\u4f9d\u90e8\u7f72\u653f\u7b56\u8655\u7406\uff0c\u4e0d\u5c6c\u672c API \u65b0\u7968 RATE_LIMITED \u696d\u52d9\u898f\u5247\u3002 \u5ee0\u5546\u4ecd\u9808\u4f9d\u9996\u6b21\u5217\u5370\u5be6\u969b\u8b49\u64da\u56de\u5831\uff1b\u7b2c\u4e00\u7248\u7531Foodiebro Admin\u986f\u793a\u4e26\u7be9\u9078\u67e5\u6838\u672a\u56de\u5831\u3001\u9001\u5370\u4e2d\u8207\u7d50\u679c\u672a\u77e5\uff0c\u66ab\u4e0d\u53e6\u767c\u5217\u5370\u672a\u78ba\u8a8d\u63d0\u9192\uff0c\u4e0d\u65b0\u589e\u56de\u5831\u903e\u6642\u671f\u9650\u6216\u5ee0\u5546\u901a\u77e5\u7fa9\u52d9\u3002\u672a\u56de\u5831\u6216\u672a\u5b8c\u6210\u78ba\u8a8d\u4e0d\u56e0\u6642\u9593\u7d93\u904e\u81ea\u52d5\u8b8a\u70bafailed\/printed\uff0c\u5916\u90e8\u7d19\u672c\u7dad\u6301\u7b49\u5f85\u5ee0\u5546\u5b8c\u6210\u56de\u5831\u3001\u4e0d\u6392\u4e00\u822c\u958b\u7acb\u9001\u4ef6\uff0c\u4e5f\u4e0d\u6703\u56e0\u672a\u56de\u5831\u81ea\u52d5\u91cd\u958b\u3001\u4f5c\u5ee2\u6216\u88dc\u5370\uff1b\u5e97\u5bb6\u4ecd\u53ef\u900f\u904e\u65e2\u6709Admin\u4e3b\u52d5\u4f5c\u5ee2\uff0c\u4f9d\u5148OfflineIssue\u5f8cOfflineInvalid\u7684\u4f5c\u5ee2\u5c08\u7528\u6d41\u7a0b\u8655\u7406\uff1b\u65e2\u6709Admin\u88dc\u5370\u4e0d\u6539\u9001\u4ef6\u8cc7\u683c\uff1b\u5408\u6cd5\u9072\u5230\u4e8b\u4ef6\u4ecd\u6309\u65e2\u6709sequence\u8207\u8b49\u64da\u66f4\u65b0\u3002\u6b64\u5b89\u6392\u4e0d\u5f71\u97ff\u65e2\u6709OPay\u4e0a\u50b3\u7570\u5e38\u7684\u5f8c\u53f0\u76e3\u63a7\u8207\u544a\u8b66\u3002 \u6a5f\u53f0\u7684\u5be6\u969b\u9996\u6b21\u5217\u5370\u7d50\u679c\u7d93\u5ee0\u5546\u5f8c\u7aef\u7d71\u4e00\u547c\u53eb\u672cAPI\uff0c\u6b63\u5f0fFoodiebro Token\u50c5\u4fdd\u7559\u65bc\u5ee0\u5546\u5f8c\u7aef\uff0c\u4e0d\u7531\u6a5f\u53f0\u6216\u700f\u89bd\u5668\u76f4\u63a5\u6301\u7528\u3002 \u5df2\u5efa\u7acb\u7968\u4f46\u6a5f\u53f0\u5217\u5370\u5931\u6557\u6642\uff0c\u53ef\u7531\u6388\u6b0a\u5e97\u5bb6\u54e1\u5de5\u5148\u5728\u65e2\u6709Admin\u67e5\u539f\u7968\u4e26\u6309\u65e2\u6709\u88dc\u5370\u9650\u5236\u8655\u7406\uff1b\u5916\u90e8\u7968\u76f8\u5bb9\u6027\u4ecd\u5f85\u9a57\u8b49\u3002\u5f8c\u53f0\u88dc\u5370\u4e0d\u8981\u6c42\u5ee0\u5546\u56de\u50b3\u65b0\u4e8b\u4ef6\uff0c\u4e0d\u65b0\u5efa\u767c\u7968\uff0c\u4e5f\u4e0d\u8986\u5beb\u672cAPI\u7684\u9996\u6b21\u5217\u5370\u6458\u8981\u3002\u6b64\u6c7a\u7b56\u4e0d\u65b0\u589e\u5ee0\u5546\u6301\u4e45\u6062\u5fa9\uff0f\u8a2d\u5099\u4f47\u5217\u9a57\u6536\u9580\u6abb\uff1b\u4e0d\u53d6\u6d88\u539fKey\u9632\u91cd\u8207\u56de\u61c9\u4e1f\u5931\u6aa2\u67e5\u3002 \u6709\u6548printed\u4e8b\u4ef6\u3001\u9001\u4ef6\u8cc7\u683c\u8207\u6301\u4e45\u5de5\u4f5c\u4e00\u4f75\u4fdd\u5b58\uff0c\u5b8c\u6210\u540c\u4e00\u7b46\u4e3b\u8981\u8cc7\u6599\u63d0\u4ea4\u5f8c\u624d\u555f\u52d5\u80cc\u666f\u9001\u4ef6\uff1b\u4e8b\u4ef6replay\u4e0d\u91cd\u6392\u3001\u4e0d\u5012\u9000\u65e2\u6709\u8cc7\u683c\u6216upload\u7d50\u679c\uff0c\u5408\u6cd5\u9072\u5230\u4ecd\u6309sequence\u898f\u5247\u3002\u8f09\u5177\u4ecd\u4e0d\u5217\u5370\uff0f\u4e0d\u56de\u5831\uff0c\u65e2\u6709printN\u4e0d\u59a8\u7919\u5176\u76f4\u63a5\u53d6\u5f97\u8cc7\u683c\u3002\u65e2\u6709Admin\u88dc\u5370\u4e0d\u6539print_fg\u3001\u4e0d\u7522\u751f\u5916\u90e8\u4e8b\u4ef6\u3001\u4e0d\u89e3\u9664\u9001\u4ef6\u8cc7\u683c\u3001\u4e0d\u6539\u5916\u90e8summary\uff1b\u672aprinted\u6642\u5e97\u5bb6\u53ef\u900f\u904e\u65e2\u6709Admin\u4f5c\u5ee2\uff0c\u4f5c\u5ee2\u5c08\u7528\u6d41\u7a0b\u4e0d\u6539\u5217\u5370\u8cc7\u683c\uff0c\u4f5c\u5ee2\u5f8c\u9072\u5230printed\u4e0d\u5f97\u653e\u884c\u4e00\u822coutbox\u3002","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PrintEventRequest"},"examples":{"printed":{"value":{"event_id":"evt-POSA-0001-2","print_attempt_id":"attempt-POSA-0001","event_sequence":2,"print_kind":"original","status":"printed","observed_at":"2026-10-06T12:00:05+08:00","device_ref":"printer-01"}},"failed":{"value":{"event_id":"evt-POSA-0002-1","print_attempt_id":"attempt-POSA-0002","event_sequence":1,"print_kind":"original","status":"failed","observed_at":"2026-10-06T12:00:05+08:00","device_ref":"printer-01","device_error_code":"paper_out"}}}}}},"responses":{"201":{"description":"\u5df2\u4fdd\u5b58\u4e8b\u4ef6\uff0c\u5305\u542bfailed\u6216unknown\uff1b\u6216\u6210\u529freplay\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Idempotency-Replayed":{"description":"\u540c event ID \u7684\u6210\u529f replay\u3002","schema":{"type":"boolean"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/PrintEventResponse"},"examples":{"printed":{"value":{"request_id":"req-example-003","data":{"invoice_id":"cb42a660-bded-4ca7-9561-58306f2e7cba","event_id":"evt-POSA-0001-2","print_attempt_id":"attempt-POSA-0001","event_sequence":2,"accepted_status":"printed","received_at":"2026-10-06T12:00:06+08:00"}}}}}}},"400":{"description":"\u53ef\u80fd code\uff1aINVALID_JSON","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"INVALID_JSON":{"value":{"request_id":"req-error-example","error":{"code":"INVALID_JSON","message":"JSON \u7121\u6cd5\u89e3\u6790\u3002","creation_state":"not_applicable","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["INVALID_JSON"]},"401":{"description":"\u53ef\u80fd code\uff1aAUTH_REQUIRED, AUTH_INVALID, AUTH_EXPIRED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"WWW-Authenticate":{"schema":{"type":"string","description":""},"description":"Bearer \u9a57\u8b49\u6311\u6230\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"AUTH_REQUIRED":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_REQUIRED","message":"\u7f3a\u5c11 Bearer Token\u3002","creation_state":"not_applicable","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}},"AUTH_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_INVALID","message":"Token \u7121\u6548\u3001\u5c1a\u672a\u751f\u6548\u3001\u5df2\u64a4\u92b7\u6216\u74b0\u5883\u4e0d\u7b26\uff1b\u4e0d\u63ed\u9732\u66f4\u591a\u6191\u8b49\u8cc7\u8a0a\u3002","creation_state":"not_applicable","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}},"AUTH_EXPIRED":{"value":{"request_id":"req-error-example","error":{"code":"AUTH_EXPIRED","message":"Token \u5df2\u9054\u6216\u8d85\u904e\u81ea\u8eab\u5230\u671f\u6642\u9593\u3002","creation_state":"not_applicable","retry_action":"refresh_credentials","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["AUTH_REQUIRED","AUTH_INVALID","AUTH_EXPIRED"]},"403":{"description":"\u53ef\u80fd code\uff1aCLIENT_NOT_APPROVED, CLIENT_INACTIVE, SCOPE_DENIED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"CLIENT_NOT_APPROVED":{"value":{"request_id":"req-error-example","error":{"code":"CLIENT_NOT_APPROVED","message":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u5c1a\u672a\u6838\u51c6\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"CLIENT_INACTIVE":{"value":{"request_id":"req-error-example","error":{"code":"CLIENT_INACTIVE","message":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u505c\u7528\uff0f\u7d50\u6848\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"SCOPE_DENIED":{"value":{"request_id":"req-error-example","error":{"code":"SCOPE_DENIED","message":"Token\/client\/grant \u7f3a\u5c11\u672c\u64cd\u4f5c\u80fd\u529b\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["CLIENT_NOT_APPROVED","CLIENT_INACTIVE","SCOPE_DENIED"]},"404":{"description":"\u53ef\u80fd code\uff1aRESOURCE_NOT_FOUND","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"RESOURCE_NOT_FOUND":{"value":{"request_id":"req-error-example","error":{"code":"RESOURCE_NOT_FOUND","message":"\u767c\u7968\u4e0d\u5b58\u5728\u6216\u5c0d\u8a72 client\/store \u4e0d\u53ef\u898b\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["RESOURCE_NOT_FOUND"]},"409":{"description":"\u53ef\u80fd code\uff1aPRINT_EVENT_CONFLICT, PRINT_EVENT_TRANSITION_INVALID, PRINT_NOT_APPLICABLE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"\u82e5\u53ef\u7b49\u5f85\u91cd\u8a66\uff0c\u5efa\u8b70\u7b49\u5f85\u79d2\u6578\uff1b\u9032\u884c\u4e2d\u8207429\u5fc5\u6709\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"PRINT_EVENT_CONFLICT":{"value":{"request_id":"req-error-example","error":{"code":"PRINT_EVENT_CONFLICT","message":"event ID \u6216 attempt\/sequence \u91cd\u8907\u4f46\u5167\u5bb9\u4e0d\u540c\u3002","creation_state":"not_applicable","retry_action":"contact_support","retry_after_seconds":null,"details":[]}}},"PRINT_EVENT_TRANSITION_INVALID":{"value":{"request_id":"req-error-example","error":{"code":"PRINT_EVENT_TRANSITION_INVALID","message":"\u5217\u5370 attempt \u5e8f\u5217\u77db\u76fe\uff1b\u7d42\u614b\u4e4b\u5f8c\u4e0d\u53ef\u65b0\u589e\u8f03\u5927\u5e8f\u865f\u4e8b\u4ef6\u6216\u4e92\u63db\u7d42\u614b\u3002","creation_state":"not_applicable","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}},"PRINT_NOT_APPLICABLE":{"value":{"request_id":"req-error-example","error":{"code":"PRINT_NOT_APPLICABLE","message":"\u8f09\u5177\u6216\u6350\u8d08\u7b49\u4e0d\u9700\u8981\u7d19\u672c\u5217\u5370\u7684\u767c\u7968\u4e0d\u80fd\u56de\u5831\u5217\u5370\u3002","creation_state":"not_applicable","retry_action":"none","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["PRINT_EVENT_CONFLICT","PRINT_EVENT_TRANSITION_INVALID","PRINT_NOT_APPLICABLE"]},"413":{"description":"\u53ef\u80fd code\uff1aPAYLOAD_TOO_LARGE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"PAYLOAD_TOO_LARGE":{"value":{"request_id":"req-error-example","error":{"code":"PAYLOAD_TOO_LARGE","message":"body \u8d85\u904e\u6838\u51c6\u4e0a\u9650\u3002","creation_state":"not_applicable","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["PAYLOAD_TOO_LARGE"]},"415":{"description":"\u53ef\u80fd code\uff1aUNSUPPORTED_MEDIA_TYPE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"UNSUPPORTED_MEDIA_TYPE":{"value":{"request_id":"req-error-example","error":{"code":"UNSUPPORTED_MEDIA_TYPE","message":"POST \u975e application\/json\u3002","creation_state":"not_applicable","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["UNSUPPORTED_MEDIA_TYPE"]},"422":{"description":"\u53ef\u80fd code\uff1aVALIDATION_FAILED\uff1bprint_kind\u50c5\u63a5\u53d7original\uff0c\u5176\u4ed6\u503c\u4f7f\u7528VALIDATION_FAILED\u4e26\u5728details\u6a19\u793aprint_kind\/out_of_range\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"VALIDATION_FAILED":{"value":{"request_id":"req-error-example","error":{"code":"VALIDATION_FAILED","message":"\u6b04\u4f4d\u7f3a\u5c11\u3001\u578b\u5225\u3001\u9577\u5ea6\u6216\u672a\u77e5\u6b04\u4f4d\u7b49\u9a57\u8b49\u932f\u8aa4\uff1bdetails \u6307\u51fa\u6b04\u4f4d\u3002","creation_state":"not_applicable","retry_action":"fix_request","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["VALIDATION_FAILED"]},"429":{"description":"\u53ef\u80fd code\uff1aRATE_LIMITED","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"429\u5fc5\u5e36\u7b49\u5f85\u79d2\u6578\uff0c\u8207JSON error.retry_after_seconds\u76f8\u540c\uff1b\u7b49\u5f85\u5f8c\u91cd\u8a66\u539f\u64cd\u4f5c\u8b58\u5225\uff0f\u5167\u5bb9\uff0cGET\u91cd\u505a\u539f\u67e5\u8a62\u3002\u6b64\u503c\u70ba\u7576\u4e0b\u5efa\u8b70\uff0c\u5176\u4ed6\u540c\u5e97\u8acb\u6c42\u4ecd\u53ef\u80fd\u5f71\u97ff\u5f8c\u7e8c\u53ef\u7528\u540d\u984d\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"RATE_LIMITED":{"value":{"request_id":"req-error-example","error":{"code":"RATE_LIMITED","message":"\u9054\u5916\u90e8\u65b0\u7968\u5e97\u7d1a\u901f\u7387\u9650\u5236\uff08\u55ae\u5e97\u6bcf\u9023\u7e8c60\u79d25\u5f35\uff09\uff1b\u7b49\u5f85 Retry-After\uff0c\u518d\u91cd\u9001\u539f POST\uff0f\u91cd\u65b0 GET\u3002","creation_state":"not_applicable","retry_action":"retry_same_key","retry_after_seconds":5,"details":[]}}}}}},"x-error-codes":["RATE_LIMITED"]},"500":{"description":"\u53ef\u80fd code\uff1aINTERNAL_ERROR","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"INTERNAL_ERROR":{"value":{"request_id":"req-error-example","error":{"code":"INTERNAL_ERROR","message":"\u975e\u9810\u671f\u932f\u8aa4\uff1b\u672c\u6b21\u5efa\u7acb\u7d50\u679c\u672a\u78ba\u5b9a\uff0c\u4e0d\u80fd\u63db Key\u3002","creation_state":"not_applicable","retry_action":"retry_same_key","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["INTERNAL_ERROR"]},"503":{"description":"\u53ef\u80fd code\uff1aSERVICE_UNAVAILABLE","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}},"Retry-After":{"schema":{"type":"integer","minimum":1},"description":"\u82e5\u53ef\u7b49\u5f85\u91cd\u8a66\uff0c\u5efa\u8b70\u7b49\u5f85\u79d2\u6578\uff1b\u9032\u884c\u4e2d\u8207429\u5fc5\u6709\u3002"}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"},"examples":{"SERVICE_UNAVAILABLE":{"value":{"request_id":"req-error-example","error":{"code":"SERVICE_UNAVAILABLE","message":"\u5fc5\u8981\u670d\u52d9\u4e0d\u53ef\u7528\uff1b\u9664\u975e\u8b49\u660e\u672a\u53d7\u7406\uff0c\u4fdd\u5b88\u8996\u70ba\u5efa\u7acb\u7d50\u679c\u4e0d\u660e\u3002","creation_state":"not_applicable","retry_action":"retry_same_key","retry_after_seconds":null,"details":[]}}}}}},"x-error-codes":["SERVICE_UNAVAILABLE"]},"default":{"description":"\u5176\u4ed6\u670d\u52d9\u7aef\u932f\u8aa4\uff0c\u4f9d\u539f\u7533\u8acb\u8b58\u5225\u6062\u590d\uff1bgateway\u932f\u8aa4\u53ef\u80fd\u7121\u6b64JSON\u683c\u5f0f\u3002","headers":{"X-Request-ID":{"description":"\u672c\u6b21 request ID\uff1b\u4e0d\u8981\u8a18\u9304 Token\u3002","schema":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"}}},"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"opaque token","description":"Foodiebro\u5f8c\u53f0\u6838\u51c6\u767c\u884c\u7684opaque Token\uff0c\u9650\u4f3a\u670d\u5668\u7aef\u4f7f\u7528\uff0c\u4e0d\u662fJWT\u6216\u5f8c\u53f0\u5bc6\u78bc\u3002\u6bcf\u7d44\u5fc5\u586b\u751f\u6548\u53ca\u5230\u671f\u6642\u9593\uff08Asia\/Taipei\uff09\uff0c\u5230\u671f\u5fc5\u9808\u665a\u65bc\u751f\u6548\uff1b\u751f\u6548\u6642\u9593\u2264\u9a57\u8b49\u7576\u4e0b\u6642\u9593<\u5230\u671f\u6642\u9593\u4e14\u672a\u64a4\u92b7\u624d\u901a\u904eToken\u6642\u9593\u6aa2\u67e5\uff0c\u4e0d\u9810\u8a2d\u6c38\u4e45\u6709\u6548\u6216\u7d71\u4e00\u6709\u6548\u5929\u6578\u3002\u5c1a\u672a\u751f\u6548\u4f7f\u7528AUTH_INVALID\uff0c\u5230\u671f\u8d77\u4f7f\u7528AUTH_EXPIRED\u3002\u6bcf\u6b21\u8acb\u6c42\u4ecd\u6aa2\u67e5vendor\/client\u72c0\u614b\u3001environment\u3001\u80fd\u529b\u53ca\u6709\u6548\u5e97\u5bb6grant\uff0c\u65b0\u958b\u7968\u53e6\u9a57\u767c\u7968\u5408\u7d04\uff0c\u65e2\u6709\u67e5\u8a62\uff0f\u56de\u5831\u4fdd\u7559\u65e2\u5b9a\u5408\u7d04\u908a\u754c\u3002\u65b0Token\u751f\u6548\u4e0d\u81ea\u52d5\u4f7f\u820aToken\u5931\u6548\uff0c\u4f9d\u5404\u81ea\u65e5\u671f\u6216\u4eba\u5de5\u64a4\u92b7\u5224\u65b7\uff0c\u53ef\u91cd\u758a\u4f7f\u7528\u4e14\u7121\u56fa\u5b9a\u4ea4\u63a5\u6642\u6578\u4e0a\u9650\uff1b\u5f8c\u53f0\u53ef\u7acb\u5373\u64a4\u92b7\u3002\u63db\u767c\u7dad\u6301\u539fclient\u3001\u539fIdempotency-Key\u8207\u5df2\u53d7\u7406\u767c\u7968\uff1b\u5df2\u53d6\u5f97\u8cc7\u683c\u7684\u80cc\u666f\u5de5\u4f5c\u7e7c\u7e8c\u8655\u7406\uff0c\u7b49\u5f85\u7d19\u672c\u5217\u5370\u8005\u4e0d\u56e0\u63db\u767c\u3001\u5230\u671f\u6216\u64a4\u92b7\u81ea\u52d5\u653e\u884c\u3002 \u5408\u4f5c\u81ea\u52a9\u9ede\u9910\u6a5f\u4e00\u5f8b\u7d93\u5ee0\u5546\u5f8c\u7aef\u547c\u53eb\uff1b\u6b63\u5f0fToken\u50c5\u7531\u5ee0\u5546\u5f8c\u7aef\u4fdd\u5b58\uff0c\u4e0d\u4e0b\u767c\u6a5f\u53f0\uff0f\u700f\u89bd\u5668\uff0f\u524d\u7aef\u3002store_hash_id\u50c5\u8b58\u5225\u5e97\u5bb6\uff0c\u4ecd\u9010\u6b21\u9a57\u8b49client\uff0f\u6709\u6548store grant\u3002"}},"schemas":{"Money":{"type":"integer","minimum":0,"maximum":9999999999,"description":"TWD \u5143\uff0c\u4ee5 JSON integer \u50b3\u9001\uff0c\u4f8b\u5982 100\uff1b\u4e0d\u63a5\u53d7\u5b57\u4e32\u3001\u5c0f\u6578\u91d1\u984d\u6216\u5206\u70ba\u55ae\u4f4d\u3002"},"InvoiceItem":{"type":"object","properties":{"name":{"type":"string","description":"","minLength":1,"maxLength":100},"quantity":{"type":"string","description":"\u6b63\u6578\uff0c\u6700\u591a\u4e09\u4f4d\u5c0f\u6578\uff1b\u4f8b\u5982 1 \u6216 1.250\u3002","pattern":"^(?!0(?:\\.0{1,3})?$)(0|[1-9][0-9]{0,6})(\\.[0-9]{1,3})?$"},"unit":{"type":"string","description":"","minLength":1,"maxLength":6},"unit_price":{"$ref":"#\/components\/schemas\/Money"},"line_amount":{"$ref":"#\/components\/schemas\/Money"},"remark":{"type":"string","description":"","maxLength":40}},"required":["name","quantity","unit","unit_price","line_amount"],"additionalProperties":false},"Buyer":{"type":"object","properties":{"identifier":{"type":"string","description":"","pattern":"^[0-9]{8}$"},"name":{"type":"string","description":"","minLength":1,"maxLength":60}},"required":["name"],"additionalProperties":false},"Delivery":{"oneOf":[{"type":"object","properties":{"mode":{"const":"paper"}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"const":"carrier"},"carrier_type":{"const":"mobile_barcode"},"carrier_id":{"type":"string","description":"\u683c\u5f0f\u4e4b\u5916\u4ecd\u9700\u6709\u6548\u6027\u9a57\u8b49\u3002","pattern":"^\/[0-9A-Z+\\-.]{7}$"}},"required":["mode","carrier_type","carrier_id"],"additionalProperties":false},{"type":"object","properties":{"mode":{"const":"donation"},"love_code":{"type":"string","description":"\u6cbf\u65e2\u6709 einv.npoban \u7684\u611b\u5fc3\u78bc\uff1b\u5efa\u7acb\u524d\u5148\u505a\u683c\u5f0f\u8207\u4ea4\u4ed8\u4e92\u65a5\u6aa2\u67e5\uff0c\u4e26\u67e5 Foodiebro syscode(code_kind=einv, code1=npoban)\uff1b\u4e0d\u5b58\u5728\u5373\u56de DONATION_INVALID\u3001\u4e0d\u914d\u865f\uff0c\u4e14\u4e0d\u547c\u53eb CheckLoveCode\u3002","minLength":3,"maxLength":8}},"required":["mode","love_code"],"additionalProperties":false}],"description":"\u4ea4\u4ed8\u65b9\u5f0f\u3002\u7d19\u672c\u3001\u624b\u6a5f\u8f09\u5177\u6216\u6350\u8d08\u53ea\u80fd\u64c7\u4e00\uff1b\u624b\u6a5f\u8f09\u5177\u8207\u6350\u8d08\u5747\u5728\u914d\u865f\u524d\u5b8c\u6210\u5fc5\u8981\u9a57\u8b49\uff0c\u9a57\u8b49\u4e0d\u901a\u904e\u4e0d\u914d\u865f\u3002"},"CreateInvoiceRequest":{"type":"object","properties":{"store_hash_id":{"type":"string","description":"Foodiebro \u65e2\u6709\u4e14\u5df2\u6388\u6b0a\u7684\u5e97\u5bb6\u8b58\u5225\uff0c\u9808\u7167\u6838\u51c6\u503c\u539f\u6a23\u50b3\u5165\uff1b\u4e0d\u81ea\u884c\u8f49\u5927\u5c0f\u5beb\u6216\u7522\u751f\u65b0\u503c\uff0c\u4e0d\u662f\u6574\u5408\u5e33\u865f\u81ea\u8a02\u4ee3\u865f\uff0c\u4e5f\u4e0d\u662f\u6388\u6b0a\u6191\u8b49\u3002","minLength":1,"maxLength":255},"external_invoice_id":{"type":"string","description":"\u540c\u4e00\u6574\u5408\u5e33\u865f\u53ca\u5be6\u969b\u5e97\u5bb6\u4e0b\u6c38\u4e45\u4e0d\u91cd\u7528\u7684ASCII\u8b58\u5225\uff0c\u5927\u5c0f\u5beb\u6709\u5225\uff1b\u5ee0\u5546\u5f8c\u7aef\u9808\u78ba\u4fdd\u540c\u5e97\u8de8\u6a5f\u53f0\u552f\u4e00\uff0c\u4e0d\u76f4\u63a5\u4f7f\u7528\u6703\u78b0\u649e\u7684\u5404\u6a5f\u53f0\u672c\u6a5f\u6d41\u6c34\u865f\u3002\u540c\u64cd\u4f5c\u91cd\u8a66\u6cbf\u539f\u5916\u90e8\u8b58\u5225\u8207\u539fIdempotency-Key\uff0f\u5167\u5bb9\u3002 \u5ee0\u5546\u9808\u8b93\u5e97\u5bb6\u5f9e\u5176\u756b\u9762\u6216\u55ae\u64da\u53d6\u5f97\u672crequest\u76f8\u540c\u8b58\u5225\uff0c\u4f9b\u65e2\u6709Admin\u4f9d\u4f86\u6e90\u5ee0\u5546\uff0f\u6574\u5408\u7cfb\u7d71\u52a0\u8b58\u5225\u7cbe\u78ba\u67e5\u6838\u539f\u7968\uff1b\u4e0d\u5f37\u5236\u7b49\u65bcorder ID\uff0c\u4e0d\u65b0\u589e\u516c\u958b\u641c\u5c0b\u64cd\u4f5c\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"transaction_at":{"type":"string","description":"\u5ee0\u5546\u5be6\u969b\u4ea4\u6613\u6642\u9593\uff0cISO 8601\u3001\u771f\u5be6\u65e5\u66c6\u65e5\u671f\u4e26\u5e36 Asia\/Taipei +08:00\uff1b\u539f\u503c\u4fdd\u5b58\u4f9b\u4ea4\u6613\u5c0d\u7167\uff0c\u4e0d\u622a\u65b7\uff0f\u91cd\u5beb\uff0c\u4e0d\u6c7a\u5b9a\u958b\u7acb\u65e5\u671f\u6216\u671f\u5225\u3002\u904e\u53bb\u4ea4\u6613\u4e0d\u8a2d\u5e74\u9f61\uff0f\u96e2\u7dda\u88dc\u9001\u4e0a\u9650\u3002\u771f\u6b63\u65b0\u7533\u8acb\u9808\u2264\u672c\u6b21Foodiebro\u4f3a\u670d\u5668\u63a5\u6536HTTP\u6642\u9593\u56fa\u5b9a\u5feb\u7167+300\u79d2\uff0c\u7b49\u65bc\u4e0a\u754c\u53ef\u63a5\u53d7\uff0c\u8d85\u904e\u56de422 TRANSACTION_DATE_INVALID\/not_created\/fix_request\u3001\u4e0d\u914d\u865f\uff1b\u4e0d\u4f9d\u5f8c\u7e8c\u8655\u7406\u8017\u6642\u91cd\u7b97\u3002Foodiebro\u4f9d\u672c\u5730\u5be6\u969b\u5efa\u7acb\u6642\u9593\u958b\u7acb\u3001\u914d\u7576\u671f\u865f\u78bc\uff0c\u4e0d\u56de\u586b\u6b77\u53f2\u65e5\u671f\u3002\u6210\u529fKey\u91cd\u64ad\uff0f\u63dbKey\u540c\u4f86\u6e90\u540c\u5167\u5bb9\u5fa9\u7528\u4f9d\u539f\u8eab\u4efd\u8207\u73fe\u884c\u6388\u6b0a\u6062\u5fa9\uff0c\u4e0d\u91cd\u8dd1\u65b0\u7968\u6642\u9593\u9580\u6abb\uff1b\u540cKey\u6539\u5167\u5bb9\u4ecd\u885d\u7a81\u30025\u5206\u9418\u70ba\u696d\u52d9\u5bb9\u5dee\uff0c\u4e0d\u662f\u6cd5\u898f\u6216OPay\u50b3\u8f38\u671f\u9650\u3002","format":"date-time","pattern":"\\+08:00$"},"currency":{"const":"TWD"},"tax_type":{"const":"taxable","description":"v1 \u56fa\u5b9a taxable\uff1b\u55ae\u50f9\u7686\u542b\u7a05\u3002\u96f6\u7a05\u3001\u514d\u7a05\u3001\u7279\u7a2e\u7a05\u53ca\u6df7\u5408\u7a05\u4ecd\u7531\u65e2\u6709\u5f8c\u53f0\u8655\u7406\u3002"},"delivery":{"$ref":"#\/components\/schemas\/Delivery"},"buyer":{"$ref":"#\/components\/schemas\/Buyer"},"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/InvoiceItem"},"minItems":1,"maxItems":200},"total_amount":{"type":"integer","minimum":1,"maximum":9999999999,"description":"\u6b63\u6574\u6578\u5143\u542b\u7a05\u7e3d\u984d\uff0c\u9808\u7b49\u65bc\u660e\u7d30\u5408\u8a08\uff1b\u4f8b\u5982 100\uff0c\u4e0d\u63a5\u53d7 \"100\" \u6216 \"100.00\"\u3002"},"remark":{"type":"string","description":"","maxLength":200}},"required":["store_hash_id","external_invoice_id","transaction_at","currency","tax_type","delivery","items","total_amount"],"additionalProperties":false,"allOf":[{"if":{"properties":{"delivery":{"properties":{"mode":{"const":"carrier"}}}}},"then":{"properties":{"buyer":{"not":{"required":["identifier"]}}}}},{"if":{"properties":{"delivery":{"properties":{"mode":{"const":"donation"}}}}},"then":{"properties":{"buyer":{"not":{"required":["identifier"]}}}}}]},"Seller":{"type":"object","properties":{"name":{"type":"string","description":"","minLength":1,"maxLength":150},"identifier":{"type":"string","description":"","pattern":"^[0-9]{8}$"},"address":{"type":"string","description":"Foodiebro \u5efa\u7acb\u767c\u7968\u6642\u4fdd\u5b58\u7684\u8ce3\u65b9\u5730\u5740\u5feb\u7167\uff1b\u65e2\u6709\u767c\u7968 replay \u4e0d\u91cd\u65b0\u8b80\u53d6\u76ee\u524d\u5e97\u5bb6\u5730\u5740\u3002","minLength":1,"maxLength":255}},"required":["name","identifier","address"],"additionalProperties":false},"PrintData":{"type":"object","properties":{"format_version":{"const":"tw-einvoice-paper-v1"},"seller":{"$ref":"#\/components\/schemas\/Seller"},"buyer_identifier":{"type":["string","null"],"pattern":"^[0-9]{8}$"},"buyer_name":{"type":["string","null"],"maxLength":60},"invoice_number":{"type":"string","description":"","pattern":"^[A-Z]{2}[0-9]{8}$"},"invoice_date":{"type":"string","description":"\u8207\u5916\u5c64 invoice_date \u76f8\u540c\u7684\u56fa\u5b9a\u958b\u7acb\u6642\u9593\uff0cISO 8601\u3001Asia\/Taipei +08:00\uff1b\u4e0d\u5f97\u4f9d\u5217\u5370\u6216\u91cd\u8a66\u7576\u4e0b\u6642\u9593\u91cd\u7b97\u3002","format":"date-time","pattern":"\\+08:00$"},"period":{"type":"string","description":"\u4f9d\u539f\u56fa\u5b9a invoice_date \u6c7a\u5b9a\u7684\u897f\u5143\u96d9\u6708\u671f\u5225\uff0c\u4f8b\u5982 2026-09\/2026-10\uff1b\u7531\u5167\u90e8\u65e2\u6709\u671f\u5225\u683c\u5f0f\u5728\u5efa\u7acb\u6642\u8f49\u63db\uff0c\u4e0d\u4f9d transaction_at\u3001\u4e0a\u50b3\u6216\u91cd\u8a66\u6642\u9593\u91cd\u7b97\u3002","pattern":"^[0-9]{4}-(01|03|05|07|09|11)\/[0-9]{4}-(02|04|06|08|10|12)$"},"random_number":{"type":"string","description":"","pattern":"^[0-9]{4}$"},"currency":{"const":"TWD"},"sales_amount":{"$ref":"#\/components\/schemas\/Money"},"tax_amount":{"$ref":"#\/components\/schemas\/Money"},"total_amount":{"$ref":"#\/components\/schemas\/Money"},"barcode":{"type":"string","description":"Foodiebro\u5df2\u56fa\u5b9a\u7522\u751f\u7684\u689d\u78bc\u539f\u59cb\u5167\u5bb9\u5b57\u4e32\uff1b\u5ee0\u5546\u50c5\u6e32\u67d3\u70ba\u53ef\u5217\u5370\u689d\u78bc\uff0c\u4e0d\u91cd\u7d44\u6216\u66f4\u6539\u5167\u5bb9\uff0c\u4e0d\u662f\u4f3a\u670d\u5668\u5716\u7247\u6216\u8a2d\u5099\u6307\u4ee4\u3002","minLength":1},"qr_left":{"type":"string","description":"Foodiebro\u5df2\u56fa\u5b9a\u7522\u751f\u7684\u5de6QR payload\u5167\u5bb9\u5b57\u4e32\uff0c\u5ee0\u5546\u50c5\u6e32\u67d3QR\u5716\u6a23\uff0c\u4e0d\u91cd\u7b97\u3001\u91cd\u7d44\u6216\u6539\u5beb\uff1b\u4e0d\u63d0\u4f9bAES key\u3002","minLength":1},"qr_right":{"type":"string","description":"Foodiebro\u5df2\u56fa\u5b9a\u7522\u751f\u7684\u53f3QR payload\u5167\u5bb9\u5b57\u4e32\uff0c\u5ee0\u5546\u50c5\u6e32\u67d3QR\u5716\u6a23\uff0c\u4e0d\u91cd\u7b97\u3001\u91cd\u7d44\u6216\u6539\u5beb\u3002","minLength":1},"items":{"type":"array","items":{"$ref":"#\/components\/schemas\/InvoiceItem"},"minItems":1,"maxItems":200},"remark":{"type":"string","description":"","maxLength":200}},"required":["format_version","seller","buyer_identifier","buyer_name","invoice_number","invoice_date","period","random_number","currency","sales_amount","tax_amount","total_amount","barcode","qr_left","qr_right","items","remark"],"additionalProperties":false,"description":"\u7d19\u672c\u56fa\u5b9aJSON\u5217\u5370\u8cc7\u6599\u7269\u4ef6\uff0c\u7531Foodiebro\u6309\u5efa\u7acb\u6642\u539f\u5feb\u7167\u7522\u751f\u8ce3\u65b9\u8cc7\u6599\u3001\u865f\u78bc\u3001\u65e5\u671f\u3001\u91d1\u984d\u3001\u689d\u78bc\u8207\u5de6\u53f3QR\uff1b\u4f9b\u5ee0\u5546POS\uff0f\u5370\u8868\u6a5f\u6e32\u67d3\uff0c\u5ee0\u5546\u4e0d\u91cd\u7b97\u91d1\u984d\u6216QR payload\u3001\u4e0d\u66f4\u6539\u7968\u64da\u5167\u5bb9\u3002barcode\u8207qr_left\/qr_right\u70ba\u5167\u5bb9\u5b57\u4e32\uff0c\u4e0d\u662f\u5716\u7247\u6216\u8a2d\u5099\u6307\u4ee4\u3002\u672a\u56de\u50b3\u4f3a\u670d\u5668PDF\uff0f\u5217\u5370\u5716\u7247\uff0fESC\/POS\uff0f\u98db\u9d5d\u6307\u4ee4\u3001\u4e0d\u63a7\u5236\u5370\u8868\u6a5f\uff0c\u4e0d\u516c\u958bAES key\u6216\u4e0a\u6e38\u79d8\u5bc6\u3002\u5217\u5370\u7248\u578b\u7bc4\u4f8b\u53e6\u5217\u4ea4\u4ed8\u7269\uff0c\u5f85\u8207\u65e2\u6709OPay\u683c\u5f0f\u6838\u5c0d\u53ca\u6e2c\u8a66\u9a57\u6536\uff0c\u76ee\u524d\u5c1a\u672a\u88fd\u4f5c\u53ef\u7528\u7bc4\u672c\u6216\u5217\u5370\u6a94\uff1b\u6210\u529freplay\u56de\u539f\u5feb\u7167\uff0c\u8f09\u5177\uff0f\u6350\u8d08print_data\u70banull\u3002"},"InvoiceCreateData":{"type":"object","properties":{"invoice_id":{"type":"string","description":"Foodiebro \u4e0d\u900f\u660e\u8cc7\u6e90\u8b58\u5225\u3002","format":"uuid"},"store_hash_id":{"type":"string","description":"\u5efa\u7acb\u6642\u7684 Foodiebro \u5e97\u5bb6\u8b58\u5225\u5feb\u7167\uff0c\u8207\u539f\u5efa\u7acb\u8acb\u6c42\u5c0d\u61c9\uff1b\u6210\u529f replay \u56fa\u5b9a\u56de\u50b3\u6b64\u503c\uff0c\u4e0d\u56e0\u5f8c\u53f0\u8b58\u5225\u7570\u52d5\u800c\u8f49\u7d81\u6216\u6539\u5beb\u3002","minLength":1,"maxLength":255},"external_invoice_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"invoice_number":{"type":"string","description":"","pattern":"^[A-Z]{2}[0-9]{8}$"},"invoice_date":{"type":"string","description":"\u7531 Foodiebro \u5efa\u7acb\u767c\u7968\u6642\u4ee5 Asia\/Taipei \u6c7a\u5b9a\u4e26\u56fa\u5b9a\u7684\u958b\u7acb\u6642\u9593\uff08ISO 8601\uff0c+08:00\uff09\uff0c\u4e0d\u662f\u5ee0\u5546 transaction_at\u3001\u5217\u5370\u6642\u9593\u6216\u4e0a\u50b3\u6642\u9593\u3002\u767c\u7968\u65e5\u671f\u3001\u671f\u5225\u3001\u5217\u5370\uff0f\u689d\u78bc\uff0fQR Code \u53ca OPay \u958b\u7acb\u6642\u9593\u4ee5\u6b64\u70ba\u6e96\uff1b\u80cc\u666f\u4e0a\u50b3\u8207\u8de8\u65e5\uff0f\u8de8\u671f\u6210\u529f\u91cd\u8a66\u4e0d\u5f97\u6539\u8b8a\u3002","format":"date-time","pattern":"\\+08:00$"},"delivery_mode":{"enum":["paper","carrier","donation"]},"print_required":{"type":"boolean"},"submission_status":{"const":"pending","description":"\u56fa\u5b9apending\uff0c\u8868\u793a\u672c\u5730\u5df2\u5efa\u7acb\uff1b\u5916\u90e8\u7d19\u672c\u53ef\u5c1a\u5f85printed\u5b8c\u6210\uff0c\u5c1a\u672a\u53d6\u5f97\u8cc7\u683c\u7684\u6301\u4e45\u9001\u4ef6\u5de5\u4f5c\u4e0d\u53ef\u57f7\u884c\uff1b\u65e2\u6709Admin\u88dc\u5370\u4e0d\u6539\u8b8a\u6b64\u8cc7\u683c\uff1b\u8f09\u5177\uff0f\u6350\u8d08\u672c\u5730\u5efa\u7acb\u5f8c\u76f4\u63a5\u53d6\u5f97\u8cc7\u683c\u5f85\u9001\u3002\u91cd\u64ad\u4ecd\u56de\u539f\u56fa\u5b9asnapshot\uff0c\u4e0d\u4ee3\u8868\u6700\u65b0\u4e0a\u50b3\u72c0\u614b\u3002"},"carrier_status":{"enum":["not_applicable","pending_upload"]},"print_status":{"enum":["not_reported","not_required"]},"print_data":{"anyOf":[{"$ref":"#\/components\/schemas\/PrintData"},{"type":"null"}],"description":"\u7d19\u672c\u70ba\u56fa\u5b9aPrintData JSON\u7269\u4ef6\u4f9b\u5ee0\u5546POS\uff0f\u5370\u8868\u6a5f\u6e32\u67d3\uff1b\u8f09\u5177\uff0f\u6350\u8d08\u70banull\u3002\u4e0d\u662f\u4f3a\u670d\u5668PDF\u3001\u5716\u7247\u6216\u8a2d\u5099\u5217\u5370\u6307\u4ee4\uff1b\u6210\u529f\u91cd\u64ad\u7dad\u6301\u5efa\u7acb\u6642\u539f\u5feb\u7167\u3002"}},"required":["invoice_id","store_hash_id","external_invoice_id","invoice_number","invoice_date","delivery_mode","print_required","submission_status","carrier_status","print_status","print_data"],"additionalProperties":false,"allOf":[{"if":{"properties":{"delivery_mode":{"const":"paper"}}},"then":{"properties":{"print_required":{"const":true},"carrier_status":{"const":"not_applicable"},"print_status":{"const":"not_reported"},"print_data":{"$ref":"#\/components\/schemas\/PrintData"}}}},{"if":{"properties":{"delivery_mode":{"const":"carrier"}}},"then":{"properties":{"print_required":{"const":false},"carrier_status":{"const":"pending_upload"},"print_status":{"const":"not_required"},"print_data":{"type":"null"}}}},{"if":{"properties":{"delivery_mode":{"const":"donation"}}},"then":{"properties":{"print_required":{"const":false},"carrier_status":{"const":"not_applicable"},"print_status":{"const":"not_required"},"print_data":{"type":"null"}}}}]},"CreateInvoiceResponse":{"type":"object","properties":{"request_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"data":{"$ref":"#\/components\/schemas\/InvoiceCreateData"}},"required":["request_id","data"],"additionalProperties":false},"PrintEventRequest":{"type":"object","properties":{"event_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"print_attempt_id":{"type":"string","description":"\u5916\u90e8\u9996\u6b21\u5217\u5370\u7684\u4e00\u6b21\u5be6\u969b\u5617\u8a66\u8b58\u5225\uff0c\u5927\u5c0f\u5beb\u6709\u5225\u4e14\u4e0d\u91cd\u7528\uff1b\u540c\u6b21\u5f8c\u7e8c\u7d50\u679c\u6cbf\u7528\uff0c\u7db2\u8def\u91cd\u8a66\u4e0d\u53e6\u5efaattempt\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"event_sequence":{"type":"integer","minimum":1,"maximum":1000000},"print_kind":{"enum":["original"],"description":"\u5fc5\u586b\u4e14\u50c5\u63a5\u53d7original\uff0c\u8868\u793a\u9996\u6b21\u5217\u5370\uff1b\u5176\u4ed6\u503c\u56deVALIDATION_FAILED\u3001details.field=print_kind\u3001details.code=out_of_range\u3002\u88dc\u5370\u4f7f\u7528\u65e2\u6709Admin\u5f8c\u53f0\uff0c\u4e0d\u53ef\u6539\u7a31original\u898f\u907f\u3002"},"status":{"enum":["submitted","printed","failed","unknown"]},"observed_at":{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"},"device_ref":{"type":"string","description":"","minLength":1,"maxLength":64},"device_error_code":{"enum":["paper_out","offline","connection_lost","other"]}},"required":["event_id","print_attempt_id","event_sequence","print_kind","status","observed_at"],"additionalProperties":false,"allOf":[{"if":{"properties":{"status":{"not":{"const":"failed"}}}},"then":{"not":{"required":["device_error_code"]}}}],"description":"\u50c5\u5916\u90e8\u7d19\u672c\u9996\u6b21\u5217\u5370\u4e8b\u4ef6\u3002\u9996\u6b21\u5931\u6557\u4e14\u78ba\u8a8d\u672a\u5370\u51fa\u7684\u5be6\u969b\u518d\u6b21\u5617\u8a66\u53ef\u4f7f\u7528\u65b0attempt\uff1b\u540c\u6b21unknown\u5f8c\u7e8c\u7d50\u679c\u6cbf\u7528\u539fattempt\u3002\u9996\u6b21\u6210\u529f\u5f8c\u7684\u88dc\u5370\u4e0d\u5728\u5916\u90e8API\u7bc4\u570d\u3002 \u56de\u5831\u50c5\u4fdd\u5b58\u5be6\u969b\u8b49\u64da\uff0c\u4e0d\u6388\u6b0a\u6216\u89f8\u767c\u518d\u6b21\u5217\u5370\uff1bfailed\/unknown\u4e0d\u81ea\u52d5\u91cd\u65b0\u5217\u5370\uff0cunknown\u5148\u78ba\u8a8d\u8a2d\u5099\u72c0\u6cc1\u3002\u5408\u6cd5\u9072\u5230\u9996\u6b21\u4e8b\u4ef6\u4ecd\u4f9d\u539fsequence\u898f\u5247\u8655\u7406\u3002 \u53ea\u6709\u6709\u6548printed\u5b8c\u6210\u8b49\u64da\u53ef\u653e\u884c\u5916\u90e8\u7d19\u672c\u4e0a\u50b3\uff1bsubmitted\/failed\/unknown\/\u672a\u56de\u5831\u4e0d\u53d6\u5f97\u8cc7\u683c\u3002\u6210\u529f\u4e8b\u4ef6\u8207\u9001\u4ef6\u8cc7\u683c\uff0f\u6301\u4e45\u5de5\u4f5c\u4e00\u4f75\u63d0\u4ea4\uff0c\u91cd\u64ad\u4e0d\u91cd\u6392\u6216\u56de\u9000upload\uff1b\u4e0d\u63a7\u5236\u5370\u8868\u6a5f\u3002"},"PrintEventResponse":{"type":"object","properties":{"request_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"data":{"type":"object","properties":{"invoice_id":{"type":"string","description":"Foodiebro \u4e0d\u900f\u660e\u8cc7\u6e90\u8b58\u5225\u3002","format":"uuid"},"event_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"print_attempt_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"event_sequence":{"type":"integer","minimum":1},"accepted_status":{"enum":["submitted","printed","failed","unknown"]},"received_at":{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"}},"required":["invoice_id","event_id","print_attempt_id","event_sequence","accepted_status","received_at"],"additionalProperties":false}},"required":["request_id","data"],"additionalProperties":false},"SubmissionIssue":{"type":"object","properties":{"code":{"enum":["PROVIDER_TEMPORARILY_UNAVAILABLE","PROVIDER_RESULT_UNKNOWN","PROVIDER_REJECTED","SUBMISSION_CONFIGURATION_ERROR"]},"message":{"type":"string","description":""},"retry_action":{"enum":["wait_and_query","contact_support","none"],"description":"\u672c\u7248\u80cc\u666f\u9001\u4ef6 issue \u56fa\u5b9a\u70ba none\uff0c\u8868\u793a\u7531 Foodiebro Admin \u5f8c\u53f0\u8655\u7406\uff0c\u5ee0\u5546\u7121\u9808\u63a1\u53d6\u52d5\u4f5c\uff1b\u5176\u9918\u65e2\u6709 enum \u503c\u4fdd\u7559\u4f46\u4e0d\u4f5c\u672c\u7248\u9810\u8a2d\u6620\u5c04\u3002\u6b64\u898f\u5247\u4e0d\u6539\u8b8a\u540c\u6b65 API \u932f\u8aa4\u7684 retry_action\u3002"},"occurred_at":{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"}},"required":["code","message","retry_action","occurred_at"],"additionalProperties":false,"description":"\u53ef\u9078\u67e5\u8a62\u4e2d\u7684\u80cc\u666f\u9001\u4ef6\u8a3a\u65b7\u8cc7\u8a0a\uff0c\u7531 Foodiebro Admin \u5f8c\u53f0\u76e3\u63a7\u8207\u8655\u7406\uff1b\u4e0d\u8981\u6c42\u5ee0\u5546\u63a1\u53d6\u8f2a\u8a62\u3001\u806f\u7e6b\u6216\u91cd\u65b0\u958b\u7acb\u7b49\u52d5\u4f5c\u3002"},"PrintSummary":{"type":"object","properties":{"status":{"enum":["not_required","not_reported","submitted","printed","failed","unknown"]},"attempt_count":{"type":"integer","minimum":0,"description":"\u5df2\u4fdd\u5b58\u5916\u90e8\u9996\u6b21\u5217\u5370\u5617\u8a66\u6578\uff0c\u542b\u78ba\u8a8d\u672a\u5370\u51fa\u5f8c\u7684\u9996\u6b21\u5217\u5370\u518d\u6b21\u5617\u8a66\uff1b\u4e0d\u542bAdmin\u88dc\u5370\u3002"},"printed_attempt_count":{"type":"integer","minimum":0,"description":"\u5916\u90e8\u9996\u6b21\u5217\u5370\u4e2d\u5df2\u56de\u5831\u6210\u529f\u7684attempt\u6578\uff0c\u6bcfattempt\u81f3\u591a\u8a08\u4e00\u6b21\uff1b\u4e0d\u542bAdmin\u88dc\u5370\u3002"},"last_attempt_status":{"enum":[null,"submitted","printed","failed","unknown"],"description":"\u4f9d\u5404\u5916\u90e8\u9996\u6b21\u5217\u5370attempt\u9996\u4e8b\u4ef6\u6210\u529f\u4fdd\u5b58\u9806\u5e8f\u9078\u5b9a\u6700\u5f8c\u7684\u65b0\u5617\u8a66\u72c0\u614b\uff1b\u9072\u5230\u4e8b\u4ef6\u4e0d\u6539attempt\u9806\u5e8f\uff0c\u4e0d\u542bAdmin\u88dc\u5370\u3002"}},"required":["status","attempt_count","printed_attempt_count","last_attempt_status"],"additionalProperties":false,"description":"\u53ea\u5f59\u6574\u5916\u90e8\u5ee0\u5546\u7684\u7d19\u672c\u9996\u6b21\u5217\u5370\u4e8b\u4ef6\uff1bAdmin\u88dc\u5370\u6b77\u53f2\u4e0d\u4f75\u5165\u8a08\u6578\u3001\u72c0\u614b\u6216last\u9806\u5e8f\u3002\u4e0d\u4ee3\u8868\u8cb7\u65b9\u6536\u5230\u7d19\u672c\u3002"},"InvoiceStatusResponse":{"type":"object","properties":{"request_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"data":{"type":"object","properties":{"invoice_id":{"type":"string","description":"Foodiebro \u4e0d\u900f\u660e\u8cc7\u6e90\u8b58\u5225\u3002","format":"uuid"},"store_hash_id":{"type":"string","description":"\u5efa\u7acb\u6642\u7684 Foodiebro \u5e97\u5bb6\u8b58\u5225\u5feb\u7167\uff1b\u67e5\u8a62\u6b0a\u9650\u4f9d\u539f\u767c\u7968\u5be6\u969b\u7d81\u5b9a\u5e97\u5bb6\u6838\u5c0d\uff0c\u4e0d\u4ee5\u6b64\u5feb\u7167\u91cd\u65b0\u89e3\u6790\u5e97\u5bb6\u3002","minLength":1,"maxLength":255},"external_invoice_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"invoice_number":{"type":"string","description":"","pattern":"^[A-Z]{2}[0-9]{8}$"},"invoice_date":{"type":"string","description":"\u7531 Foodiebro \u5efa\u7acb\u767c\u7968\u6642\u4ee5 Asia\/Taipei \u6c7a\u5b9a\u4e26\u56fa\u5b9a\u7684\u958b\u7acb\u6642\u9593\uff08ISO 8601\uff0c+08:00\uff09\uff0c\u4e0d\u662f\u5ee0\u5546 transaction_at\u3001\u5217\u5370\u6642\u9593\u6216\u4e0a\u50b3\u6642\u9593\u3002\u767c\u7968\u65e5\u671f\u3001\u671f\u5225\u3001\u5217\u5370\uff0f\u689d\u78bc\uff0fQR Code \u53ca OPay \u958b\u7acb\u6642\u9593\u4ee5\u6b64\u70ba\u6e96\uff1b\u80cc\u666f\u4e0a\u50b3\u8207\u8de8\u65e5\uff0f\u8de8\u671f\u6210\u529f\u91cd\u8a66\u4e0d\u5f97\u6539\u8b8a\u3002","format":"date-time","pattern":"\\+08:00$"},"delivery_mode":{"enum":["paper","carrier","donation"]},"print_required":{"type":"boolean"},"submission_status":{"enum":["pending","submitting","provider_accepted","rejected","unknown","blocked"],"description":"pending\u53ef\u6db5\u84cb\u7b49\u5f85\u5916\u90e8\u7d19\u672c\u5217\u5370\u5b8c\u6210\u6216\u5df2\u53d6\u5f97\u8cc7\u683c\u7b49\u5f85\u4e0a\u50b3\uff0c\u4e0d\u80fd\u89e3\u8b80\u70ba\u5df2\u53ef\u57f7\u884c\uff1b\u5176\u9918\u503c\u70ba\u771f\u5be6\u9001\u4ef6\u7d50\u679c\u3002\u8f09\u5177\uff0f\u6350\u8d08\u4e0d\u7b49\u5f85\u5217\u5370\u56de\u5831\uff1b\u65e2\u6709Admin\u88dc\u5370\u4e0d\u6539\u5916\u90e8print_summary\u6216\u9001\u4ef6\u8cc7\u683c\u3002"},"submission_issue":{"anyOf":[{"$ref":"#\/components\/schemas\/SubmissionIssue"},{"type":"null"}]},"platform_status":{"enum":["unconfirmed","confirmed","rejected"]},"carrier_status":{"enum":["not_applicable","pending_upload","provider_accepted","unconfirmed","confirmed","rejected"]},"print_summary":{"$ref":"#\/components\/schemas\/PrintSummary"},"updated_at":{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"},"confirmation_evidence":{"type":"object","properties":{"platform_source":{"type":["string","null"]},"carrier_source":{"type":["string","null"]},"platform_confirmed_at":{"anyOf":[{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"},{"type":"null"}]},"carrier_confirmed_at":{"anyOf":[{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"},{"type":"null"}]}},"required":["platform_source","carrier_source","platform_confirmed_at","carrier_confirmed_at"],"additionalProperties":false}},"required":["invoice_id","store_hash_id","external_invoice_id","invoice_number","invoice_date","delivery_mode","print_required","submission_status","submission_issue","platform_status","carrier_status","print_summary","updated_at","confirmation_evidence"],"additionalProperties":false,"allOf":[{"if":{"properties":{"delivery_mode":{"const":"paper"}}},"then":{"properties":{"print_required":{"const":true},"carrier_status":{"const":"not_applicable"},"print_summary":{"properties":{"status":{"not":{"const":"not_required"}}}}}}},{"if":{"properties":{"delivery_mode":{"const":"carrier"}}},"then":{"properties":{"print_required":{"const":false},"carrier_status":{"not":{"const":"not_applicable"}},"print_summary":{"properties":{"status":{"const":"not_required"},"attempt_count":{"const":0},"printed_attempt_count":{"const":0},"last_attempt_status":{"type":"null"}}}}}},{"if":{"properties":{"delivery_mode":{"const":"donation"}}},"then":{"properties":{"print_required":{"const":false},"carrier_status":{"const":"not_applicable"},"print_summary":{"properties":{"status":{"const":"not_required"},"attempt_count":{"const":0},"printed_attempt_count":{"const":0},"last_attempt_status":{"type":"null"}}}}}},{"if":{"properties":{"platform_status":{"const":"confirmed"}}},"then":{"properties":{"confirmation_evidence":{"properties":{"platform_source":{"type":"string","description":"","minLength":1},"platform_confirmed_at":{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"}}}}}},{"if":{"properties":{"carrier_status":{"const":"confirmed"}}},"then":{"properties":{"confirmation_evidence":{"properties":{"carrier_source":{"type":"string","description":"","minLength":1},"carrier_confirmed_at":{"type":"string","description":"ISO 8601\uff0cAsia\/Taipei +08:00\u3002","format":"date-time","pattern":"\\+08:00$"}}}}}}]}},"required":["request_id","data"],"additionalProperties":false},"FieldError":{"type":"object","properties":{"field":{"type":"string","description":"JSON dot path\uff0c\u4e0d\u56de\u50b3\u539f\u59cb\u654f\u611f\u6b04\u4f4d\u503c\u3002"},"code":{"enum":["required","invalid_type","invalid_format","out_of_range","unknown_field","inconsistent_value"]},"message":{"type":"string","description":""}},"required":["field","code","message"],"additionalProperties":false},"ErrorResponse":{"type":"object","properties":{"request_id":{"type":"string","description":"\u5927\u5c0f\u5beb\u6709\u5225\u3001\u4e0d\u91cd\u7528\u7684 ASCII \u8b58\u5225\u3002","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$"},"error":{"type":"object","properties":{"code":{"enum":["INVALID_JSON","IDEMPOTENCY_KEY_REQUIRED","IDEMPOTENCY_KEY_INVALID","AUTH_REQUIRED","AUTH_INVALID","AUTH_EXPIRED","CLIENT_NOT_APPROVED","CLIENT_INACTIVE","SCOPE_DENIED","STORE_ACCESS_DENIED","RESOURCE_NOT_FOUND","METHOD_NOT_ALLOWED","PAYLOAD_TOO_LARGE","UNSUPPORTED_MEDIA_TYPE","VALIDATION_FAILED","AMOUNT_MISMATCH","TAX_CONFIGURATION_INVALID","TRANSACTION_DATE_INVALID","BUYER_IDENTIFIER_INVALID","CARRIER_INVALID","DELIVERY_MODE_INVALID","DONATION_INVALID","IDEMPOTENCY_KEY_CONFLICT","IDEMPOTENCY_IN_PROGRESS","EXTERNAL_INVOICE_CONFLICT","INVOICE_NUMBER_UNAVAILABLE","INVOICE_PERIOD_UNAVAILABLE","INVOICE_SERVICE_NOT_ENABLED","PRINT_EVENT_CONFLICT","PRINT_EVENT_TRANSITION_INVALID","PRINT_NOT_APPLICABLE","RATE_LIMITED","QUOTA_EXCEEDED","CARRIER_VALIDATION_UNAVAILABLE","SERVICE_UNAVAILABLE","CREATION_RESULT_UNKNOWN","INTERNAL_ERROR"],"description":"\u7a69\u5b9a\u932f\u8aa4\u78bc\u5168\u96c6\uff1bQUOTA_EXCEEDED\u50c5\u4fdd\u7559\u539f\u5b9a\u7fa9\uff0c\u9996\u7248\u4e0d\u555f\u7528\u3001\u4e0d\u56de\u50b3\u3002\u5404\u64cd\u4f5c\u7684x-error-codes\u53ca\u7bc4\u4f8b\u5217\u672c\u7248\u53ef\u7528\u78bc\u3002"},"message":{"type":"string","description":"\u95b1\u8b80\u7528\u6587\u6848\uff0c\u4e0d\u4f5c\u7a0b\u5f0f\u5224\u65b7\u3002"},"creation_state":{"enum":["not_created","created","unknown","not_applicable"],"description":"not_created \u50c5\u4fdd\u8b49\u672c\u6b21 HTTP \u672a\u65b0\u589e\u767c\u7968\uff1b\u4e0d\u80fd\u5426\u5b9a\u5148\u524d\u540c Key \u7684\u7533\u8acb\u3002\u975e\u5efa\u7acb\u64cd\u4f5c\u4e00\u5f8b not_applicable\u3002"},"retry_action":{"enum":["fix_request","retry_same_key","refresh_credentials","contact_support","none","retry_get"]},"retry_after_seconds":{"type":["integer","null"],"minimum":1},"details":{"type":"array","items":{"$ref":"#\/components\/schemas\/FieldError"}}},"required":["code","message","creation_state","retry_action","retry_after_seconds","details"],"additionalProperties":false}},"required":["request_id","error"],"additionalProperties":false}}},"x-contract-status":"review-draft-not-implemented","x-max-body-bytes":262144,"x-error-catalog":[{"code":"INVALID_JSON","http_status":400,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"JSON \u7121\u6cd5\u89e3\u6790\u3002"},{"code":"IDEMPOTENCY_KEY_REQUIRED","http_status":400,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u5efa\u7acb API \u7f3a\u5c11 Idempotency-Key\u3002"},{"code":"IDEMPOTENCY_KEY_INVALID","http_status":400,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"Key \u4e0d\u7b26\u5408 8\u2013128 ASCII \u82f1\u6578\u6216 ._:-\u3002"},{"code":"AUTH_REQUIRED","http_status":401,"retry_action":"refresh_credentials","creation_state_for_create":"not_created","description":"\u7f3a\u5c11 Bearer Token\u3002"},{"code":"AUTH_INVALID","http_status":401,"retry_action":"refresh_credentials","creation_state_for_create":"not_created","description":"Token \u7121\u6548\u3001\u5c1a\u672a\u751f\u6548\u3001\u5df2\u64a4\u92b7\u6216\u74b0\u5883\u4e0d\u7b26\uff1b\u4e0d\u63ed\u9732\u66f4\u591a\u6191\u8b49\u8cc7\u8a0a\u3002"},{"code":"AUTH_EXPIRED","http_status":401,"retry_action":"refresh_credentials","creation_state_for_create":"not_created","description":"Token \u5df2\u9054\u6216\u8d85\u904e\u81ea\u8eab\u5230\u671f\u6642\u9593\u3002"},{"code":"CLIENT_NOT_APPROVED","http_status":403,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u5c1a\u672a\u6838\u51c6\u3002"},{"code":"CLIENT_INACTIVE","http_status":403,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"\u5ee0\u5546\u6216\u6574\u5408\u5e33\u865f\u505c\u7528\uff0f\u7d50\u6848\u3002"},{"code":"SCOPE_DENIED","http_status":403,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"Token\/client\/grant \u7f3a\u5c11\u672c\u64cd\u4f5c\u80fd\u529b\u3002"},{"code":"STORE_ACCESS_DENIED","http_status":403,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"store_hash_id \u4e0d\u5b58\u5728\u3001\u5e97\u5bb6\u5df2\u522a\u9664\uff0c\u6216\u8a72\u6574\u5408\u5e33\u865f\u5728\u76ee\u524d\u74b0\u5883\u7121\u6709\u6548\u5e97\u5bb6\u6388\u6b0a\uff1b\u4e0d\u5340\u5206\u539f\u56e0\u3002"},{"code":"RESOURCE_NOT_FOUND","http_status":404,"retry_action":"contact_support","creation_state_for_create":"not_applicable","description":"\u767c\u7968\u4e0d\u5b58\u5728\u6216\u5c0d\u8a72 client\/store \u4e0d\u53ef\u898b\u3002"},{"code":"METHOD_NOT_ALLOWED","http_status":405,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u8def\u5f91\u4e0d\u63a5\u53d7\u6b64 HTTP method\u3002"},{"code":"PAYLOAD_TOO_LARGE","http_status":413,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"body \u8d85\u904e\u6838\u51c6\u4e0a\u9650\u3002"},{"code":"UNSUPPORTED_MEDIA_TYPE","http_status":415,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"POST \u975e application\/json\u3002"},{"code":"VALIDATION_FAILED","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u6b04\u4f4d\u7f3a\u5c11\u3001\u578b\u5225\u3001\u9577\u5ea6\u6216\u672a\u77e5\u6b04\u4f4d\u7b49\u9a57\u8b49\u932f\u8aa4\uff1bdetails \u6307\u51fa\u6b04\u4f4d\u3002"},{"code":"AMOUNT_MISMATCH","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u6578\u91cf\u00d7\u6574\u6578\u55ae\u50f9\u4e0d\u662f\u6574\u6578\u5143\u3001\u8207\u54c1\u9805\u91d1\u984d\u4e0d\u7b26\uff0c\u6216\u660e\u7d30\u5408\u8a08\u4e0d\u7b49\u65bc\u7e3d\u984d\uff1b\u4e0d\u81ea\u884c\u6368\u5165\u3002"},{"code":"TAX_CONFIGURATION_INVALID","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u5916\u90e8 API v1 \u50c5\u63a5\u53d7 taxable\uff1b\u5176\u4ed6\u7a05\u5225\u6216\u91d1\u984d\u542b\u7a05\u8a2d\u5b9a\u9808\u7531\u65e2\u6709\u5f8c\u53f0\u8655\u7406\u3002"},{"code":"TRANSACTION_DATE_INVALID","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u4ea4\u6613\u6642\u9593\u683c\u5f0f\uff0f\u65e5\u66c6\u65e5\u671f\u7121\u6548\u3001\u672a\u5e36 +08:00 offset\uff0c\u6216\u771f\u6b63\u65b0\u7533\u8acb\u8d85\u904e\u672c\u6b21\u4f3a\u670d\u5668\u63a5\u6536 HTTP \u6642\u9593\u56fa\u5b9a\u5feb\u7167\u52a0300\u79d2\uff1b\u904e\u53bb\u4ea4\u6613\u4e0d\u8a2d\u5e74\u9f61\u4e0a\u9650\u3002"},{"code":"BUYER_IDENTIFIER_INVALID","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u8cb7\u65b9\u7d71\u7de8\u683c\u5f0f\uff0f\u7de8\u5be9\u4e0d\u7b26\u3002"},{"code":"CARRIER_INVALID","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u624b\u6a5f\u8f09\u5177\u683c\u5f0f\u6216 OPay \u914d\u865f\u524d\u6709\u6548\u6027\u9a57\u8b49\u62d2\u7d55\uff1b\u4e0d\u914d\u865f\u3001\u4e0d\u81ea\u884c\u8f49\u7d19\u672c\u3002"},{"code":"DELIVERY_MODE_INVALID","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u7d19\u672c\u3001\u624b\u6a5f\u8f09\u5177\u3001\u6350\u8d08\u53ca\u8cb7\u65b9\u8cc7\u6599\u7d44\u5408\u4e0d\u7b26\u3002"},{"code":"DONATION_INVALID","http_status":422,"retry_action":"fix_request","creation_state_for_create":"not_created","description":"\u611b\u5fc3\u78bc\u4e0d\u5728 Foodiebro \u65e2\u6709 syscode(code_kind=einv, code1=npoban) \u767d\u540d\u55ae\uff1b\u4e0d\u914d\u865f\u3001\u4e0d\u81ea\u884c\u8f49\u7d19\u672c\u6216\u8f09\u5177\u3002"},{"code":"IDEMPOTENCY_KEY_CONFLICT","http_status":409,"retry_action":"contact_support","creation_state_for_create":"unknown","description":"\u5df2\u53d7\u7406\u7684\u540c Key \u5167\u5bb9\u4e0d\u540c\uff1b\u6062\u5fa9\u539f\u5167\u5bb9\uff0c\u4e0d\u80fd\u4fee\u6539\u820a\u7533\u8acb\u3002"},{"code":"IDEMPOTENCY_IN_PROGRESS","http_status":409,"retry_action":"retry_same_key","creation_state_for_create":"unknown","description":"\u540c Key\u3001\u540c\u5167\u5bb9\u78ba\u8a8d\u4ecd\u5728\u8655\u7406\u4e14\u5c1a\u7121\u6210\u529f\u7d50\u679c\uff1b\u7acb\u5373\u56de\u8986\u4e26\u9644 Retry-After\uff0c\u4e0d\u7b49\u5f85\u539f\u8acb\u6c42\u6216\u53e6\u914d\u865f\u3002"},{"code":"EXTERNAL_INVOICE_CONFLICT","http_status":409,"retry_action":"contact_support","creation_state_for_create":"created","description":"\u540c\u5e97\u5bb6\u5916\u90e8\u8b58\u5225\u5df2\u6709\u53e6\u4e00\u5167\u5bb9\u7684\u767c\u7968\uff1b\u4e0d\u65b0\u914d\u865f\u3002"},{"code":"INVOICE_NUMBER_UNAVAILABLE","http_status":409,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"\u7121\u53ef\u7528\u865f\u78bc\uff0f\u5269\u9918\u91cf\u4e0d\u8db3\uff1bFoodiebro \u88dc\u865f\u5f8c\u4ee5\u539f Key \u91cd\u8a66\u3002"},{"code":"INVOICE_PERIOD_UNAVAILABLE","http_status":409,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"\u958b\u7acb\u671f\u5225\u7f3a\u5c11\u6709\u6548\u5b57\u8ecc\uff1b\u7ba1\u7406\u54e1\u8655\u7406\u5f8c\u4ee5\u539f Key \u91cd\u8a66\u3002"},{"code":"INVOICE_SERVICE_NOT_ENABLED","http_status":409,"retry_action":"contact_support","creation_state_for_create":"not_created","description":"\u5e97\u5bb6\u6709\u6548\u767c\u7968\u5408\u7d04\u6216\u767c\u7968\u8a2d\u5b9a\u672a\u5c31\u7dd2\uff1b\u4e0d\u63ed\u9732\u5167\u90e8\u6191\u8b49\u3002"},{"code":"PRINT_EVENT_CONFLICT","http_status":409,"retry_action":"contact_support","creation_state_for_create":"not_applicable","description":"event ID \u6216 attempt\/sequence \u91cd\u8907\u4f46\u5167\u5bb9\u4e0d\u540c\u3002"},{"code":"PRINT_EVENT_TRANSITION_INVALID","http_status":409,"retry_action":"fix_request","creation_state_for_create":"not_applicable","description":"\u5217\u5370 attempt \u5e8f\u5217\u77db\u76fe\uff1b\u7d42\u614b\u4e4b\u5f8c\u4e0d\u53ef\u65b0\u589e\u8f03\u5927\u5e8f\u865f\u4e8b\u4ef6\u6216\u4e92\u63db\u7d42\u614b\u3002"},{"code":"PRINT_NOT_APPLICABLE","http_status":409,"retry_action":"none","creation_state_for_create":"not_applicable","description":"\u8f09\u5177\u6216\u6350\u8d08\u7b49\u4e0d\u9700\u8981\u7d19\u672c\u5217\u5370\u7684\u767c\u7968\u4e0d\u80fd\u56de\u5831\u5217\u5370\u3002"},{"code":"RATE_LIMITED","http_status":429,"retry_action":"retry_same_key","creation_state_for_create":"not_created","description":"\u9054\u5916\u90e8\u65b0\u7968\u5e97\u7d1a\u901f\u7387\u9650\u5236\uff08\u55ae\u5e97\u6bcf\u9023\u7e8c60\u79d25\u5f35\uff09\uff1b\u7b49\u5f85 Retry-After\uff0c\u518d\u91cd\u9001\u539f POST\uff0f\u91cd\u65b0 GET\u3002"},{"code":"QUOTA_EXCEEDED","http_status":429,"retry_action":"retry_same_key","creation_state_for_create":"not_created","description":"\u4fdd\u7559\u78bc\uff0c\u9996\u7248\u4e0d\u555f\u7528\u3001\u4e0d\u56de\u50b3\uff1b\u9996\u7248\u4e0d\u8a2d\u6bcf\u65e5\u65b0\u958b\u7968\u7e3d\u5f35\u6578\u4e0a\u9650\uff0c\u4e5f\u7121\u6bcf\u65e5\u984d\u6eff\u62d2\u7d55\u8def\u5f91\u3002"},{"code":"CARRIER_VALIDATION_UNAVAILABLE","http_status":503,"retry_action":"retry_same_key","creation_state_for_create":"not_created","description":"OPay CheckBarcode \u5728\u914d\u865f\u524d\u9a57\u8b49\u903e\u6642\u6216\u9a57\u8b49\u670d\u52d9\u4e0d\u53ef\u7528\uff08connect timeout 2 \u79d2\u3001request timeout 5 \u79d2\u3001overall deadline 5 \u79d2\uff0c\u4ee5\u8f03\u65e9\u8005\u70ba\u6e96\uff09\uff1b\u4e0d\u5728 Redis \u9396\u6216 DB transaction \u5167\u7b49\u5f85\uff0c\u5c1a\u672a\u914d\u865f\u3002"},{"code":"SERVICE_UNAVAILABLE","http_status":503,"retry_action":"retry_same_key","creation_state_for_create":"unknown","description":"\u5fc5\u8981\u670d\u52d9\u4e0d\u53ef\u7528\uff1b\u9664\u975e\u8b49\u660e\u672a\u53d7\u7406\uff0c\u4fdd\u5b88\u8996\u70ba\u5efa\u7acb\u7d50\u679c\u4e0d\u660e\u3002"},{"code":"CREATION_RESULT_UNKNOWN","http_status":503,"retry_action":"retry_same_key","creation_state_for_create":"unknown","description":"\u5167\u90e8 timeout\uff0fcommit \u7d50\u679c\u4e0d\u660e\uff1b\u4e0d\u80fd\u5224\u5b9a\u672a\u5efa\u7acb\u6216\u53e6\u914d\u865f\uff0c\u7528\u539f Key \u548c\u5167\u5bb9\u6062\u5fa9\u3002"},{"code":"INTERNAL_ERROR","http_status":500,"retry_action":"retry_same_key","creation_state_for_create":"unknown","description":"\u975e\u9810\u671f\u932f\u8aa4\uff1b\u672c\u6b21\u5efa\u7acb\u7d50\u679c\u672a\u78ba\u5b9a\uff0c\u4e0d\u80fd\u63db Key\u3002"}],"x-submission-issue-catalog":[{"code":"PROVIDER_TEMPORARILY_UNAVAILABLE","submission_status":"pending","retry_action":"none","description":"Foodiebro \u5f8c\u53f0\u76e3\u63a7\uff0c\u50c5\u5728\u5df2\u78ba\u8a8d\u5b89\u5168\u7684\u689d\u4ef6\u4e0b\u91cd\u8a66\u539f\u767c\u7968\uff1b\u5ee0\u5546\u7121\u9808\u8f2a\u8a62\u3001\u806f\u7e6b\u6216\u91cd\u958b\u3002"},{"code":"PROVIDER_RESULT_UNKNOWN","submission_status":"unknown","retry_action":"none","description":"\u4e0a\u6e38\u53ef\u80fd\u5df2\u53d7\u7406\uff0c\u7531 Foodiebro \u5f8c\u53f0\u67e5\u6838\u539f\u64cd\u4f5c\uff1b\u5ee0\u5546\u7121\u9808\u8f2a\u8a62\u6216\u806f\u7e6b\uff0c\u4e0d\u5f97\u91cd\u958b\u3002"},{"code":"PROVIDER_REJECTED","submission_status":"rejected","retry_action":"none","description":"\u4e0a\u6e38\u660e\u78ba\u62d2\u7d55\uff0c\u7531 Foodiebro \u5f8c\u53f0\u4f9d\u539f\u865f\u78bc\u53d7\u63a7\u8655\u7406\uff1b\u5ee0\u5546\u7121\u9808\u8f2a\u8a62\u3001\u806f\u7e6b\u6216\u91cd\u958b\u3002"},{"code":"SUBMISSION_CONFIGURATION_ERROR","submission_status":"blocked","retry_action":"none","description":"\u8a2d\u5b9a\u6216\u6191\u8b49\u7570\u5e38\uff0c\u7531 Foodiebro \u5f8c\u53f0\u8655\u7406\uff1b\u5ee0\u5546\u7121\u9808\u8f2a\u8a62\u3001\u806f\u7e6b\u6216\u91cd\u958b\u3002"}],"x-sources":["https:\/\/spec.openapis.org\/oas\/v3.1.1.html","https:\/\/laravel.com\/framework\/docs\/13.x\/sanctum","https:\/\/developers.opay.tw\/Content\/Doc\/opay_i301.pdf"],"x-foodiebro-runtime-docs":{"contract_revision":"2026-10-06","environment":"sandbox","try_it_out":true,"production_read_only":true,"token_input":"never-in-page","artifact":"docs\/external-invoice-api.openapi.json"}}