【轉載】ASP.NET Core Web 支付功能接入 支付寶-電腦網頁支付篇

来源:https://www.cnblogs.com/Agui520/archive/2018/08/06/9428558.html
-Advertisement-
Play Games

轉自:http://www.cnblogs.com/essenroc/p/8627775.html 這篇文章將介紹ASP.NET Core中使用 開源項目 Payment,實現接入支付寶-電腦網頁支付介面及同步跳轉及非同步通知功能。 開發環境:Win 10 x64、VS2017 15.6.4、.NET ...


轉自:http://www.cnblogs.com/essenroc/p/8627775.html

這篇文章將介紹ASP.NET Core中使用 開源項目 Payment,實現接入支付寶-電腦網頁支付介面及同步跳轉及非同步通知功能。

開發環境:Win 10 x64、VS2017 15.6.4、.NET Core SDK 2.1.101、.NET Core Runtime 2.0.6

1.新建"ASP.NET Core Web 應用程式"項目,我將它命名為AlipaySample.

2. 引入安裝Nuget包 "Essensoft.AspNetCore.Payment.Alipay". 目前(2018/03/29)版本為 1.2.1

3. 在Startup.cs文件內 添加依賴註入、設置參數(螞蟻金服開放平臺 - 賬戶管理 - 密鑰管理 - 開放平臺密鑰)

代碼:

複製代碼 複製代碼
 1         public void ConfigureServices(IServiceCollection services)
 2         {
 3             services.AddMvc();
 4 
 5             // 添加支付寶客戶端依賴註入
 6             services.AddAlipay();
 7 
 8             // 可在添加依賴註入時設置參數 一般設置 AppId、RsaPrivateKey、RsaPublicKey,其餘預設即可.
 9             // 如:
10             //services.AddAlipay(opt =>
11             //{
12             //    //此處為螞蟻金服開放平臺上創建的APPID,而非老版本的商戶號
13             //    opt.AppId = "";
14 
15             //    // 這裡的公私鑰 預設均為支付寶官方推薦使用的RSAWithSHA256.
16             //    // 商戶私鑰
17             //    opt.RsaPrivateKey = "";
18             //    // 支付寶公鑰
19             //    opt.RsaPublicKey = "";
20             //});
21 
22             // 具體參數見 AlipayOptions
23 
24             // 註冊配置實例
25             services.Configure<AlipayOptions>(Configuration.GetSection("Alipay"));
26 
27             // 兩種方式設置註冊配置實例參數
28 
29             // 1.預設配置文件(開發環境/正式環境):
30             // appsettings.Development.json / appsettings.json
31 
32             // 2.用戶機密配置文件(VS2017 15.6.4 中,右鍵項目 => 管理用戶機密):
33             // Windows: % APPDATA %\microsoft\UserSecrets\< userSecretsId >\secrets.json
34             // Linux: ~/.microsoft / usersecrets /< userSecretsId >/ secrets.json
35             // macOS: ~/.microsoft / usersecrets /< userSecretsId >/ secrets.json
36 
37             // 配置文件內容如下('...'為省略的項目其他配置內容,若有的情況下 -_-!):
38 
39             //{
40             // ...
41             // ...
42             //
43             //  "Alipay": {
44             //    "AppId": "",
45             //    "RsaPublicKey": "",
46             //    "RsaPrivateKey": ""
47             //  }
48             //}
49         }
複製代碼 複製代碼

4. 添加一個控制器, 我將其命名為 AlipayController.cs

代碼:

