溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

發(fā)布時(shí)間:2021-07-13 12:37:13 來(lái)源:億速云 閱讀:214 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

前言

最近在使用ASP.NET Core來(lái)進(jìn)行開(kāi)發(fā),剛好有個(gè)接入支付寶支付的需求,百度了一下沒(méi)找到相關(guān)的資料,看了官方的SDK以及Demo都還是.NET Framework的,所以就先根據(jù)官方SDK的源碼,用.NET Standard 2.0 實(shí)現(xiàn)了支付寶服務(wù)端SDK,Alipay.AopSdk.Core(github:https://github.com/stulzq/Alipay.AopSdk.Core) ,支持.NET CORE 2.0。為了使用方便,已上傳至Nuget可以直接使用。

支付寶有比較多的支付產(chǎn)品,比如當(dāng)面付、APP支付、手機(jī)網(wǎng)站支付、電腦網(wǎng)站支付等,本次講的是電腦網(wǎng)站支付。

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

如果你沒(méi)有時(shí)間閱讀文章,可以直接從github獲取Demo原來(lái)進(jìn)行查看,非常簡(jiǎn)單。github: https://github.com/stulzq/Alipay.Demo.PCPayment

創(chuàng)建項(xiàng)目

新建一個(gè)ASP.NET Core 2.0 MVC項(xiàng)目

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

配置

由于我在開(kāi)發(fā)的時(shí)候支付接口并沒(méi)有申請(qǐng)下來(lái),所以使用的是支付寶沙箱環(huán)境來(lái)進(jìn)行開(kāi)發(fā)的。

支付寶沙箱環(huán)境介紹:螞蟻沙箱環(huán)境(Beta)是協(xié)助開(kāi)發(fā)者進(jìn)行接口功能開(kāi)發(fā)及主要功能聯(lián)調(diào)的輔助環(huán)境。沙箱環(huán)境模擬了開(kāi)放平臺(tái)部分產(chǎn)品的主要功能和主要邏輯,在開(kāi)發(fā)者應(yīng)用上線審核前,開(kāi)發(fā)者可以根據(jù)自身需求,先在沙箱環(huán)境中了解、組合和調(diào)試各種開(kāi)放接口,進(jìn)行開(kāi)發(fā)調(diào)通工作,從而幫助開(kāi)發(fā)者在應(yīng)用上線審核完成后,能更快速、更順利的進(jìn)行線上調(diào)試和驗(yàn)收工作。
如果在簽約或創(chuàng)建應(yīng)用前想要進(jìn)行集成測(cè)試,可以使用沙箱環(huán)境。

沙箱環(huán)境支持使用個(gè)人賬號(hào)或企業(yè)賬號(hào)登陸。

沙箱環(huán)境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

1.生成密鑰

下載支付寶官方提供的密鑰生成工具來(lái)進(jìn)行生成,詳細(xì)介紹:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=105971&docType=1

2.設(shè)置應(yīng)用公鑰

我們生成密鑰之后,需要到支付寶后臺(tái)設(shè)置應(yīng)用公鑰,就是我們生成的公鑰。

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

設(shè)置之后,支付寶會(huì)給我們一個(gè)支付寶公鑰,保存這個(gè)支付寶公鑰

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

這個(gè)支付寶公鑰和我們自己生成的公鑰是不一樣的,我們?cè)谂渲肧DK時(shí)用的公鑰就是支付寶公鑰

3.配置SDK

新建一個(gè)Config類(lèi),在里面存儲(chǔ)我們的配置。

public class Config{ 
// 應(yīng)用ID,您的APPID 
public static string AppId = ""; 
// 支付寶網(wǎng)關(guān) 
public static string Gatewayurl = ""; 
// 商戶私鑰,您的原始格式RSA私鑰 
public static string PrivateKey = ""; 
// 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對(duì)應(yīng)APPID下的支付寶公鑰。 
public static string AlipayPublicKey = ""; 
 // 簽名方式 
public static string SignType = "RSA2"; 
// 編碼格式 
public static string CharSet = "UTF-8";}

應(yīng)用ID和支付寶網(wǎng)關(guān)都可以在支付寶后臺(tái)查看。

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

商戶私鑰即我們自己生成的私鑰,公鑰就是支付寶公鑰這里一定要注意,別用錯(cuò)了。這里的公鑰私鑰直接填寫(xiě)字符串即可。

簽名方式推薦使用RSA2,使用RSA2,支付寶會(huì)用SHA256withRsa算法進(jìn)行接口調(diào)用時(shí)的驗(yàn)簽(不限制密鑰長(zhǎng)度)。

編碼格式,如果我們是直接配置的字符串(公鑰、私鑰),那么就是我們代碼的編碼,如果使用的是文件(公鑰、私鑰),那么就是文件的編碼。

完成配置如下:

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

添加SDK

