2022-11-13 23:17:18 +08:00
using System ;
2021-07-20 01:20:31 +08:00
namespace SKIT.FlurlHttpClient.Wechat.TenpayV3
{
/// <summary>
/// 为 <see cref="WechatTenpayClient"/> 提供回调通知事件签名验证的扩展方法。
/// </summary>
public static class WechatTenpayClientEventVerificationExtensions
{
/// <summary>
/// <para>验证回调通知事件签名。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_1.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="callbackTimestamp">微信回调通知中的 Wechatpay-Timestamp 字段。</param>
/// <param name="callbackNonce">微信回调通知中的 Wechatpay-Nonce 字段。</param>
/// <param name="callbackBody">微信回调通知中请求正文。</param>
/// <param name="callbackSignature">微信回调通知中的 Wechatpay-Signature 字段。</param>
/// <param name="callbackSerialNumber">微信回调通知中的 Wechatpay-Serial 字段。</param>
/// <returns></returns>
2022-03-11 10:38:15 +08:00
public static bool VerifyEventSignature ( this WechatTenpayClient client , string callbackTimestamp , string callbackNonce , string callbackBody , string callbackSignature , string callbackSerialNumber )
2021-11-25 11:58:06 +08:00
{
2022-11-13 23:17:18 +08:00
return VerifyEventSignature (
client ,
callbackTimestamp : callbackTimestamp ,
callbackNonce : callbackNonce ,
callbackBody : callbackBody ,
callbackSignature : callbackSignature ,
callbackSignatureType : Constants . SignSchemes . WECHATPAY2_RSA_2048_WITH_SHA256 ,
callbackSerialNumber : callbackSerialNumber
) ;
}
/// <summary>
/// <para>验证回调通知事件签名。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_1.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="callbackTimestamp">微信回调通知中的 Wechatpay-Timestamp 字段。</param>
/// <param name="callbackNonce">微信回调通知中的 Wechatpay-Nonce 字段。</param>
/// <param name="callbackBody">微信回调通知中请求正文。</param>
/// <param name="callbackSignature">微信回调通知中的 Wechatpay-Signature 字段。</param>
/// <param name="callbackSignatureType">微信回调通知中的 Wechatpay-Signature-Type 字段。</param>
/// <param name="callbackSerialNumber">微信回调通知中的 Wechatpay-Serial 字段。</param>
/// <returns></returns>
public static bool VerifyEventSignature ( this WechatTenpayClient client , string callbackTimestamp , string callbackNonce , string callbackBody , string callbackSignature , string callbackSignatureType , string callbackSerialNumber )
{
return VerifyEventSignature (
client ,
callbackTimestamp : callbackTimestamp ,
callbackNonce : callbackNonce ,
callbackBody : callbackBody ,
callbackSignature : callbackSignature ,
callbackSignatureType : callbackSignatureType ,
callbackSerialNumber : callbackSerialNumber ,
out _
) ;
2021-11-25 11:58:06 +08:00
}
/// <summary>
/// <para>验证回调通知事件签名。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_1.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="callbackTimestamp">微信回调通知中的 Wechatpay-Timestamp 字段。</param>
/// <param name="callbackNonce">微信回调通知中的 Wechatpay-Nonce 字段。</param>
/// <param name="callbackBody">微信回调通知中请求正文。</param>
/// <param name="callbackSignature">微信回调通知中的 Wechatpay-Signature 字段。</param>
/// <param name="callbackSerialNumber">微信回调通知中的 Wechatpay-Serial 字段。</param>
/// <param name="error"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
2022-03-11 10:38:15 +08:00
public static bool VerifyEventSignature ( this WechatTenpayClient client , string callbackTimestamp , string callbackNonce , string callbackBody , string callbackSignature , string callbackSerialNumber , out Exception ? error )
2022-11-13 23:17:18 +08:00
{
return VerifyEventSignature (
client ,
callbackTimestamp : callbackTimestamp ,
callbackNonce : callbackNonce ,
callbackBody : callbackBody ,
callbackSignature : callbackSignature ,
callbackSignatureType : Constants . SignSchemes . WECHATPAY2_RSA_2048_WITH_SHA256 ,
callbackSerialNumber : callbackSerialNumber ,
out error
) ;
}
/// <summary>
/// <para>验证回调通知事件签名。</para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml </para>
/// <para>REF: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_1.shtml </para>
/// </summary>
/// <param name="client"></param>
/// <param name="callbackTimestamp">微信回调通知中的 Wechatpay-Timestamp 字段。</param>
/// <param name="callbackNonce">微信回调通知中的 Wechatpay-Nonce 字段。</param>
/// <param name="callbackBody">微信回调通知中请求正文。</param>
/// <param name="callbackSignature">微信回调通知中的 Wechatpay-Signature 字段。</param>
/// <param name="callbackSignatureType">微信回调通知中的 Wechatpay-Signature-Type 字段。</param>
/// <param name="callbackSerialNumber">微信回调通知中的 Wechatpay-Serial 字段。</param>
/// <param name="error"></param>
/// <returns></returns>
/// <exception cref="ArgumentNullException"></exception>
public static bool VerifyEventSignature ( this WechatTenpayClient client , string callbackTimestamp , string callbackNonce , string callbackBody , string callbackSignature , string callbackSignatureType , string callbackSerialNumber , out Exception ? error )
2021-07-20 01:20:31 +08:00
{
if ( client = = null ) throw new ArgumentNullException ( nameof ( client ) ) ;
if ( callbackTimestamp = = null ) throw new ArgumentNullException ( nameof ( callbackTimestamp ) ) ;
if ( callbackNonce = = null ) throw new ArgumentNullException ( nameof ( callbackNonce ) ) ;
if ( callbackBody = = null ) throw new ArgumentNullException ( nameof ( callbackBody ) ) ;
if ( callbackSignature = = null ) throw new ArgumentNullException ( nameof ( callbackSignature ) ) ;
2022-11-13 23:17:18 +08:00
if ( callbackSignatureType = = null ) throw new ArgumentNullException ( nameof ( callbackSignatureType ) ) ;
2021-07-20 01:20:31 +08:00
if ( callbackSerialNumber = = null ) throw new ArgumentNullException ( nameof ( callbackSerialNumber ) ) ;
2022-11-13 23:17:18 +08:00
bool ret = WechatTenpayClientSignExtensions . VerifySignature (
client ,
strTimestamp : callbackTimestamp ,
strNonce : callbackNonce ,
strContent : callbackBody ,
strSignature : callbackSignature ,
strSignatureScheme : callbackSignatureType ,
strSerialNumber : callbackSerialNumber ,
out error
) ;
2022-05-09 19:28:47 +08:00
if ( error ! = null )
2022-11-13 23:17:18 +08:00
{
2022-05-09 19:28:47 +08:00
error = new Exceptions . WechatTenpayEventVerificationException ( "Verify signature of event failed. Please see the `InnerException` for more details." , error ) ;
2022-11-13 23:17:18 +08:00
}
2022-05-09 19:28:47 +08:00
return ret ;
2021-07-20 01:20:31 +08:00
}
}
}