public async Task <PaymentResponse> CreateAsync(PaymentRequest request) { var key = Convert.FromBase64String(_options.JdPay.Key); SettleObject inputObj = new SortedDictionary <string, object>(); inputObj.SetValue("version", "V2.0"); inputObj.SetValue("merchant", _options.JdPay.Merchant); inputObj.SetValue("tradeNum", request.OrderId); inputObj.SetValue("tradeName", request.Subject); inputObj.SetValue("tradeTime", DateTime.Now.ToString("yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo)); inputObj.SetValue("amount", request.Amount.ToString()); inputObj.SetValue("orderType", "1"); inputObj.SetValue("currency", "CNY"); inputObj.SetValue("callbackUrl", _options.ShowUrl); inputObj.SetValue("notifyUrl", _options.JdPay.PayNotifyUrl); inputObj.SetValue("userId", request.OpenId); inputObj.SetValue("sign", MakeSign(inputObj)); var signedData = inputObj.GetValues().ToDictionary(x => x.Key, x => x.Value); await Task.Run(() => { foreach (var obj in signedData) { if (obj.Key == "version" || obj.Key == "merchant" || obj.Key == "sign") { continue; } inputObj.SetValue(obj.Key, SecretUtil.Des3EncryptEcb(key, obj.Value.ToString())); } }); var res = new PaymentResponse(request.OrderId) { Url = _options.JdPay.Gateway, Data = inputObj.ToUrl() }; return(res); }