最近一個朋友的老板讓他支付寶支付呐伞,但是他沒搞過這事啊,然后找到我慎式,讓我?guī)退阋幌铝媲猓缓笳宜习褰o點小費,反正閑著也是閑著瘪吏,最近生活非常拮據(jù)啊癣防,所以就應(yīng)下來了。
在開始之前需要先去支付寶開發(fā)平臺->開發(fā)者中心,創(chuàng)建應(yīng)用掌眠、為應(yīng)用添加功能包蕾盯、設(shè)置接口加簽方式等開發(fā)信息,具體操作可以去開發(fā)者中心查看相關(guān)文檔蓝丙,由于支付寶的所有參數(shù)和設(shè)置都是由朋友那邊準(zhǔn)備好的级遭,所以我也就省去了這一步,等這些基本工作都準(zhǔn)備好后渺尘,就開始開始編程之旅了挫鸽。
其實我也沒有接入過支付寶支付,先去Nuget或者Github搜素一番鸥跟,看有沒有官方SDK或者是開源庫可以方便快捷的接入支付功能丢郊,?
結(jié)果非常好,找打了Alipay Easy SDK for .NET医咨,那么 直接通過NuGet管理面板搜索AlipayEasySDK進(jìn)行安裝枫匾,或者通過.NET CLI 執(zhí)行dotnet add package AlipayEasySDK來進(jìn)行安裝。當(dāng)然拟淮,喜歡哪種方式自行選擇干茉。SDK安裝好后,先就需要進(jìn)行支付寶的參數(shù)配置惩歉,我在appsetting.json里面新增了一個Alipay的配置節(jié)點等脂,用于配置支付寶支付的相關(guān)參數(shù)?
"Alipay": {
? ? "Protocol": "https",
? ? "GatewayHost": "openapi.alipay.com",
? ? "SignType": "RSA2",
? ? "AppId": "AppId",
? ? "NotifyUrl": "回調(diào)地址",
? ? "MerchantPrivateKey": "應(yīng)用的私鑰",
? ? "AlipayPublicKey": "支付寶公鑰"
? }
我采用的加簽?zāi)J綖楣€模式的偷懶做法,官方推薦推薦加簽?zāi)J綖楣€證書模式,?
配置文件配置好后撑蚌,我們就可以去Startup.cs初始化我們的支付寶配置了
Config alipayConfig = Configuration.GetSection("Alipay").Get<Config>();
Factory.SetOptions(alipayConfig);
是不是感覺有些so easy,現(xiàn)在就可以去調(diào)用SDK提供的API來發(fā)起支付了上遥。我們先來做一個二維碼掃碼支付
AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().PreCreate("商品名稱", "訂單id", "金額");
if (ResponseChecker.Success(response))
{
? string qrCode=response.QrCode; //二維碼支付地址
}
Factory.Payment.FaceToFace().PreCreate會給我們返回一個二維碼支付的支付,我們需要自己來生成二維碼**(可以前端生成争涌,也可以后端生成)**粉楚,我這里就是用的后端生成,這里我通過Nuget安裝了一個叫SkiaSharp.QrCode的類庫,使用起來也是非常方便的模软。
using (var generator = new QRCodeGenerator())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? var qr = generator.CreateQrCode("支付寶二維碼地址", ECCLevel.L);
? ? ? ? ? ? ? ? ? ? var info = new SKImageInfo(120, 120);
? ? ? ? ? ? ? ? ? ? using (var surface = SKSurface.Create(info))
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? var canvas = surface.Canvas;
? ? ? ? ? ? ? ? ? ? ? ? canvas.Render(qr, info.Width, info.Height);
? ? ? ? ? ? ? ? ? ? ? ? using (var image = surface.Snapshot())
? ? ? ? ? ? ? ? ? ? ? ? using (var data = image.Encode(SKEncodedImageFormat.Png, 100)) { return File(data.ToArray(), "image/jpeg"); }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
最后就可以實現(xiàn)這樣的效果伟骨。
但是這樣有個不好的地方,就是不知道實時的支付狀態(tài)燃异,所以携狭,我就準(zhǔn)備了另外一種方式,PC端跳轉(zhuǎn)到支付寶頁面支付回俐,
AlipayTradePagePayResponse response= Factory.Payment.Page().Pay("火鍋", "00000009929929", "0.01", "http://www.baidu.com");
if (ResponseChecker.Success(response))
{
? string html=response.Body;? //html代碼逛腿,嵌入前端會自動跳轉(zhuǎn)至支付寶頁面
}
Factory.Payment.FaceToFace().PreCreate("商品名稱", "訂單id", "金額","支付成功后的跳轉(zhuǎn)地址")
我們把這段html嵌入到頁面中,就可以看到自動跳轉(zhuǎn)至支付寶頁面?
此時仅颇,我們掃碼后就會看到有實時的處理狀態(tài)?
支付寶支持成功的結(jié)果有異步回調(diào)和主動查詢兩種方式单默,一般來說,會兩種方式同時使用忘瓦,因為搁廓,誰也說不準(zhǔn),異步回調(diào)的時候會不會出問題耕皮。這里我就只演示一下異步回調(diào)的方式境蜕,我先新建一個接口來接口我們的回調(diào)參數(shù)
[HttpPost("payNotify")]?
public string PayNotify()
{
? ? ? IFormCollection collection = HttpContext.Request.Form;
? ? ? ICollection<string> keys = HttpContext.Request.Form.Keys;
? ? Dictionary<string, string> alipayResult = new Dictionary<string, string>();
? ? ? ? ? ? foreach (string key in keys)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? alipayResult.Add(key, collection[key]);
? ? ? ? ? ? }
? ? ? ? }
,既然是異步回調(diào)明场,那么肯定是讓支付寶能夠訪問到我們的接口汽摹,所以,我們需要把我們的接口暴露到外網(wǎng)苦锨。這里我用的是natapp,因為它可以免費創(chuàng)建兩個通道的止,代理方式也是非常簡單的桶现,直接新建通道,然后下載對應(yīng)版本的程序,通過命令行的方式運行即可
好了备闲,這里我們就可以把我們的回調(diào)地址配置到剛才的配置文件中了http://v6thj2.natappfree.cc/api/PayCallback/payNotify,現(xiàn)在晤柄,我們來支付一分錢看看我們的勞動成果?
可以看到傍念,我們支付成功后围辙,支付寶會通知我們支付結(jié)果,在我們接到通知結(jié)果后夺鲜,要記得驗簽和支付金額皆尔,然后去處理自己的業(yè)務(wù)邏輯。好了币励,.NET5接入支付寶支付就簡單的講這么多了慷蠕。希望能對大家有所幫助。