| | |
| | | /// <returns></returns> |
| | | public async Task<AlipayTradeFastpayRefundQueryResponse> QueryAlipayTradeRefund(OrderInQuiryInput input) |
| | | { |
| | | AlipayTradeFastpayRefundQueryResponse response = await Factory.Payment.Common().QueryRefundAsync(input.OutTradeNo, input.OutTradeNo); |
| | | AlipayTradeFastpayRefundQueryResponse response = await QueryTradeRefund(input.OutTradeNo, input.OutTradeNo); |
| | | return response; |
| | | } |
| | | |
| | | public async Task<AlipayTradeRefundResponse> TradeRefund(AlipayTradeRefundRequest input) |
| | | { |
| | | AlipayTradeRefundResponse response = await TradeRefund(input.OutTradeNo,input.OutRefundNo, input.RefundAmount); |
| | | AlipayTradeRefundResponse response = await TradeRefund(input.OutTradeNo, input.OutRefundNo, input.RefundAmount); |
| | | return response; |
| | | } |
| | | |
| | |
| | | throw new TeaUnretryableException(_lastRequest, innerException); |
| | | } |
| | | |
| | | private async Task<AlipayTradeFastpayRefundQueryResponse> QueryTradeRefund(string outTradeNo, string outRequestNo) |
| | | { |
| | | Dictionary<string, object> runtime_ = new Dictionary<string, object> |
| | | { |
| | | { |
| | | "ignoreSSL", |
| | | _kernel.GetConfig("ignoreSSL") |
| | | }, |
| | | { |
| | | "httpProxy", |
| | | _kernel.GetConfig("httpProxy") |
| | | }, |
| | | { "connectTimeout", 15000 }, |
| | | { "readTimeout", 15000 }, |
| | | { |
| | | "retry", |
| | | new Dictionary<string, int?> { { "maxAttempts", 0 } } |
| | | } |
| | | }; |
| | | TeaRequest _lastRequest = null; |
| | | Exception innerException = null; |
| | | long _now = DateTime.Now.Millisecond; |
| | | int _retryTimes = 0; |
| | | while (TeaCore.AllowRetry((IDictionary)runtime_["retry"], _retryTimes, _now)) |
| | | { |
| | | if (_retryTimes > 0) |
| | | { |
| | | int backoffTime = TeaCore.GetBackoffTime((IDictionary)runtime_["backoff"], _retryTimes); |
| | | if (backoffTime > 0) |
| | | { |
| | | TeaCore.Sleep(backoffTime); |
| | | } |
| | | } |
| | | |
| | | _retryTimes++; |
| | | try |
| | | { |
| | | TeaRequest teaRequest = new TeaRequest(); |
| | | Dictionary<string, string> dictionary = new Dictionary<string, string> |
| | | { |
| | | { "method", "alipay.trade.fastpay.refund.query" }, |
| | | { |
| | | "app_id", |
| | | _kernel.GetConfig("appId") |
| | | }, |
| | | { |
| | | "timestamp", |
| | | _kernel.GetTimestamp() |
| | | }, |
| | | { "format", "json" }, |
| | | { "version", "1.0" }, |
| | | { |
| | | "alipay_sdk", |
| | | _kernel.GetSdkVersion() |
| | | }, |
| | | { "charset", "UTF-8" }, |
| | | { |
| | | "sign_type", |
| | | _kernel.GetConfig("signType") |
| | | }, |
| | | { |
| | | "app_cert_sn", |
| | | _kernel.GetMerchantCertSN() |
| | | }, |
| | | { |
| | | "alipay_root_cert_sn", |
| | | _kernel.GetAlipayRootCertSN() |
| | | } |
| | | }; |
| | | var queryOptions = new string[] { "gmt_refund_pay" }; |
| | | Dictionary<string, object> bizParams = new Dictionary<string, object> |
| | | { |
| | | { "out_trade_no", outTradeNo }, |
| | | { "out_request_no", outRequestNo }, |
| | | { "query_options", queryOptions } |
| | | }; |
| | | Dictionary<string, string> dictionary2 = new Dictionary<string, string>(); |
| | | teaRequest.Protocol = _kernel.GetConfig("protocol"); |
| | | teaRequest.Method = "POST"; |
| | | teaRequest.Pathname = "/gateway.do"; |
| | | teaRequest.Headers = new Dictionary<string, string> |
| | | { |
| | | { |
| | | "host", |
| | | _kernel.GetConfig("gatewayHost") |
| | | }, |
| | | { "content-type", "application/x-www-form-urlencoded;charset=utf-8" } |
| | | }; |
| | | teaRequest.Query = _kernel.SortMap(TeaConverter.merge<string>(new object[3] |
| | | { |
| | | new Dictionary<string, string> { |
| | | { |
| | | "sign", |
| | | _kernel.Sign(dictionary, bizParams, dictionary2, _kernel.GetConfig("merchantPrivateKey")) |
| | | } }, |
| | | dictionary, |
| | | dictionary2 |
| | | })); |
| | | teaRequest.Body = TeaCore.BytesReadable(_kernel.ToUrlEncodedRequestBody(bizParams)); |
| | | _lastRequest = teaRequest; |
| | | TeaResponse response = await TeaCore.DoActionAsync(teaRequest, runtime_); |
| | | Dictionary<string, object> respMap = await _kernel.ReadAsJsonAsync(response, "alipay.trade.fastpay.refund.query"); |
| | | if (_kernel.IsCertMode()) |
| | | { |
| | | if (_kernel.Verify(respMap, _kernel.ExtractAlipayPublicKey(_kernel.GetAlipayCertSN(respMap)))) |
| | | { |
| | | return TeaModel.ToObject<AlipayTradeFastpayRefundQueryResponse>(_kernel.ToRespModel(respMap)); |
| | | } |
| | | } |
| | | else if (_kernel.Verify(respMap, _kernel.GetConfig("alipayPublicKey"))) |
| | | { |
| | | return TeaModel.ToObject<AlipayTradeFastpayRefundQueryResponse>(_kernel.ToRespModel(respMap)); |
| | | } |
| | | |
| | | throw new TeaException(new Dictionary<string, string> { { "message", "验签失败,请检查支付宝公钥设置是否正确。" } }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | if (TeaCore.IsRetryable(ex)) |
| | | { |
| | | innerException = ex; |
| | | continue; |
| | | } |
| | | |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | throw new TeaUnretryableException(_lastRequest, innerException); |
| | | } |
| | | |
| | | } |
| | | } |