我正在尝试在本地环境中测试Paypal Webhooks;具体来说,当用户取消订阅时,我现在正在向自己(管理员)发送电子邮件。
我正在使用ngrok生成一个URL(类似于https://d044ce9878a1.ngrok.io
)来公开我的本地站点;在我的Paypal开发人员帐户中,我已将https://d044ce9878a1.ngrok.io?paypal_listener
与我的应用程序相关联。
这是我编写的用于处理Webhooks的类:
<?php
namespace memberships;
use Exception;
use mailer\NotifyAdmin;
class Webhooks {
/**
* Listens to Paypal's webhooks
*/
public function __construct() {
// Bail out if the incoming request isn't marked with the "paypal_listener" param
if( ! isset( $_GET[ "paypal_listener" ] ) ) {
return;
}
// Prepare to send an email to the administrator
$this->NotifyAdmin = new NotifyAdmin();
// Get the incoming webhook
$input = file_get_contents( "php://input" );
$data = json_decode( $input );
switch( $data->event_type ) {
case "BILLING.SUBSCRIPTION.CANCELLED":
$this->on_subscription_canceled( $data );
break;
}
}
/**
* Sends an email to the user confirming that their subscription was canceled
*/
private function on_subscription_canceled( $data ) {
// For testing purposes, I'm sending an email to the administrator as if an error occurred
$this->NotifyAdmin->setErrMessage( "The webhook worked!" );
$this->NotifyAdmin->send_email();
}
}
如果我模拟通过开发人员仪表板发送Webhook事件,则代码有效,并且成功发送给管理员的电子邮件是消息"The webhook worked!"
。
在本地,我的(响应)应用程序位于localhost:3000
。我使用沙盒用户帐户进行注册并创建Paypal订阅;一切正常,如果我登录到沙盒Paypal仪表板,我可以看到订阅已成功创建并处于活动状态。如果我从贝宝(Paypal)仪表板上取消了订阅,则订阅已成功取消,但是网络挂钩不起作用-我没有收到"The webhook worked!"
电子邮件。同样,如果我从我的应用程序(而不是从Paypal仪表板)取消订阅,则该订阅已成功取消,但是webhook无效。
所以问题是,一旦我确认Paypal可以将通知发送到https://d044ce9878a1.ngrok.io?paypal_listener
(因为webhook模拟器可以正常工作),其他所有功能都应该正常工作吗?或者我错过了其他额外的步骤吗?