public Task <T> PageExecuteAsync <T>(IJDPayRequest <T> request, string reqMethod) where T : JDPayResponse { // 字典排序 var sortedTxtParams = new JDPayDictionary(request.GetParameters()); var encyptParams = BuildEncryptDic(request, sortedTxtParams); var rsp = Activator.CreateInstance <T>(); var url = request.GetRequestUrl(); if (reqMethod == "GET") { //拼接get请求的url var tmpUrl = url; if (encyptParams != null && encyptParams.Count > 0) { if (tmpUrl.Contains("?")) { tmpUrl = tmpUrl + "&" + HttpClientEx.BuildQuery(encyptParams); } else { tmpUrl = tmpUrl + "?" + HttpClientEx.BuildQuery(encyptParams); } } rsp.Body = tmpUrl; } else { //输出post表单 rsp.Body = BuildHtmlRequest(url, encyptParams); } return(Task.FromResult(rsp)); }
public async Task <T> ExecuteAsync <T>(IJDPayRequest <T> request) where T : JDPayResponse { // 字典排序 var sortedTxtParams = new JDPayDictionary(request.GetParameters()); var content = BuildEncryptXml(request, sortedTxtParams); Logger?.LogTrace(0, "Request:{content}", content); using (var client = ClientFactory.CreateClient(JDPayOptions.DefaultClientName)) { var body = await HttpClientUtility.DoPostAsync(client, request.GetRequestUrl(), content); Logger?.LogTrace(1, "Response:{content}", body); var parser = new JDPayXmlParser <T>(); var rsp = parser.Parse(JDPayUtility.FotmatXmlString(body)); if (!string.IsNullOrEmpty(rsp.Encrypt)) { var encrypt = rsp.Encrypt; var base64EncryptStr = Encoding.UTF8.GetString(Convert.FromBase64String(encrypt)); var reqBody = JDPaySecurity.DecryptECB(base64EncryptStr, Options.DesKeyBase64); Logger?.LogTrace(2, "Encrypt Content:{body}", reqBody); var reqBodyDoc = new XmlDocument() { XmlResolver = null }; reqBodyDoc.LoadXml(reqBody); var sign = JDPayUtility.GetValue(reqBodyDoc, "sign"); var rootNode = reqBodyDoc.SelectSingleNode("jdpay"); var signNode = rootNode.SelectSingleNode("sign"); rootNode.RemoveChild(signNode); var reqBodyStr = JDPayUtility.ConvertXmlToString(reqBodyDoc); var xmlh = rsp.Body.Substring(0, rsp.Body.IndexOf("<jdpay>")); if (!string.IsNullOrEmpty(xmlh)) { reqBodyStr = reqBodyStr.Replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", xmlh); } var sha256SourceSignString = SHA256.Compute(reqBodyStr); var decryptByte = RSA_ECB_PKCS1Padding.Decrypt(Convert.FromBase64String(sign), Options.PublicKey); var decryptStr = JDPaySecurity.BytesToString(decryptByte); if (sha256SourceSignString == decryptStr) { rsp = parser.Parse(reqBody); rsp.Encrypt = encrypt; } else { throw new Exception("sign check fail: check Sign and Data Fail!"); } } return(rsp); } }
public Task <T> PageExecuteAsync <T>(IJDPayRequest <T> request) where T : JDPayResponse { // 字典排序 var sortedTxtParams = new JDPayDictionary(request.GetParameters()); var encyptParams = BuildEncryptDic(request, sortedTxtParams); var rsp = Activator.CreateInstance <T>(); var url = request.GetRequestUrl(); //输出post表单 rsp.Body = BuildHtmlRequest(url, encyptParams); return(Task.FromResult(rsp)); }
private string BuildHtmlRequest <T>(IJDPayRequest <T> request, IDictionary <string, string> parameters) where T : JDPayResponse { var sb = new StringBuilder(); sb.Append("<form id='submit' name='submit' action='" + request.GetRequestUrl() + "' method='post' style='display:none;'>"); foreach (var iter in parameters) { if (!string.IsNullOrEmpty(iter.Value)) { sb.Append("<input name='" + iter.Key + "' value='" + iter.Value + "'/>"); } } sb.Append("<input type='submit' style='display:none;'></form>"); sb.Append("<script>document.forms['submit'].submit();</script>"); return(sb.ToString()); }