我没有收到贝宝付款通知

Posted

技术标签:

【中文标题】我没有收到贝宝付款通知【英文标题】:I don't get notified by paypal on payments 【发布时间】:2018-06-29 15:26:40 【问题描述】:

我已经为我的 Symfony 应用程序成功设置了 Payum,我已经创建了一个每天定期付款的订阅。

在我的应用程序中,我从未在 payum_notify_do URL 上收到来自 paypal 的单个请求,该 URL 在我的 payum 协议详细信息实体中得到了很好的引用。

在 paypal 沙盒验证器帐户上,我可以看到自订阅以来我每天都收到付款。

为什么我从来没有收到付款通知? Symfony 应用程序和 Payum 错误地认为用户从未付款。

Payum 实际需要什么配置才能接收来自 Paypal 的通知?

我的工作流程是:

    提供订阅详细信息以及要提交的表单 提交表单时:
      使用订阅信息创建协议详细信息实体 从中创建一个捕获令牌 重定向到令牌 URL (paypal)
    从 paypal 回来,我检查协议是否被捕获 我创建了一个定期付款明细实体 我重定向到显示订阅详细信息页面(显示感谢和订阅详细信息等消息)

在步骤 2.1 创建的协议详细信息实体包含以下 JSON 数据:


  "L_BILLINGAGREEMENTDESCRIPTION0": "blah blah blah",
  "PAYMENTREQUEST_0_AMT": "0.00",
  "L_BILLINGTYPE0": "RecurringPayments",
  "NOSHIPPING": 1,
  "PAYMENTREQUEST_0_PAYMENTACTION": "Sale",
  "AUTHORIZE_TOKEN_USERACTION": "commit",
  "RETURNURL": "https://hostname.tld/payum/capture/AAAAA-BBBBB",
  "CANCELURL": "https://hostname.tld/payum/capture/AAAAA-BBBBB?cancelled=1",
  "PAYMENTREQUEST_0_NOTIFYURL": "https://hostname.tld/payum/notifier/AAAAAA-BBBBB",
  "TOKEN": "EC-NNNNNN",
  "TIMESTAMP": "2017-11-20T13:48:58Z",
  "CORRELATIONID": "ZZZZZZ",
  "ACK": "Success",
  "VERSION": "65.1",
  "BUILD": "40680762",
  "BILLINGAGREEMENTACCEPTEDSTATUS": "1",
  "CHECKOUTSTATUS": "PaymentActionNotInitiated",
  "CURRENCYCODE": "USD",
  "AMT": "0.00",
  "SHIPPINGAMT": "0.00",
  "HANDLINGAMT": "0.00",
  "TAXAMT": "0.00",
  "NOTIFYURL": "https://hostname.tld/payum/notifier/XXX-ZZZ",
  "INSURANCEAMT": "0.00",
  "SHIPDISCAMT": "0.00",
  "PAYMENTREQUEST_0_CURRENCYCODE": "USD",
  "PAYMENTREQUEST_0_SHIPPINGAMT": "0.00",
  "PAYMENTREQUEST_0_HANDLINGAMT": "0.00",
  "PAYMENTREQUEST_0_TAXAMT": "0.00",
  "PAYMENTREQUEST_0_INSURANCEAMT": "0.00",
  "PAYMENTREQUEST_0_SHIPDISCAMT": "0.00",
  "PAYMENTREQUEST_0_INSURANCEOPTIONOFFERED": "false",
  "PAYMENTREQUESTINFO_0_ERRORCODE": "0",
  "EMAIL": "XXX-buyer@YYY.com",
  "PAYERID": "XXX",
  "PAYERSTATUS": "verified",
  "FIRSTNAME": "test",
  "LASTNAME": "buyer",
  "COUNTRYCODE": "FR"

服务器日志显示捕获 URL 已通过来自 sandbox.paypal.com 的引用者很好地查询,因此进展顺利。

尽管等待了几个星期并确认在 paypal 端收款(我从 7 欧元/天收取了 400 欧元左右),但我没有发生 paypal 调用通知 URL。

我已确认,如果我用浏览器打开通知 URL,它确实有效。

