UnionPay-银联支付-netcore(二)

前言

最近公司要求支持银联支付,首先就会去参考官方api文档,银联支付官方文档,看完后发现是.net版本的示例文档,版无.netcore版本,于是网上搜索了一下netcore版本,发现讲解的都不全或者没有netcore版本的示例,于是决定将netcore版本的对接过程记录下来

步骤

此示例未银联支付在线网关支付模式

引用github封装好的SDK处理银联支付

Nuget安装SDK

Install-Package Essensoft.AspNetCore.Payment.UnionPay -Version 2.4.3

appsettings.json 配置项

  "UnionPay": {"MerId": "ab7290058192dd0","SignCert": "certs/acp_test_sign.pfx","SignCertPassword": "000000","EncryptCert": "certs/acp_test_enc.cer","MiddleCert": "certs/acp_test_middle.cer","RootCert": "certs/acp_test_root.cer","TestMode": true,"NotifyUrl": "http://www.xxx.com/api/PayNotify/UnionPayNotify"},

新增配置实体类

using Essensoft.AspNetCore.Payment.UnionPay;
public class UnionPayOptionsExtend: UnionPayOptions
{/// <summary>/// 回调地址/// </summary>public string NotifyUrl { get; set; }
}

新增支付实体类

    /// <summary>/// 银联支付/// </summary>public class UnionPayModel{/// <summary>/// 商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则/// </summary>[Required][Display(Name = "orderId")]public string OrderId { get; set; }/// <summary>/// 商户发送交易时间,格式:yyyyMMddHHmmss/// </summary>[Required][Display(Name = "txnTime")]public string TxnTime { get; set; }/// <summary>/// 交易金额,单位:分/// </summary>[Required][Display(Name = "txnAmt")]public string TxnAmt { get; set; }//[Required]//[Display(Name = "currencyCode")]//public string CurrencyCode { get; set; }/// <summary> /// 订单超时时间。/// 超过此时间后,除网银交易外,其他交易银联系统会拒绝受理,提示超时。 跳转银行网银交易如果超时后交易成功,会自动退款,大约5个工作日金额返还到持卡人账户。/// 此时间建议取支付时的北京时间加15分钟。/// 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。/// 支付超时时间, 格式:yyyyMMddHHmmss/// </summary>[Display(Name = "payTimeout")]public string PayTimeout { get; set; }/// <summary>/// 前台通知url,点击返回商户跳转/// </summary>[Display(Name = "frontUrl")]public string FrontUrl { get; set; }/ <summary>/ 异步通知地址/ </summary>//[Required]//[Display(Name = "backUrl")]//public string BackUrl { get; set; }/// <summary>/// 保留域/// </summary>[JsonProperty("reserved")]public string Reserved { get; set; }}/// 查询实体public class UnionPayQueryModel{/// <summary>/// 订单号/// </summary>[Required][Display(Name = "orderId")]public string OrderId { get; set; }/// <summary>/// 订单交易时间 格式:yyyyMMddHHmmss/// </summary>public string TxnTime { get; set; }}

新增UnionPaymentService

