自从微软更换了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>订单名称</param> /// <param>订单金额</param> /// <param>订单号</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.构造支付请求数据