协议详情的金额确实为零,但我相信这是对订阅的预期:付款为零,然后是与实际订阅的另一个协议。 这是在上面第 4 步创建的实际定期付款详细信息:


  "TOKEN": "EC-NNNNNN",
  "DESC": "blah blah blah",
  "EMAIL": "XXX-buyer@YYY.com",
  "AMT": "6.99",
  "CURRENCYCODE": "EUR",
  "BILLINGFREQUENCY": "1",
  "BILLINGPERIOD": "Day",
  "PROFILESTARTDATE": "2017-11-19T23:00:00Z",
  "PROFILEID": "I-XXXXX",
  "PROFILESTATUS": "ActiveProfile",
  "TIMESTAMP": "2017-11-20T13:49:08Z",
  "CORRELATIONID": "abcdef0123456789",
  "ACK": "Success",
  "VERSION": "65.1",
  "BUILD": "39206242",
  "STATUS": "Active",
  "AUTOBILLOUTAMT": "NoAutoBill",
  "MAXFAILEDPAYMENTS": "0",
  "SUBSCRIBERNAME": "test buyer",
  "NEXTBILLINGDATE": "2017-11-20T10:00:00Z",
  "NUMCYCLESCOMPLETED": "0",
  "NUMCYCLESREMAINING": "0",
  "OUTSTANDINGBALANCE": "0.00",
  "FAILEDPAYMENTCOUNT": "0",
  "TRIALAMTPAID": "0.00",
  "REGULARAMTPAID": "0.00",
  "AGGREGATEAMT": "0.00",
  "AGGREGATEOPTIONALAMT": "0.00",
  "FINALPAYMENTDUEDATE": "1970-01-01T00:00:00Z",
  "TOTALBILLINGCYCLES": "0",
  "SHIPPINGAMT": "0.00",
  "TAXAMT": "0.00",
  "REGULARBILLINGPERIOD": "Day",
  "REGULARBILLINGFREQUENCY": "1",
  "REGULARTOTALBILLINGCYCLES": "0",
  "REGULARCURRENCYCODE": "EUR",
  "REGULARAMT": "6.99",
  "REGULARSHIPPINGAMT": "0.00",
  "REGULARTAXAMT": "0.00"

所以一切看起来都很虚无缥缈,但我没有来自 PayPal 的付款通知信息。


在阅读了所有这些内容和docs 之后,我注意到在定期付款后,我直接重定向到订阅页面,而不是通过令牌重定向。我因此替换了这个:

return $this->redirect($this->generateUrl('subscription_show', [
    'gatewayName' => $token->getGatewayName(),
    'billingAgreementId' => $agreement->getId(),
    'recurringPaymentId' => $payment->getId(),
]));

与:

$doneToken = $payum->getTokenFactory()
                   ->createToken('paypal', $payment, 'subscription_show', [
                       'gatewayName' => $token->getGatewayName(),
                       'billingAgreementId' => $agreement->getId(),
                       'recurringPaymentId' => $payment->getId(),
                   ]);

return $this->redirect($doneToken->getTargetUrl());

让我们在几天后看看这是否有效。


48 小时后,尽管 PayPal 活动仪表板上每天都有定期付款,但仍然没有通知。

我可以在日志中看到我去了两次贝宝(基于推荐人),所以一次是在付款详细信息之后,一次是在定期付款之后(这导致直接返回我的网站,而贝宝上没有任何 UI,与首先明确要求确认)。

我不知道我做错了什么。

【问题讨论】:

【参考方案1】:

我有 found out 说 PayPal 不使用通知 URL 进行定期付款。

见:How to set an IPN URL for PayPal Recurring Payments using ExpressCheckout?

所以,我需要做的是自己在静态 IPN URL 上处理 IPN。

我是这样做的:

添加paypal-ipn依赖 在我的控制器上添加一条新路由以接收来自 PayPal 的所有 IPN

然后,在收到 IPN 时:

使用新的依赖项验证 IPN 对定期付款执行 Sync(将调用 PayPal 上的 GetRecurringPaymentsProfileDetails API 端点) 在数据库中保存更新的模型 如果txn_typerecurring_payment_profile_created,则向客户发送购买确认邮件 如果 txn_typerecurring_payment,则创建发票并将其通过电子邮件发送给客户 返回 204

【讨论】:

以上是关于我没有收到贝宝付款通知的主要内容,如果未能解决你的问题,请参考以下文章

未收到贝宝 webhook 通知

贝宝沙箱 IPN 通知 url 没有响应

贝宝支付流专业通知网址

贝宝试用定期付款未开始

等待 Paypal 付款通知 ASP.NET

Paypal 没有收到付款