ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼
前言
自從微軟更換了CEO以后,微軟的戰(zhàn)略方向有了相當(dāng)大的變化,不再是那么封閉,開源了許多東西,擁抱開源社區(qū),.NET實現(xiàn)跨平臺,收購xamarin并免費(fèi)提供給開發(fā)者等等。我本人是很喜歡.net的,并希望.net core能夠崛起。我是從.net core 1.1的時候開始使用的,到現(xiàn)在的.net core 2.0。.net core 2.0比1.1有了一些改變,api也增加了很多,用著更順手了,最近在做asp.net core 對接支付寶,百度了一下沒找到關(guān)于core的支付寶支付相關(guān)資料,所以便自己研究了一下,把官方的服務(wù)端sdk修改成.net standard 2.0的(https://github.com/stulzq/Alipay.AopSdk.Core) ,并且根據(jù)官方的Demo成功做出了asp.net core 2.0的PC網(wǎng)站支付Demo,前面寫了篇文章介紹了一下:ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付,大家可以看一看。今天講的是支付寶當(dāng)面付中的掃碼支付。
掃碼支付簡單介紹
掃碼支付是支付寶當(dāng)面付中的一種支付方式,當(dāng)面付包含條碼支付、掃碼支付、聲波支付。
掃碼支付,指用戶打開支付寶錢包中的“掃一掃”功能,掃描商家展示在某收銀場景下的二維碼并進(jìn)行支付的模式。該模式適用于線下實體店支付、面對面支付等場景。
使用示例:
1.某直播平臺充值
2.某視頻網(wǎng)站開通vip
掃碼支付比傳統(tǒng)的跳轉(zhuǎn)網(wǎng)頁支付方便快捷。
業(yè)務(wù)流程:
使用步驟:
- 收銀員在商家收銀系統(tǒng)操作生成支付寶訂單,并生成二維碼;
- 用戶登錄支付寶錢包,點(diǎn)擊首頁“付款-掃碼付”或直接點(diǎn)擊“掃一掃”,進(jìn)入掃一掃界面;
- 用戶掃收銀員提供的二維碼,核對金額,確認(rèn)支付;
- 用戶付款后商家收銀系統(tǒng)會拿到支付成功或者失敗的結(jié)果。
詳細(xì)介紹請查閱官方文檔:https://docs.open.alipay.com/194
配置
創(chuàng)建一個ASP.NET Core 2.0 MVC 項目
新建一個配置類Config
public class Config { // 應(yīng)用ID,您的APPID public static string AppId = ""; /// <summary> /// 合作商戶uid /// </summary> public static string Uid = ""; // 支付寶網(wǎng)關(guān) public static string Gatewayurl = "https://openapi.alipaydev.com/gateway.do"; // 商戶私鑰,您的原始格式RSA私鑰 public static string PrivateKey = ""; // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應(yīng)APPID下的支付寶公鑰。 public static string AlipayPublicKey = ""; // 簽名方式 public static string SignType = "RSA2"; // 編碼格式 public static string CharSet = "UTF-8"; }
以下演示均是使用的支付寶沙箱環(huán)境,支付寶沙箱環(huán)境指的協(xié)助開發(fā)者進(jìn)行接口功能開發(fā)及主要功能聯(lián)調(diào)的輔助環(huán)境。沙箱環(huán)境模擬了開放平臺部分產(chǎn)品的主要功能和主要邏輯,在開發(fā)者應(yīng)用上線審核前,開發(fā)者可以根據(jù)自身需求,先在沙箱環(huán)境中了解、組合和調(diào)試各種開放接口,進(jìn)行開發(fā)調(diào)通工作,從而幫助開發(fā)者在應(yīng)用上線審核完成后,能更快速、更順利的進(jìn)行線上調(diào)試和驗收工作。
如果在簽約或創(chuàng)建應(yīng)用前想要進(jìn)行集成測試,可以使用沙箱環(huán)境
配置的詳細(xì)說明,請看我前一篇文章:ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付
ASP.NET Core 2.0 實現(xiàn)掃碼支付
使用的生成二維碼的組件名為QRCoder,該組件引用了一個第三方實現(xiàn)的System.Drawing類庫,當(dāng)面付SDK為Alipay.AopSdk.F2FPay,已經(jīng)更新到github和nuget。Nuget: https://www.nuget.org/packages/Alipay.AopSdk.F2FPay/ ,github: https://github.com/stulzq/Alipay.AopSdk.Core
新建控制器FTFPayController
1.生成二維碼Action
/// <summary> /// 生成支付二維碼 /// </summary> /// <param name="orderName">訂單名稱</param> /// <param name="orderAmount">訂單金額</param> /// <param name="outTradeNo">訂單號</param> /// <returns></returns> [HttpGet] public IActionResult ScanCodeGen(string orderName, string orderAmount, string outTradeNo) { AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(orderName,orderAmount,outTradeNo); //如果需要接收掃碼支付異步通知,那么請把下面兩行注釋代替本行。 //推薦使用輪詢撤銷機(jī)制,不推薦使用異步通知,避免單邊賬問題發(fā)生。 AlipayF2FPrecreateResult precreateResult = _serviceClient.tradePrecreate(builder); //string notify_url = "http://10.5.21.14/Pay/Notify"; //商戶接收異步通知的地址 //AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url); //以下返回結(jié)果的處理供參考。 //payResponse.QrCode即二維碼對于的鏈接 //將鏈接用二維碼工具生成二維碼打印出來,顧客可以用支付寶錢包掃碼支付。 var bitmap = new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/error.png")); switch (precreateResult.Status) { case ResultEnum.SUCCESS: bitmap.Dispose(); bitmap=RenderQrCode(precreateResult.response.QrCode); //輪詢訂單結(jié)果 //根據(jù)業(yè)務(wù)需要,選擇是否新起線程進(jìn)行輪詢 ParameterizedThreadStart parStart = new ParameterizedThreadStart(LoopQuery); Thread myThread = new Thread(parStart); object o = precreateResult.response.OutTradeNo; myThread.Start(o); break; case ResultEnum.FAILED: Console.WriteLine("生成二維碼失敗:"+ precreateResult.response.Body); break; case ResultEnum.UNKNOWN: Console.WriteLine("生成二維碼失?。? + (precreateResult.response == null ? "配置或網(wǎng)絡(luò)異常,請檢查后重試" : "系統(tǒng)異常,請更新外部訂單后重新發(fā)起請求")); break; } MemoryStream ms = new MemoryStream(); bitmap.Save(ms, ImageFormat.Png); byte[] bytes = ms.GetBuffer(); return File(bytes, "image/png"); }
2.構(gòu)造支付請求數(shù)據(jù)
/// <summary> /// 構(gòu)造支付請求數(shù)據(jù) /// </summary> /// <param name="orderName">訂單名稱</param> /// <param name="orderAmount">訂單金額</param> /// <param name="outTradeNo">訂單編號</param> /// <returns>請求結(jié)果集</returns> private AlipayTradePrecreateContentBuilder BuildPrecreateContent(string orderName,string orderAmount,string outTradeNo) { //線上聯(lián)調(diào)時,請輸入真實的外部訂單號。 if (string.IsNullOrEmpty(outTradeNo)) { outTradeNo = System.DateTime.Now.ToString("yyyyMMddHHmmss") + "0000" + (new Random()).Next(1, 10000).ToString(); } AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder(); //收款賬號 builder.seller_id = Config.Uid; //訂單編號 builder.out_trade_no = outTradeNo; //訂單總金額 builder.total_amount = orderAmount; //參與優(yōu)惠計算的金額 //builder.discountable_amount = ""; //不參與優(yōu)惠計算的金額 //builder.undiscountable_amount = ""; //訂單名稱 builder.subject = orderName; //自定義超時時間 builder.timeout_express = "5m"; //訂單描述 builder.body = ""; //門店編號,很重要的參數(shù),可以用作之后的營銷 builder.store_id = "test store id"; //操作員編號,很重要的參數(shù),可以用作之后的營銷 builder.operator_id = "test"; //傳入商品信息詳情 List<GoodsInfo> gList = new List<GoodsInfo>(); GoodsInfo goods = new GoodsInfo(); goods.goods_id = "goods id"; goods.goods_name = "goods name"; goods.price = "0.01"; goods.quantity = "1"; gList.Add(goods); builder.goods_detail = gList; //系統(tǒng)商接入可以填此參數(shù)用作返傭 //ExtendParams exParam = new ExtendParams(); //exParam.sysServiceProviderId = "20880000000000"; //builder.extendParams = exParam; return builder; }
3.渲染二維碼
/// <summary> /// 渲染二維碼 /// </summary> /// <param name="str"></param> /// <returns></returns> private Bitmap RenderQrCode(string str) { QRCodeGenerator.ECCLevel eccLevel = QRCodeGenerator.ECCLevel.L; using (QRCodeGenerator qrGenerator = new QRCodeGenerator()) { using (QRCodeData qrCodeData = qrGenerator.CreateQrCode(str, eccLevel)) { using (QRCode qrCode = new QRCode(qrCodeData)) { Bitmap bp= qrCode.GetGraphic(20, Color.Black, Color.White, new Bitmap(Path.Combine(_hostingEnvironment.WebRootPath, "images/alipay.png")), 15); return bp; } } } }
4.輪詢支付結(jié)果
/// <summary> /// 輪詢支付結(jié)果 /// </summary> /// <param name="o">訂單號</param> public void LoopQuery(object o) { AlipayF2FQueryResult queryResult = new AlipayF2FQueryResult(); int count = 100; int interval = 10000; string outTradeNo = o.ToString(); for (int i = 1; i <= count; i++) { Thread.Sleep(interval); queryResult = _serviceClient.tradeQuery(outTradeNo); if (queryResult?.Status == ResultEnum.SUCCESS) { DoSuccessProcess(queryResult); return; } } DoFailedProcess(queryResult); } /// <summary> /// 請?zhí)砑又Ц冻晒蟮奶幚? /// </summary> private void DoSuccessProcess(AlipayF2FQueryResult queryResult) { //支付成功,請更新相應(yīng)單據(jù) Console.WriteLine("掃碼支付成功:商戶訂單號 " + queryResult.response.OutTradeNo); } /// <summary> /// 請?zhí)砑又Ц妒『蟮奶幚? /// </summary> private void DoFailedProcess(AlipayF2FQueryResult queryResult) { //支付失敗,請更新相應(yīng)單據(jù) Console.WriteLine("掃碼支付失?。荷虘粲唵翁?" + queryResult.response.OutTradeNo); }
以上代碼只是作為演示,實際中使用請根據(jù)自己的需求來修改,比如輪詢應(yīng)該是用專門的一個或多個后臺任務(wù)線程來輪詢而不是每個訂單開一個線程,請注意。
Demo演示
1.生成二維碼
生成二維碼必須提供商戶訂單號、訂單金額、訂單名稱三個參數(shù),不然會出現(xiàn)錯誤。
2.掃描支付
打開手機(jī)支付寶,點(diǎn)開掃一掃,掃描二維碼完成付款。
如果使用的是沙箱環(huán)境,那么必須下載沙箱版支付寶,使用正式版支付寶掃描沙箱環(huán)境api生成的二維碼,會出現(xiàn)二維碼失效,沙箱環(huán)境后臺可以下載。沙箱環(huán)境必須使用沙箱環(huán)境賬號。
(1)掃碼之后:
(2)支付成功:
3.支付結(jié)果
通過輪詢獲得的結(jié)果:
地址集合
前一篇文章:ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付
當(dāng)面付官方文檔:https://docs.open.alipay.com/194
Nuget組件:
QRCoder(二維碼生成):https://www.nuget.org/packages/QRCoder/
Alipay.AopSdk.F2FPay(當(dāng)面付SDK):https://www.nuget.org/packages/Alipay.AopSdk.F2FPay/
支付寶當(dāng)面付與服務(wù)端SDK:https://github.com/stulzq/Alipay.AopSdk.Core
本文Demo:https://github.com/stulzq/Alipay.Demo.PCPayment
總結(jié)
以上所述是小編給大家介紹的ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
關(guān)于HttpHandler與HttpModule的理解和應(yīng)用方法
本篇文章小編將為大家介紹,關(guān)于HttpHandler與HttpModule的理解和應(yīng)用方法,有需要的朋友可以參考一下2013-04-04使用ASP.NET MVC引擎開發(fā)插件系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了使用ASP.NET MVC引擎開發(fā)插件系統(tǒng)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05.NET中OpenFileDialog使用線程報錯的解決方法
這篇文章主要為大家詳細(xì)介紹了.NET中OpenFileDialog使用線程報錯的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01SQL Server數(shù)據(jù)庫連接 Web.config如何配置
以下的文章主要描述的是Web.config正確配置SQL Server數(shù)據(jù)庫連接的實際擦步驟。我們以圖文結(jié)合的方式對其有個更好的說明,需要的朋友可以參考下2015-10-10.Net?core?Blazor+自定義日志提供器實現(xiàn)實時日志查看器的原理解析
我們經(jīng)常遠(yuǎn)程連接服務(wù)器去查看日志,比較麻煩,如果直接訪問項目的某個頁面就能實時查看日志就比較奈斯了,結(jié)合blazor實現(xiàn)了基本效果,這篇文章主要介紹了.Net?core?Blazor+自定義日志提供器實現(xiàn)實時日志查看器,需要的朋友可以參考下2022-10-10.NET程序性能監(jiān)控系統(tǒng)Elastic?AMP的使用方法
這篇文章介紹了.NET程序性能監(jiān)控系統(tǒng)Elastic?AMP的使用方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11