主頁 > .NET開發 > Stripe支付介紹在asp.net mvc中開發對接,圖文加代碼說明

Stripe支付介紹在asp.net mvc中開發對接,圖文加代碼說明

2020-12-15 06:20:20 .NET開發

     最近一個國外的電商專案,需要對接支付功能,國內的支付一般使用微信支付、支付寶、銀聯等等,但國際上一般使用Paypal、Skrill、BrainTree、Stripe等,經過內部綜合考量所以最后選擇使用 Stripe支付,

Stripe的對接相對還是比較簡單的,只是相關的檔案是英文的,且國內和國外的思想不一樣,看檔案不是很方便,

做為技術人員這里我將對接中所遇到的問題和解決方法匯總,希望能對開發人員有所幫助,

一:Stripe支付介紹

Stripe支付國際支付還是非常有名氣的,具體的介紹下面的一些說明:

  1. 中文官網:https://stripe.com/zh-cn-us
  2. Stripe國際支付簡介:點擊打開
  3. Stripe支付對接還是非常方便的,
  4. Stripe支付功能也還是很強大的包括支付、賬單、訂閱等等,

二:Stripe技術對接

  1. 對接前的準備作業
    • 需要去官網申請一個賬號,好像是國內的銀行卡不好申請,具體如何申請還請百度搜索下,我這里就不贅述了,
    • 申請好以后在后臺拿到測驗的公鑰和私鑰,
    • 需要申請HTTPS證書,這個異步通知的介面需要提供HTTPS的域名,
    • 官網介面檔案,共區分后端、前端、ios和安卓,
      • 后端的介面:點擊查看
      • 前端的介面:點擊查看
    • 其它的一些使用檔案:點擊查看
  2. 支付對接方式說明:共有2中方式,
    • 方式一:使用Stripe的支付頁面進行支付(官方名稱:CheckOut),
      • 這種分2種情況:
        • 跳轉到Stripe的支付頁面進行支付,這種類似于支付寶的對接,需要跳轉到支付寶的支付頁面,Stripe的支付頁面效果圖如下,
        • 自己的頁面構建一個Stripe的支付,這種類似于微信公眾號的支付,
    • 方式二:自己做支付頁面,通過介面的方式進行支付,
      • 官網給出了很多HTML示例效果,可下載后自己修改下,點擊查看示例效果
      • 采用這種方式,輸入信用卡等資訊是Stripe通過js控制的,我們是拿不到用戶輸入的相關資訊的,為了安全,
    • 不管是使用方式一和方式二,我們都無法獲取用戶輸入的信用卡等資訊,
    • 推薦使用方式一對接,有以下幾點:
      • 用戶在Stripe輸入銀行卡資訊,用戶感覺要更加安全,
      • 減少不必要的開發作業,因為自己做的收銀頁面沒法和Stripe的比較,
  3. 下面所有的流程主要是使用跳轉到Stripe支付頁面支付,
  4. 簡單的流程說明
    • 用戶點擊頁面上的“支付”按鈕,
    • 通過js呼叫后臺的介面,介面中要呼叫Stripe的介面創建支付的會話(Session),呼叫Stripe介面之前需要設定一些資料,包括支付金額、支付方式等等,這個后面說明,呼叫介面成功則Stripe會回傳一個SessionId,將該值返會給前端,
    • 前端拿到SessionId以后,帶上改引數跳轉到Stripe的支付頁面,
    • 用戶如果取消支付或支付成功,則跳轉到創建Session配置的取消地址和支付成功跳轉地址,
    • 支付成功或其他的一些事件,Stripe會異步通知我們支付結果,
    • 上面這幾步驟是大致的流程,還請有多的細節問題,
  5. 下面我們根據上面簡單的流程進行一步步詳細的說明,
  6. 下面的演示代碼是:.NET MVC

