〇、前言
支付宝对 .Net 的支持还是比较充分的,在每个接口文档中都有关于 C# 语言的示例,这样就大大降低了对接的难度,很容易上手。
官方接口文档地址:退款-alipay.trade.refund 退款状态查询-alipay.trade.fastpay.refund.query
本文就简单实现下这两个接口,并顺便记录特别注意的点。
一、接入准备
1.1 引入 SDK
安装支付宝开放平台官方 SDK:AlipaySDKNet.Standard。基于.Net Standard 2.0开发,支持.Net Framework 4.6.1、.Net Core 2.0及其以上版本。
NuGet 简介地址:https://www.nuget.org/packages/AlipaySDKNet.Standard/
1.2 必要账户基础信息
名称 | 示例 | |
应用 ID | 2024 ... ... | (15 位纯数字) |
应用公钥 | MIIBIjANBgkqhk ... ... | (392 位) |
应用私钥 | MIIEvgIBADANBgk ... ... | (PKCS1 格式的 1592 位) |
注意:通过支付宝密钥工具生成的应用私钥默认是 PKCS8 格式的,仅适用于 Java,此时必须手动转换成 PKCS1 格式,适用于其他全部语言。
密钥工具下载地址:https://opendocs.alipay.com/common/02kipk
如下格式转换,下边为转换后的格式以及标注:
二、接口调用
2.1 公用配置方法
将固定的应用信息填入,此方法可在不同接口中公用:
private static AlipayConfig GetAlipayConfig(){ string privateKey ="<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->"; string alipayPublicKey ="<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->"; AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.ServerUrl ="https://openapi.alipay.com/gateway.do"; alipayConfig.AppId ="<-- 请填写您的AppId,例如:2019091767145019 -->"; alipayConfig.PrivateKey = privateKey; alipayConfig.Format ="json"; alipayConfig.AlipayPublicKey = alipayPublicKey; alipayConfig.Charset ="UTF-8"; alipayConfig.SignType ="RSA2"; return alipayConfig;}
2.2 退款接口
以下是退款接口的代码,其中入参仅示例了必要的字段,其他详情见官方文档。
// 初始化SDKIAopClient alipayClient = new DefaultAopClient(GetAlipayConfig());// 构造请求参数以调用接口AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();AlipayTradeRefundModel model = new AlipayTradeRefundModel();// 设置查询选项List<String> queryOptions = new List<String>();queryOptions.Add("refund_detail_item_list");model.QueryOptions = queryOptions;//// 设置商户订单号(与支付宝交易号,配置任一即可)//model.OutTradeNo ="20150320010101001";// 设置支付宝交易号model.TradeNo ="2024072900000000000000000001";// 设置退款金额,单位为:元model.RefundAmount ="0.01";// 设置退款原因说明model.RefundReason ="正常退款0729";// 设置退款请求号model.OutRequestNo = $"ZFB{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}";request.SetBizModel(model);AlipayTradeRefundResponse response = alipayClient.Execute(request);if (!response.IsError){ Console.WriteLine("调用成功");}else{ Console.WriteLine("调用失败");}
成功返回:
{"alipay_trade_refund_response": {"code":"10000","msg":"Success","buyer_logon_id":"188******10","fund_change":"Y","gmt_refund_pay":"2024-07-29 13:50:04","out_trade_no":"*****","refund_detail_item_list": [{"amount":"0.01","fund_channel":"COUPON"}],"refund_fee":"0.01","send_back_fee":"0.01","trade_no":"*****","buyer_open_id":"*****"},"sign":"*****"}
2.3 退款状态查询接口
以下是退款状态查询接口的代码,其中入参仅示例了必要的字段,其他详情见官方文档。
// 初始化SDKIAopClient alipayClient = new DefaultAopClient(GetAlipayConfig());// 构造请求参数以调用接口AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();// 设置查询选项List<String> queryOptions = new List<String>();queryOptions.Add("refund_detail_item_list");model.QueryOptions = queryOptions;//// 设置商户订单号(与支付宝交易号,配置任一即可)//model.OutTradeNo ="2014112611001004680073956707";// 设置支付宝交易号model.TradeNo ="2024072900000000000000000001";// 设置退款请求号,来自退款接口中生成的编号model.OutRequestNo ="ZFB20240729135000591024";request.SetBizModel(model);AlipayTradeFastpayRefundQueryResponse response = alipayClient.Execute(request);if (!response.IsError){ Console.WriteLine("调用成功");}else{ Console.WriteLine("调用失败");}
成功返回:
{"alipay_trade_fastpay_refund_query_response": {"code":"10000","msg":"Success","out_request_no":"ZFB20240729135000591024","out_trade_no":"*****","refund_amount":"0.01","refund_detail_item_list": [{"amount":"0.01","fund_channel":"COUPON"}],"refund_status":"REFUND_SUCCESS","send_back_fee":"0.01","total_amount":"1.00","trade_no":"*****"},"sign":"*****"}