using Essensoft.AspNetCore.Payment.UnionPay;
using Essensoft.AspNetCore.Payment.UnionPay.Request;
using Essensoft.AspNetCore.Payment.UnionPay.Response;
using Sup.Essensoft.Service.Options;
using Sup.Essensoft.Service.UnionPay.Model;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
public class UnionPaymentService: IUnionPaymentService
{private readonly IUnionPayClient _client;public IOptions<UnionPayOptionsExtend> _optionsAccessor { get; set; }private readonly ILogger _logger;private readonly ITracer _tracer;public UnionPaymentService(IOptions<UnionPayOptionsExtend> optionsAccessor,ILogger<UnionPaymentService> logger,IUnionPayClient client,ITracer tracer){_optionsAccessor = optionsAccessor;_logger = logger;_client = client;_tracer = tracer;}/// <summary>/// 银联网关支付/// </summary>/// <param name="model"></param>/// <returns></returns>public async Task<UnionPayNullResponse> UnionPayGatewayPay(UnionPayModel model){IScope spanScope = null;try{spanScope = _tracer.BuildSpan("UnionPayGatewayPay").WithTag(Tags.Component, nameof(UnionPaymentService)).WithBusinessId(model.OrderId).StartActive();_logger.LogInformation($"银联支付入参:{model.ToJson()}");var request = new UnionPayGatewayPayFrontConsumeRequest(){TxnType = "01",//交易类型TxnSubType = "01",//交易子类BizType = "000201",//业务类型ChannelType = "07",//渠道类型CurrencyCode = "156",//交易币种OrderId = model.OrderId,TxnAmt = model.TxnAmt,TxnTime = model.TxnTime,PayTimeOut = model.PayTimeout,FrontUrl = model.FrontUrl,BackUrl = _optionsAccessor.Value.NotifyUrl,};_logger.LogInformation($"银联入参:{request.ToJson()}");var response = await _client.PageExecuteAsync(request, _optionsAccessor.Value);_logger.LogInformation($"银联支付出参:{response.ToJson()}");return response;}catch (Exception ex){_logger.LogInformation($"银联支付异常:{ex.Message},{ex.StackTrace}");throw ex;}finally{spanScope?.Dispose();}}/// <summary>/// 银联支付查询/// </summary>/// <param name="model"></param>/// <returns></returns>public async Task<UnionPayGatewayPayQueryResponse> UnionPayQuery(UnionPayQueryModel model){IScope spanScope = null;try{spanScope = _tracer.BuildSpan("UnionPayQuery").WithTag(Tags.Component, nameof(UnionPaymentService)).WithBusinessId(model.OrderId).StartActive();var request = new UnionPayGatewayPayQueryRequest{TxnType = "00",//交易类型TxnSubType = "00",//交易子类BizType = "000201",//业务类型OrderId = model.OrderId,TxnTime = model.TxnTime,};_logger.LogInformation($"银联支付查询入参:{request.ToJson()}");var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);_logger.LogInformation($"银联支付查询出参:{response.ToJson()}");return response;}catch (Exception ex){_logger.LogInformation($"银联支付查询异常:{ex.Message},{ex.StackTrace}");throw ex;}finally{spanScope?.Dispose();}}
}

