ASP.NET Core 2.0 支付宝扫码支付的实现代码

前言

自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等。我本人是很喜欢.net的,并希望.net core能够崛起。我是从.net core 1.1的时候开始使用的,到现在的.net core 2.0。.net core 2.0比1.1有了一些改变,api也增加了很多,用着更顺手了,最近在做asp.net core 对接支付宝,百度了一下没找到关于core的支付宝支付相关资料,所以便自己研究了一下,把官方的服务端sdk修改成.net standard 2.0的(https://github.com/stulzq/Alipay.AopSdk.Core) ,并且根据官方的Demo成功做出了asp.net core 2.0的PC网站支付Demo,前面写了篇文章介绍了一下:ASP.NET Core 2.0 使用支付宝PC网站支付,大家可以看一看。今天讲的是支付宝当面付中的扫码支付。

扫码支付简单介绍

扫码支付是支付宝当面付中的一种支付方式,当面付包含条码支付、扫码支付、声波支付。

扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。

使用示例:

1.某直播平台充值

2.某视频网站开通vip

扫码支付比传统的跳转网页支付方便快捷。

业务流程:

使用步骤:

  • 收银员在商家收银系统操作生成支付宝订单,并生成二维码;
  • 用户登录支付宝钱包,点击首页“付款-扫码付”或直接点击“扫一扫”,进入扫一扫界面;
  • 用户扫收银员提供的二维码,核对金额,确认支付;
  • 用户付款后商家收银系统会拿到支付成功或者失败的结果。

详细介绍请查阅官方文档:https://docs.open.alipay.com/194

配置

创建一个ASP.NET Core 2.0 MVC 项目

新建一个配置类Config

public class Config
{
 // 应用ID,您的APPID
 public static string AppId = "";
 /// <summary>
 /// 合作商户uid
 /// </summary>
 public static string Uid = "";
 // 支付宝网关
 public static string Gatewayurl = "https://openapi.alipaydev.com/gateway.do";
 // 商户私钥,您的原始格式RSA私钥
 public static string PrivateKey = "";
 // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
 public static string AlipayPublicKey = "";
 // 签名方式
 public static string SignType = "RSA2";
 // 编码格式
 public static string CharSet = "UTF-8";
}

以下演示均是使用的支付宝沙箱环境,支付宝沙箱环境指的协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑,在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的进行线上调试和验收工作。

如果在签约或创建应用前想要进行集成测试,可以使用沙箱环境

配置的详细说明,请看我前一篇文章:ASP.NET Core 2.0 使用支付宝PC网站支付

ASP.NET Core 2.0 实现扫码支付

使用的生成二维码的组件名为QRCoder,该组件引用了一个第三方实现的System.Drawing类库,当面付SDK为Alipay.AopSdk.F2FPay,已经更新到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);
 //如果需要接收扫码支付异步通知,那么请把下面两行注释代替本行。
 //推荐使用轮询撤销机制,不推荐使用异步通知,避免单边账问题发生。
 AlipayF2FPrecreateResult precreateResult = _serviceClient.tradePrecreate(builder);
 //string notify_url = "http://10.5.21.14/Pay/Notify"; //商户接收异步通知的地址
 //AlipayF2FPrecreateResult precreateResult = serviceClient.tradePrecreate(builder, notify_url);
 //以下返回结果的处理供参考。
 //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);
  //轮询订单结果
  //根据业务需要,选择是否新起线程进行轮询
  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 ? "配置或网络异常,请检查后重试" : "系统异常,请更新外部订单后重新发起请求"));
  break;
 }
 MemoryStream ms = new MemoryStream();
 bitmap.Save(ms, ImageFormat.Png);
 byte[] bytes = ms.GetBuffer();
 return File(bytes, "image/png");
}

2.构造支付请求数据

