【问题标题】:Pay with Amazon behaving async使用亚马逊支付异步行为
【发布时间】:2016-02-18 00:43:27
【问题描述】:

我已将 Pay with Amazon 与我的 Web 应用程序集成,但我确定只有在我逐步完成代码调试时才能捕获资金,如果我没有断点则不会发生。对我来说,这表明暂停是必要的。我正在使用定期付款。相关部分代码如下:

...
//make checkout object
AmazonAutomaticSimpleCheckout asc = new AmazonAutomaticSimpleCheckout(billingAgreeementId);

//capture
CaptureResponse cr = asc.Capture(authId, amount, 1);

//check if capture was successful
if (cr.CaptureResult.CaptureDetails.CaptureStatus.State == PaymentStatus.COMPLETED)
{
     ...
     //give the user the things they paid for in the database
     ...

     return "success";
}
...

所以,如果我在//capture 下的捕获行有一个断点,那么该函数将返回成功。如果我没有断点,我会收到关于以下 if 语句的运行时异常System.NullReferenceException: Object reference not set to an instance of an object.

对我来说,这意味着我应该能够等待捕获方法。

另请注意,capture(...) 方法正在调用 CaptureAction(...) 方法,就像 C# 示例一样。

//Invoke the Capture method
public CaptureResponse Capture(string authId, string captureAmount, int indicator)
{
    return CaptureAction(propertiesCollection, service, authId, captureAmount, billingAgreementId, indicator, null, null);
}

我如何等待capture 电话?是不是忘记传递参数来指示它应该立即执行操作?

【问题讨论】:

  • 只是快速阅读一些 API 示例,看起来您应该等待长达 60 秒的响应。当详细信息可用时,看起来确实设置了某种标志。你看过样本吗?
  • 我浏览了样本。我希望我可以等待捕获(正如你所说,最多 60 秒)。我只是不明白如何做到这一点,因为它不是标准的 C# 异步函数。

标签: c# amazon-pay


【解决方案1】:

似乎经过一些实验,一个函数基本上可以实现我使用断点手动执行的等待是函数CheckAuthorizationStatus(),它也在文档提供的 C# 示例中。

所以固定代码只是在调用capture() 方法之前添加CheckAuthorizationStatus()CheckAuthorizationStatus() 显然会循环,直到授权状态​​发生变化。这对我来说似乎有点笨拙,但据我所知,这似乎是使用 Amazon API 支付的方式。更正代码如下:

//make checkout object
AmazonAutomaticSimpleCheckout asc = new AmazonAutomaticSimpleCheckout(billingAgreeementId);

//capture
CaptureResponse cr;

GetAuthorizationDetailsResponse gadr = asc.CheckAuthorizationStatus(authId);

cr = asc.Capture(authId, amount, 1);

//gadr = asc.CheckAuthorizationStatus(authId);

//check if capture was succeddful
if (cr.CaptureResult.CaptureDetails.CaptureStatus.State == PaymentStatus.COMPLETED)
{
     ...

     return "success";
 }

【讨论】:

  • 如果您认为它可以解决问题,请随时将其标记为答案,这里没有禁止回答您自己的问题的规定。
  • 好的,听起来不错。我将把它打开一段时间,希望其他人有更好的答案,因为我不完全理解它。谢谢!
【解决方案2】:

当使用asynchronous 模式时,您通常会依赖几种处理方式。 AuthorizeOnBillingAgreement 的结果将返回一个亚马逊授权 ID(例如 P01-1234567-1234567-A000001)。获得授权 ID 后,您可以:

  1. 投票GetAuthorizationDetails - 这将返回包含授权“状态”的授权详细信息。当状态为“打开”时,您可以进行 Capture API 调用,并传入授权 ID。

  2. 等待Instant Payment Notification (IPN)。如果您有 IPN 处理程序,您可以监视它并按照步骤 1 中的说明进行捕获 API 调用。IPN 通常在 60 秒内发送,它将具有最终处理状态(打开或拒绝)。

您不应添加任意暂停。在进行捕获之前,您应该始终检查授权状态。即使付款状态已完成,您仍然需要检查状态。

【讨论】:

    【解决方案3】:

    免责声明:

    实施经常性付款,只是简单的付款 - 尽管只是阅读它似乎相似或至少有类似的文档synchronous option

    因为符合我的要求,所以我选择了同步流程。本质上把它当作一个“支付网关”——给我“现在”的结果,我会处理任何结果。

    此外,AUTHCAPTURE 一步到位 - 同样,这是基于个人的操作要求。

    两个相关的项目是:

    • CaptureNow=true
    • TransactionTimeout=0

      零值总是返回同步的打开或拒绝

    你会得到(同步):

    • AuthorizeResult.AuthorizationDetails 将有
      • AmazonAuthorizationIdAuthorizationAmount
    • AuthorizeResult.AuthorizationDetails.IdList
      • null 失败
      • 否则它将包含捕获 id(如果捕获成功)
        AuthorizeResult.AuthorizationDetails.IdList.member - 我只看到它包含 1 项(CaptureId

    然后你可以使用CaptureId调用GetCaptureDetails,解析GetCaptureDetailsResponse后做你需要做的事情

    同样,以上基于Payments API 流(不是经常性付款/计费协议),所以我希望它至少可以帮助/为您提供测试同步选项的途径/想法。

    【讨论】:

      猜你喜欢
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多