Completed
Push — master ( fa5fd4...7a15ce )
by Nic
07:40
created

FoxyStripeController::getProductPage()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 10
ccs 0
cts 7
cp 0
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 1
crap 12
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
        if ($request->postVar('FoxyData') || $request->postVar('FoxySubscriptionData')) {
50
            $this->processFoxyRequest($request);
51
52
            return 'foxy';
53
        }
54
55
        return 'No FoxyData or FoxySubscriptionData received.';
56
    }
57
58
    /**
59
     * Process a request after a transaction is completed via Foxy
60
     *
61
     * @param HTTPRequest $request
62
     */
63
    protected function processFoxyRequest(HTTPRequest $request)
64
    {
65
        $encryptedData = $request->postVar('FoxyData')
66
            ? urldecode($request->postVar('FoxyData'))
67
            : urldecode($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()) {
117
            $order = Order::create();
118
            $order->Order_ID = (int)$transaction->id;
119
            $order->Response = urlencode($encryptedData);
120
        }
121
122
        $order->write();
123
    }
124
125
    /**
126
     * Single Sign on integration with FoxyCart.
127
     */
128
    public function sso()
129
    {
130
        // GET variables from FoxyCart Request
131
        $fcsid = $this->request->getVar('fcsid');
132
        $timestampNew = strtotime('+30 days');
133
134
        // get current member if logged in. If not, create a 'fake' user with Customer_ID = 0
135
        // fake user will redirect to FC checkout, ask customer to log in
136
        // to do: consider a login/registration form here if not logged in
137
        if (!$Member = Security::getCurrentUser()) {
138
            $Member = new Member();
139
            $Member->Customer_ID = 0;
140
        }
141
142
        $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

142
        $auth_token = sha1($Member->Customer_ID . '|' . $timestampNew . '|' . /** @scrutinizer ignore-type */ FoxyCart::getStoreKey());
Loading history...
143
144
        $config = FoxyStripeSetting::current_foxystripe_setting();
145
        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...
146
            $link = FoxyCart::getFoxyCartStoreName();
147
        } else {
148
            $link = FoxyCart::getFoxyCartStoreName() . '.foxycart.com';
149
        }
150
151
        $params = [
152
            'fc_auth_token' => $auth_token,
153
            'fcsid' => $fcsid,
154
            'fc_customer_id' => $Member->Customer_ID,
155
            'timestamp' => $timestampNew,
156
        ];
157
158
        $httpQuery = http_build_query($params);
159
160
        $this->redirect("https://{$link}/checkout?$httpQuery");
161
    }
162
}
163