/// <summary>
/// 构造支付请求数据
/// </summary>
/// <param name="orderName">订单名称</param>
/// <param name="orderAmount">订单金额</param>
/// <param name="outTradeNo">订单编号</param>
/// <returns>请求结果集</returns>
private AlipayTradePrecreateContentBuilder BuildPrecreateContent(string orderName,string orderAmount,string outTradeNo)
{
 //线上联调时,请输入真实的外部订单号。
 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;
 //参与优惠计算的金额
 //builder.discountable_amount = "";
 //不参与优惠计算的金额
 //builder.undiscountable_amount = "";
 //订单名称
 builder.subject = orderName;
 //自定义超时时间
 builder.timeout_express = "5m";
 //订单描述
 builder.body = "";
 //门店编号,很重要的参数,可以用作之后的营销
 builder.store_id = "test store id";
 //操作员编号,很重要的参数,可以用作之后的营销
 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;
 //系统商接入可以填此参数用作返佣
 //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.轮询支付结果

/// <summary>
/// 轮询支付结果
/// </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>
/// 请添加支付成功后的处理
/// </summary>
private void DoSuccessProcess(AlipayF2FQueryResult queryResult)
{
 //支付成功,请更新相应单据
 Console.WriteLine("扫码支付成功:商户订单号 " + queryResult.response.OutTradeNo);
}
/// <summary>
/// 请添加支付失败后的处理
/// </summary>
private void DoFailedProcess(AlipayF2FQueryResult queryResult)
{
 //支付失败,请更新相应单据
 Console.WriteLine("扫码支付失败:商户订单号 " + queryResult.response.OutTradeNo);
}

以上代码只是作为演示,实际中使用请根据自己的需求来修改,比如轮询应该是用专门的一个或多个后台任务线程来轮询而不是每个订单开一个线程,请注意。

Demo演示

1.生成二维码

生成二维码必须提供商户订单号、订单金额、订单名称三个参数,不然会出现错误。

2.扫描支付

打开手机支付宝,点开扫一扫,扫描二维码完成付款。

如果使用的是沙箱环境,那么必须下载沙箱版支付宝,使用正式版支付宝扫描沙箱环境api生成的二维码,会出现二维码失效,沙箱环境后台可以下载。沙箱环境必须使用沙箱环境账号。

(1)扫码之后:

(2)支付成功:

3.支付结果

通过轮询获得的结果:

地址集合

前一篇文章:ASP.NET Core 2.0 使用支付宝PC网站支付

当面付官方文档:https://docs.open.alipay.com/194

Nuget组件:

QRCoder(二维码生成):https://www.nuget.org/packages/QRCoder/

Alipay.AopSdk.F2FPay(当面付SDK):https://www.nuget.org/packages/Alipay.AopSdk.F2FPay/

支付宝当面付与服务端SDK:https://github.com/stulzq/Alipay.AopSdk.Core

本文Demo:https://github.com/stulzq/Alipay.Demo.PCPayment

总结

以上所述是小编给大家介绍的ASP.NET Core 2.0 支付宝扫码支付的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • ASP.NET Core 2.0 支付宝扫码支付的实现代码

    前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并希望.net core能够崛起.我是从.net core 1.1的时候开始使用的,到现在的.net core 2.0..net core 2.0比1.1有了一些改变,api也增加了很多,用着更顺手了,最近在做asp.net core 对接支付宝,百度了一下没找到关于core的支付宝支付相关资料,所以

  • java实现在SSM下使用支付宝扫码支付功能

    本文实例为大家分享了java使用支付宝扫码支付的具体代码,供大家参考,具体内容如下 准备工作 首先开通支付宝沙箱的测试账号,里面会有消费者账户和收款方账户 手机扫码下载手机端app 基础配置 所需jar包 AlipayConfig package com.alipay.config; import java.io.FileWriter; import java.io.IOException; import java.util.ResourceBundle; /* * *类名:AlipayConf

  • C#支付宝扫码支付代码完整版

    本文实例为大家分享了C#支付宝扫码支付示的具体代码,供大家参考,具体内容如下 支付宝工具类 using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web; namespace ZK_ECommerce.Shop.pay.alipay { public class AliPay { p

  • 基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.app支付,5.h5支付,6.小程序支付 我在这里用到的是native支付,就是网页生成二维码让用户扫码支付,再调用回调接口判断用户是否支付成功. 支付宝支付api也挺多的,我只使用了一些我在系统中能够用到的,现在将代码简单记录在这里,先从微信支付开始. 微信支付 先上后台代码: 传入参数(总金额一定要

  • Java中Spring Boot支付宝扫码支付及支付回调的实现代码

    前言:最近开发支付宝支付功能,总结一下做个分享 官方文档:https://opendocs.alipay.com/apis 支付宝沙箱地址: https://openhome.alipay.com/platform/appDaily.htm?tab=info 支付宝支付流程: 准备工作:获取支付宝沙箱数据(APPID,支付宝网关,RSA2秘,沙箱支付账号等) 集成SpringBoot,使用Java代码发起支付请求 支付宝收到支付请求后,返回HTML代码片段,用于前端展示二维码 扫码支付成功后,支

  • Spring使用支付宝扫码支付

    前一段一直在研究支付宝的扫码支付,不得不说,支付宝的文档写的真是一个烂(起码在下刚开始看的时候是mengbi的).文档上面的示例和demo里面的示例长的完全不一样.往往文档上面的例子很简单,而demo的代码写的很复杂,所以一开始就不知道该采用哪个代码,后来仔细看了一下demo的那些包里面的代码,发现也是调用的文档示例的那些接口,这才明白它们原来是一个东西,只不过demo对文档的接口进行了一些包装而已. 首先申请一个企业的支付宝账号,这个账号有个pid,需要向这个账号里面添加应用,每个应用都有一个

  • 浅谈ASP.NET Core 2.0 布局页面(译)

    本文介绍了ASP.NET Core 2.0 布局页面,分享给大家,具体如下: 问题 如何在ASP.NET Core 2.0项目中共享可见元素.代码块和指令? 答案 新建一个空项目,首先添加GreetingService服务和UserViewModel模型: public interface IGreetingService { string Greet(string firstname, string surname); } public class GreetingService : IGre

  • Centos7+Docker+Jenkins+ASP.NET Core 2.0自动化发布与部署的实现

    前言 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到Docker上.为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE 2

  • PHP 接入微信扫码支付总结(总结篇)

    微信扫码支付分为两种模式, 模式一比较复杂,需要公众号配置回调地址. 模式二比较简单,只需要在代码中配置回调地址就可以了. 我这次使用的是模式二. 需要配置参数, const APPID = 'xxx'; const MCHID = 'xxx'; const KEY = 'xxx'; const APPSECRET = 'xxx'; 配置公众号的appid,appsecret.以及微信支付的mchid与key. 生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果. require_onc

  • java实现微信扫码支付功能

    本文实例为大家分享了java实现微信扫码支付的具体代码,供大家参考,具体内容如下 1.maven项目的pom.xml中添加如下jar包: <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 2.编写WeWxConfig类

随机推荐