pay/plugins/paypal/inc/PayPalClient.php
2025-11-28 10:08:12 +08:00

119 lines
4.0 KiB
PHP

<?php
class PayPalClient
{
private static $api_url = [
0 => 'https://api-m.paypal.com',
1 => 'https://api-m.sandbox.paypal.com',
];
private $gateway_url;
private $client_id;
private $client_secret;
private $access_token;
public function __construct($client_id, $client_secret, $mode)
{
$this->gateway_url = self::$api_url[$mode];
$this->client_id = $client_id;
$this->client_secret = $client_secret;
$this->access_token = $this->getAccessToken();
}
//获取Token
public function getAccessToken(){
$path = '/v1/oauth2/token';
$post = 'grant_type=client_credentials';
$result = $this->curl($this->gateway_url . $path, $post, true);
$this->access_token = $result['access_token'];
return $this->access_token;
}
//创建订单
public function createOrder($params){
$path = '/v2/checkout/orders';
return $this->curl($this->gateway_url . $path, $params);
}
//支付订单
public function captureOrder($id){
$path = '/v2/checkout/orders/'.$id.'/capture';
return $this->curl($this->gateway_url . $path, '');
}
//查询订单
public function orderDetail($id){
$path = '/v2/checkout/orders/'.$id;
return $this->curl($this->gateway_url . $path);
}
//查询支付
public function paymentDetail($capture_id){
$path = '/v2/payments/captures/'.$capture_id;
return $this->curl($this->gateway_url . $path);
}
//退款
public function refundPayment($capture_id, $params){
$path = '/v2/payments/captures/'.$capture_id.'/refund';
return $this->curl($this->gateway_url . $path, $params);
}
//退款查询
public function refundDetail($refund_id){
$path = '/v2/payments/refunds/'.$refund_id;
return $this->curl($this->gateway_url . $path);
}
private function curl($url, $data = null, $auth = false)
{
$header[] = 'Accept: application/json';
$header[] = 'Content-Type: application/json';
if(!empty($this->access_token))
{
$header[] = 'Authorization: Bearer '.$this->access_token;
}
if($data !== null && is_array($data)){
$data = json_encode($data);
}
$curlVersion = curl_version();
$ua = 'PayPalSDK/PayPal-PHP-SDK 1.14.0 (platform-ver='.PHP_VERSION.'; os='.str_replace(' ', '_', php_uname('s') . ' ' . php_uname('r')).'; machine='.php_uname('m').'; curl='.$curlVersion['version'].')';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
if($data !== null){
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// 获取token
if ($auth) {
curl_setopt($ch, CURLOPT_USERPWD, $this->client_id.':'.$this->client_secret);
}
$response = curl_exec($ch);
if (curl_errno($ch)) {
throw new Exception('curl error: '.curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($response, true);
if($httpCode>=200 && $httpCode<300){
return $result;
}else{
if(isset($result['error_description'])){
throw new Exception('['.$result['error'].']'.$result['error_description']);
}elseif(isset($result['message'])){
throw new Exception('['.$result['name'].']'.$result['message']);
}else{
throw new Exception('返回数据解析失败(httpCode='.$httpCode.')');
}
}
}
}