官方SDK的源碼(.NET Framework),用.NET Standard 2.0 實(shí)現(xiàn)的支付寶服務(wù)端SDK,Alipay.AopSdk.Core(github:https://github.com/stulzq/Alipay.AopSdk.Core) ,支持.NET Core 2.0。
通過(guò)Nuget安裝:Install-Package Alipay.AopSdk.Core

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

支付

添加一個(gè)控制器 PayController

/// 發(fā)起支付請(qǐng)求/// </summary>/// <param name="tradeno">外部訂單號(hào),商戶網(wǎng)站訂單系統(tǒng)中唯一的訂單號(hào)</param>/// 
<param name="subject">訂單名稱(chēng)</param>/// <param name="totalAmout">付款金額</param>/// 
<param name="itemBody">商品描述</param>/// <returns></returns>[HttpPost]
public void PayRequest(string tradeno,string subject,string totalAmout,string itemBody){ 
DefaultAopClient 
client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0", Config.SignType, Config.AlipayPublicKey, Config.CharSet, false); // 組裝業(yè)務(wù)參數(shù)model AlipayTradePagePayModel model = new AlipayTradePagePayModel(); 
model.Body = itemBody; 
model.Subject = subject; 
model.TotalAmount = totalAmout; 
model.OutTradeNo = tradeno; 
model.ProductCode = "FAST_INSTANT_TRADE_PAY"; AlipayTradePagePayRequest 
request = new AlipayTradePagePayRequest(); 
// 設(shè)置同步回調(diào)地址 
request.SetReturnUrl("http://localhost:5000/Pay/Callback"); 
 // 設(shè)置異步通知接收地址 
request.SetNotifyUrl(""); 
// 將業(yè)務(wù)model載入到request 
request.SetBizModel(model); 
var response = client.SdkExecute(request); Console.WriteLine($"訂單支付發(fā)起成功,訂單號(hào):{tradeno}"); 
//跳轉(zhuǎn)支付寶支付 
Response.Redirect(Config.Gatewayurl + "?" + response.Body);}

運(yùn)行:

圖1

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

圖2

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

圖3

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

支付異步回調(diào)通知

支付寶同步回調(diào)通知(支付成功后跳轉(zhuǎn)到商戶網(wǎng)站),是不可靠的,所以這里必須使用異步通知來(lái)獲取支付結(jié)果,異步通知即支付寶主動(dòng)請(qǐng)求我們提供的地址,我們根據(jù)請(qǐng)求數(shù)據(jù)來(lái)校驗(yàn),獲取支付結(jié)果。

/// <summary>/// 支付異步回調(diào)通知 需配置域名 因?yàn)槭侵Ц秾氈鲃?dòng)post請(qǐng)求這個(gè)action 所以要通過(guò)域名訪問(wèn)或者公網(wǎng)ip/// </summary>public async void Notify(){ 
/* 實(shí)際驗(yàn)證過(guò)程建議商戶添加以下校驗(yàn)。 
 1、商戶需要驗(yàn)證該通知數(shù)據(jù)中的out_trade_no是否為商戶系統(tǒng)中創(chuàng)建的訂單號(hào), 
 2、判斷total_amount是否確實(shí)為該訂單的實(shí)際金額(即商戶訂單創(chuàng)建時(shí)的金額), 
3、校驗(yàn)通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據(jù)的對(duì)應(yīng)的操作方(有的時(shí)候,一個(gè)商戶可能有多個(gè)seller_id/seller_email) 
 4、驗(yàn)證app_id是否為該商戶本身。 */ Dictionary<string, string> sArray = GetRequestPost(); 
if (sArray.Count != 0) 
 { 
bool flag = AlipaySignature.RSACheckV1(sArray, Config.AlipayPublicKey,Config.CharSet, Config.SignType, false); 
if (flag) 
{  
//交易狀態(tài)  
//判斷該筆訂單是否在商戶網(wǎng)站中已經(jīng)做過(guò)處理  
 //如果沒(méi)有做過(guò)處理,根據(jù)訂單號(hào)(out_trade_no)在商戶網(wǎng)站的訂單系統(tǒng)中查到該筆訂單的詳細(xì),并執(zhí)行商戶的業(yè)務(wù)程序  
//請(qǐng)務(wù)必判斷請(qǐng)求時(shí)的total_amount與通知時(shí)獲取的total_fee為一致的  
//如果有做過(guò)處理,不執(zhí)行商戶的業(yè)務(wù)程序  
 //注意:  
//退款日期超過(guò)可退款期限后(如三個(gè)月可退款),支付寶系統(tǒng)發(fā)送該交易狀態(tài)通知  
Console.WriteLine(Request.Form["trade_status"]);  
await Response.WriteAsync("success"); 
 } 
else 
{  
await Response.WriteAsync("fail"); 
} 
 }}

同步回調(diào)

同步回調(diào)即支付成功跳轉(zhuǎn)回商戶網(wǎng)站

運(yùn)行:

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

/// <summary>/// 支付同步回調(diào)/// </summary>[HttpGet]public IActionResult Callback(){ /* 實(shí)際驗(yàn)證過(guò)程建議商戶添加以下校驗(yàn)。 
 1、商戶需要驗(yàn)證該通知數(shù)據(jù)中的out_trade_no是否為商戶系統(tǒng)中創(chuàng)建的訂單號(hào), 
