Skip to content

Commit 72da487

Browse files
committed
ReponsdType String
1 parent a4548dd commit 72da487

9 files changed

+93
-23
lines changed

src/Message/CompletePurchaseRequest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ public function getData()
1616
{
1717
$data = $this->httpRequest->request->all();
1818
$tradeSha = $this->tradeSha($data['TradeInfo']);
19+
$data['Result'] = $this->decrypt($data['TradeInfo']);
1920
if (! hash_equals($tradeSha, $data['TradeSha'])) {
2021
throw new InvalidResponseException('Incorrect TradeSha');
2122
}
22-
$data['Result'] = $this->decrypt($data['TradeInfo']);
2323

2424
return $data;
2525
}

src/Message/FetchTransactionRequest.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ public function getData()
5959
return $value !== null && $value !== '';
6060
});
6161

62-
var_dump($data);
6362
$data['CheckValue'] = $this->checkValue($data);
6463

6564
return $data;
@@ -73,10 +72,22 @@ public function sendData($data)
7372
$response = $this->httpClient->request('POST', $this->getEndpoint(), [
7473
'Content-Type' => 'application/x-www-form-urlencoded',
7574
], http_build_query($data));
76-
$result = json_decode((string) $response->getBody(), true);
7775

78-
if (! hash_equals($result['Result']['CheckCode'], $this->checkCode($result['Result']))) {
79-
throw new InvalidResponseException('Incorrect CheckCode');
76+
$body = trim((string) $response->getBody());
77+
$result = json_decode($body, true);
78+
79+
if (json_last_error() === JSON_ERROR_NONE) {
80+
81+
if (! hash_equals($result['Result']['CheckCode'], $this->checkCode($result['Result']))) {
82+
throw new InvalidResponseException('Incorrect CheckCode');
83+
}
84+
} else {
85+
$result = [];
86+
parse_str($body, $result);
87+
88+
if (! hash_equals($result['CheckCode'], $this->checkCode($result))) {
89+
throw new InvalidResponseException('Incorrect CheckCode');
90+
}
8091
}
8192

8293
return $this->response = new FetchTransactionResponse($this, $result);

src/Message/FetchTransactionResponse.php

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,45 @@ class FetchTransactionResponse extends AbstractResponse
66
{
77
public function isSuccessful()
88
{
9-
return $this->getCode() === '00';
9+
return (int) $this->getCode() === 1;
10+
}
11+
12+
public function isCancelled()
13+
{
14+
return (int) $this->getCode() === 6;
1015
}
1116

1217
public function getCode()
1318
{
14-
return $this->data['Result']['RespondCode'];
19+
return array_key_exists('Result', $this->data)
20+
? $this->data['Result']['TradeStatus']
21+
: $this->data['TradeStatus'];
1522
}
1623

1724
public function getMessage()
1825
{
19-
return $this->data['Result']['RespondMsg'];
26+
$lookup = [
27+
0 => '未付款',
28+
1 => '付款成功',
29+
2 => '付款失敗',
30+
3 => '取消付款',
31+
6 => '退款',
32+
];
33+
34+
return $lookup[$this->getCode()];
2035
}
2136

22-
public function getTransactionId()
37+
public function getTransactionReference()
2338
{
24-
return $this->data['Result']['MerchantOrderNo'];
39+
return array_key_exists('Result', $this->data)
40+
? $this->data['Result']['TradeNo']
41+
: $this->data['TradeNo'];
2542
}
2643

27-
public function getTransactionReference()
44+
public function getTransactionId()
2845
{
29-
return $this->data['Result']['TradeNo'];
46+
return array_key_exists('Result', $this->data)
47+
? $this->data['Result']['MerchantOrderNo']
48+
: $this->data['MerchantOrderNo'];
3049
}
3150
}

src/Traits/HasDefaults.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ public function decrypt(string $plainText)
171171
$result = $encryptor->decrypt($plainText);
172172

173173
$data = json_decode($result, true);
174-
175174
if (json_last_error() === JSON_ERROR_NONE) {
176175
return $data;
177176
}

tests/GatewayTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ public function testFetchTransaction()
112112
$response = $request->send();
113113

114114
self::assertTrue($response->isSuccessful());
115-
self::assertEquals('00', $response->getCode());
116-
self::assertEquals('授權成功', $response->getMessage());
115+
self::assertEquals(1, $response->getCode());
116+
self::assertEquals('付款成功', $response->getMessage());
117117
self::assertEquals('Vanespl_ec_1695795668', $response->getTransactionId());
118118
self::assertEquals('23092714215835071', $response->getTransactionReference());
119119
}

