PageRenderTime 27ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/wp-e-commerce/merchants/paypal_pro.php

https://gitlab.com/endomorphosis/reservationtelco
PHP | 402 lines | 345 code | 30 blank | 27 comment | 97 complexity | 292a996efd9b4965fb346ebb36f8e433 MD5 | raw file
  1. <?php
  2. /*
  3. * Some parts of this code were inspired by the shopp plugin and their paypal pro module.
  4. * and copyright Ingenesis Limited, 19 August, 2008.
  5. */
  6. $nzshpcrt_gateways[$num]['name'] = 'Paypal Payments Pro';
  7. $nzshpcrt_gateways[$num]['internalname'] = 'paypal_pro';
  8. $nzshpcrt_gateways[$num]['function'] = 'gateway_paypal_pro';
  9. $nzshpcrt_gateways[$num]['form'] = "form_paypal_pro";
  10. $nzshpcrt_gateways[$num]['submit_function'] = "submit_paypal_pro";
  11. $nzshpcrt_gateways[$num]['payment_type'] = "credit_card";
  12. if(in_array('paypal_pro',(array)get_option('custom_gateway_options'))) {
  13. $curryear = date('Y');
  14. //generate year options
  15. for($i=0; $i < 10; $i++){
  16. $years .= "<option value='".$curryear."'>".$curryear."</option>\r\n";
  17. $curryear++;
  18. }
  19. $gateway_checkout_form_fields[$nzshpcrt_gateways[$num]['internalname']] = "
  20. <tr id='wpsc_pppro_cc_type' class='card_type' %s>
  21. <td class='wpsc_pppro_cc_type1'>Card Type: *</td>
  22. <td class='wpsc_pppro_cc_type2'>
  23. <select class='wpsc_ccBox' name='cctype'>
  24. <option value='Visa'>Visa</option>
  25. <option value='Mastercard'>MasterCard</option>
  26. <option value='Discover'>Discover</option>
  27. <option value='Amex'>Amex</option>
  28. </select>
  29. <p class='validation-error'>%s</p>
  30. </td>
  31. </tr>
  32. <tr id='wpsc_pppro_cc_number' %s>
  33. <td class='wpsc_pppro_cc_number1'>Card Number: *</td>
  34. <td class='wpsc_pppro_cc_number2'>
  35. <input type='text' value='' name='card_number' />
  36. <p class='validation-error'>%s</p>
  37. </td>
  38. </tr>
  39. <tr id='wpsc_pppro_cc_expiry' %s>
  40. <td class='wpsc_pppro_cc_expiry1'>Expiry: *</td>
  41. <td class='wpsc_pppro_cc_expiry2'>
  42. <select class='wpsc_ccBox' name='expiry[month]'>
  43. ".$months."
  44. <option value='01'>01</option>
  45. <option value='02'>02</option>
  46. <option value='03'>03</option>
  47. <option value='04'>04</option>
  48. <option value='05'>05</option>
  49. <option value='06'>06</option>
  50. <option value='07'>07</option>
  51. <option value='08'>08</option>
  52. <option value='09'>09</option>
  53. <option value='10'>10</option>
  54. <option value='11'>11</option>
  55. <option value='12'>12</option>
  56. </select>
  57. <select class='wpsc_ccBox' name='expiry[year]'>
  58. ".$years."
  59. </select>
  60. <p class='validation-error'>%s</p>
  61. </td>
  62. </tr>
  63. <tr id='wpsc_pppro_cc_code' class='card_cvv' %s>
  64. <td class='wpsc_pppro_cc_code1'>CVV: *</td>
  65. <td class='wpsc_pppro_cc_code2'><input type='text' size='4' value='' maxlength='4' name='card_code' />
  66. <p class='validation-error'>%s</p>
  67. </td>
  68. </tr>
  69. ";
  70. }
  71. function gateway_paypal_pro($seperator, $sessionid){
  72. global $wpdb, $wpsc_cart;
  73. $purchase_log = $wpdb->get_row("SELECT * FROM `".WPSC_TABLE_PURCHASE_LOGS."` WHERE `sessionid`= ".$sessionid." LIMIT 1",ARRAY_A) ;
  74. $usersql = "SELECT `".WPSC_TABLE_SUBMITED_FORM_DATA."`.value, `".WPSC_TABLE_CHECKOUT_FORMS."`.`name`, `".WPSC_TABLE_CHECKOUT_FORMS."`.`unique_name` FROM `".WPSC_TABLE_CHECKOUT_FORMS."` LEFT JOIN `".WPSC_TABLE_SUBMITED_FORM_DATA."` ON `".WPSC_TABLE_CHECKOUT_FORMS."`.id = `".WPSC_TABLE_SUBMITED_FORM_DATA."`.`form_id` WHERE `".WPSC_TABLE_SUBMITED_FORM_DATA."`.`log_id`=".$purchase_log['id']." ORDER BY `".WPSC_TABLE_CHECKOUT_FORMS."`.`order`";
  75. //exit($usersql);
  76. $userinfo = $wpdb->get_results($usersql, ARRAY_A);
  77. //exit('<pre>'.print_r($userinfo, true).'</pre>');
  78. //BUILD DATA TO SEND TO PayPal
  79. $data = array();
  80. $data['USER'] = get_option('paypal_pro_username');
  81. $data['PWD'] = get_option('paypal_pro_password');
  82. $data['SIGNATURE'] = get_option('paypal_pro_signature');
  83. $data['VERSION'] = "52.0";
  84. $data['METHOD'] = "DoDirectPayment";
  85. $data['PAYMENTACTION'] = "Sale";
  86. $data['IPADDRESS'] = $_SERVER["REMOTE_ADDR"];
  87. $data['RETURNFMFDETAILS'] = "1"; // optional - return fraud management filter data
  88. $sql = 'SELECT `code` FROM `'.WPSC_TABLE_CURRENCY_LIST.'` WHERE `id`='.get_option('currency_type');
  89. $data['CURRENCYCODE'] = $wpdb->get_var($sql);
  90. foreach((array)$userinfo as $key => $value){
  91. if(($value['unique_name']=='billingfirstname') && $value['value'] != ''){
  92. $data['FIRSTNAME'] = $value['value'];
  93. }
  94. if(($value['unique_name']=='billinglastname') && $value['value'] != ''){
  95. $data['LASTNAME'] = $value['value'];
  96. }
  97. if(($value['unique_name']=='billingemail') && $value['value'] != ''){
  98. $data['EMAIL'] = $value['value'];
  99. }
  100. if(($value['unique_name']=='billingphone') && $value['value'] != ''){
  101. $data['PHONENUM'] = $value['value'];
  102. }
  103. if(($value['unique_name']=='billingaddress') && $value['value'] != ''){
  104. $data['STREET'] = $value['value'];
  105. }
  106. if(($value['unique_name']=='billingcity') && $value['value'] != ''){
  107. $data['CITY'] = $value['value'];
  108. }
  109. if(($value['unique_name']=='billingstate') && $value['value'] != ''){
  110. $sql = "SELECT `code` FROM `".WPSC_TABLE_REGION_TAX."` WHERE `id` ='".$value['value']."' LIMIT 1";
  111. $data['STATE'] = $wpdb->get_var($sql);
  112. }else{
  113. // $data['STATE']='CA';
  114. }
  115. if(($value['unique_name']=='billingcountry') && $value['value'] != ''){
  116. $value['value'] = maybe_unserialize($value['value']);
  117. if($value['value'][0] == 'UK'){
  118. $data['COUNTRYCODE'] = 'GB';
  119. }else{
  120. $data['COUNTRYCODE'] = $value['value'][0];
  121. }
  122. if(is_numeric($value['value'][1])){
  123. $sql = "SELECT `code` FROM `".WPSC_TABLE_REGION_TAX."` WHERE `id` ='".$value['value'][1]."' LIMIT 1";
  124. $data['STATE'] = $wpdb->get_var($sql);
  125. }
  126. }
  127. if(($value['unique_name']=='billingpostcode') && $value['value'] != ''){
  128. $data['ZIP'] = $value['value'];
  129. }
  130. //
  131. if((($value['unique_name']=='shippingfirstname') && $value['value'] != '')){
  132. $data1['SHIPTONAME1'] = $value['value'];
  133. }
  134. if((($value['unique_name']=='shippinglastname') && $value['value'] != '')){
  135. $data1['SHIPTONAME2'] = $value['value'];
  136. }
  137. if(($value['unique_name']=='shippingaddress') && $value['value'] != ''){
  138. $data['SHIPTOSTREET'] = $value['value'];
  139. }
  140. if(($value['unique_name']=='shippingcity') && $value['value'] != ''){
  141. $data['SHIPTOCITY'] = $value['value'];
  142. }
  143. //$data['SHIPTOCITY'] = 'CA';
  144. if(($value['unique_name']=='shippingstate') && $value['value'] != ''){
  145. // $data['SHIPTOSTATE'] = $value['value'];
  146. $sql = "SELECT `code` FROM `".WPSC_TABLE_REGION_TAX."` WHERE `id` ='".$value['value']."' LIMIT 1";
  147. $data['SHIPTOSTATE'] = $wpdb->get_var($sql);
  148. }else{
  149. }
  150. if(($value['unique_name']=='shippingcountry') && $value['value'] != ''){
  151. $value['value'] = maybe_unserialize($value['value']);
  152. if(is_array($value['value'])){
  153. if($value['value'][0] == 'UK'){
  154. $data['SHIPTOCOUNTRY'] = 'GB';
  155. }else{
  156. $data['SHIPTOCOUNTRY'] = $value['value'][0];
  157. }
  158. if(is_numeric($value['value'][1])){
  159. $sql = "SELECT `code` FROM `".WPSC_TABLE_REGION_TAX."` WHERE `id` ='".$value['value'][1]."' LIMIT 1";
  160. $data['SHIPTOSTATE'] = $wpdb->get_var($sql);
  161. }
  162. }else{
  163. $data['SHIPTOCOUNTRY'] = $value['value'];
  164. }
  165. }
  166. if(($value['unique_name']=='shippingpostcode') && $value['value'] != ''){
  167. $data['SHIPTOZIP'] = $value['value'];
  168. }
  169. //exit($key.' > '.print_r($value,true));
  170. }
  171. $data['SHIPTONAME'] = $data1['SHIPTONAME1'].' '.$data1['SHIPTONAME2'];
  172. // exit('<pre>'.print_r($data, true).'</pre>');
  173. if( ($data['SHIPTONAME'] == null) || ($data['SHIPTOSTREET'] == null) || ($data['SHIPTOCITY'] == null) ||
  174. ($data['SHIPTOSTATE'] == null) || ($data['SHIPTOCOUNTRY'] == null) || ($data['SHIPTOZIP'] == null)) {
  175. // if any shipping details are empty, the order will simply fail, this deletes them all if one is empty
  176. unset($data['SHIPTONAME']);
  177. unset($data['SHIPTOSTREET']);
  178. unset($data['SHIPTOCITY']);
  179. unset($data['SHIPTOSTATE']);
  180. unset($data['SHIPTOCOUNTRY']);
  181. unset($data['SHIPTOZIP']);
  182. }
  183. $data['CREDITCARDTYPE'] = $_POST['cctype'];
  184. $data['ACCT'] = $_POST['card_number'];
  185. $data['EXPDATE'] = $_POST['expiry']['month'].$_POST['expiry']['year'];
  186. $data['CVV2'] = $_POST['card_code'];
  187. $data['AMT'] = number_format($wpsc_cart->total_price,2);
  188. $data['ITEMAMT'] = number_format($wpsc_cart->subtotal,2);
  189. $data['SHIPPINGAMT'] = number_format($wpsc_cart->base_shipping,2);
  190. $data['TAXAMT'] = number_format($wpsc_cart->total_tax, 2);
  191. // Ordered Items
  192. $discount = $wpsc_cart->coupons_amount;
  193. //exit($discount);
  194. if(($discount > 0)) {
  195. $i = 1;
  196. $data['AMT'] = number_format(sprintf("%01.2f", $wpsc_cart->calculate_total_price()),2,'.','');
  197. $data['ITEMAMT'] = number_format(sprintf("%01.2f", $wpsc_cart->calculate_total_price()),2,'.','');
  198. $data['SHIPPINGAMT'] = 0;
  199. $data['TAXAMT'] = 0;
  200. $data['L_NAME'.$i] = "Your Shopping Cart";
  201. $data['L_AMT'.$i] = number_format(sprintf("%01.2f", $wpsc_cart->calculate_total_price()),2,'.','');
  202. $data['L_QTY'.$i] = 1;
  203. // $data['item_number_'.$i] = 0;
  204. $data['L_TAXAMT'.$i] = 0;
  205. } else {
  206. foreach($wpsc_cart->cart_items as $i => $Item) {
  207. $data['L_NAME'.$i] = $Item->product_name;
  208. $data['L_AMT'.$i] = number_format($Item->unit_price,2);
  209. $data['L_NUMBER'.$i] = $i;
  210. $data['L_QTY'.$i] = $Item->quantity;
  211. //$data['L_TAXAMT'.$i] = number_format($Item->tax,2);
  212. }
  213. }
  214. $transaction = "";
  215. foreach($data as $key => $value) {
  216. if (is_array($value)) {
  217. foreach($value as $item) {
  218. if (strlen($transaction) > 0) $transaction .= "&";
  219. $transaction .= "$key=".urlencode($item);
  220. }
  221. } else {
  222. if (strlen($transaction) > 0) $transaction .= "&";
  223. $transaction .= "$key=".urlencode($value);
  224. }
  225. }
  226. //exit($transaction);
  227. $response = send($transaction);
  228. //exit('<pre>'.print_r($response, true).'</pre><pre>'.print_r($data, true).'</pre>');
  229. if($response->ack == 'Success' || $response->ack == 'SuccessWithWarning'){
  230. //redirect to transaction page and store in DB as a order with accepted payment
  231. $sql = "UPDATE `".WPSC_TABLE_PURCHASE_LOGS."` SET `processed`= '2' WHERE `sessionid`=".$sessionid;
  232. $wpdb->query($sql);
  233. $transact_url = get_option('transact_url');
  234. unset($_SESSION['WpscGatewayErrorMessage']);
  235. $_SESSION['paypalpro'] = 'success';
  236. header("Location: ".get_option('transact_url').$seperator."sessionid=".$sessionid);
  237. exit(); // on some servers, a header that is not followed up with an exit does nothing.
  238. }else{
  239. //redirect back to checkout page with errors
  240. $sql = "UPDATE `".WPSC_TABLE_PURCHASE_LOGS."` SET `processed`= '5' WHERE `sessionid`=".$sessionid;
  241. $wpdb->query($sql);
  242. $transact_url = get_option('checkout_url');
  243. $paypal_account_error = false;
  244. $paypal_error_codes = array('10500','10501','10507','10548','10549','10550','10552','10758','10760','15003');
  245. foreach($paypal_error_codes as $error_code) {
  246. if(in_array($error_code, $response->errorcodes)) {
  247. $paypal_account_error = true;
  248. break;
  249. }
  250. }
  251. if($paypal_account_error == true) {
  252. $_SESSION['wpsc_checkout_misc_error_messages'][] = __('There is a problem with your PayPal account configuration, please contact PayPal for further information.');
  253. foreach($response->longerror as $paypal_error) {
  254. $_SESSION['wpsc_checkout_misc_error_messages'][] = $paypal_error;
  255. }
  256. } else {
  257. $_SESSION['wpsc_checkout_misc_error_messages'][] = __('Sorry your transaction did not go through to Paypal successfully, please try again.');
  258. }
  259. $_SESSION['paypalpro'] = 'fail';
  260. }
  261. //exit('<pre>'.print_r($response, true).'</pre>');
  262. }
  263. function send ($transaction) {
  264. $connection = curl_init();
  265. if (get_option('paypal_pro_testmode') == "on"){
  266. curl_setopt($connection,CURLOPT_URL,"https://api-3t.sandbox.paypal.com/nvp"); // Sandbox testing
  267. // exit('sandbox is true');
  268. }else{
  269. curl_setopt($connection,CURLOPT_URL,"https://api-3t.paypal.com/nvp"); // Live
  270. }
  271. $useragent = 'WP e-Commerce plugin';
  272. curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
  273. curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);
  274. curl_setopt($connection, CURLOPT_NOPROGRESS, 1);
  275. curl_setopt($connection, CURLOPT_VERBOSE, 1);
  276. curl_setopt($connection, CURLOPT_FOLLOWLOCATION,0);
  277. curl_setopt($connection, CURLOPT_POST, 1);
  278. curl_setopt($connection, CURLOPT_POSTFIELDS, $transaction);
  279. curl_setopt($connection, CURLOPT_TIMEOUT, 30);
  280. curl_setopt($connection, CURLOPT_USERAGENT, $useragent);
  281. curl_setopt($connection, CURLOPT_REFERER, "https://".$_SERVER['SERVER_NAME']);
  282. curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
  283. $buffer = curl_exec($connection);
  284. curl_close($connection);
  285. //echo $buffer;
  286. $Response = response($buffer);
  287. return $Response;
  288. }
  289. function response ($buffer) {
  290. $_ = new stdClass();
  291. $r = array();
  292. $pairs = split("&",$buffer);
  293. foreach($pairs as $pair) {
  294. list($key,$value) = split("=",$pair);
  295. if (preg_match("/(\w*?)(\d+)/",$key,$matches)) {
  296. if (!isset($r[$matches[1]])) $r[$matches[1]] = array();
  297. $r[$matches[1]][$matches[2]] = urldecode($value);
  298. } else $r[$key] = urldecode($value);
  299. }
  300. $_->ack = $r['ACK'];
  301. $_->errorcodes = $r['L_ERRORCODE'];
  302. $_->shorterror = $r['L_SHORTMESSAGE'];
  303. $_->longerror = $r['L_LONGMESSAGE'];
  304. $_->severity = $r['L_SEVERITYCODE'];
  305. $_->timestamp = $r['TIMESTAMP'];
  306. $_->correlationid = $r['CORRELATIONID'];
  307. $_->version = $r['VERSION'];
  308. $_->build = $r['BUILD'];
  309. $_->transactionid = $r['TRANSACTIONID'];
  310. $_->amt = $r['AMT'];
  311. $_->avscode = $r['AVSCODE'];
  312. $_->cvv2match = $r['CVV2MATCH'];
  313. return $_;
  314. }
  315. function submit_paypal_pro(){
  316. //exit('<pre>'.print_r($_POST, true).'</pre>');
  317. if($_POST['PayPalPro']['username'] != null) {
  318. update_option('paypal_pro_username', $_POST['PayPalPro']['username']);
  319. }
  320. if($_POST['PayPalPro']['password'] != null) {
  321. update_option('paypal_pro_password', $_POST['PayPalPro']['password']);
  322. }
  323. if($_POST['PayPalPro']['signature'] != null) {
  324. update_option('paypal_pro_signature', $_POST['PayPalPro']['signature']);
  325. }
  326. if($_POST['PayPalPro']['testmode'] != null) {
  327. update_option('paypal_pro_testmode', $_POST['PayPalPro']['testmode']);
  328. }
  329. return true;
  330. }
  331. function form_paypal_pro(){
  332. if(get_option('paypal_pro_testmode') == "on"){
  333. $selected = 'checked="checked"';
  334. }else{
  335. $selected = '';
  336. }
  337. $output = '
  338. <tr>
  339. <td>
  340. <label for="paypal_pro_username">'.__('API Username:').'</label>
  341. </td>
  342. <td>
  343. <input type="text" name="PayPalPro[username]" id="paypal_pro_username" value="'.get_option("paypal_pro_username").'" size="30" />
  344. </td>
  345. </tr>
  346. <tr>
  347. <td>
  348. <label for="paypal_pro_password">'.__('API Password:').'</label>
  349. </td>
  350. <td>
  351. <input type="password" name="PayPalPro[password]" id="paypal_pro_password" value="'.get_option('paypal_pro_password').'" size="16" />
  352. </td>
  353. </tr>
  354. <tr>
  355. <td>
  356. <label for="paypal_pro_signature">'.__('API Signature:').'</label>
  357. </td>
  358. <td>
  359. <input type="text" name="PayPalPro[signature]" id="paypal_pro_signature" value="'.get_option('paypal_pro_signature').'" size="48" />
  360. </td>
  361. </tr>
  362. <tr>
  363. <td>
  364. <label for="paypal_pro_testmode">'.__('Test Mode Enabled:').'</label>
  365. </td>
  366. <td>
  367. <input type="hidden" name="PayPalPro[testmode]" value="off" /><input type="checkbox" name="PayPalPro[testmode]" id="paypal_pro_testmode" value="on" '.$selected.' />
  368. </td>
  369. </tr>';
  370. return $output;
  371. }
  372. ?>