2、判斷total_amount是否確實(shí)為該訂單的實(shí)際金額(即商戶訂單創(chuàng)建時(shí)的金額), 
3、校驗(yàn)通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據(jù)的對(duì)應(yīng)的操作方(有的時(shí)候,一個(gè)商戶可能有多個(gè)seller_id/seller_email) 
 4、驗(yàn)證app_id是否為該商戶本身。 */ Dictionary<string, string> sArray = GetRequestGet(); if (sArray.Count != 0) 
{ 
 bool flag = AlipaySignature.RSACheckV1(sArray, Config.AlipayPublicKey, Config.CharSet, Config.SignType, false); 
if (flag) 
{  
Console.WriteLine($"同步驗(yàn)證通過(guò),訂單號(hào):{sArray["out_trade_no"]}");  
 ViewData["PayResult"] = "同步驗(yàn)證通過(guò)"; } else 
{  
Console.WriteLine($"同步驗(yàn)證失敗,訂單號(hào):{sArray["out_trade_no"]}");  
 ViewData["PayResult"] = "同步驗(yàn)證失敗"; 
 } 
} return View();
}

訂單查詢

查詢訂單當(dāng)前狀態(tài):已付款、未付款等等。

運(yùn)行:

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

訂單退款

[HttpPost]public JsonResult Query(string tradeno, string alipayTradeNo){ 
 DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0", Config.SignType, Config.AlipayPublicKey, Config.CharSet, false); 
AlipayTradeQueryModel model = new AlipayTradeQueryModel(); 
 model.OutTradeNo = tradeno; 
model.TradeNo = alipayTradeNo; 
 AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); 
request.SetBizModel(model); 
var response = client.Execute(request); 
return Json(response.Body);}

退回該訂單金額。

運(yùn)行:

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

/// <summary>
/// 訂單退款
/// </summary>/// <param name="tradeno">商戶訂單號(hào)</param>/// <param name="alipayTradeNo">支付寶交易號(hào)</param>/// <param name="refundAmount">退款金額</param>/// <param name="refundReason">退款原因</param>/// <param name="refundNo">退款單號(hào)</param>/// <returns></returns>[HttpPost]public JsonResult Refund(string tradeno,string alipayTradeNo,string refundAmount,string refundReason,string refundNo){ DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0", Config.SignType, Config.AlipayPublicKey, Config.CharSet, false); 
 AlipayTradeRefundModel model = new AlipayTradeRefundModel(); model.OutTradeNo = tradeno; model.TradeNo = alipayTradeNo; 
model.RefundAmount = refundAmount; model.RefundReason = refundReason; model.OutRequestNo = refundNo; AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); 
request.SetBizModel(model); 
 var response = client.Execute(request); return Json(response.Body);}

退款查詢

查詢退款信息。

運(yùn)行:

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

/// <summary>
/// 退款查詢
/// </summary>
/// <param name="tradeno">商戶訂單號(hào)</param>
/// <param name="alipayTradeNo">支付寶交易號(hào)</param>
/// <param name="refundNo">退款單號(hào)</param>
/// <returns></returns>
[HttpPost]
public JsonResult RefundQuery(string tradeno,string alipayTradeNo,string refundNo)
{
 DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",
  Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);
 if (string.IsNullOrEmpty(refundNo))
 {
  refundNo = tradeno;
 }
 AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
 model.OutTradeNo = tradeno;
 model.TradeNo = alipayTradeNo;
 model.OutRequestNo = refundNo;
 AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
 request.SetBizModel(model);
 var response = client.Execute(request);
 return Json(response.Body);
}

訂單關(guān)閉

對(duì)一定時(shí)間以后沒(méi)有進(jìn)行付款的訂單進(jìn)行關(guān)閉,訂單狀態(tài)需為:待付款,已完成支付的訂單無(wú)法關(guān)閉。

運(yùn)行:

ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能

/// <summary>
/// 關(guān)閉訂單
/// </summary>
/// <param name="tradeno">商戶訂單號(hào)</param>
/// <param name="alipayTradeNo">支付寶交易號(hào)</param>
/// <returns></returns>
[HttpPost]
public JsonResult OrderClose(string tradeno, string alipayTradeNo)
{
 DefaultAopClient client = new DefaultAopClient(Config.Gatewayurl, Config.AppId, Config.PrivateKey, "json", "2.0",
  Config.SignType, Config.AlipayPublicKey, Config.CharSet, false);
 AlipayTradeCloseModel model = new AlipayTradeCloseModel();
 model.OutTradeNo = tradeno;
 model.TradeNo = alipayTradeNo;
 AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
 request.SetBizModel(model);
 var response = client.Execute(request);
 return Json(response.Body);
}

地址集合支付寶API文檔支付寶沙箱環(huán)境支付寶密鑰生成工具支付寶服務(wù)端SDK源碼支付寶服務(wù)端SDK Nuget

以上是“ASP.NET Core 2.0怎么使用支付寶實(shí)現(xiàn)PC網(wǎng)站支付功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI