主頁 > 後端開發 > 完整的支付系統整體架構!

完整的支付系統整體架構!

2021-01-06 06:20:42 後端開發

整理于網路

從產品分類、模塊功能和業務流程,了解支付產品服務的設計,

支付產品模塊是按照支付場景來為業務方提供支付服務,這個模塊一般位于支付網關之后,支付渠道之前, 它根據支付能力將不同的支付渠道封裝成統一的介面,通過支付網關來對外提供服務,所以,從微服務的角度來說,支付產品本身也是一個代理模式的微服務,它透過支付網關回應業務方請求, 進行一些統一處理后,分發到不同的支付渠道去執行,最后將執行結果做處理后,通過支付網關再回傳給業務方,支付產品在支付系統架構圖中的位置,如下圖所示:

產品分類

在不同的公司由于接入渠道和應用的差異,對支付產品分類略有不同,綜合支付場景和流程,支付產品可以分為如下幾類:

支付產品是由支付系統對支付渠道進行封裝而對業務方提供的支付能力,整體上來說,可以提供如下支付產品:

1. 快捷支付

用戶在完成綁卡之后,在支付的時候,不需要再輸入卡或者身份資訊,僅需要輸入支付密碼就可以完成支付,對于小額度的支付,甚至可以開通小額免密,直接完成支付, 這種支付方式不會打斷用戶的體驗,是目前主要的在線支付方式,一般快捷支付產品是通過封裝銀行或者第三方支付平臺提供的快捷支付介面或者代付介面來實作的,

2. 網銀支付

用戶在支付的時候,需要跳轉到銀行網銀頁面來完成支付,在網銀頁面,需要輸入用戶的卡號和身份資訊,這種支付方式會中斷用戶當前的體驗,一般僅用于 PC Web 上的支付, 網銀支付是封裝銀行提供的網銀支付來實作,

3. 協議支付

協議支付也稱代識訓者代扣,代收指渠道授權商戶可以從用戶的銀行賬戶中扣款,一般用于定期扣款,不用于日常消費,比如水電煤氣、有線電視費,協議支付是通過封裝銀行、第三方支付提供的代扣或者快捷介面來實作,

4. 平臺支付

使用微信、支付寶等第三方支付平臺來完成支付,使用時,一般需要用戶預先安裝支付平臺系統(手機上),注冊并登錄到第三方支付平臺,并且已經在該平臺上完成綁卡等操作, 由于微信、支付寶已經被大量使用,用戶也產生對這些平臺的信任,平臺支付往往是電商公司的主要支付方式,

5. 外卡支付

對于由海外支付的需求,還需要提供外卡支付支持, 國內不少支付渠道都能支持外卡支付,如支付寶全球購等,直接對接 Paypal,也是目前用的最多的外卡支付渠道,

6. 話費支付

對于有包月小額型別的支付,手機話費也是一個不錯的選擇,目前也有一些平臺可以支持話費支付,比如虹軟、聯動優勢等,

7. 虛幣支付

不少公司會有自己的虛擬幣,比如京豆、Q幣等,這些虛幣也可以作為一種支付方式,

8. 賬戶支付

也稱為余額支付、零錢支付等, 指為用戶建立本地賬戶, 支持充值,之后可以使用這個賬戶來完成支付,

9. 信用支付

如京東的白條,螞蟻花唄等,指使用信用賬戶進行透支,類似信用卡支付,

10. 代付

和代扣相反,代付是平臺將錢打給用戶,

模塊功能

支付產品根據其支付能力,對外提供不同的功能,整體上來說,一般支付產品需要提供如下介面:

1. 簽約和解約

在快捷支付、代扣等產品中,用戶在使用前,需要先完成簽約,簽約可以在渠道側進行,一般第三方支付采用這種方式,當電商需要接入時,讓第三方給授權, 銀行和銀聯的簽約一般是在電商側進行, 電商側負責收集用戶的資訊,呼叫銀行和銀聯的介面進行簽約,簽約后,后續的支付行為就使用簽約號來進行,無需再輸入個人資訊, 和簽約相對應,解約則是取消簽約關系,

2. 支付

支付是少不了的操作, 不同產品中支付行為不一樣,快捷支付是在電商服務器上發起,請求渠道進行支付;網銀支付則是跳轉到銀行支付網關上進行; 而賬戶支付、虛幣支付,則是在本地進行的,

3. 撤銷和退款

有些渠道區分撤銷和退款,比如銀聯、農行等,撤銷指取消當天在渠道側未結算的交易; 而退款僅針對已經結算的交易,有些渠道則不作區分,

4. 查詢簽約狀態

對于需要簽約的交易,可以通過這個介面來查詢簽約狀態,

5. 查詢訂單狀態

通過這個介面來查詢支付清單狀態以及退款的訂單狀態,

6. 預授權

預授權交易用于受理方向持卡人的發卡方確認交易許可,受理方將預估的消費金額作為預授權金額,發送給持卡人的發卡方,

7. 預授權撤銷