複製代碼 複製代碼
  1 using Essensoft.AspNetCore.Payment.Alipay;
  2 using Essensoft.AspNetCore.Payment.Alipay.Domain;
  3 using Essensoft.AspNetCore.Payment.Alipay.Notify;
  4 using Essensoft.AspNetCore.Payment.Alipay.Request;
  5 using Microsoft.AspNetCore.Mvc;
  6 using System.Threading.Tasks;
  7 
  8 namespace AlipaySample.Controllers
  9 {
 10     public class AlipayController : Controller
 11     {
 12         // 支付寶請求客戶端(用於處理請求與其響應)
 13         private readonly AlipayClient _client = null;
 14 
 15         // 支付寶通知客戶端(用於解析非同步通知或同步跳轉)
 16         private readonly AlipayNotifyClient _notifyClient = null;
 17 
 18         // 賦值依賴註入對象
 19         public AlipayController(AlipayClient client, AlipayNotifyClient notifyClient)
 20         {
 21             _client = client;
 22             _notifyClient = notifyClient;
 23         }
 24 
 25         [HttpPost]
 26         public async Task<IActionResult> PagePay(string out_trade_no, string subject, string total_amount, string body, string product_code, string notify_url, string return_url)
 27         {
 28             // 組裝模型
 29             var model = new AlipayTradePagePayModel()
 30             {
 31                 Body = body,
 32                 Subject = subject,
 33                 TotalAmount = total_amount,
 34                 OutTradeNo = out_trade_no,
 35                 ProductCode = product_code,
 36             };
 37 
 38             var req = new AlipayTradePagePayRequest();
 39 
 40             // 設置請求參數
 41             req.SetBizModel(model);
 42 
 43             // 設置非同步通知URL
 44             req.SetNotifyUrl(notify_url);
 45 
 46             // 設置同步跳轉URL
 47             req.SetReturnUrl(return_url);
 48 
 49             // 頁面請求處理 傳入 'GET' 返回的 response.Body 為 URL, 'POST' 返回的 response.Body 為 HTML.
 50             var response = await _client.PageExecuteAsync(req, null, "GET");
 51 
 52             // 重定向到支付寶電腦網頁支付頁面.
 53             return Redirect(response.Body);
 54         }
 55 
 56         /// <summary>
 57         /// 電腦網頁支付-同步跳轉
 58         /// 常用於展示訂單支付狀態頁,建議在非同步通知統一做業務處理,而不是在此處.
 59         /// </summary>
 60         /// <returns></returns>
 61         [HttpGet]
 62         public async Task<IActionResult> PagePayReturn()
 63         {
 64             try
 65             {
 66                 // 以 AlipayTradePagePayReturnResponse 類型 解析
 67                 var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayReturnResponse>(Request);
 68                 return Content("成功:" + notify.OutTradeNo);
 69             }
 70             catch
 71             {
 72                 return Content("參數異常/驗簽失敗");
 73             }
 74         }
 75 
 76         /// <summary>
 77         /// 電腦網頁支付-非同步通知
 78         /// 常用於訂單業務處理
 79         /// </summary>
 80         /// <returns></returns>
 81         [HttpPost]
 82         public async Task<IActionResult> PagePayNotify()
 83         {
 84             try
 85             {
 86                 // 以 AlipayTradePagePayNotifyResponse 類型 解析
 87                 var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayNotifyResponse>(Request);
 88                 if ("TRADE_SUCCESS" == notify.TradeStatus) // 訂單是否交易完成
 89                 {
 90                     // 業務代碼
 91                     // ...
 92                     // ...
 93 
 94                     //返回給支付寶成功內容,停止繼續通知
 95                     return Content("success", "text/plain");
 96                 }
 97                 // 訂單其他狀態均返回給支付寶空內容.
 98                 return NoContent();
 99             }
100             catch
101             {
102                 // 參數異常/驗簽失敗均返回給支付寶空內容.
103                 return NoContent();
104             }
105         }
106     }
107 }
複製代碼 複製代碼

 5. 修改 Views/Home/Index 頁面,用於網站提交支付請求.

代碼:

