Php 如何使用paypal webhooks处理多个环境:开发、登台和生产?

Php 如何使用paypal webhooks处理多个环境:开发、登台和生产?,php,paypal,webhooks,payment,Php,Paypal,Webhooks,Payment,我想有三个环境,在那里我可以测试和使用贝宝网络钩子。我目前的方法是为paypal开发者门户中的每个环境创建新的webhook,当请求到达时,检查它是否适用于该环境。paypal如何处理多个webhook URL?如果环境不正确,应返回什么状态代码?在我们的一个项目中,我们根据环境使用不同的配置变量 对于开发人员 $config['paypal.settings'] = array( 'mode'=> "sandbox", //'live' or 'san

我想有三个环境,在那里我可以测试和使用贝宝网络钩子。我目前的方法是为paypal开发者门户中的每个环境创建新的webhook,当请求到达时,检查它是否适用于该环境。paypal如何处理多个webhook URL?如果环境不正确,应返回什么状态代码?

在我们的一个项目中,我们根据环境使用不同的配置变量

对于开发人员

$config['paypal.settings'] = array(
        'mode'=> "sandbox", //'live' or 'sandbox'(default)
        'clientID'=>"CLIENT_ID_FOR_DEV" ,
        'secret'=> "SUPERSECRETCLIENT_SECRET_FOR_DEV" ,
        'currency'=>'EUR',
        'logEnabled' => false,
        'logDir'=>__DIR__ . '/../logs'
);
对于prod:

$config['paypal.settings'] = array(
        'mode'=> "live", 
        'clientID'=>"CLIENT_ID_FOR_PROD" ,
        'secret'=> "SUPERSECRETCLIENT_SECRET_FOR_PROD" ,
        'currency'=>'EUR',
        'logEnabled' => false,
        'logDir'=>__DIR__ . '/../logs'
);
显然,我们的开发和产品环境位于两个不同的域上,这两个域是为paypal界面上的每个客户端ID配置的

在Paypal调用的webhook控制器中,我们有:

class WebhookController{
  function paypalPingBackAction($request){
      $paypalSettings = //get paypal settings
      $isLive = ($paypalSettings["sandbox"] ?? "sandbox") == "live";

      $currentDomain = $request->getDomain();

     // now we have enough information (domain and sandbox)
     // to do things accordingly

  }
}


Paypal并不真正关心您发回的代码。但如果你发送了500,他会稍后重试。所以,如果一切顺利,可能只需返回一个空的
201 accepted

创建一个如下所示的类,将其保留在应用程序的开头。让它初始化一次

class App {
    private static $env_status = null;
    private static $paypal_settings = [];

    const ENV_PRODUCTION = "production";
    const ENV_STAGING = "staging";
    const ENV_DEV = "development";

    public static function init() {
        // Set environment status.  
        // You can also parse domain name and depending on your domain, you can set the environment status.
        self::$env_status = getenv("ENV_STATUS");   // getenv() Gets from Environment variable. You'll need set clear_env = no in php config for this to work.

        switch(self::$env_status) {
            case App::ENV_PRODUCTION:
                self::$paypal_settings = [
                    "mode" => "live"
                    "clientID" => "PRODUCTION_CLIENT_ID" ,
                    "secret" => "PRODUCTION_SECRET" ,
                    "currency" => "USD",
                    "webhook" => "https://example.com/live_webhook_endpoint"
                ];

                break;

            case App::ENV_STAGING:
                self::$paypal_settings = [
                    "mode"=> "sandbox"
                    "clientID"=> "STAGING_CLIENT_ID" ,
                    "secret"=> "STAGING_SECRET" ,
                    "currency"=> "USD",
                    "webhook" => "https://example.com/staging_webhook_endpoint"
                ];

                break;

            default:
                // ENV_DEV settings
                self::$paypal_settings = [
                    "mode"=> "sandbox"
                    "clientID"=> "DEVELOPMENT_CLIENT_ID" ,
                    "secret"=> "DEVELOPMENT_SECRET" ,
                    "currency"=> "USD",
                    "webhook" => "https://example.com/development_webhook_endpoint"
                ];
                break;
        }
    }

    public static function env_status() {
        return self::$env_status;
    }

    public static function paypal_settings() {
        return self::$paypal_settings;
    }

    // You can also create seprate function if you just want webhook URL. 
    // You can define in different variable also if that's the case.
    public static function paypal_webhook_url() {
        return self::$paypal_settings['webhook'];
    }

} App::init();
然后,无论何时您想要获得paypal设置,您都可以在应用程序中的任何位置调用它

$paypay_settings = App::paypal_settings();
或者,如果您只需要paypal webhook URL

$paypal_webhook_url = App::paypal_webhook_url();
这样,您就不必在代码的其他部分保留任何条件。所有条件都将放在一个地方,以后更容易更新

paypal如何处理多个webhook URL。 您将需要点击PayPal沙盒URL,才能在登台/开发环境中点击

如果环境不正确,应返回什么状态代码? HTTP 400。因为这将是一个无效的请求

参考:

超文本传输协议(HTTP)400错误请求-响应状态代码表示服务器无法或不会处理该请求,原因是被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由)


如果您使用版本控制系统,请注意不要将您的生产机密提交到存储库中,因为恶意的google搜索可能会暴露这些机密,并反过来被用于访问您的paypal帐户。同意。应从环境变量加载所有凭据。以上只是一个关于如何实现不同环境的示例。