|
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
|
|
|
|