新增IUnionPaymentService

 public interface IUnionPaymentService{/// <summary>/// 微信Native支付/// 微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付/// https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5&index=3/// </summary>/// <param name="model"></param>/// <returns></returns>Task<UnionPayNullResponse> UnionPayGatewayPay(UnionPayModel model);/// <summary>/// 银联支付查询/// </summary>/// <param name="model"></param>/// <returns></returns>Task<UnionPayGatewayPayQueryResponse> UnionPayQuery(UnionPayQueryModel model);}

新增PayController,处理发起支付入口

 private readonly IUnionPaymentService _unionPaymentService;/// <summary>
/// 银联网关支付
/// </summary>
/// <param name="viewMode"></param>
/// <returns></returns>
[HttpPost("UnionPayGatewayPay")]
[ProducesResponseType(typeof(string), 200)]
[Trace("orderId", "aid")]
public async Task<IActionResult> UnionPayGatewayPay([FromBody] UnionPayModel viewMode)
{var data = await _unionPaymentService.UnionPayGatewayPay(viewMode);if (!string.IsNullOrEmpty(data?.Body)){return Ok(ResponseResult.Execute(data?.Body));}return Ok(ResponseResult.Execute("-1", $"银联支付异常"));
}/// <summary>
/// 银联支付查询
/// </summary>
/// <param name="viewMode"></param>
/// <returns></returns>
[HttpGet("UnionPayQuery")]
[ProducesResponseType(typeof(DataResponse), 200)]
[Trace("out_trade_no", "aid")]
public async Task<IActionResult> UnionPayQuery([FromQuery] UnionPayQueryModel viewMode)
{var data = await _unionPaymentService.UnionPayQuery(viewMode);if (data.RespCode == "00" && data.OrigRespCode == "00"){return Ok(ResponseResult.Execute(data));}return Ok(ResponseResult.Execute("-1", $"银联查询交易失败:{data?.RespCode},{data?.RespMsg}"));
}

新增PayNotifyController,处理异步通知

private readonly IUnionPaymentService _unionPaymentService;/// <summary>
/// 微信支付结果通知
/// </summary>
/// <returns></returns>
[HttpPost("UnionPayNotify")]
public async Task<IActionResult> UnionPayNotify()
{var result = UnionPayNotifyResult.Failure;try{var notify = await _unionPayNotifyClient.ExecuteAsync<UnionPayGatewayPayFrontConsumeNotify>(Request, _unionPayOptionsAccessor.Value);_logger.LogInformation("银联支付回调参数: " + notify?.ToJson());if (notify == null){_logger.LogInformation($"银联支付回调通知为空");return NoContent();}_tracer.ActiveSpan.SetTag("aid", notify?.OrderId);_logger.LogInformation("银联支付回调订单号: " + notify.OrderId);if ("00" == notify.RespCode || "A6" == notify.RespCode){_logger.LogInformation($"银联支付成功:{notify.OrderId}");result = UnionPayNotifyResult.Success;}return result;}catch (Exception ex){_logger.LogInformation($"银联支付回调通知异常:{ex.ToString()}");}return NoContent();
}

PostMan测试结果

在这里插入图片描述

{"data": "<form id='submit' name='submit' action='https://gateway.test.95516.com/gateway/api/frontTransReq.do' method='post' style='display:none;'><input  name='bizType' value='000201'/><input  name='txnTime' value='20210706090137'/><input  name='backUrl' value='http://m344739968.vicp.cc/api/PayNotify/UnionPayNotify'/><input  name='currencyCode' value='156'/><input  name='txnAmt' value='800'/><input  name='txnType' value='01'/><input  name='txnSubType' value='01'/><input  name='channelType' value='07'/><input  name='orderId' value='10221062810212809421'/><input  name='frontUrl' value='http://www.baidu.com'/><input  name='payTimeout' value='20210706100137'/><input  name='version' value='5.1.0'/><input  name='encoding' value='UTF-8'/><input  name='signMethod' value='01'/><input  name='accessType' value='0'/><input  name='merId' value='777290058192030'/><input  name='certId' value='69629715588'/><input  name='signature' value='mXI/atwmc7qsErWv7ZusQma86Msl4bYle4vy/8Tr9fBYDEuljamdtzIXsR590FiMGrPaBXVK2xkIBypqc6RsbILIx9FRawbMRwAYF6GOU1aCPYOFmweOT9JgP9C31jwY5E/ooZR7w/o8rCWMuHPkxyDTmdXsQBTifvE9ac30qD5PZq0EyBB0FKX3k03j9s9190n4Q/UTwh4Xsj5uBBaflGUGF611iKvxkhF1++7WHUsrR98fXMlPbpSDq++nYiNLl6jKP/j5msxJU2mrffV2ia2o4TzuHHjoYHUhzjKvpecCoXmnkX5eqlYn6UAPBlw7u2HR9fPk4EbhLGtjNCzKow=='/><input type='submit' style='display:none;'></form><script>document.forms['submit'].submit();</script>","code": "0","message": "发起支付成功","messageType": 1
}

前端拿到返回结果,发起提交表单,将会跳转到银联支付收银台页面,完成支付后等待银联支付通知即可

总结

  1. 以上代码仅仅是核心源代码,仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38510.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓app接入银联支付

刚接触了下银联支付&#xff0c;在网上搜还是看官方文档银联支付都不是很清晰&#xff0c;所以自己总结一篇&#xff0c;希望可以帮助大家快速集成。 一.进入下载官网&#xff0c;选择下载手机控件支付demo&#xff1a; https://open.unionpay.com/ajweb/help/file/techFile?p…

银联在线支付网关,实现快捷安全的全球支付

今天你又“剁手”了吗&#xff1f;如今我们可以随时随地在网上购物&#xff0c;在线支付、便捷安全&#xff0c;那么对其中的支付知识你又有多少了解呢&#xff1f;本篇将为你揭开“银联在线支付网关”的神秘面纱&#xff01; 相关简介&#xff1a; 银联在线支付网关是中国银联…

PHP【连连支付】用户绑定银行卡

应用场景&#xff1a; 上次介绍的是&#xff0c;对接连连第三方支付&#xff0c;详情请参考《连连支付第三方对接》。使用连连支付&#xff0c;由于第一次去支付&#xff0c;需要进行绑卡操作&#xff0c;这样会导致用户体验不好。因此&#xff0c;需要在个人中心增加绑卡功能…

B2B电商平台--ChinaPay银联电子支付功能(实战)

奇迹每天都在发生&#xff0c;而你能把握的便是当下&#xff0c;未来已来............. -------------------------------------------------------------------------------------------------------------- 一、概念简介 理解什么是UnionPay、ChinaPay 这两个概念如果搞不清…

银联支付(chinapay)java接入避坑指南

一、背景 银联支付能给满足绝大部分银行支付渠道&#xff0c;所以接入银联无卡支付&#xff0c;是很多系统应用需要做的事情。银联支付的类型分很多种&#xff0c;网关支付&#xff08;带token请求实现&#xff0c;下次有空再分享&#xff09;、无卡支付&#xff08;带证书请求…

android接入支持海外的支付,visa,mastercard

为了支持海外的支付&#xff0c;我真的是找遍了各种方法&#xff0c;研究过google支付&#xff0c;最后因为手续费太高放弃。最后还是找到了支付宝海外支付。 sdk文档地址&#xff1a;http://www.alipay-seller.mpymnt.com/node/82&#xff08;对&#xff0c;只有英文文档&…

银联支付接口申请-手机控件支付

前一段时间在帮公司申请各种支付接口&#xff0c;在银联支付接口消耗了不少时间&#xff0c;其实银联支付申请还是比较简单的&#xff08;不用上传app截图什么的&#xff09;&#xff0c;只是申请入口比较难找&#xff0c;还有填写的资料比较多。下面我给大家介绍下银联支付接口…

Android-银联支付开发

转自&#xff1a;http://blog.csdn.net/qq285016127/article/details/38435585 银联支付也是一般比较常用的支付功能,这里简单了介绍android app如果短期快速应用这一方面的东西。直接上代码&#xff1a; 1.导入银联支付的依赖包: 2.在res目录下增加资源包: 3.配置AndroidManif…

西米支付:支付宝/微信支付/银联支付通道的接入介绍

本文以电脑网站支付为例&#xff0c;着重对第三方支付通道的接入进行了分析&#xff0c;包括支付宝支付接入、微信支付接入及银联支付接入。 1、支付宝支付接入 支付宝支付能力主要有当面付、刷脸付、App支付、手机网站支付、电脑网站支付和花呗分期等&#xff0c;本文采用电脑…

网关支付、银联代扣通道、快捷支付、银行卡支付等网上常见支付方式接口说明

一、网关支付 这是在线支付的最普遍形式。 大致支付过程&#xff1a;第三方支付公司作为代理&#xff08;网关&#xff09;&#xff0c;接入一堆银行。用户在网关页面&#xff08;可以在商户端&#xff0c;也可以第三方支付平台端&#xff09;选择银行&#xff0c;页面跳转到第…

HTB soccer

title: HTB_soccer description: HTB靶机 难度&#xff1a;easy date: 2023-05-31 categories: [渗透,靶机] HTB soccer 如果图片转载有问题移步&#xff1a;https://qing3feng.github.io/2023/05/31/HTB%20soccer/ 信息收集 ┌──(kali㉿kali)-[~] └─$ sudo nmap --min…

提高WhatsApp营销效果(1):文案篇

// 综述 在WhatsApp上做营销&#xff0c;最主要有四个因素会影响到转化的效果 分别是&#xff1a; ■ WhatsApp的发送者 ■ 文案 ■ 投放时段 ■ 目标号码 对于发送者来讲&#xff0c;主要影响因素是发送者所在的国家、头像和昵称。 投放时段来讲&#xff0c;自然是在用…

港联证券|半导体接棒AI走强 科创50指数领涨

周四&#xff0c;A股三大指数大幅低开&#xff0c;随后反弹并环绕上一买卖日收盘指数打开震动。沪指收报五连阳&#xff0c;半导体概念股团体大涨带动科创50指数走强&#xff0c;4月以来科创50指数已涨超6%。CPO概念股继续活泼&#xff0c;贵金属板块涨幅居前&#xff0c;AI使用…

【汇正财经】沪深创集体红盘,算力股全线爆发

盘面回顾&#xff1a; 大盘日K线收星涨0.31%&#xff0c;深成指涨0.61%&#xff0c;创业板冲高翻绿再弹起&#xff0c;收盘涨0.2%。CPO概念股午后继续大涨&#xff0c;算力概念股全线爆发&#xff0c;AI芯片、ChatGPT概念、电商概念等科技板块交投活跃&#xff0c;酒店餐饮、钙…

微信小程序会员卡开发跳坑

看了一下文档&#xff0c;大概是这样一个函数&#xff0c;可以让用户领取会员卡 wx.navigateToMiniProgram({appId: wxeb490c6f9b154ef9, //固定为此 appid&#xff0c;不可改动extraData: data, // 包括 encrypt_card_id, outer_str, biz三个字段&#xff0c;须从 step3 中获…

使用uni-app生成微信小程序踩的坑

毕设要求写一个浏览器端&#xff0c;一个APP端&#xff0c;一个微信端&#xff0c;刚开始以为要学三个技术然后写三个客户端&#xff0c;后来知道了uni-app这个神器&#xff0c;一次编写就可以编译生成APP、H5以及各种小程序版本的客户端。然而我比较熟悉的是web的前端开发&…

uni-app APP端-微信登录流程

uni-app APP端-微信登录流程 手把手教学 1.前期准备 在微信开放平台注册账户 微信开放平台 (qq.com)在管理中心中创建移动应用项目&#xff0c;按要求填写相关信息审核通过后即可获得我们所需的 AppID和AppSecret然后才uniapp项目中填写&#xff0c;在manifest.json中的App模…

微信小程序开发笔记 进阶篇②——多个微信小程序一个用户体系,同一个UnionID

目录 一、前言二、微信开放平台绑定小程序三、微信小程序login和getUserInfo四、后台请求auth.code2Session五、后台解密开放数据 一、前言 微信小程序开发笔记——导读 二、微信开放平台绑定小程序 微信官方文档&#xff1a;UnionID 机制说明 我们目前有一个微信开放平台&am…

微信小程序登录,包括uniapp的微信小程序登录

代码&#xff1a; 样式&#xff1a; <button click"login">登入</button> 事件&#xff08;methods中&#xff09;&#xff1a; login() {//判断缓存中是否有用户数据&#xff08;也就是判断有没有登录&#xff09;if (!uni.getStorageSync(encrypte…

桔子拓客是什么?

桔子拓客软件是一款安装在手机上APP智能营销软件&#xff0c;启动软件后可不停的活跃帐号&#xff0c;推送作品给指定的人群&#xff0c;指定区域&#xff0c;以此来达到精准曝光&#xff0c;定向引流&#xff0c;帮助用户实现流量的暴增&#xff01; 桔子拓客软件采用非入侵式…