1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace SalesforceBulkApi\api; |
4
|
|
|
|
5
|
|
|
use SalesforceBulkApi\conf\LoginParams; |
6
|
|
|
use SalesforceBulkApi\dto\LoginResponseDto; |
7
|
|
|
use SalesforceBulkApi\exceptions\ApiRequestException; |
8
|
|
|
use SalesforceBulkApi\exceptions\ApiResponseException; |
9
|
|
|
use SalesforceBulkApi\exceptions\HttpClientException; |
10
|
|
|
use SalesforceBulkApi\exceptions\SFClientException; |
11
|
|
|
use SalesforceBulkApi\services\ApiSalesforce; |
12
|
|
|
use GuzzleHttp\Psr7\Request; |
13
|
|
|
|
14
|
|
|
class UserApiSF |
15
|
|
|
{ |
16
|
|
|
/** |
17
|
|
|
* @var string |
18
|
|
|
*/ |
19
|
|
|
public static $endpoint = 'https://%s.salesforce.com/services/Soap/%s/%s'; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* @param ApiSalesforce $api |
23
|
|
|
* |
24
|
|
|
* @return LoginResponseDto |
25
|
|
|
* @throws \Exception |
26
|
|
|
*/ |
27
|
|
|
public static function login(ApiSalesforce $api) |
28
|
|
|
{ |
29
|
|
|
$asWho = $api->getLoginParams()->amIPartner() ? 'u' : 'c'; |
30
|
|
|
$version = $api->getLoginParams()->getApiVersion(); |
31
|
|
|
$endpointPrefix = $api->getLoginParams()->getEndpointPrefix(); |
32
|
|
|
|
33
|
|
|
$request = new Request( |
34
|
|
|
'POST', |
35
|
|
|
sprintf(self::$endpoint, $endpointPrefix, $asWho, $version), |
36
|
|
|
[ |
37
|
|
|
'Content-Type' => 'text/xml; charset=UTF8', |
38
|
|
|
'SOAPAction' => 'login' |
39
|
|
|
], |
40
|
|
|
self::getXml($api->getLoginParams()) |
41
|
|
|
); |
42
|
|
|
try { |
43
|
|
|
$response = $api->send($request); |
44
|
|
|
} catch (\Exception $e) { |
45
|
|
|
throw new HttpClientException($e->getMessage()); |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
if ($response->getStatusCode() != 200 && $response->getStatusCode() !== 500) { |
49
|
|
|
$error = |
50
|
|
|
'API error: Status = ' . $response->getStatusCode() . ' ; ReasonPhrase = ' |
51
|
|
|
. $response->getReasonPhrase() . ' ; Body = ' . $response->getBody()->getContents(); |
52
|
|
|
$api->addError($error); |
53
|
|
|
throw new ApiResponseException($error); |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
$dom = new \DOMDocument; |
57
|
|
|
$dom->loadXML($response->getBody()); |
58
|
|
|
if ($response->getStatusCode() == 500) { |
59
|
|
|
$fail = $dom->getElementsByTagName('faultstring'); |
60
|
|
|
if ($fail->length == 0) { |
61
|
|
|
throw new SFClientException( |
62
|
|
|
'SF Api waiting behavior changed. Error: incorrect response = ' . $response->getBody()->getContents( |
63
|
|
|
) |
64
|
|
|
); |
65
|
|
|
} |
66
|
|
|
$error = 'API error: ' . $fail[0]->nodeValue; |
67
|
|
|
$api->addError($error); |
68
|
|
|
throw new ApiRequestException($error); |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
return new LoginResponseDto($dom); |
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
/** |
75
|
|
|
* @param LoginParams $params |
76
|
|
|
* |
77
|
|
|
* @return string |
78
|
|
|
*/ |
79
|
|
|
private static function getXml(LoginParams $params) |
80
|
|
|
{ |
81
|
|
|
/** @noinspection XmlUnusedNamespaceDeclaration */ |
82
|
|
|
$xml = <<<XML |
83
|
|
|
<?xml version="1.0" encoding="utf-8" ?> |
84
|
|
|
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> |
85
|
|
|
<env:Body> |
86
|
|
|
<n1:login xmlns:n1="urn:partner.soap.sforce.com"> |
87
|
|
|
<n1:username>%s</n1:username> |
88
|
|
|
<n1:password>%s</n1:password> |
89
|
|
|
</n1:login> |
90
|
|
|
</env:Body> |
91
|
|
|
</env:Envelope> |
92
|
|
|
XML; |
93
|
|
|
|
94
|
|
|
$login = $params->getUserName(); |
95
|
|
|
$pass = $params->getUserPass() . $params->getUserSecretToken(); |
96
|
|
|
|
97
|
|
|
$login = htmlspecialchars($login, ENT_QUOTES, 'UTF-8'); |
98
|
|
|
$pass = htmlspecialchars($pass, ENT_QUOTES, 'UTF-8'); |
99
|
|
|
|
100
|
|
|
return sprintf($xml, $login, $pass); |
101
|
|
|
} |
102
|
|
|
} |
103
|
|
|
|