三:發起支付

  1. 官網有個快速開始支付的說明檔案,點擊查看
  2. 做一個HTML頁面,頁面上需要參考Stripe的js檔案和點擊跳轉到支付按鈕,當然支付的頁面上還有很多其他的一些東西,比如識訓地址、商品資訊等等,
    1.   <!DOCTYPE html>
    2.   <html>
    3.   <head>
    4.       <meta charset="utf-8" />
    5.       <title></title>
    6.       <script src=https://www.cnblogs.com/angelasp/archive/2020/12/14/"~/js/jquery-1.12.4.min.js"></script>
    7.       <script src=https://www.cnblogs.com/angelasp/archive/2020/12/14/"http://js.stripe.com/v3/"></script>
    8.    
    9.   </head>
    10.   <body>
    11.    
    12.      <button id="checkout-button">去付款</button>
    13.    
    14.       <script type="text/javascript">
    15.    
    16.           //創建一個stripe,里面的引數則是stripe申請的公鑰,在后臺能查看到,pk_開通的,加test表示是測驗的
    17.           var stripe = Stripe('pk_test_xxx'); //輸入自己的pk_test
    18.           var checkoutButton = document.getElementById('checkout-button');
    19.    
    20.           //支付按鈕點擊事件
    21.           checkoutButton.addEventListener('click', function () {
    22.    
    23.               //呼叫后端的介面
    24.               fetch('/home/CreateCheckoutSession', {
    25.                   method: 'POST',
    26.               })
    27.                   .then(function (response) {
    28.                       return response.json();
    29.                   })
    30.                   .then(function (session) {
    31.                       //呼叫后端介面成功,得到sessionId,頁面會在函式里面進行跳轉
    32.                       return stripe.redirectToCheckout({ sessionId: session.id });
    33.                   })
    34.                   .then(function (result) {
    35.                     
    36.                       if (result.error) {
    37.                           alert(result.error.message);
    38.                       }
    39.                   })
    40.                   .catch(function (error) {
    41.                       console.error('Error:', error);
    42.                   });
    43.           });
    44.       </script>
    45.    
    46.    
    47.    
    48.   </body>
    49.    
    50.   </html>

     

  3. 上面的頁面中需要一個后臺呼叫Stripe來產生SessionId,
  4. 后端代碼,VS上先在NuGet上參考第三方的包,名稱:Stripe.net,
  5. 后端提供SessionId的代碼如下
    1.   /// <summary>
    2.   /// 呼叫stripe創建支付的會話,成功則回傳會話的Id,用于頁面跳轉
    3.   /// </summary>
    4.   /// <returns></returns>
    5.   [HttpPost]
    6.   public ActionResult CreateCheckoutSession()
    7.   {
    8.   try
    9.   {
    10.   // Stripe的私鑰,在 Stripe后臺能看到 sk開頭的,_test則表示是用于測驗環境的,
    11.   StripeConfiguration.ApiKey = "sk_test_xx"; //sk_test_xxx 這里需要修改
    12.    
    13.   //封裝支付請求的資料,
    14.   //欄位說明詳見官網:https://stripe.com/docs/api/checkout/sessions/object
    15.   var options = new SessionCreateOptions
    16.   {
    17.   PaymentMethodTypes = new List<string>
    18.   {
    19.   "card" ,"alipay" //支持的付款方式
    20.   },
    21.   BillingAddressCollection= "required",//是否要收集帳單地址資訊
    22.    
    23.   LineItems = new List<SessionLineItemOptions>
    24.   {
    25.   new SessionLineItemOptions
    26.   {
    27.   PriceData = https://www.cnblogs.com/angelasp/archive/2020/12/14/new SessionLineItemPriceDataOptions
    28.   {
    29.   UnitAmount = 2000, //需要支付的金額
    30.   Currency = "usd",//支持的貨幣簡寫,具體見官網
    31.   ProductData = https://www.cnblogs.com/angelasp/archive/2020/12/14/new SessionLineItemPriceDataProductDataOptions
    32.   {
    33.   Name = "支付的顯示名稱,或者是商品名稱",
    34.   Images= new List<string>(){"http://www.angelasp.com/images/angellogo.gif" },
    35.   Description="支付的描述資訊,可以是商品的描述等資訊"
    36.   },
    37.   },
    38.   Quantity = 1,
    39.   },
    40.   },
    41.    
    42.   Mode = "payment",
    43.   SuccessUrl = "https://example.com/success", //支付成功以后跳轉的URL地址
    44.   CancelUrl = "https://example.com/cancel",//用戶取消支付以后跳轉的URL地址
    45.   };
    46.    
    47.   options.PaymentIntentData = https://www.cnblogs.com/angelasp/archive/2020/12/14/new SessionPaymentIntentDataOptions();
    48.   options.PaymentIntentData.Metadata = https://www.cnblogs.com/angelasp/archive/2020/12/14/new Dictionary<string, string>
    49.   {
    50.   { "sn", "6735" }, { "attachmentValue", "6735" }, //傳遞的自定義引數,回呼通知的時候會原樣回傳
    51.   };
    52.    
    53.   var service = new SessionService();
    54.   Session session = service.Create(options);
    55.    
    56.   return Json(new { id = session.Id });
    57.   }
    58.   catch (Exception ex)
    59.   {
    60.   throw ex;
    61.   }
    62.   }

     

  6. 上面前端HTML和后端的介面都處理好以后,點擊頁面上的那個去付款的按鈕,則會跳轉到Stripe的收銀臺頁面(下圖),
  7. Stripe的測驗也非常方便,官方提供了很多測驗的卡號,下面表格是我收集整理的一些,
  8. 卡號

    品牌

    CVC

    年月

    4242424242424242

    Visa

    任意3位數字

    大于當前時間的年月

    4000056655665556

    Visa (debit)

    任意3位數字

    大于當前時間的年月

    5555555555554444

    Mastercard

    任意3位數字

    大于當前時間的年月

    2223003122003222

    Mastercard (2-series)

    任意3位數字

    大于當前時間的年月

    5200828282828210

    Mastercard (debit)

    任意3位數字

    大于當前時間的年月

    5105105105105100

    Mastercard (prepaid)

    任意3位數字

    大于當前時間的年月

    378282246310005

    American Express

    任意4位數字

    大于當前時間的年月

    371449635398431

    American Express

    任意4位數字

    大于當前時間的年月

    6011111111111117

    Discover

    任意3位數字

    大于當前時間的年月

    6011000990139424

    Discover

    任意3位數字

    大于當前時間的年月

    3056930009020004

    Diners Club

    任意3位數字

    大于當前時間的年月

    36227206271667

    Diners Club (14 digit card)

    任意3位數字

    大于當前時間的年月

    3566002020360505

    JCB

    任意3位數字

    大于當前時間的年月

    6200000000000005

    UnionPay

    任意3位數字

    大于當前時間的年月

    信用卡的年月,填寫大于當前時間的年月即可,

  9. 在Stripe的支付頁面填寫好相關資訊以后點擊支付,如果沒有問題的話就會支付成功,
  10. 支付成功以后可在Stripe的后臺看到付款的金額和一些日志,日志包括事件、介面請求日志、訂單資料等等,因為是測驗的資料所以要先開啟可查看測驗資料,不然是看不到的,如何開啟看下圖,
  11. 完成上面的步驟以后,則發起支付收款簡單的流程沒有問題下,下面說下如何接受Stripe異步通知,

