问题
访问商户订单号查询订单
一直提示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