Php 如何使用paypal webhooks处理多个环境:开发、登台和生产?
我想有三个环境,在那里我可以测试和使用贝宝网络钩子。我目前的方法是为paypal开发者门户中的每个环境创建新的webhook,当请求到达时,检查它是否适用于该环境。paypal如何处理多个webhook URL?如果环境不正确,应返回什么状态代码?在我们的一个项目中,我们根据环境使用不同的配置变量 对于开发人员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
$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帐户。同意。应从环境变量加载所有凭据。以上只是一个关于如何实现不同环境的示例。