對已成功的預授權交易,在結算前使用預授權撤銷交易,通知發卡方取消付款承諾,預授權撤銷交易必須是對原始預授權交易或追加預授權交易最終承兌金額的全額撤銷,

8. 預授權完成交易

對已批準的預授權交易,用預授權完成做支付結算,

9. 預授權完成撤銷

預授權完成撤銷交易必須是對原始預授權完成交易的全額撤銷,預授權完成撤銷后的預授權仍然有效,

10. 對賬

通過 FTP 或者 HTTP 方式提供對賬檔案供商戶側對賬,

11. 余額查詢

查詢商戶的交易賬戶的余額,避免由于余額不足導致交易失敗, 注意,不是客戶的余額, 當然,不是所有的銀行或者第三方支付都提供這個介面,

業務流程

上述操作,除了對賬、查單外,每個操作實作的主流程,一般會包括“引數校驗,支付路由,生成訂單,風險評估,呼叫渠道服務,更新訂單和發送訊息”這 7 步,對于一些比較復雜的服務,還會涉及到異步通知處理的步驟,

1. 執行引數校驗

所有的支付操作,都需要對輸入執行引數校驗,避免介面受到攻擊,驗證輸入引數中各欄位的有效性驗證,比如用戶ID、商戶ID、價格、回傳地址等引數,驗證賬戶狀態,交易主體、交易對手等賬戶的狀態是處于可交易的狀態,驗證訂單,如果涉及到預單,還需要驗證訂單號的有效性,訂單狀態是未支付,為了避免用戶快取某個 URL 地址,還需要校驗下單時間和支付時間是否超過預定的間隔,驗證簽名,簽名也是為了防止支付介面被偽造, 一般簽名是使用分發給商戶的 key 來對輸入引數拼接成的字串做 MD5 Hash 或者 RSA 加密,然后作為一個引數隨其他引數一起提交到服務器端,簽名驗證也可以在網關中統一完成,

2. 根據支付路由尋找合適的支付服務

根據用戶選擇的支付方式確定用來完成該操作的合適的支付渠道,用戶指定的支付方式不一定是最終的執行支付的渠道,比如用戶選擇通過工行信用卡來執行支付,但是我們沒有實作和工行的對接,而是可以通過第三方支付,比如支付寶、微信支付、易寶支付,或者銀聯來完成,那如何選擇合適的支付渠道,就通過支付路由來實作,支付路由會綜合考慮收費、渠道的可用性等因素來選擇最優方案,

3. 評估交易風險

檢查本次交易是否有風險,風控介面回傳三種結果:阻斷交易、增強驗證和放行交易,阻斷交易,說明該交易是高風險的,需要終止,不執行第 5 個步驟;增強驗證,說明該交易有一定的風險,需要確認下是不是用戶本人在操作,這可以通過發送短信驗證碼或者其他可以驗證用戶身份的方式來做校驗,驗證通過后,可以繼續執行該交易,放行交易,即本次交易是安全的,可以繼續往下走,

4. 生成交易訂單

將訂單資訊持久化到資料庫中,當訪問壓力大的時候,資料庫寫入會成為一個瓶頸,

5. 呼叫支付渠道提供的服務

所有的支付服務都需要第三方通道來完成執行,一般銀行渠道的呼叫比較簡單,可以直接回傳結果,而一些第三方支付,支付寶,微信支付等,則會通過異步介面來告知支付結果,

6. 更新訂單

對于同步回傳的結果,需要在主執行緒中更新訂單的狀態,標記是支付成功還是失敗,對于異步回傳的渠道,需要在異步程式中處理,

7. 發送訊息

通過訊息來通知相關系統關于訂單的變更,風控,信用 BI 等,都需要依賴這資料做準實時計算,

8. 異步通知

如上述流程,其中涉及到呼叫遠程介面,其延遲不可控,如果呼叫方一直阻塞等待,很容易超時,引入異步通知機制,可以讓呼叫方在主執行緒中盡快回傳,通過異步執行緒來得到支付結果,對于通過異步來獲取支付結果的渠道介面,也需要對應的在異步通知中將結果回傳給呼叫方, 異步通知需要呼叫方提供一個回呼地址,一般以 http 或者 https 的方式,這就有技術風險,如果呼叫失敗,還需要重試,而重試不能過于頻繁,需要逐步拉大每一次重試的時間間隔,在異步處理程式中,訂單根據處理結果變更狀態后,也要發訊息通知相關系統,

支付系統架構整體設計

每個公司根據其業務和公司發展的不同階段,所設計的支付系統也會有所不同,我們先看看互聯網公司的一些典型的支付系統架構,

1. 支付寶

這個整體架構上并沒有與眾不同之處,在模塊劃分上,這個圖顯示的是最頂層的劃分,也無法告知更多細節, 但支付寶架構檔案有兩個搞支付平臺設計的人必須仔細揣摩的要點, 一個是賬務處理,在記賬方面,涉及到內外兩個子系統,外部子系統是單邊賬,滿足線上性能需求;內部子系統走復式記賬,滿足財務需求,如記賬、對賬和平賬,

