@@ -34,6 +34,7 @@ public function setUp()
3434
3535 $ this ->completePurchaseOptions = [
3636 'encryptionKey ' => '2f52208a25a1facf ' ,
37+ 'transactionId ' => 'phpne-demo-53922585 ' ,
3738 ];
3839 }
3940
@@ -235,7 +236,12 @@ public function testCompletePurchaseSuccess()
235236
236237 $ this ->getHttpRequest ()->initialize (['crypt ' => '@5548276239c33e937e4d9d847d0a01f4c05f1b71dd5cd32568b6985a6d6834aca672315cf3eec01bb20d34cd1ccd7bdd69a9cd89047f7f875103b46efd8f7b97847eea6b6bab5eb8b61da9130a75fffa1c9152b7d39f77e534ea870281b8e280ea1fdbd49a8f5a7c67d1f512fe7a030e81ae6bd2beed762ad074edcd5d7eb4456a6797911ec78e4d16e7d3ac96b919052a764b7ee4940fd6976346608ad8fed1eb6b0b14d84d802c594b3fd94378a26837df66b328f01cfd144f2e7bc166370bf7a833862173412d2798e8739ee7ef9b0568afab0fc69f66af19864480bf3e74fe2fd2043ec90396e40ab62dc9c1f32dee0e309af7561d2286380ebb497105bde2860d401ccfb4cfcd7047ad32e9408d37f5d0fe9a67bd964d5b138b2546a7d54647467c59384eaa20728cf240c460e36db68afdcf0291135f9d5ff58563f14856fd28534a5478ba2579234b247d0d5862c5742495a2ae18c5ca0d6461d641c5215b07e690280fa3eaf5d392e1d6e2791b181a500964d4bc6c76310e47468ae72edddc3c04d83363514c908624747118 ' ]);
237238
238- $ response = $ this ->gateway ->completePurchase ($ this ->completePurchaseOptions )->send ();
239+ $ options = $ this ->completePurchaseOptions ;
240+
241+ // Switch to the transaction ID actually encrypted in the server request.
242+ $ options ['transactionId ' ] = 'phpne-demo-56260425 ' ;
243+
244+ $ response = $ this ->gateway ->completePurchase ($ options )->send ();
239245
240246 $ this ->assertTrue ($ response ->isSuccessful ());
241247 $ this ->assertFalse ($ response ->isRedirect ());
@@ -266,4 +272,44 @@ public function testCompletePurchaseSuccess()
266272 $ response ->getData ()
267273 );
268274 }
275+
276+ /**
277+ * The wrong transaction ID is supplied with the server request.
278+ *
279+ * @expectedException Omnipay\Common\Exception\InvalidResponseException
280+ */
281+ public function testCompletePurchaseReplayAttack ()
282+ {
283+ //$this->expectException(Complicated::class);
284+
285+ // Set the "crypt" query parameter.
286+
287+ $ this ->getHttpRequest ()->initialize (['crypt ' => '@5548276239c33e937e4d9d847d0a01f4c05f1b71dd5cd32568b6985a6d6834aca672315cf3eec01bb20d34cd1ccd7bdd69a9cd89047f7f875103b46efd8f7b97847eea6b6bab5eb8b61da9130a75fffa1c9152b7d39f77e534ea870281b8e280ea1fdbd49a8f5a7c67d1f512fe7a030e81ae6bd2beed762ad074edcd5d7eb4456a6797911ec78e4d16e7d3ac96b919052a764b7ee4940fd6976346608ad8fed1eb6b0b14d84d802c594b3fd94378a26837df66b328f01cfd144f2e7bc166370bf7a833862173412d2798e8739ee7ef9b0568afab0fc69f66af19864480bf3e74fe2fd2043ec90396e40ab62dc9c1f32dee0e309af7561d2286380ebb497105bde2860d401ccfb4cfcd7047ad32e9408d37f5d0fe9a67bd964d5b138b2546a7d54647467c59384eaa20728cf240c460e36db68afdcf0291135f9d5ff58563f14856fd28534a5478ba2579234b247d0d5862c5742495a2ae18c5ca0d6461d641c5215b07e690280fa3eaf5d392e1d6e2791b181a500964d4bc6c76310e47468ae72edddc3c04d83363514c908624747118 ' ]);
288+
289+ // These options contain a different transactionId from the once expected.
290+
291+ $ options = $ this ->completePurchaseOptions ;
292+
293+ $ response = $ this ->gateway ->completePurchase ($ options )->send ();
294+ }
295+
296+ /**
297+ * The missing expected transaction ID supplied by the app.
298+ *
299+ * @expectedException Omnipay\Common\Exception\InvalidRequestException
300+ */
301+ public function testCompletePurchaseMissingExpectedParam ()
302+ {
303+ //$this->expectException(Complicated::class);
304+
305+ // Set the "crypt" query parameter.
306+
307+ $ this ->getHttpRequest ()->initialize (['crypt ' => '@5548276239c33e937e4d9d847d0a01f4c05f1b71dd5cd32568b6985a6d6834aca672315cf3eec01bb20d34cd1ccd7bdd69a9cd89047f7f875103b46efd8f7b97847eea6b6bab5eb8b61da9130a75fffa1c9152b7d39f77e534ea870281b8e280ea1fdbd49a8f5a7c67d1f512fe7a030e81ae6bd2beed762ad074edcd5d7eb4456a6797911ec78e4d16e7d3ac96b919052a764b7ee4940fd6976346608ad8fed1eb6b0b14d84d802c594b3fd94378a26837df66b328f01cfd144f2e7bc166370bf7a833862173412d2798e8739ee7ef9b0568afab0fc69f66af19864480bf3e74fe2fd2043ec90396e40ab62dc9c1f32dee0e309af7561d2286380ebb497105bde2860d401ccfb4cfcd7047ad32e9408d37f5d0fe9a67bd964d5b138b2546a7d54647467c59384eaa20728cf240c460e36db68afdcf0291135f9d5ff58563f14856fd28534a5478ba2579234b247d0d5862c5742495a2ae18c5ca0d6461d641c5215b07e690280fa3eaf5d392e1d6e2791b181a500964d4bc6c76310e47468ae72edddc3c04d83363514c908624747118 ' ]);
308+
309+ $ options = $ this ->completePurchaseOptions ;
310+
311+ unset($ options ['transactionId ' ]);
312+
313+ $ response = $ this ->gateway ->completePurchase ($ options )->send ();
314+ }
269315}
0 commit comments