四:接受異步通知

  1. Stripe支持很多事件的通知,例如Session創建完成、訂單付款完成、退款等等,詳見官網說明,事件型別說明
  2. 需要一個HTTPS的介面,如果沒有證書可去阿里云等申請免費的證書,
  3. 在Stripe后臺添加一個端點(接受通知的配置)見下圖
  4. 事件型別非常多,目前我們是做跳轉支付,支付成功了通知我們,則選擇:payment_intent.succeeded  事件
  5. 拿到驗證端點的密鑰,每個端點有獨立的密鑰,見下圖
  6. 撰寫接受通知的介面代碼,官網有英文的說明代碼,下面我把代碼整理了貼出來,
    1.   /// <summary>
    2.    
    3.   /// 支付成功的異步通知介面
    4.    
    5.   /// </summary>
    6.    
    7.   /// <returns></returns>
    8.    
    9.   [HttpPost]
    10.    
    11.   public ActionResult Notify()
    12.    
    13.   {
    14.    
    15.   var json = new StreamReader(HttpContext.Request.InputStream).ReadToEndAsync().Result;
    16.    
    17.   try
    18.    
    19.   {
    20.    
    21.                   //驗證資料的來源
    22.    
    23.                   string endpointSecret = "whsec_XXXXX";//后臺創建的端點簽名密鑰
    24.    
    25.                   var stripeEvent = EventUtility.ConstructEvent(json, Request.Headers["Stripe-Signature"], endpointSecret);
    26.    
    27.    
    28.    
    29.                   //stripeEvent.Type  則是不同的事件,具體則看你配置端點的時候,這個介面設定了那些事件
    30.    
    31.                   if (stripeEvent.Type == Events.PaymentIntentSucceeded)
    32.    
    33.   {
    34.    
    35.                       //支付成功的業務處理
    36.    
    37.                       var payModel = stripeEvent.Data.Object as PaymentIntent;
    38.    
    39.    
    40.    
    41.   decimal payAmount = payModel.Amount / 100M;  //支付的金額
    42.    
    43.                       string payPaySN = payModel.Id;//支付方的唯一訂單號
    44.    
    45.                       string payCurrency = payModel.Currency;//支付的貨幣
    46.    
    47.    
    48.    
    49.                       //賬單資訊,如果創建Session的時候設定收集賬單資訊,則這里可以獲取到
    50.    
    51.                       var billing = payModel.Charges.Data[0].BillingDetails;
    52.    
    53.   string billingName = billing.Name;
    54.    
    55.   string billingEmail = billing.Email;
    56.    
    57.   string billingPhone = billing.Phone;
    58.    
    59.   string billingCity = billing.Address.City;
    60.    
    61.   string billingCountry = billing.Address.Country;
    62.    
    63.   string billingLine1 = billing.Address.Line1;
    64.    
    65.   string billingLine2 = billing.Address.Line2;
    66.    
    67.   string billingPostalCode = billing.Address.PostalCode;
    68.    
    69.   string billingState = billing.Address.State;
    70.    
    71.    
    72.    
    73.                       //發起支付創建的自定義引數,這里具體根據自己的業務來
    74.    
    75.                       string orderSN = payModel.Metadata["sn"];
    76.    
    77.   string attachmentValue = https://www.cnblogs.com/angelasp/archive/2020/12/14/payModel.Metadata["attachmentValue"];
    78.    
    79.    
    80.    
    81.                       //其它的一些業務處理,比如更新訂單狀態等等
    82.    
    83.    
    84.    
    85.    
    86.    
    87.                   }
    88.    
    89.   else if (stripeEvent.Type == Events.PaymentMethodAttached)
    90.    
    91.   {
    92.    
    93.   var paymentMethod = stripeEvent.Data.Object as PaymentMethod;
    94.    
    95.   Console.WriteLine("PaymentMethod was attached to a Customer!");
    96.    
    97.   }
    98.    
    99.   else
    100.    
    101.   {
    102.    
    103.   Console.WriteLine("Unhandled event type: {0}", stripeEvent.Type);
    104.    
    105.   }
    106.    
    107.    
    108.    
    109.   return Json(new { id = 1});
    110.    
    111.   }
    112.    
    113.   catch (StripeException)
    114.    
    115.   {
    116.   return Json(new { id =2 });
    117.    
    118.   }
    119.    
    120.   }

     

  7. 完成上面的步驟,就可以測驗發起支付了和接受支付結果了,
  8. Stripe后臺可以看到請求的日志記錄,可以針對端點發送測驗資料,這些對于除錯程式還是很方便的,具體如何使用我就不多說了,都有中文的大家用心看下就懂了,
  9. 上線的時候需要將相關配置引數換成正式環境的,

以上只是我在研究Stripe支付的一點簡單的總結,時間倉促很多細節還未深入詳細說明,以上如有不正之處還望見諒,可給我留言討論,謝謝!

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

標籤:.NET技术

上一篇:C#(九)基礎篇—靜態成員與例外處理

下一篇:F# 函式式編程之 - 習題答案

標籤雲
其他(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)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more