Completed
Pull Request — master (#373)
by Nic
06:00
created

FoxyStripeController::modifyOrderDetailPrice()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
eloc 13
dl 0
loc 22
ccs 0
cts 14
cp 0
rs 9.5222
c 0
b 0
f 0
cc 5
nc 5
nop 3
crap 30
1
<?php
2
3
namespace Dynamic\FoxyStripe\Controller;
4
5
use Dynamic\FoxyStripe\Model\FoxyCart;
6
use Dynamic\FoxyStripe\Model\FoxyStripeClient;
7
use Dynamic\FoxyStripe\Model\FoxyStripeSetting;
8
use Dynamic\FoxyStripe\Model\OptionItem;
9
use Dynamic\FoxyStripe\Model\Order;
10
use Dynamic\FoxyStripe\Model\OrderDetail;
11
use Dynamic\FoxyStripe\Page\ProductPage;
12
use SilverStripe\Control\HTTPRequest;
13
use SilverStripe\ORM\Queries\SQLUpdate;
14
use SilverStripe\Security\Member;
15
use SilverStripe\Security\Security;
16
17
class FoxyStripeController extends \PageController
18
{
19
    /**
20
     *
21
     */
22
    const URLSEGMENT = 'foxystripe';
23
24
    /**
25
     * @var array
26
     */
27
    private static $allowed_actions = [
0 ignored issues
show
introduced by
The private property $allowed_actions is not used, and could be removed.
Loading history...
28
        'index',
29
        'sso',
30
    ];
31
32
    /**
33
     * @return string
34
     */
35
    public function getURLSegment()
36
    {
37
        return self::URLSEGMENT;
38
    }
39
40
    /**
41
     * @return string
42
     *
43
     * @throws \SilverStripe\ORM\ValidationException
44
     */
45
    public function index()
46
    {
47
        $request = $this->getRequest();
48
49
        $this->processFoxyRequest($request);
50
51
        if ($request->postVar('FoxyData') || $request->postVar('FoxySubscriptionData')) {
52
            $this->processFoxyRequest($request);
53
54
            return 'foxy';
55
        }
56
57
        return 'No FoxyData or FoxySubscriptionData received.';
58
    }
59
60
    /**
61
     * Process a request after a transaction is completed via Foxy
62
     *
63
     * @param HTTPRequest $request
64
     */
65
    protected function processFoxyRequest(HTTPRequest $request)
66
    {
67
        $encryptedData = $request->postVar('FoxyData') ?: $request->postVar('FoxySubscriptionData');
68
        $decryptedData = $this->decryptFeedData($encryptedData);
69
70
        $this->parseFeedData($encryptedData, $decryptedData);
71
72
        $this->extend('addIntegrations', $encryptedData);
73
    }
74
75
    /**
76
     * Decrypt the XML data feed from Foxy
77
     *
78
     * @param $data
79
     * @return string
80
     * @throws \SilverStripe\ORM\ValidationException
81
     */
82
    private function decryptFeedData($data)
83
    {
84
        return \rc4crypt::decrypt(FoxyCart::getStoreKey(), $data);
0 ignored issues
show
Bug introduced by
It seems like Dynamic\FoxyStripe\Model\FoxyCart::getStoreKey() can also be of type false; however, parameter $pwd of rc4crypt::decrypt() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

84
        return \rc4crypt::decrypt(/** @scrutinizer ignore-type */ FoxyCart::getStoreKey(), $data);
Loading history...
85
    }
86
87
    /**
88
     * Parse the XML data feed from Foxy to a SimpleXMLElement object
89
     *
90
     * @param $encrypted
91
     * @param $decrypted
92
     *
93
     * @throws \SilverStripe\ORM\ValidationException
94
     */
95
    private function parseFeedData($encryptedData, $decryptedData)
96
    {
97
        $orders = new \SimpleXMLElement($decryptedData);
98
99
        // loop over each transaction to find FoxyCart Order ID
100
        foreach ($orders->transactions->transaction as $transaction) {
101
            $this->processTransaction($transaction, $encryptedData);
102
        }
103
    }
104
105
    /**
106
     * @param $transaction
107
     * @return bool
108
     * @throws \SilverStripe\ORM\ValidationException
109
     */
110
    private function processTransaction($transaction, $encryptedData)
111
    {
112
        if (!isset($transaction->id)) {
113
            return false;
114
        }
115
116
        if (!$order = Order::get()->filter('Order_ID', (int)$transaction->id)->first()) {
0 ignored issues
show
Unused Code introduced by
The assignment to $order is dead and can be removed.
Loading history...
117
            $order = Order::create();
118
            $order->Order_ID = (int)$transaction->id;
119
            $order->Response = urlencode($encryptedData);
120
            $order->write();
121
        }
122
    }
123
124
    /**
125
     * Single Sign on integration with FoxyCart.
126
     */
127
    public function sso()
128
    {
129
        // GET variables from FoxyCart Request
130
        $fcsid = $this->request->getVar('fcsid');
131
        $timestampNew = strtotime('+30 days');
132
133
        // get current member if logged in. If not, create a 'fake' user with Customer_ID = 0
134
        // fake user will redirect to FC checkout, ask customer to log in
135
        // to do: consider a login/registration form here if not logged in
136
        if (!$Member = Security::getCurrentUser()) {
137
            $Member = new Member();
138
            $Member->Customer_ID = 0;
139
        }
140
141
        $auth_token = sha1($Member->Customer_ID . '|' . $timestampNew . '|' . FoxyCart::getStoreKey());
0 ignored issues
show
Bug introduced by
Are you sure Dynamic\FoxyStripe\Model\FoxyCart::getStoreKey() of type SilverStripe\ORM\FieldType\DBVarchar|false can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

141
        $auth_token = sha1($Member->Customer_ID . '|' . $timestampNew . '|' . /** @scrutinizer ignore-type */ FoxyCart::getStoreKey());
Loading history...
142
143
        $config = FoxyStripeSetting::current_foxystripe_setting();
144
        if ($config->CustomSSL) {
0 ignored issues
show
Bug Best Practice introduced by
The property CustomSSL does not exist on Dynamic\FoxyStripe\Model\FoxyStripeSetting. Since you implemented __get, consider adding a @property annotation.
Loading history...
145
            $link = FoxyCart::getFoxyCartStoreName();
146
        } else {
147
            $link = FoxyCart::getFoxyCartStoreName() . '.foxycart.com';
148
        }
149
150
        $this
151
            ->redirect("https://{$link}/checkout?fc_auth_token={$auth_token}&fcsid={$fcsid}&fc_customer_id={$Member->Customer_ID}&timestamp={$timestampNew}");
152
    }
153
}
154