溫馨提示×

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

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

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

發(fā)布時(shí)間:2021-07-13 11:48:21 來源:億速云 閱讀:229 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了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)充值

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

2.某視頻網(wǎng)站開通vip

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

掃碼支付比傳統(tǒng)的跳轉(zhuǎn)網(wǎng)頁支付方便快捷。

業(yè)務(wù)流程:

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

使用步驟:

  • 收銀員在商家收銀系統(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)目

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

新建一個(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ò)誤。

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

2.掃描支付

打開手機(jī)支付寶,點(diǎn)開掃一掃,掃描二維碼完成付款。

如果使用的是沙箱環(huán)境,那么必須下載沙箱版支付寶,使用正式版支付寶掃描沙箱環(huán)境api生成的二維碼,會(huì)出現(xiàn)二維碼失效,沙箱環(huán)境后臺(tái)可以下載。沙箱環(huán)境必須使用沙箱環(huán)境賬號(hào)。

(1)掃碼之后:

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

(2)支付成功:

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

3.支付結(jié)果

通過輪詢獲得的結(jié)果:

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ASP.NET Core 2.0中如何實(shí)現(xiàn)支付寶掃碼支付”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(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