tests/Message/CompletePurchaseRequestTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ public function testGetDataForJSON()
8484
'Status' => 'SUCCESS',
8585
'MerchantID' => 'MS350766787',
8686
'Version' => '2.0',
87-
'TradeInfo' => 'ee11d1501e6dc8433c75988258f2343d11f4d0a423be672e8e02aaf373c53c2363aeffdb4992579693277359b3e449eb6a4a2e8871d4ce1374807c7a37547efeb6f3fc6a0a89308bd3eeec2e4146c34dbe40397b2e84a47eba6c4660f95fa2414dc31ba332bea8236bf3f8778fd9f875661598b30a7598c89b6642d3ab9a882a97992c48550a5313bc1f94104385885d2329d2780b6fc8f8cc1323577f3cf2bb9f02c00fee30d72cda74aeff4b5087f949fcc62bf9e963dbfb85214410ac0c9f5167310c3a13dcfac0e28cebb7162ec9900d93d67985525a92ae21d36bb06ed505f903296389500753b26cc197a39afcd2e38b21ba68469d23001f58685c4797197930b0e2744a0997da276adaf15abf01e10f5096d0b36ba098ccfbd33ce4f29f8655b02bf48c3e64894bdb50781dd945708a0d21d17449f1a659f0fdcfd3fab9a423ee43787f3ada33eb6b642e01ed6db8dd64a15ae4358c1a53a2ec58986d080a4b4aaf54811c90ed367363972bf3e346de9984411e6c0d13605dad8996041fa5c5d138daa1c0cb0b6b986ca88b65cb2d7964c01d35a5d9c247467a53dde39dd255776ad2f81f202849da86aef12a1515679ea50f4394b704ed3950ca3a7c138a9128eb48c3ec3501eb28c9e49be588253d25ae3df6a1dc9ddce93758268159ac4dc7e36f840836984cdeac2efd1c353eb0caa4cbc0b7a8f4381101b4125d90e732c27cf7b74ee85dcbce5c0ebfd27974f2f2edd7fc3c6b81e47645fe8ba582d9789a6df0105fbb2ad1073026cbbfa5f8ce3d831856201751903fa40a2d22d248d8d44f57a697d2c26f04faf386a3558ac3ac280690d117ff73f4f8c59cd96f8bc458bf5c7fea2064716aa2c61c4b73fd5cd7e1c57b3ec485264f274abaf8781558020ba13abc8ac4169e4ce7dd280b1fd3eb313831153ca3dac42312672351a782ab7124d5b4ec626533d0d1f7d9',
88-
'TradeSha' => '0F7D321B19179C553054BF981AB3DBDE327329AEE73A27B7B94D05A0D525830E',
87+
'TradeInfo' => '1c666a338762a97c40f28d5d7fe5dfa52bb5a65f7c460fe5970ac7a993529669a9e11cb3a6ffb7e3447d0482f263eab8fbb4a2e9024a074a1b28e5b07a3cb19a03b493114841831ad6fec058b5b1d9d43bf256b42007f53336ced1687d58984fcf6b54cbafbdb4b31070c2434f00467135f0d60c91dc55d588661b47151842bec5698938743e1dce75de3f26b0ef3bbe69730ef7f15c979cfa9f394e7830d46b318fd97036d4116e59108cf3d67ce1b69db1ce531061a81b91ed6a10ec797fd6f84242dab56a60ce16d02a03af70b0d0746fbbfb04bda214c1d676ee0aeedb01ea9d818e0b06b318af974e93bd4fdffea536f367b52962cd04951dbe805a0f5465e203c924258cc5a2b4d8f742ad60f2a0649c5f00ca39b267d6ee8f21ab0a29ad47abf7f5ade2b4b8b6717b647f9952ead032b9c3fdb0a82d5f9611950f852639d8891f3652761b4004f9c13ad346550b9126fdc3e21e8ca4f94909093cbe746be38df5a1b7d4aad321cb8fea0b1c2f08c8836f7ec32153d6a553724dfc41b06425304af71b91dd4b014f837bc3a028dd626901e324b16be9b9d845bb3b2bc0bf6b089161fa5dd8b786dfa96ca58aa0f37c6361cbe81f33ff888208d6ea60c998ddedc15266ddfd95b7b6b1f293ec4740ac8f56d95b3c1063ed7e7bd9d81c238bc4fb4105862b903d6e6f216dc38a6a0039b6b32fef3a8cf7f51b3eb954bbd3',
88+
'TradeSha' => 'E70392EF67FADF8D08C60E0F1B3AE0E5510476FD17DFAF18221A1B200A9A4A13',
8989
]);
9090
$request = new CompletePurchaseRequest($this->getHttpClient(), $this->getHttpRequest());
9191
$request->initialize([
@@ -101,8 +101,8 @@ public function testGetDataForJSON()
101101
'Status' => 'SUCCESS',
102102
'MerchantID' => 'MS350766787',
103103
'Version' => '2.0',
104-
'TradeInfo' => 'ee11d1501e6dc8433c75988258f2343d11f4d0a423be672e8e02aaf373c53c2363aeffdb4992579693277359b3e449eb6a4a2e8871d4ce1374807c7a37547efeb6f3fc6a0a89308bd3eeec2e4146c34dbe40397b2e84a47eba6c4660f95fa2414dc31ba332bea8236bf3f8778fd9f875661598b30a7598c89b6642d3ab9a882a97992c48550a5313bc1f94104385885d2329d2780b6fc8f8cc1323577f3cf2bb9f02c00fee30d72cda74aeff4b5087f949fcc62bf9e963dbfb85214410ac0c9f5167310c3a13dcfac0e28cebb7162ec9900d93d67985525a92ae21d36bb06ed505f903296389500753b26cc197a39afcd2e38b21ba68469d23001f58685c4797197930b0e2744a0997da276adaf15abf01e10f5096d0b36ba098ccfbd33ce4f29f8655b02bf48c3e64894bdb50781dd945708a0d21d17449f1a659f0fdcfd3fab9a423ee43787f3ada33eb6b642e01ed6db8dd64a15ae4358c1a53a2ec58986d080a4b4aaf54811c90ed367363972bf3e346de9984411e6c0d13605dad8996041fa5c5d138daa1c0cb0b6b986ca88b65cb2d7964c01d35a5d9c247467a53dde39dd255776ad2f81f202849da86aef12a1515679ea50f4394b704ed3950ca3a7c138a9128eb48c3ec3501eb28c9e49be588253d25ae3df6a1dc9ddce93758268159ac4dc7e36f840836984cdeac2efd1c353eb0caa4cbc0b7a8f4381101b4125d90e732c27cf7b74ee85dcbce5c0ebfd27974f2f2edd7fc3c6b81e47645fe8ba582d9789a6df0105fbb2ad1073026cbbfa5f8ce3d831856201751903fa40a2d22d248d8d44f57a697d2c26f04faf386a3558ac3ac280690d117ff73f4f8c59cd96f8bc458bf5c7fea2064716aa2c61c4b73fd5cd7e1c57b3ec485264f274abaf8781558020ba13abc8ac4169e4ce7dd280b1fd3eb313831153ca3dac42312672351a782ab7124d5b4ec626533d0d1f7d9',
105-
'TradeSha' => '0F7D321B19179C553054BF981AB3DBDE327329AEE73A27B7B94D05A0D525830E',
104+
'TradeInfo' => '1c666a338762a97c40f28d5d7fe5dfa52bb5a65f7c460fe5970ac7a993529669a9e11cb3a6ffb7e3447d0482f263eab8fbb4a2e9024a074a1b28e5b07a3cb19a03b493114841831ad6fec058b5b1d9d43bf256b42007f53336ced1687d58984fcf6b54cbafbdb4b31070c2434f00467135f0d60c91dc55d588661b47151842bec5698938743e1dce75de3f26b0ef3bbe69730ef7f15c979cfa9f394e7830d46b318fd97036d4116e59108cf3d67ce1b69db1ce531061a81b91ed6a10ec797fd6f84242dab56a60ce16d02a03af70b0d0746fbbfb04bda214c1d676ee0aeedb01ea9d818e0b06b318af974e93bd4fdffea536f367b52962cd04951dbe805a0f5465e203c924258cc5a2b4d8f742ad60f2a0649c5f00ca39b267d6ee8f21ab0a29ad47abf7f5ade2b4b8b6717b647f9952ead032b9c3fdb0a82d5f9611950f852639d8891f3652761b4004f9c13ad346550b9126fdc3e21e8ca4f94909093cbe746be38df5a1b7d4aad321cb8fea0b1c2f08c8836f7ec32153d6a553724dfc41b06425304af71b91dd4b014f837bc3a028dd626901e324b16be9b9d845bb3b2bc0bf6b089161fa5dd8b786dfa96ca58aa0f37c6361cbe81f33ff888208d6ea60c998ddedc15266ddfd95b7b6b1f293ec4740ac8f56d95b3c1063ed7e7bd9d81c238bc4fb4105862b903d6e6f216dc38a6a0039b6b32fef3a8cf7f51b3eb954bbd3',
105+
'TradeSha' => 'E70392EF67FADF8D08C60E0F1B3AE0E5510476FD17DFAF18221A1B200A9A4A13',
106106
'Result' => [
107107
'Status' => 'SUCCESS',
108108
'Message' => '授權成功',

tests/Message/FetchTransactionRequestTest.php

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,41 @@
77

88
class FetchTransactionRequestTest extends TestCase
99
{
10-
public function testSendDataForJSON(): void
10+
public function testSendData()
1111
{
1212
$timestamp = 1695795668;
1313
$request = new FetchTransactionRequest($this->getHttpClient(), $this->getHttpRequest());
1414

1515
$this->setMockHttpResponse('FetchTransactionSuccess.txt');
1616

17+
$request->initialize(array_merge([
18+
'HashKey' => 'Fs5cX1TGqYM2PpdbE14a9H83YQSQF5jn',
19+
'HashIV' => 'C6AcmfqJILwgnhIP',
20+
'MerchantID' => 'MS127874575',
21+
'testMode' => true,
22+
], [
23+
'RespondType' => 'String',
24+
'TimeStamp' => $timestamp,
25+
'transactionId' => 'Vanespl_ec_'.$timestamp,
26+
'amount' => 30,
27+
]));
28+
29+
$response = $request->send();
30+
31+
self::assertTrue($response->isSuccessful());
32+
self::assertEquals(1, $response->getCode());
33+
self::assertEquals('付款成功', $response->getMessage());
34+
// self::assertEquals('Vanespl_ec_1695795668', $response->getTransactionId());
35+
// self::assertEquals('23092714215835071', $response->getTransactionReference());
36+
}
37+
38+
public function testSendDataForJSON(): void
39+
{
40+
$timestamp = 1695795668;
41+
$request = new FetchTransactionRequest($this->getHttpClient(), $this->getHttpRequest());
42+
43+
$this->setMockHttpResponse('FetchTransactionSuccessJSON.txt');
44+
1745
$request->initialize(array_merge([
1846
'HashKey' => 'Fs5cX1TGqYM2PpdbE14a9H83YQSQF5jn',
1947
'HashIV' => 'C6AcmfqJILwgnhIP',
@@ -28,8 +56,8 @@ public function testSendDataForJSON(): void
2856
$response = $request->send();
2957

3058
self::assertTrue($response->isSuccessful());
31-
self::assertEquals('00', $response->getCode());
32-
self::assertEquals('授權成功', $response->getMessage());
59+
self::assertEquals(1, $response->getCode());
60+
self::assertEquals('付款成功', $response->getMessage());
3361
self::assertEquals('Vanespl_ec_1695795668', $response->getTransactionId());
3462
self::assertEquals('23092714215835071', $response->getTransactionReference());
3563

tests/Mock/FetchTransactionSuccess.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ Content-Length: 650
1010
Connection: keep-alive
1111
Server-Timing: cdn-cache; desc=MISS, edge; dur=155, origin; dur=159, ak_p; desc="1699760227300_400186759_436094693_31328_2828_16_269_-";dur=1
1212

13-
{"Status":"SUCCESS","Message":"\u67e5\u8a62\u6210\u529f","Result":{"MerchantID":"MS127874575","Amt":30,"TradeNo":"23092714215835071","MerchantOrderNo":"Vanespl_ec_1695795668","TradeStatus":"1","PaymentType":"CREDIT","CreateTime":"2023-09-27 14:21:59","PayTime":"2023-09-27 14:21:59","FundTime":"0000-00-00","CheckCode":"79C5227AF869AE4F25FDF4E22B928D5B52E415D9905EC6912D7807E18C3FFACA","RespondCode":"00","Auth":"115468","ECI":null,"CloseAmt":null,"CloseStatus":"0","BackBalance":"30","BackStatus":"0","RespondMsg":"\u6388\u6b0a\u6210\u529f","Inst":"0","InstFirst":"0","InstEach":"0","PaymentMethod":"CREDIT","Card6No":"400022","Card4No":"1111","AuthBank":"KGI"}}
13+
Status=SUCCESS&Message=查詢成功&MerchantID=MS127874575&Amt=30&TradeNo=23092714215835071&MerchantOrderNo=Vanespl_ec_1695795668&TradeStatus=1&PaymentType=CREDIT&CreateTime=2023-09-27 14:21:59&PayTime=2023-09-27 14:21:59&FundTime=0000-00-00&CheckCode=79C5227AF869AE4F25FDF4E22B928D5B52E415D9905EC6912D7807E18C3FFACA&RespondCode=00&Auth=115468&CloseStatus=0&BackBalance=30&BackStatus=0&RespondMsg=授權成功&Inst=0&InstFirst=0&InstEach=0&PaymentMethod=CREDIT&Card6No=400022&Card4No=1111&AuthBank=KGI
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
HTTP/1.1 200 OK
2+
Content-Type: text/html; charset=UTF-8
3+
Strict-Transport-Security: max-age=63072000
4+
X-Akamai-Transformed: 9 650 0 pmb=mRUM,1
5+
Expires: Sun, 12 Nov 2023 03:37:07 GMT
6+
Cache-Control: max-age=0, no-cache, no-store
7+
Pragma: no-cache
8+
Date: Sun, 12 Nov 2023 03:37:07 GMT
9+
Content-Length: 650
10+
Connection: keep-alive
11+
Server-Timing: cdn-cache; desc=MISS, edge; dur=155, origin; dur=159, ak_p; desc="1699760227300_400186759_436094693_31328_2828_16_269_-";dur=1
12+
13+
{"Status":"SUCCESS","Message":"\u67e5\u8a62\u6210\u529f","Result":{"MerchantID":"MS127874575","Amt":30,"TradeNo":"23092714215835071","MerchantOrderNo":"Vanespl_ec_1695795668","TradeStatus":"1","PaymentType":"CREDIT","CreateTime":"2023-09-27 14:21:59","PayTime":"2023-09-27 14:21:59","FundTime":"0000-00-00","CheckCode":"79C5227AF869AE4F25FDF4E22B928D5B52E415D9905EC6912D7807E18C3FFACA","RespondCode":"00","Auth":"115468","ECI":null,"CloseAmt":null,"CloseStatus":"0","BackBalance":"30","BackStatus":"0","RespondMsg":"\u6388\u6b0a\u6210\u529f","Inst":"0","InstFirst":"0","InstEach":"0","PaymentMethod":"CREDIT","Card6No":"400022","Card4No":"1111","AuthBank":"KGI"}}

0 commit comments

Comments
 (0)