|
@@ -31,10 +31,17 @@ class SenangPayDriver implements PaymentGatewayDriver
|
31
|
31
|
*/
|
32
|
32
|
protected $secret_key;
|
33
|
33
|
|
34
|
|
- public function __construct(string $endpoint, string $merchant_id, string $secret_key){
|
|
34
|
+ /**
|
|
35
|
+ * @var array
|
|
36
|
+ */
|
|
37
|
+ protected $keyMap;
|
|
38
|
+
|
|
39
|
+ public function __construct(string $endpoint, string $merchant_id, string $secret_key, array $keyMap)
|
|
40
|
+ {
|
35
|
41
|
$this->endpoint = rtrim($endpoint, '/');
|
36
|
42
|
$this->merchant_id = $merchant_id;
|
37
|
43
|
$this->secret_key = $secret_key;
|
|
44
|
+ $this->keyMap = $keyMap;
|
38
|
45
|
}
|
39
|
46
|
|
40
|
47
|
public function createPaymentURL(PayableEntity $payable, array $options = []): string
|
|
@@ -45,36 +52,44 @@ class SenangPayDriver implements PaymentGatewayDriver
|
45
|
52
|
|
46
|
53
|
$detail = preg_replace('/[^A-Z0-9,\-_]/i', '_', $detail);
|
47
|
54
|
$amount = sprintf('%0.2f', $amount);
|
48
|
|
- $hash = md5($this->secret_key.$detail.$amount.$order_id);
|
|
55
|
+ $hash = md5($this->secret_key . $detail . $amount . $order_id);
|
49
|
56
|
|
50
|
|
- return "$this->endpoint/payment/$this->merchant_id?".
|
|
57
|
+ return "$this->endpoint/payment/$this->merchant_id?" .
|
51
|
58
|
http_build_query(compact('detail', 'order_id', 'amount', 'hash'));
|
52
|
59
|
}
|
53
|
60
|
|
54
|
61
|
public function verifyGatewayReturn(Request $request): bool
|
55
|
62
|
{
|
56
|
|
- $hash = $request->query->get('hash');
|
|
63
|
+ $hash = $request->query->get($this->keyMap['hash']);
|
57
|
64
|
return $hash == $this->computeHash($request->request->all());
|
58
|
65
|
}
|
59
|
66
|
|
60
|
67
|
public function verifyGatewayCallback(Request $request, Response &$response = null): bool
|
61
|
68
|
{
|
62
|
69
|
$response = Res::make('OK');
|
63
|
|
- $hash = $request->request->get('hash');
|
|
70
|
+ $hash = $request->request->get($this->keyMap['hash']);
|
64
|
71
|
return $hash == $this->computeHash($request->request->all());
|
65
|
72
|
}
|
66
|
73
|
|
67
|
|
- public function getBillIdFromRequest(Request $request): ?string{
|
68
|
|
- return $request->get('order_id');
|
|
74
|
+ public function getBillIdFromRequest(Request $request): ?string
|
|
75
|
+ {
|
|
76
|
+ return $request->get($this->keyMap['order_id']);
|
69
|
77
|
}
|
70
|
78
|
|
71
|
79
|
public function getBillStatus(Request $request): ?int
|
72
|
80
|
{
|
73
|
|
- return $request->request->get('status') == 1 ? Payment::SUCCESS : Payment::PENDING;
|
|
81
|
+ $status = $request->get($this->keyMap['status_id']);
|
|
82
|
+ if ($status == null) {
|
|
83
|
+ return null;
|
|
84
|
+ } else {
|
|
85
|
+ return $status == 1 ? Payment::SUCCESS : Payment::PENDING;
|
|
86
|
+ }
|
74
|
87
|
}
|
75
|
88
|
|
76
|
|
- public function computeHash($payload){
|
77
|
|
- $payload['hash'] = '[HASH]';
|
78
|
|
- return md5($this->secret_key.'?'.http_build_query($payload));
|
|
89
|
+ public function computeHash($payload)
|
|
90
|
+ {
|
|
91
|
+ $query = http_build_query($payload);
|
|
92
|
+ $query = preg_replace('/(^|&)hash=[^&]*($|&)/','$1hash=[HASH]$2', $query);
|
|
93
|
+ return md5($this->secret_key . '?' . $query);
|
79
|
94
|
}
|
80
|
95
|
}
|