我目前正在从事一个涉及使用支付网关的项目。iframe用于保存付款网关。通过发送以下POST可以检索iframe的网址。
ResponseBody b = new ResponseBody();
b.SenderId = ConfigurationManager.AppSettings["SenderId"];
b.Username = ConfigurationManager.AppSettings["PayUsername"];
b.Password = ConfigurationManager.AppSettings["PayPassword"];
b.PaymentSessionProviderReference = transaction.TransactionRef;
b.AmountInCents = Decimal.ToInt32(purchaseDetails.CartTotal * 100);
b.ReturnURL = redirectorLink;
b.BackgroundColor = "#ffffff";
b.InlineFrame = true;
if ((string)Session["Language"] == "en-EN") { b.Language = "EN"; }
client.BaseAddress = new Uri(url);
HttpResponseMessage response = await client.PostAsJsonAsync("PreparePayment", b);
然后,对此帖子的回复将保留指向付款网关的网址,然后在iframe中打开该网址。另外,在此POST中也指定了returnLink,在该位置上,网关将在用户输入其付款明细之后,在iframe中重定向用户。
为了让我确认付款状态以继续工作流,然后我使用returnLink属性中指定的操作方法通过另一个POST请求付款。这样做如下:
GetPaymentModel b = new GetPaymentModel();
b.SenderId = ConfigurationManager.AppSettings["SenderId"];
b.Username = ConfigurationManager.AppSettings["PayUsername"];
b.Password = ConfigurationManager.AppSettings["PayPassword"];
b.PaymentSessionProviderReference = transaction.TransactionRef;
b.MessageId = null;
b.PaymentId = null;
client.BaseAddress = new Uri(url);
HttpResponseMessage response = await client.PostAsJsonAsync("GetPayment", b);
现在这是问题开始的地方。在所有环境中都正确返回了JSON。然后,此JSON将反序列化,如下所示:
string jsonResponse = "";
jsonResponse = await response.Content.ReadAsStringAsync();
AvaLogger.WriteLog(jsonResponse);
//Yet to figure out how to log trace on the test server.
ITraceWriter traceWriter = new MemoryTraceWriter();
paymentDetails = JsonConvert.DeserializeObject<PaymentDetailsModel>(jsonResponse,
new JsonSerializerSettings { TraceWriter = traceWriter, Converters = { new
JavaScriptDateTimeConverter() }}
);
AvaLogger.WriteLog("Information For: " + paymentDetails.paymentSessionProviderReference + ". Host message: " + paymentDetails.hostMessage);
在本地和实时环境上记录此信息时,日志方法记录以下信息:
[24/06/2020 08:38:46] <PaymentResolver>d__12: MoveNext: {"transactionTypeField":0,"authorisationCodeField":"425643","batchNumberField":"","hostCodeField":"000","hostMessageField":"APPROVED","merchantAccountField":"1000","merchantTerminalField":null,"maskedCardNumberField":"444444****4444","detectedCardApplicationField":"VISA","paymentDateField":"2020-06-24T08:38:59","anyField":null,"paymentIdField":153938,"paymentSessionProviderReferenceField":"G2315","paymentStateField":3,"amountInCentsField":2000,"pGDataField":{"paymentGatewayReferenceField":"93177947","emailAddressField":"[email protected]","anyField":null,"PropertyChangedEvent":null},"assignmentsField":[],"PropertyChangedEvent":null}
LogMode: NotSet
UTC TimeStamp: 24/06/2020 06:38:46
[24/06/2020 08:38:46] <PaymentResolver>d__12: MoveNext: Information For: G2315. Host message: APPROVED
LogMode: NotSet
UTC TimeStamp: 24/06/2020 06:38:46
JSON已被完全检索,并且数据已正确反序列化。但是,当涉及到测试环境时,会发生以下情况:
[24/06/2020 09:48:32] <PaymentResolver>d__12: MoveNext: {"transactionTypeField":0,"authorisationCodeField":"316120","batchNumberField":"","hostCodeField":"000","hostMessageField":"APPROVED","merchantAccountField":"1000","merchantTerminalField":null,"maskedCardNumberField":"444444****4444","detectedCardApplicationField":"VISA","paymentDateField":"2020-06-24T09:48:26","anyField":null,"paymentIdField":153949,"paymentSessionProviderReferenceField":"G2333","paymentStateField":3,"amountInCentsField":500,"pGDataField":{"paymentGatewayReferenceField":"93180750","emailAddressField":"[email protected]","anyField":null,"PropertyChangedEvent":null},"assignmentsField":[],"PropertyChangedEvent":null}
LogMode: NotSet
UTC TimeStamp: 24/06/2020 07:48:32
[24/06/2020 09:48:32] <PaymentResolver>d__12: MoveNext: Information For: . Host message:
LogMode: NotSet
UTC TimeStamp: 24/06/2020 07:48:32
JSON仍正确返回。但是,不会对数据进行反序列化。结果,paymentDetails的所有属性(在文章底部显示的PaymentDetailsModel实例)将保持为空。
是否存在某种可能与此混淆的服务器配置?感谢您的阅读,并希望这对您有足够的参考价值!
PS我正在尝试弄清楚如何打印TraceWriter实例的日志,因为在ASP.NET上处理API还是比较陌生的。
以供参考:
PaymentDetailsModel:
public class PaymentDetailsModel
{
[JsonProperty("transactionTypeField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public TransactionTypes transactionType { get; set; }
[JsonProperty("authorisationCodeField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string authorisationCode { get; set; }
[JsonProperty("batchNumberField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string batchNumber { get; set; }
[JsonProperty("hostCodeField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string hostCode{ get; set; }
[JsonProperty("hostMessageField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string hostMessage { get; set; }
[JsonProperty("merchantAccountField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string merchantAccount { get; set; }
[JsonProperty("merchantTerminalField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string merchantTerminal { get; set; }
[JsonProperty("maskedCardNumberField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string maskedCardNumber { get; set; }
[JsonProperty("detectedCardApplicationField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string detectedCardApplication { get; set; }
[JsonProperty("paymentDateField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string paymentDate { get; set; }
[JsonProperty("anyField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public object any { get; set; }
[JsonProperty("paymentIdField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public int paymentId { get; set; }
[JsonProperty("paymentSessionProviderReferenceField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public string paymentSessionProviderReference { get; set; }
[JsonProperty("paymentStateField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public PaymentStates paymentState { get; set; }
[JsonProperty("amountInCentsField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public int amountInCents { get; set; }
[JsonProperty("pGDataField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public PGdataModel pGData { get; set; }
[JsonProperty("assignmentsField", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public object[] assignments { get; set; }
public object PropertyChangedEvent { get; set; }
}
更新:
我创建了一个控制台应用程序,以消除Web应用程序增加的复杂性,并且反序列化对于硬编码JSON字符串和从API检索的JSON都可以正常工作。这是否可以鼓励这可能是IIS配置问题呢?
因此,结果证明Web.config上发生了更改,将Newtonsoft版本从10更改为11,并且对于此……大的面部表情时刻没有引发任何错误。将版本更改为11以与其他环境匹配可以解决此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句