您好,登錄后才能下訂單哦!
這篇文章主要介紹了ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
掃碼支付簡(jiǎn)單介紹
掃碼支付是支付寶當(dāng)面付中的一種支付方式,當(dāng)面付包含條碼支付、掃碼支付、聲波支付。
掃碼支付,指用戶打開支付寶錢包中的“掃一掃”功能,掃描商家展示在某收銀場(chǎng)景下的二維碼并進(jìn)行支付的模式。該模式適用于線下實(shí)體店支付、面對(duì)面支付等場(chǎng)景。
使用示例:
1.某直播平臺(tái)充值
2.某視頻網(wǎng)站開通vip
掃碼支付比傳統(tǒng)的跳轉(zhuǎn)網(wǎng)頁支付方便快捷。
業(yè)務(wù)流程:
使用步驟:
收銀員在商家收銀系統(tǒng)操作生成支付寶訂單,并生成二維碼;
用戶登錄支付寶錢包,點(diǎn)擊首頁“付款-掃碼付”或直接點(diǎn)擊“掃一掃”,進(jìn)入掃一掃界面;
用戶掃收銀員提供的二維碼,核對(duì)金額,確認(rèn)支付;
用戶付款后商家收銀系統(tǒng)會(huì)拿到支付成功或者失敗的結(jié)果。
詳細(xì)介紹請(qǐng)查閱官方文檔:https://docs.open.alipay.com/194
配置
創(chuàng)建一個(gè)ASP.NET Core 2.0 MVC 項(xiàng)目
新建一個(gè)配置類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 對(duì)應(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)境模擬了開放平臺(tái)部分產(chǎn)品的主要功能和主要邏輯,在開發(fā)者應(yīng)用上線審核前,開發(fā)者可以根據(jù)自身需求,先在沙箱環(huán)境中了解、組合和調(diào)試各種開放接口,進(jìn)行開發(fā)調(diào)通工作,從而幫助開發(fā)者在應(yīng)用上線審核完成后,能更快速、更順利的進(jìn)行線上調(diào)試和驗(yàn)收工作。
如果在簽約或創(chuàng)建應(yīng)用前想要進(jìn)行集成測(cè)試,可以使用沙箱環(huán)境
配置的詳細(xì)說明,請(qǐng)看我前一篇文章:ASP.NET Core 2.0 使用支付寶PC網(wǎng)站支付
ASP.NET Core 2.0 實(shí)現(xiàn)掃碼支付
使用的生成二維碼的組件名為QRCoder,該組件引用了一個(gè)第三方實(shí)現(xiàn)的System.Drawing類庫(kù),當(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">訂單號(hào)</param> /// <returns></returns> [HttpGet] public IActionResult ScanCodeGen(string orderName, string orderAmount, string outTradeNo) { AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(orderName,orderAmount,outTradeNo); //如果需要接收掃碼支付異步通知,那么請(qǐng)把下面兩行注釋代替本行。 //推薦使用輪詢撤銷機(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即二維碼對(duì)于的鏈接 //將鏈接用二維碼工具生成二維碼打印出來,顧客可以用支付寶錢包掃碼支付。 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("生成二維碼失?。?quot;+ precreateResult.response.Body); break; case ResultEnum.UNKNOWN: Console.WriteLine("生成二維碼失敗:" + (precreateResult.response == null ? "配置或網(wǎng)絡(luò)異常,請(qǐng)檢查后重試" : "系統(tǒng)異常,請(qǐng)更新外部訂單后重新發(fā)起請(qǐng)求")); break; } MemoryStream ms = new MemoryStream(); bitmap.Save(ms, ImageFormat.Png); byte[] bytes = ms.GetBuffer(); return File(bytes, "image/png"); }
2.構(gòu)造支付請(qǐng)求數(shù)據(jù)
/// <summary> /// 構(gòu)造支付請(qǐng)求數(shù)據(jù) /// </summary> /// <param name="orderName">訂單名稱</param> /// <param name="orderAmount">訂單金額</param> /// <param name="outTradeNo">訂單編號(hào)</param> /// <returns>請(qǐng)求結(jié)果集</returns> private AlipayTradePrecreateContentBuilder BuildPrecreateContent(string orderName,string orderAmount,string outTradeNo) { //線上聯(lián)調(diào)時(shí),請(qǐng)輸入真實(shí)的外部訂單號(hào)。 if (string.IsNullOrEmpty(outTradeNo)) { outTradeNo = System.DateTime.Now.ToString("yyyyMMddHHmmss") + "0000" + (new Random()).Next(1, 10000).ToString(); } AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder(); //收款賬號(hào) builder.seller_id = Config.Uid; //訂單編號(hào) builder.out_trade_no = outTradeNo; //訂單總金額 builder.total_amount = orderAmount; //參與優(yōu)惠計(jì)算的金額 //builder.discountable_amount = ""; //不參與優(yōu)惠計(jì)算的金額 //builder.undiscountable_amount = ""; //訂單名稱 builder.subject = orderName; //自定義超時(shí)時(shí)間 builder.timeout_express = "5m"; //訂單描述 builder.body = ""; //門店編號(hào),很重要的參數(shù),可以用作之后的營(yíng)銷 builder.store_id = "test store id"; //操作員編號(hào),很重要的參數(shù),可以用作之后的營(yíng)銷 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">訂單號(hà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> /// 請(qǐng)?zhí)砑又Ц冻晒蟮奶幚? /// </summary> private void DoSuccessProcess(AlipayF2FQueryResult queryResult) { //支付成功,請(qǐng)更新相應(yīng)單據(jù) Console.WriteLine("掃碼支付成功:商戶訂單號(hào) " + queryResult.response.OutTradeNo); } /// <summary> /// 請(qǐng)?zhí)砑又Ц妒『蟮奶幚? /// </summary> private void DoFailedProcess(AlipayF2FQueryResult queryResult) { //支付失敗,請(qǐng)更新相應(yīng)單據(jù) Console.WriteLine("掃碼支付失?。荷虘粲唵翁?hào) " + queryResult.response.OutTradeNo); }
以上代碼只是作為演示,實(shí)際中使用請(qǐng)根據(jù)自己的需求來修改,比如輪詢應(yīng)該是用專門的一個(gè)或多個(gè)后臺(tái)任務(wù)線程來輪詢而不是每個(gè)訂單開一個(gè)線程,請(qǐng)注意。
Demo演示
1.生成二維碼
生成二維碼必須提供商戶訂單號(hào)、訂單金額、訂單名稱三個(gè)參數(shù),不然會(huì)出現(xiàn)錯(cuò)誤。
2.掃描支付
打開手機(jī)支付寶,點(diǎn)開掃一掃,掃描二維碼完成付款。
如果使用的是沙箱環(huán)境,那么必須下載沙箱版支付寶,使用正式版支付寶掃描沙箱環(huán)境api生成的二維碼,會(huì)出現(xiàn)二維碼失效,沙箱環(huán)境后臺(tái)可以下載。沙箱環(huán)境必須使用沙箱環(huán)境賬號(hào)。
(1)掃碼之后:
(2)支付成功:
3.支付結(jié)果
通過輪詢獲得的結(jié)果:
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
免責(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)容。