ASP.NET芯2.0使用支付宝PC网站支付实现代码
序
最近用ASP.NET芯开发,刚好有接入支付宝支付的需求。百度看了之后没有找到相关信息。看完官方的SDK和Demo,他们还在。NET框架。因此,根据官方SDK的源代码,支付宝服务器SDK是用。NET标准2.0。支付宝. AOP SDK . core (github:https://github.com/stulzq/Alipay。AopSdk.Core),支持。NET CORE 2.0。为了方便,已经上传到Nuget,可以直接使用。
支付宝有很多支付产品,如面对面支付、APP支付、手机网站支付、电脑网站支付等。这次我们讨论的是电脑网站支付。
如果没有时间看文章,可以直接从github获取Demo进行查看,非常简单。https://github.com/stulzq/Alipay. github :演示PCPayment
创建项目
创建一个新的ASP.NET核心2.0 MVC项目
部署
因为开发的时候没有申请支付接口,所以用支付宝沙盒环境开发。
支付宝沙盒环境介绍:蚂蚁沙盒环境(Beta)是帮助开发者开发界面功能、协调主要功能的辅助环境。沙盒环境模拟开放平台部分产品的主要功能和主要逻辑。在应用在线审核之前,开发者可以根据自己的需要,在沙盒环境中对各种开放接口进行理解、组合和调试,帮助开发者在应用在线审核完成后,更快速、更顺利地进行在线调试和验收工作。如果您想在注册或创建应用程序之前进行集成测试,可以使用沙盒环境。
沙盒环境支持使用个人帐户或企业帐户登录。
沙盒环境地址:https://openhome.alipay.com/platform/appDaily.htm?标签=信息
1.生成密钥
下载支付宝提供的密钥生成工具生成。详细介绍:https://doc.open.alipay.com/docs/doc.htm?树id=291文章id=105971目录类型=1
2.设置应用程序公钥
我们生成密钥后,需要在支付宝后台设置应用公钥,也就是我们生成的公钥。
设置后,支付宝会给我们一个支付宝公钥,并保存这个支付宝公钥
这个支付宝公钥不同于我们自己生成的公钥。我们在配置SDK时使用的公钥是支付宝公钥
3.配置SDK
创建一个新的配置类,并将我们的配置存储在其中。
公共类Config{ //应用程序ID,您的APPID公共静态字符串AppId=//支付宝网关公共静态字符串Gatewayurl=//商家私钥,您的原始RSA私钥公共静态字符串PrivateKey=//支付宝公钥,检查地址:APPID下支付宝公钥对应https://openhome.alipay.com/platform/keyManage.htm.公共静态字符串AlipayPublicKey=//签名方法:public static string sign type=' RSA 2 ';//编码格式公共静态字符串字符集=' utf-8 ';}可以在支付宝后台查看应用ID和支付宝网关。
商家的私钥是我们自己生成的私钥,公钥是支付宝的公钥。这里,公钥和私钥可以直接填写字符串。
签名方式推荐使用RSA2,支付宝将使用SHA256withRsa算法验证接口调用(不限制密钥长度)。
编码格式:如果我们是直接配置的字符串(公钥和私钥),就是我们代码的编码;如果我们使用文件(公钥和私钥),那就是文件的编码。
按照以下步骤完成配置:
添加SDK
官方SDK源代码(。NET框架),支付宝服务器SDK用。NET标准2.0,支付宝. AOP SDK . core (github:https://github.com/stulzq/Alipay。核心),支持。NET核心2.0。通过Nuget安装:安装包支付宝。aopsdk.core
支付
添加控制器付款控制器
///发起支付请求////summary///param名称=' tradeno '外部订单号,商户网站订单系统中唯一的订单号/param///param名称='subject '订单名称/param///param名称='totalAmout '支付金额/param///param名称='itemBody '商品描述/param///returns/returns[httpset]public void PayRequest(string trade no,string subject,string totalAmout,string item body){ defaultopclient client=new defaultGatewayurl,配置。AppId,Config。PrivateKey,' json ',' 2.0 ',Config。签名类型,配置。配置。CharSet,false);//组装业务参数模型alipaytradepagepaymodel=new alipaytradepagepaymodel();模特。Body=itemBody模特。主语=主语;模特。合计金额=合计金额;模特。OutTradeNo=tradeno模特。product code=' FAST _ INSTANT _ TRade _ PAY ';AlipayTradePagePayRequest=new AlipayTradePagePayRequest();//设置同步回叫地址request . setreturnurl(' http://localhost 33605000/pay/callback ');//设置异步通知接收地址请求。setnotifyURl(“”);//将业务模型加载到request request . setbizmodel(model)中;var响应=客户端。SdkExecute(请求);控制台。WriteLine($ '订单支付启动成功,订单号:{ trade no } ');//跳转支付宝支付响应。重定向(config.gatewayurl '?'回应。身体);}运行:
图1
图2
图3
付款异步回拨通知
支付宝同步回拨通知(支付成功后跳转到商家网站)不可靠,这里必须使用异步通知才能获取支付结果。异步通知是指支付宝主动请求我们提供的地址,我们根据请求的数据进行核对,得到支付结果。
///摘要///需要为支付异步回调通知配置域名。由于支付宝主动请求此动作,需要通过域名或公共IP////Summary公共async void notify () {/*进行访问,实际验证过程建议商家添加以下验证。1.商家需要验证通知数据中的out_trade_no是否是商家系统中创建的订单号。2.确定total_amount是否为订单的实际金额(即创建商户订单时的金额)。3.检查通知中的卖家id(或卖家电子邮件)是否为单据out_trade_no的对应操作员(有时,商家可能有多个卖家id/卖家电子邮件)。4.验证app_id是否为商家本身。*/Dictionarystring,string sArray=GetRequestPost();if (sArray。数数!=0) { bool标志=AlipaySignature。RSACheckV1(sArray,Config。配置。字符集,配置。SignType,false);如果(标志){//交易状态//判断订单是否已经在商家网站处理//如果没有,根据订单编号(out_trade_no)在商家网站订单系统中查找订单明细。并执行商家的业务流程。//请判断请求时的total_amount与通知时获得的total_fee是否一致。//如果已经处理,则不执行商户的业务流程。//注意://退款日期超过退款期限后(如三个月后退款),支付宝系统会将交易状态通知发送至控制台。writeline(请求。表单['贸易状态'])等待响应。WriteAsync(“成功”);} else {等待响应。write async(' fail ');}}}同步回调
同步回拨意味着支付成功跳回商家网站
运行:
///摘要///支付同步回调////摘要[HttpGet]public IActionResult Callback(){/*实际验证过程建议商户添加以下校验。 1、商户需要验证该通知数据中的出口_贸易_否是否为商户系统中创建的订单号, 2、判断合计_金额是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的卖家id(或者卖家_电子邮件)是否为出口_贸易_否这笔单据的对应的操作方(有的时候,一个商户可能有多个卖家id/卖家电子邮件)4、验证app_id是否为该商户本身*/Dictionarystring,string sArray=GetRequestGet();if (sArray .数数!=0) { bool标志=支付宝签名.RSACheckV1(sArray,Config .配置。字符集,配置SignType,false);如果(标志){控制台WriteLine($)同步验证通过,订单号:{ SarRay[' out _ trade _ no ']} ');视图数据['PayResult']='同步验证通过;} else { Console .WriteLine($ '同步验证失败,订单号:{ SarRay[' out _ trade _ no ']} ');视图数据['PayResult']='同步验证失败;} }返回视图();}订单查询
查询订单当前状态:已付款、未付款等等。
运行:
订单退款
公共JsonResult查询(字符串tradeno,字符串alipayTradeNo){ DefaultAopClient客户端=新的DefaultAopClient(Config .Gatewayurl,配置AppId,Config .PrivateKey,“json”,“2.0”,Config .签名类型,配置。配置. CharSet,false);AlipayTradeQueryModel模型=新的AlipayTradeQueryModel();模特OutTradeNo=tradeno模特。交易号=支付宝交易号;AlipayTradeQueryRequest=new AlipayTradeQueryRequest();请求SetBizModel(模型);定义变量响应=客户端。执行(请求);返回Json(响应。身体);}退回该订单金额。
运行:
///摘要///订单退款////summary////param name='商品名'商户订单号/param///param名称='支付宝交易号'支付宝交易号/param///param name=' RefAnDamount '退款金额/param///param name=' RefAnDreason '退款原因/param///param name=' RefAnDno '退款单号/param///returns/returns[httpset]public JsonResult退款(字符串tradeno,字符串支付宝交易号,字符串拒绝安装,字符串拒绝理由,字符串重新编号){ DefaultAopClient客户端=新DefaultAopClient(Config .Gatewayurl,配置AppId,Config .PrivateKey,“json”,“2.0”,Config .签名类型,配置。配置. CharSet,false);alipaytraderrefundmodel=新的alipaytraderefundmodel();模特OutTradeNo=tradeno模特。交易号=支付宝交易号;模特。退款金额=退款金额;模特拒绝理由=拒绝理由模特outrequest no=RefAndNoalPayTradeRequest请求=新的alipaytraderrequest();请求SetBizModel(模型);定义变量响应=客户端。执行(请求);返回Json(响应。身体);}退款查询
查询退款信息。
运行:
///摘要///退款查询////summary////param name='商品名'商户订单号/param///param名称='支付宝交易号'支付宝交易号/param///param名称='退款编号'退款单号/param///returns/returns[Httpset]public JsonResult RefAnDquery(字符串tradeno,字符串支付宝交易号,字符串RefAnDno){ Defaultaopclient客户端=新的Defaultaopclient(Config .Gatewayurl,配置AppId,Config .PrivateKey,“json”,“2.0”,Config .签名类型,配置。配置. CharSet,false);如果(字符串IsNullOrEmpty(RefAnDno)){ RefAnDno=交易号;} AlipayTradeFastPayrefandquerymodel=新的AlipayTradeFastpayRefundQueryModel();模特OutTradeNo=tradeno模特。交易号=支付宝交易号;模特outrequest no=RefAndNoalPayTradeFastPayRefAnDqueryquest=new AlipayTradeFastPayRefAnDqueryquest();请求SetBizModel(模型);定义变量响应=客户端。执行(请求);返回Json(响应。身体);}订单关闭
对一定时间以后没有进行付款的订单进行关闭,订单状态需为:待付款,已完成支付的订单无法关闭。
运行:
///摘要///关闭订单////summary////param name='商品名'商户订单号/param///param名称='支付宝交易号'支付宝交易号/param/Gatewayurl,配置AppId,Config .PrivateKey,“json”,“2.0”,Config .签名类型,配置。配置. CharSet,false);AlipayTradeCloseModel=新的AlipayTradeCloseModel();模特OutTradeNo=tradeno模特。交易号=支付宝交易号;AlipayTradeCloseRequest=new AlipayTradeCloseRequest();请求SetBizModel(模型);定义变量响应=客户端。执行(请求);返回Json(响应。身体);}地址集合支付宝应用程序接口文档支付宝沙箱环境支付宝密钥生成工具支付宝服务端软件开发工具包(软件开发工具包)源码支付宝服务端SDK Nuget
最重要的:
本文演示:https://github。com/stulzq/支付宝。演示PCPayment
版权声明:ASP.NET芯2.0使用支付宝PC网站支付实现代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。