另一個是柔性事務處理,利用訊息機制來實作跨系統的事務處理,避免資料庫鎖導致的性能問題,

2. 京東金融

京東金融是在網銀在線的基礎上發展起來的, 網銀在線的原班技術人員有不少來自易寶公司,在京東收購之后,又引入了支付寶的人才,因而從架構上受這兩個公司的影響很大,

3. 去哪兒

這些架構檔案全部來自互聯網公開資料, 對于架構是否真實反映實際系統情況,需要大家自行判斷, 咱們僅是以這些檔案為基礎,分析支付系統應有的軟體架構,

參考架構

一般來說,支付系統典型架構會包含如下模塊:

支付系統從架構上來說,分為三層;

  • 支撐層: 用來支持核心系統的基礎軟體包和基礎設施, 包括運維監控系統、日志分析系統等,

  • 核心層: 支付系統的核心模塊,內部又分為兩個部分: 支付核心模塊以及支付服務模塊,

  • 產品層: 通過核心層提供的服務組合起來,對最終用戶、商戶、運營管理人員提供的系統,

1. 支撐系統

支撐系統是一個公司提供給支付系統運行的基礎設施, 主要包括如下子系統:

  • 運維監控: 支付系統在運行程序中不可避免的會受到各種內部和外部的干擾,光纖被挖斷、黑客攻擊、資料庫被誤刪、上線系統中有 bug 等等,運維人員必須在第一時間內對這些意外事件作出回應,又不能夠一天 24 小時盯著,這就需要一個運維監控系統來協助完成,

  • 日志分析: 日志是支付系統統計分析、運維監控的重要依據,公司需要提供基礎設施來支持日志統一收集和分析,

  • 短信平臺: 短信在支付系統中有重要作用,如身份驗證、安全登錄、找回密碼、以及報警監控,都需要短信的支持,

  • 安全機制: 安全是支付的生命線, SSL、證書系統、防刷介面等,都是支付的必要設施,

  • 統計報表: 支付資料的可視化展示,是公司進行決策的基礎,

遠程連接管理、分布式計算、訊息機制、全文檢索、檔案傳輸、資料存盤、機器學習等,都是構建大型系統所必須的基礎軟體,這里不再一一詳細介紹,

2. 支付核心系統

支付核心系統指用戶執行支付的核心流程,包括:

  • 用戶從支付應用啟動支付流程;

  • 支付應用根據應用和用戶選擇的支付工具來呼叫對應的支付產品來執行支付;

  • 支付路由根據支付工具、渠道費率、介面穩定性等因素選擇合適的支付渠道來落地支付;

  • 支付渠道呼叫銀行、第三方支付等渠道提供的介面來執行支付操作,最終落地資金轉移,

3. 支付服務系統

支持支付核心系統所提供的功能,服務系統又分為基礎服務系統、資金系統、風控和信用系統,

基礎服務系統提供支撐線上支付系統運行的基礎業務功能:

  • 客戶資訊管理:包括對用戶、商戶的實名身份、基本資訊、協議的管理;

  • 卡券管理: 對優惠券、代金券、折扣券的制作、發放、使用流程的管理;

  • 支付通道管理: 通道介面、配置引數、費用、限額以及 QOS 的管理;

  • 賬戶和賬務系統: 管理賬戶資訊以及交易流水、記賬憑證等,這里的賬務一般指對接線上系統的賬務,采用單邊賬的記賬方式,內部賬記錄在會計核算系統中,

  • 訂單系統: 一般訂單系統可以獨立于業務系統來實作的,這里的訂單,主要指支付訂單,

資金系統指圍繞財務會計而產生的后臺資金核實、調度和管理的系統,包括:

  • 會計核算: 提供會計科目、內部賬務、試算平衡、日切、流水登記、核算和歸檔的功能,

  • 資金管理: 管理公司在各個支付渠道的頭寸,在余額不足時進行打款, 對第三方支付公司,還需要對備付金進行管理,

  • 清算分潤: 對于有分潤需求的業務,還需要提供清分清算、對賬處理和計費分潤功能,

風控系統是支付系統必備的基礎功能,所有的支付行為必須做風險評估并采取對應的措施;信用系統是在風控基礎上發展的高級功能,京東的白條,螞蟻花唄等,都是成功的案例,

4. 支付應用

支撐系統、核心系統和服務系統,在每個互聯網公司的架構上都是大同小異的,都是必不可少的模塊,而支付應用是每個公司根據自己的業務來構建的,各不相同,

總體來說,可以按照使用物件分為針對最終用戶的應用、針對商戶的應用、針對運營人員的運營管理、BI 和風控后臺,

近期熱文推薦:

1.Java 15 正式發布, 14 個新特性,重繪你的認知!!

2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!

3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245029.html

標籤:Java

上一篇:IDEA中無法import自己工程中類的問題解決方法

下一篇:JetBrains發布代碼質量檢測工具Qodana早期預覽版

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more