├── .gitignore ├── README.md ├── composer.json ├── composer.lock └── index.php /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # php-ussd-sample 2 | 3 | To run this application, you must have: 4 | - PHP installed on your system 5 | - Composer installed on your system 6 | 7 | Clone the repository 8 | 9 | Open the terminal in the application directory 10 | 11 | run `composer install` 12 | and run `php -S localhost:8000 index.php` 13 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "phpfastcache/phpfastcache": "^9.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "e00ef148fe3a714b27866b460e541bdc", 8 | "packages": [ 9 | { 10 | "name": "phpfastcache/phpfastcache", 11 | "version": "9.0.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/PHPSocialNetwork/phpfastcache.git", 15 | "reference": "bcd068ff1a78cd1475a4d8c13ed371711465ef40" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/PHPSocialNetwork/phpfastcache/zipball/bcd068ff1a78cd1475a4d8c13ed371711465ef40", 20 | "reference": "bcd068ff1a78cd1475a4d8c13ed371711465ef40", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-json": "*", 25 | "ext-mbstring": "*", 26 | "php": ">=8.0", 27 | "psr/cache": "^2.0||^3.0", 28 | "psr/simple-cache": "^2.0||^3.0" 29 | }, 30 | "conflict": { 31 | "doctrine/couchdb": "=8.0.0" 148 | }, 149 | "type": "library", 150 | "extra": { 151 | "branch-alias": { 152 | "dev-master": "1.0.x-dev" 153 | } 154 | }, 155 | "autoload": { 156 | "psr-4": { 157 | "Psr\\Cache\\": "src/" 158 | } 159 | }, 160 | "notification-url": "https://packagist.org/downloads/", 161 | "license": [ 162 | "MIT" 163 | ], 164 | "authors": [ 165 | { 166 | "name": "PHP-FIG", 167 | "homepage": "https://www.php-fig.org/" 168 | } 169 | ], 170 | "description": "Common interface for caching libraries", 171 | "keywords": [ 172 | "cache", 173 | "psr", 174 | "psr-6" 175 | ], 176 | "support": { 177 | "source": "https://github.com/php-fig/cache/tree/3.0.0" 178 | }, 179 | "time": "2021-02-03T23:26:27+00:00" 180 | }, 181 | { 182 | "name": "psr/simple-cache", 183 | "version": "3.0.0", 184 | "source": { 185 | "type": "git", 186 | "url": "https://github.com/php-fig/simple-cache.git", 187 | "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" 188 | }, 189 | "dist": { 190 | "type": "zip", 191 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", 192 | "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", 193 | "shasum": "" 194 | }, 195 | "require": { 196 | "php": ">=8.0.0" 197 | }, 198 | "type": "library", 199 | "extra": { 200 | "branch-alias": { 201 | "dev-master": "3.0.x-dev" 202 | } 203 | }, 204 | "autoload": { 205 | "psr-4": { 206 | "Psr\\SimpleCache\\": "src/" 207 | } 208 | }, 209 | "notification-url": "https://packagist.org/downloads/", 210 | "license": [ 211 | "MIT" 212 | ], 213 | "authors": [ 214 | { 215 | "name": "PHP-FIG", 216 | "homepage": "https://www.php-fig.org/" 217 | } 218 | ], 219 | "description": "Common interfaces for simple caching", 220 | "keywords": [ 221 | "cache", 222 | "caching", 223 | "psr", 224 | "psr-16", 225 | "simple-cache" 226 | ], 227 | "support": { 228 | "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" 229 | }, 230 | "time": "2021-10-29T13:26:27+00:00" 231 | } 232 | ], 233 | "packages-dev": [], 234 | "aliases": [], 235 | "minimum-stability": "stable", 236 | "stability-flags": [], 237 | "prefer-stable": false, 238 | "prefer-lowest": false, 239 | "platform": [], 240 | "platform-dev": [], 241 | "plugin-api-version": "2.0.0" 242 | } 243 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 | $sessionID, 35 | 'msisdn' => $msisdn, 36 | 'userData' => $userData, 37 | 'network' => $network, 38 | 'newSession' => $newSession, 39 | 'message' => $message, 40 | 'level' => 1, 41 | 'page' => 1, 42 | ]; 43 | 44 | $userResponseTracker = $Psr16Adapter->get($sessionID); 45 | 46 | !$userResponseTracker 47 | ? $userResponseTracker = [$currentState] 48 | : $userResponseTracker[] = $currentState; 49 | 50 | $Psr16Adapter->set($sessionID, $userResponseTracker); 51 | 52 | http_response_code(200); 53 | 54 | // treat this as json 55 | header('Content-Type: application/json'); 56 | 57 | echo json_encode([ 58 | 'sessionID' => $sessionID, 59 | 'msisdn' => $msisdn, 60 | 'userID' => $userID, 61 | 'continueSession' => $continueSession, 62 | 'message' => $message, 63 | ]); 64 | exit(); 65 | } 66 | 67 | 68 | $userResponseTracker = $Psr16Adapter->get($sessionID) ?? []; 69 | 70 | if (!(count($userResponseTracker) > 0)) { 71 | http_response_code(200); 72 | 73 | echo json_encode([ 74 | 'sessionID' => $sessionID, 75 | 'msisdn' => $msisdn, 76 | 'userID' => $userID, 77 | 'continueSession' => false, 78 | 'message' => 'Error! Please dial code again!', 79 | ]); 80 | exit(); 81 | } 82 | 83 | $lastResponse = $userResponseTracker[count($userResponseTracker) - 1]; 84 | 85 | $message = "Bad Option"; 86 | $continueSession = false; 87 | 88 | if ($lastResponse['level'] === 1) { 89 | if (in_array($userData, ["2", "3", "4", "5"])) { 90 | 91 | $message = "Thank you for voting!"; 92 | $continueSession = false; 93 | } else if ($userData === '1') { 94 | $message = "For SMS which of the features do you like best?" . 95 | "\n1. From File" . 96 | "\n2. Quick SMS" . 97 | "\n\n #. Next Page"; 98 | 99 | $continueSession = true; 100 | 101 | $currentState = [ 102 | 'sessionID' => $sessionID, 103 | 'msisdn' => $msisdn, 104 | 'userData' => $userData, 105 | 'network' => $network, 106 | 'newSession' => $newSession, 107 | 'message' => $message, 108 | 'level' => 2, 109 | 'page' => 1, 110 | ]; 111 | 112 | $userResponseTracker[] = $currentState; 113 | $Psr16Adapter->set($sessionID, $userResponseTracker); 114 | } 115 | } else if ($lastResponse['level'] === 2) { 116 | if ($lastResponse['page'] === 1 && $userData === '#') { 117 | $message = "For SMS which of the features do you like best?" . 118 | "\n3. Bulk SMS" . 119 | "\n\n*. Go Back" . 120 | "\n#. Next Page"; 121 | 122 | $continueSession = true; 123 | 124 | $currentState = [ 125 | 'sessionID' => $sessionID, 126 | 'msisdn' => $msisdn, 127 | 'userData' => $userData, 128 | 'network' => $network, 129 | 'newSession' => $newSession, 130 | 'message' => $message, 131 | 'level' => 2, 132 | 'page' => 2, 133 | ]; 134 | 135 | $userResponseTracker[] = $currentState; 136 | $Psr16Adapter->set($sessionID, $userResponseTracker); 137 | } else if ($lastResponse['page'] === 2 && $userData === '#') { 138 | // Useful Resources 139 | $message = "For SMS which of the features do you like best?" . 140 | "\n4. SMS To Contacts" . 141 | "\n\n*. Go Back"; 142 | 143 | $continueSession = true; 144 | 145 | $currentState = [ 146 | 'sessionID' => $sessionID, 147 | 'msisdn' => $msisdn, 148 | 'userData' => $userData, 149 | 'network' => $network, 150 | 'newSession' => $newSession, 151 | 'message' => $message, 152 | 'level' => 2, 153 | 'page' => 3, 154 | ]; 155 | 156 | $userResponseTracker[] = $currentState; 157 | $Psr16Adapter->set($sessionID, $userResponseTracker); 158 | } else if ($lastResponse['page'] === 3 && $userData === '*') { 159 | $message = "For SMS which of the features do you like best?" . 160 | "\n3. Bulk SMS" . 161 | "\n\n*. Go Back" . 162 | "\n#. Next Page"; 163 | 164 | $continueSession = true; 165 | 166 | $currentState = [ 167 | 'sessionID' => $sessionID, 168 | 'msisdn' => $msisdn, 169 | 'userData' => $userData, 170 | 'network' => $network, 171 | 'newSession' => $newSession, 172 | 'message' => $message, 173 | 'level' => 2, 174 | 'page' => 2, 175 | ]; 176 | 177 | $userResponseTracker[] = $currentState; 178 | $Psr16Adapter->set($sessionID, $userResponseTracker); 179 | } else if ($lastResponse['page'] === 2 && $userData === '*') { 180 | $message = "For SMS which of the features do you like best?" . 181 | "\n1. From File" . 182 | "\n2. Quick SMS" . 183 | "\n\n #. Next Page"; 184 | 185 | $continueSession = true; 186 | $currentState = [ 187 | 'sessionID' => $sessionID, 188 | 'msisdn' => $msisdn, 189 | 'userData' => $userData, 190 | 'network' => $network, 191 | 'newSession' => $newSession, 192 | 'message' => $message, 193 | 'level' => 2, 194 | 'page' => 1, 195 | ]; 196 | 197 | $userResponseTracker[] = $currentState; 198 | $Psr16Adapter->set($sessionID, $userResponseTracker); 199 | } else if (in_array($userData, ["1", "2", "3", "4"])) { 200 | $message = "Thank you for voting!"; 201 | $continueSession = false; 202 | } else { 203 | $message = "Bad choice!"; 204 | $continueSession = false; 205 | } 206 | } 207 | 208 | http_response_code(200); 209 | 210 | // treat this as json 211 | header('Content-Type: application/json'); 212 | 213 | echo json_encode([ 214 | 'sessionID' => $sessionID, 215 | 'msisdn' => $msisdn, 216 | 'userID' => $userID, 217 | 'continueSession' => $continueSession, 218 | 'message' => $message, 219 | ]); 220 | --------------------------------------------------------------------------------