我没有收到 paypal 付款通知
I don't get notified by paypal on payments
我已经为我的 Symfony 应用程序成功设置了 Payum,我已经创建了一个每天定期付款的订阅。
在我的申请中,我从未在 payum_notify_do
URL 上收到来自 paypal 的单一请求,这在我的 payum 协议详细信息实体中有很好的引用。
在paypal sandbox验证器账户上,我可以看到自订阅以来我每天都收到一笔付款。
为什么我从来没有收到付款通知? 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 方面收了钱,但我没有收到 paypal 调用的通知 URL(我从一个收款人那里收了大约 400 欧元) 7 欧元/天)。
我已经确认如果我用浏览器打开通知 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 activity 仪表板上每天都有定期付款,但仍然没有通知。
我可以在日志中看到我去了 paypal 两次(基于推荐人)所以一次是在付款细节之后,一次是在经常性付款之后(直接返回我的网站,没有任何 UI在 paypal 上,与第一个明确要求确认的相反。
我不知道我做错了什么。
我 found out PayPal 不使用通知 URL 进行定期付款。
参见:How to set an IPN URL for PayPal Recurring Payments using ExpressCheckout?
所以,我需要做的是在静态 IPN 上自己处理 IPN URL。
我是这样做的:
- 添加 paypal-ipn 依赖
- 在我的控制器上添加一条新路由以接收来自 PayPal 的所有 IPN
然后,当收到 IPN 时:
- 使用新依赖项验证 IPN
- 对定期付款执行
Sync
(将调用 PayPal 上的 GetRecurringPaymentsProfileDetails
API 端点)
- 将更新后的模型保存到数据库中
- 如果
txn_type
是 recurring_payment_profile_created
,则向客户发送购买确认电子邮件
- 如果
txn_type
是 recurring_payment
,则创建发票并将其通过电子邮件发送给客户
- return 204
我已经为我的 Symfony 应用程序成功设置了 Payum,我已经创建了一个每天定期付款的订阅。
在我的申请中,我从未在 payum_notify_do
URL 上收到来自 paypal 的单一请求,这在我的 payum 协议详细信息实体中有很好的引用。
在paypal sandbox验证器账户上,我可以看到自订阅以来我每天都收到一笔付款。
为什么我从来没有收到付款通知? 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 方面收了钱,但我没有收到 paypal 调用的通知 URL(我从一个收款人那里收了大约 400 欧元) 7 欧元/天)。
我已经确认如果我用浏览器打开通知 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 activity 仪表板上每天都有定期付款,但仍然没有通知。
我可以在日志中看到我去了 paypal 两次(基于推荐人)所以一次是在付款细节之后,一次是在经常性付款之后(直接返回我的网站,没有任何 UI在 paypal 上,与第一个明确要求确认的相反。
我不知道我做错了什么。
我 found out PayPal 不使用通知 URL 进行定期付款。
参见:How to set an IPN URL for PayPal Recurring Payments using ExpressCheckout?
所以,我需要做的是在静态 IPN 上自己处理 IPN URL。
我是这样做的:
- 添加 paypal-ipn 依赖
- 在我的控制器上添加一条新路由以接收来自 PayPal 的所有 IPN
然后,当收到 IPN 时:
- 使用新依赖项验证 IPN
- 对定期付款执行
Sync
(将调用 PayPal 上的GetRecurringPaymentsProfileDetails
API 端点) - 将更新后的模型保存到数据库中
- 如果
txn_type
是recurring_payment_profile_created
,则向客户发送购买确认电子邮件 - 如果
txn_type
是recurring_payment
,则创建发票并将其通过电子邮件发送给客户 - return 204