複製代碼 複製代碼
 1 @{
 2     ViewData["Title"] = "Home Page";
 3 }
 4 
 5 <div style="padding:24px 0">
 6     <h3>支付寶 電腦網站支付 - <a href="https://docs.open.alipay.com/270/alipay.trade.page.pay" target="_blank">API文檔</a></h3>
 7     <hr />
 8     <form asp-controller="Alipay" asp-action="PagePay" target="_blank">
 9         <div class="form-group">
10             <label>body:</label>
11             <input type="text" class="form-control" name="body" value="支付寶網站支付測試詳情">
12         </div>
13         <div class="form-group">
14             <label>subject:</label>
15             <input type="text" class="form-control" name="subject" value="支付寶網站支付測試">
16         </div>
17         <div class="form-group">
18             <label>total_amount:</label>
19             <input type="text" class="form-control" name="total_amount" value="0.01">
20         </div>
21         <div class="form-group">
22             <label>out_trade_no:</label>
23             <input type="text" class="form-control" name="out_trade_no" value="@DateTime.Now.ToString("yyyyMMddHHmmssfff")">
24         </div>
25         <div class="form-group">
26             <label>product_code:</label>
27             <input type="text" class="form-control" name="product_code" value="FAST_INSTANT_TRADE_PAY">
28         </div>
29         <div class="form-group">
30             <label>notify_url(通知Url需外網環境可訪問):</label>
31             <input type="text" class="form-control" name="notify_url" value="http://xxx.com/alipay/pagepaynotify">
32         </div>
33         <div class="form-group">
34             <label>return_url:</label>
35             <input type="text" class="form-control" name="return_url" value="http://xxx.com/alipay/pagepayreturn">
36         </div>
37         <button type="submit" class="btn btn-primary">提交</button>
38     </form>
39 </div>
複製代碼 複製代碼

 實現頁面如下:

本篇文章到此結束,具體效果可自行測試。感謝各位觀看。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET Core TDD 前傳: 編寫易於測試的代碼 -- 單一職責 ...
  • Asp.NET中的路由配置,首先要提到的幾個相關類型,Route ,RouteBase,RouteData,RouteTable,RouteCollection 這幾個。下麵我一次回憶一下,有需要的朋友也可以作為參考,如果有問題也可以在留言區指出來,高手路過也請提出一些寶貴的意見。 ①Route 這 ...
  • 1、ini文件是什麼? 見百度百科:https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=aladdin 2、C#語言實現ini文件的讀寫操作 此博文為原創,轉載請註明出處!!!!! ...
  • 一、問題 ①ASP.NET項目,開發工具Visual Studio ②在IIS上發佈之後,網頁控制台報錯,某某文件找不到,但是在伺服器文件夾中看明明有那個文件 二、解決方法 ①》》打開IIS,點擊你的網站,在右邊視窗搜索找到MIME類型 》》右擊上方,新建MIME類型 》》如,字體woff > 文件 ...
  • 【1】註冊表是什麼? 百度百科 https://baike.baidu.com/item/%E6%B3%A8%E5%86%8C%E8%A1%A8/101856?fr=aladdin 【2】怎麼打開註冊表? Windows+R >>>>>> regedit 【3】C# 源碼 此博文為原創,轉載請註明出 ...
  • 第一種:利用MODEL拼成要輸出JSON的對象。再用JSON.NET轉成JSON輸出到前端(這種常用,就不舉例了。) 第二種:利用table拼成JSON數據格式,再用JSON.NET轉成JSON輸出到前端: dt = new DataTable(); dt.Columns.Add(new DataC ...
  • c#編寫的資料庫自動備份,windows服務,帶配置,帶服務,壓縮備份,定期清理備份等功能於一身 ...
  • 1. 簡介 "C 併發編程經典實例" 是一本關於使用C 進行併發編程的入門參考書,使用“問題 解決方案 討論”的模式講解了以下這些概念: 面向非同步編程的async和await 使用TPL(任務並行庫) 創建數據流管道的TPL Dataflow庫 基於LINQ的Reactive Extensions ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...