mirror of
https://github.com/Varorbc/PaySharp.git
synced 2026-10-18 13:40:40 +08:00
增加退款通知
This commit is contained in:
@@ -39,13 +39,6 @@ namespace ICanPay.Alipay
|
||||
/// </summary>
|
||||
public string Charset => "UTF-8";
|
||||
|
||||
/// <summary>
|
||||
/// 应用授权
|
||||
/// //TODO:有些不添加
|
||||
/// </summary>
|
||||
[StringLength(40, ErrorMessage = "应用授权最大长度为40位")]
|
||||
public string AppAuthToken { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 参数集合
|
||||
/// </summary>
|
||||
|
||||
@@ -45,6 +45,11 @@ namespace ICanPay.Alipay
|
||||
/// </summary>
|
||||
public string Sign { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 授权方的app_id
|
||||
/// </summary>
|
||||
public string AuthAppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 支付宝交易号
|
||||
/// </summary>
|
||||
@@ -113,7 +118,14 @@ namespace ICanPay.Alipay
|
||||
/// <summary>
|
||||
/// 总退款金额
|
||||
/// </summary>
|
||||
public double RefundFee { get; set; }
|
||||
[ReName(Name = "refund_fee")]
|
||||
public double RefundAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 实际退款金额
|
||||
/// </summary>
|
||||
[ReName(Name = "send_back_fee")]
|
||||
public double SendBackAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单标题
|
||||
|
||||
@@ -20,7 +20,10 @@ namespace Microsoft.Extensions.DependencyInjection
|
||||
|
||||
var gateways = new Gateways();
|
||||
setupAction(gateways);
|
||||
services.AddSingleton(gateways);
|
||||
services.AddScoped<IGateways>(a =>
|
||||
{
|
||||
return gateways;
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -525,5 +525,31 @@ namespace ICanPay.Core.Utils
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region AES解密
|
||||
|
||||
/// <summary>
|
||||
/// AES解密
|
||||
/// </summary>
|
||||
/// <param name="data">待解密数据</param>
|
||||
/// <param name="key">密钥</param>
|
||||
/// <returns></returns>
|
||||
public static string AESDecrypt(string data, string key)
|
||||
{
|
||||
var keyArray = Encoding.UTF8.GetBytes(key);
|
||||
var toEncryptArray = Convert.FromBase64String(data);
|
||||
var rDel = new RijndaelManaged
|
||||
{
|
||||
Key = keyArray,
|
||||
Mode = CipherMode.ECB,
|
||||
Padding = PaddingMode.PKCS7
|
||||
};
|
||||
|
||||
var cTransform = rDel.CreateDecryptor();
|
||||
var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||||
return Encoding.UTF8.GetString(resultArray);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
+73
-118
@@ -1,9 +1,22 @@
|
||||
using ICanPay.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using static ICanPay.Wechatpay.Response.QueryResponse;
|
||||
|
||||
namespace ICanPay.Wechatpay
|
||||
{
|
||||
public class Notify : INotify
|
||||
{
|
||||
/// <summary>
|
||||
/// 返回状态码
|
||||
/// </summary>
|
||||
public string ReturnCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 返回信息
|
||||
/// </summary>
|
||||
public string ReturnMsg { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应用ID
|
||||
/// </summary>
|
||||
@@ -25,11 +38,21 @@ namespace ICanPay.Wechatpay
|
||||
/// </summary>
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 加密信息
|
||||
/// </summary>
|
||||
public string ReqInfo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 签名
|
||||
/// </summary>
|
||||
public string Sign { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 签名类型
|
||||
/// </summary>
|
||||
public string SignType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 业务结果
|
||||
/// </summary>
|
||||
@@ -45,38 +68,6 @@ namespace ICanPay.Wechatpay
|
||||
/// </summary>
|
||||
public string ErrCodeDes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易类型
|
||||
/// </summary>
|
||||
public string TradeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时
|
||||
/// </summary>
|
||||
public string PrepayId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 返回状态码
|
||||
/// </summary>
|
||||
public string ReturnCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 返回信息
|
||||
/// </summary>
|
||||
public string ReturnMsg { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 支付跳转链接
|
||||
/// mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
|
||||
/// </summary>
|
||||
public string MWebUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 二维码链接
|
||||
/// trade_type为NATIVE时有返回,用于生成二维码,展示给用户进行扫码支付
|
||||
/// </summary>
|
||||
public string CodeUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户标识
|
||||
/// 用户在商户appid 下的唯一标识
|
||||
@@ -90,22 +81,57 @@ namespace ICanPay.Wechatpay
|
||||
/// </summary>
|
||||
public string IsSubscribe { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易类型
|
||||
/// </summary>
|
||||
public string TradeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 银行类型,采用字符串类型的银行标识,详见银行类型
|
||||
/// </summary>
|
||||
public string BankType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单金额
|
||||
/// 订单总金额,单位为分
|
||||
/// </summary>
|
||||
[ReName(Name = "total_fee")]
|
||||
public double TotalAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应结订单金额
|
||||
/// 当订单使用了免充值型优惠券后返回该参数,应结订单金额=订单金额-免充值优惠券金额。
|
||||
/// </summary>
|
||||
public double SettlementTotalFee { get; set; }
|
||||
[ReName(Name = "settlement_total_fee")]
|
||||
public double SettlementTotalAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 货币类型
|
||||
/// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,详见货币类型
|
||||
/// </summary>
|
||||
[ReName(Name = "fee_type")]
|
||||
public string AmountType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 现金支付金额
|
||||
/// 订单现金支付金额,详见支付金额
|
||||
/// </summary>
|
||||
[ReName(Name = "cash_fee")]
|
||||
public double CashAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 现金支付货币类型
|
||||
/// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
|
||||
/// </summary>
|
||||
[ReName(Name = "cash_fee_type")]
|
||||
public string CashAmountType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 代金券金额
|
||||
/// “代金券”金额小于等于订单金额,订单金额-“代金券”金额=现金支付金额,详见支付金额
|
||||
/// </summary>
|
||||
public double CouponFee { get; set; }
|
||||
[ReName(Name = "coupon_fee")]
|
||||
public double CouponAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 代金券使用数量
|
||||
@@ -113,38 +139,16 @@ namespace ICanPay.Wechatpay
|
||||
public int CouponCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 货币类型
|
||||
/// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,详见货币类型
|
||||
/// 退款代金券
|
||||
/// TODO:特殊代金券
|
||||
/// </summary>
|
||||
public string FeeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单金额
|
||||
/// 订单总金额,单位为元
|
||||
/// </summary>
|
||||
public double TotalFee
|
||||
{
|
||||
get => _totalFee;
|
||||
set => _totalFee = value / 100;
|
||||
}
|
||||
private double _totalFee;
|
||||
|
||||
/// <summary>
|
||||
/// 现金支付货币类型
|
||||
/// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
|
||||
/// </summary>
|
||||
public string CashFeeType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 现金支付金额
|
||||
/// 订单现金支付金额,详见支付金额
|
||||
/// </summary>
|
||||
public double CashFee { get; set; }
|
||||
public List<CouponResponse> Coupons { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信支付订单号
|
||||
/// </summary>
|
||||
public string TransactionId { get; set; }
|
||||
[ReName(Name = "transaction_id")]
|
||||
public string TradeNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 商户订单号
|
||||
@@ -162,76 +166,27 @@ namespace ICanPay.Wechatpay
|
||||
public string TimeEnd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 营销详情
|
||||
/// 新增返回,单品优惠功能字段,需要接入请见详细说明
|
||||
/// </summary>
|
||||
public string PromotionDetail { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易状态描述
|
||||
/// 对当前查询订单状态的描述和下一步操作的指引
|
||||
/// </summary>
|
||||
public string TradeStateDesc { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 交易状态
|
||||
/// SUCCESS—支付成功
|
||||
/// REFUND—转入退款
|
||||
/// NOTPAY—未支付
|
||||
/// CLOSED—已关闭
|
||||
/// REVOKED—已撤销(刷卡支付)
|
||||
/// USERPAYING--用户支付中
|
||||
/// PAYERROR--支付失败(其他原因,如银行返回失败)
|
||||
/// 支付状态机请见下单API页面
|
||||
/// </summary>
|
||||
public string TradeState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否重调
|
||||
/// 是否需要继续调用撤销,Y-需要,N-不需要
|
||||
/// </summary>
|
||||
public string Recall { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否重调
|
||||
/// 是否需要继续调用撤销,Y-需要,N-不需要
|
||||
/// 商户退款单号
|
||||
/// </summary>
|
||||
public string OutRefundNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信退款单号
|
||||
/// </summary>
|
||||
public string RefundId { get; set; }
|
||||
[ReName(Name = "refund_id")]
|
||||
public string RefundNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 退款金额
|
||||
/// </summary>
|
||||
public string RefundFee { get; set; }
|
||||
[ReName(Name = "refund_fee")]
|
||||
public string RefundAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应结退款金额
|
||||
/// </summary>
|
||||
public string SettlementRefundFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 现金退款金额
|
||||
/// </summary>
|
||||
public string CashRefundFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 代金券退款总金额
|
||||
/// </summary>
|
||||
public string CouponRefundFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单总退款次数
|
||||
/// </summary>
|
||||
public string TotalRefundCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 退款笔数
|
||||
/// </summary>
|
||||
public string RefundCount { get; set; }
|
||||
[ReName(Name = "settlement_refund_fee")]
|
||||
public string SettlementRefundAmount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 退款状态
|
||||
@@ -241,7 +196,7 @@ namespace ICanPay.Wechatpay
|
||||
/// <summary>
|
||||
/// 退款成功时间
|
||||
/// </summary>
|
||||
public string SuccessTime { get; set; }
|
||||
public DateTime SuccessTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 退款入账账户
|
||||
|
||||
@@ -13,7 +13,6 @@ namespace ICanPay.Wechatpay.Request
|
||||
|
||||
internal override void Execute(Merchant merchant)
|
||||
{
|
||||
GatewayData.Remove("notify_url");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,9 +59,18 @@ namespace ICanPay.Wechatpay
|
||||
throw new GatewayException("不是成功的返回码");
|
||||
}
|
||||
|
||||
if (Notify.Sign != SubmitProcess.BuildSign(GatewayData, _merchant.Key))
|
||||
if (string.IsNullOrEmpty(Notify.ReqInfo))
|
||||
{
|
||||
throw new GatewayException("签名不一致");
|
||||
if (Notify.Sign != SubmitProcess.BuildSign(GatewayData, _merchant.Key))
|
||||
{
|
||||
throw new GatewayException("签名不一致");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//TODO:解密
|
||||
var key = EncryptUtil.MD5(_merchant.Key).ToLower();
|
||||
var data = EncryptUtil.AESDecrypt(Notify.ReqInfo, key);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user