欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET Core 2.0 支付寶掃碼支付的實現(xiàn)代碼

 更新時間:2017年10月11日 10:17:11   作者:曉晨Master  
這篇文章主要介紹了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)文章

最新評論