亚马逊支付行为异步

Pay with Amazon behaving async

我已将 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下的捕获行有一个断点,那么函数returns就成功了。如果我没有断点,我会得到关于以下 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 电话?我是不是忘记传一个参数,表示应该立即执行操作?

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

所以固定代码只是在调用capture()方法之前添加CheckAuthorizationStatus()CheckAuthorizationStatus() 显然会循环,直到授权状态​​发生变化。这对我来说似乎有些笨拙,但据我所知,这似乎是 Pay with 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";
 }

使用 asynchronous mode you will typically rely on a couple of ways of handling it. The result of AuthorizeOnBillingAgreement 时将 return 亚马逊授权 ID(例如 P01-1234567-1234567-A000001)。获得授权 ID 后,您可以:

  1. Poll GetAuthorizationDetails - This will return the authorization details which will contain the "State" of the authorization. When the state is "Open" you can then make the Capture API调用传入授权Id.

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

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

免责声明:

实施经常性付款,只是直接付款 - 尽管只是阅读文档似乎类似或者至少有一个synchronous option.

因为符合我的要求,所以我选择了同步流程。从本质上讲,将其视为 "payment gateway" - 将结果 "now" 给我,我将处理任何结果。

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

2 个相关项目是:

  • CaptureNow=true
  • TransactionTimeout=0

    A value of zero always returns a synchronous Open or Declined

您将获得(同步):

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

然后您可以使用 CaptureId 调用 GetCaptureDetails 并在解析 GetCaptureDetailsResponse

后执行您需要执行的操作

同样,以上是基于Payments API流程(不是循环Payments/Billing协议)所以我希望至少helps/gives你avenue/idea 用于测试同步选项。