private JDPayDictionary BuildEncryptDic <T>(IJDPayRequest <T> request, IDictionary <string, string> dictionary, JDPayOptions options) where T : JDPayResponse { var signDic = new JDPayDictionary(dictionary) { { JDPayContants.VERSION, request.GetApiVersion() }, { JDPayContants.MERCHANT, options.Merchant } }; var signContent = JDPaySecurity.GetSignContent(signDic); var sign = JDPaySecurity.RSASign(signContent, options.PrivateKey); var encyptDic = new JDPayDictionary { { JDPayContants.VERSION, request.GetApiVersion() }, { JDPayContants.MERCHANT, options.Merchant }, { JDPayContants.SIGN, sign } }; foreach (var iter in dictionary) { if (!string.IsNullOrEmpty(iter.Value)) { encyptDic.Add(iter.Key, JDPaySecurity.EncryptECB(iter.Value, options.DesKeyBase64)); } } return(encyptDic); }
private JDPayDictionary BuildEncryptDic <T>(IJDPayRequest <T> request, IDictionary <string, string> parameters) where T : JDPayResponse { var signDic = new JDPayDictionary(parameters) { { VERSION, request.GetApiVersion() }, { MERCHANT, Options.Merchant }, }; var signContent = JDPaySecurity.GetSignContent(signDic); var sign = JDPaySecurity.RSASign(signContent, PrivateKey); var encyptDic = new JDPayDictionary { { VERSION, request.GetApiVersion() }, { MERCHANT, Options.Merchant }, { SIGN, sign } }; foreach (var iter in parameters) { if (!string.IsNullOrEmpty(iter.Value)) { encyptDic.Add(iter.Key, JDPaySecurity.EncryptECB(iter.Value, DesKey)); } } return(encyptDic); }
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>(); //输出post表单 rsp.Body = BuildHtmlRequest(request, encyptParams); return(Task.FromResult(rsp)); }
public Task <T> PageExecuteAsync <T>(IJDPayRequest <T> request, string optionsName) where T : JDPayResponse { var options = string.IsNullOrEmpty(optionsName) ? _optionsSnapshotAccessor.Value : _optionsSnapshotAccessor.Get(optionsName); // 字典排序 var sortedTxtParams = new JDPayDictionary(request.GetParameters()); var encyptParams = BuildEncryptDic(request, sortedTxtParams, options); var rsp = Activator.CreateInstance <T>(); //输出post表单 rsp.Body = BuildHtmlRequest(request, 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()); }
private string BuildEncryptXml <T>(IJDPayRequest <T> request, JDPayDictionary dic) where T : JDPayResponse { var xmldoc = JDPayUtility.SortedDictionary2AllXml(dic); var smlStr = JDPayUtility.ConvertXmlToString(xmldoc); var sha256SourceSignString = SHA256.Compute(smlStr); var encyptBytes = RSA_ECB_PKCS1Padding.Encrypt(Encoding.UTF8.GetBytes(sha256SourceSignString), PrivateKey); var sign = Convert.ToBase64String(encyptBytes, Base64FormattingOptions.InsertLineBreaks); var data = smlStr.Replace("</jdpay>", "<sign>" + sign + "</sign></jdpay>"); var encrypt = JDPaySecurity.EncryptECB(data, DesKey); // 字典排序 var reqdic = new JDPayDictionary { { VERSION, request.GetApiVersion() }, { MERCHANT, Options.Merchant }, { ENCRYPT, Convert.ToBase64String(Encoding.UTF8.GetBytes(encrypt)) } }; return(JDPayUtility.SortedDictionary2XmlStr(reqdic)); }
public async Task <T> ExecuteAsync <T>(IJDPayRequest <T> request) where T : JDPayResponse { return(await ExecuteAsync(request, null)); }
public Task <T> PageExecuteAsync <T>(IJDPayRequest <T> request) where T : JDPayResponse { return(PageExecuteAsync(request, null)); }