微信支付Authorization参数添加

问题

访问商户订单号查询订单一直提示Authorization不合法
在这里插入图片描述

解决

必须要设置好Authorization

/// <summary>
/// 根据订单编号判断订单支付支付
/// </summary>
/// <param name="orderNumber"></param>
/// <returns>
/// SUCCESS:支付成功
/// REFUND:转入退款
/// NOTPAY:未支付
/// CLOSED:已关闭
/// REVOKED:已撤销(仅付款码支付会返回)
/// USERPAYING:用户支付中(仅付款码支付会返回)
/// PAYERROR:支付失败(仅付款码支付会返回)
/// </returns>
public async Task<(bool isSuccess, string payStatus, string errMsg, string transactionId)> ExecuteGetPayTransactionByOutTradeNumberAsync(
    string orderNumber)
{
    var client = this.Client;
    var merchantId = client.Credentials.MerchantId;
    var baseUrl = "https://api.mch.weixin.qq.com";
    var url = $"/v3/pay/transactions/out-trade-no/{orderNumber}?mchid={merchantId}";
    var auth = await BuildAuthAsync("GET","",url);
    url = $"{baseUrl}{url}";
    try
    {
        var authToken = $"WECHATPAY2-SHA256-RSA2048 {auth}";
        var response = await url
            .WithHeaders(new
            {
                Authorization = authToken,
                Accept = "application/json",
                User_Agent =
                    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36"
            })
            .GetAsync();
        if (response.StatusCode == 200)
        {
            var jsonData = await response.GetStringAsync();
            var res = JsonConvert.DeserializeObject<GetPayTransactionByOutTradeNumberResponse>(jsonData);
            return (true, res.TradeState, string.Empty, res.TransactionId);
        }
    }
    catch (FlurlHttpException ex)
    {
        //获取原始字符串,支持类型多
        var errDetail = await ex.GetResponseStringAsync();
        return (false, string.Empty, errDetail, string.Empty);
    }
    catch (Exception ex)
    {
        return (false, string.Empty, ex.Message, string.Empty);
    }
    return (false, string.Empty, "出错了", string.Empty);
}


public WechatTenpayClient Client{ get; private set; }

/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="wechatConfig"></param>
public WeChatPayClientV1(IOptions<WeChatPayConfigModel> wechatConfig, ICertificateManager manager)
{
    var primaryKey = System.IO.File.ReadAllText("apiclient_key.pem");
    var certTxt = System.IO.File.ReadAllText("apiclient_cert.pem");
    string serialNumber = RSAUtility.ExportSerialNumberFromCertificate(certTxt);
    var options = new WechatTenpayClientOptions()
    {
        MerchantId = wechatConfig.Value.Mchid,
        MerchantV3Secret = wechatConfig.Value.Apiv3Key,
        MerchantCertificateSerialNumber = serialNumber,
        MerchantCertificatePrivateKey = primaryKey,
        PlatformCertificateManager = manager // 证书管理器的具体用法请参阅下文的高级技巧与加密、验签有关的章节
    };
    Instance = new WechatTenpayClient(options);
}

/// <summary>
/// 构造签名串
/// </summary>
/// <param name="method">HTTP请求方式(全大写)</param>
/// <param name="body">API接口请求参数的json字符串</param>
/// <param name="uri">API接口的相对路径</param>
/// <returns></returns>
public async Task<string> BuildAuthAsync(string method, string body, string uri)
{
    var client = this.Instance;
    var merchantId = client.Credentials.MerchantId;
    var serialNo = client.Credentials.MerchantCertificateSerialNumber;
    var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
    string nonce = Path.GetRandomFileName();
    string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";
    string signature = RequestSign(message,merchantId);
   
    return $"mchid=\"{merchantId}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{serialNo}\",signature=\"{signature}\"";
}

/// <summary>
/// 生成签名
/// </summary>
/// <param name="message"></param>
/// <param name="mchid"></param>
/// <returns></returns>
protected string RequestSign(string message,string mchid)
{
    //加载证书 _apiCertPath API证书物理路径 _certPwd API证书密码(默认是商户号)
    X509Certificate2 cer = new X509Certificate2("apiclient_cert.p12", mchid, X509KeyStorageFlags.Exportable);
    if (cer != null)
    {
        RSA rsa = cer.GetRSAPrivateKey();//获取私钥
        //查看在不同平台上的具体类型
        byte[] data = Encoding.UTF8.GetBytes(message);
        return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
    }
    else
    {
        return "";
    }
}

参考

https://blog.csdn.net/qq_43005276/article/details/134924576
https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-generation.html
https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat
https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat/blob/main/docs/WechatTenpayV3/Basic_RequestSensitiveDataEncryption.md

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值