Odyssey
CHKFREE.i
1 <?php
2 /*
3  * Subscriber Management functions for CheckFree based on CheckFree Builder 3.1
4  *
5  * ===========================
6  * 4/18/2019 Create bpSetCred function to load config from trusted details
7  * based on prod / pilot status, and to retrieve the ssl cert using updated
8  * ODY method to fetch & decrypt.
9  *
10  * Call the new bpSetCred in each of the other
11  * bp* functions that previously loaded from trusted details independently
12  *
13  * Remove unused password credential certpass / prodpass / servicepass
14  *
15  * Changes not tested -- CVFCU is only client & haven't migrated yet
16  * No vendor test site available
17  * Don't want to Surprise! enroll new folks by testing in prod
18  * So I hacked up a copy of hcuConnect just to call bpSetCred, and verified it
19  * works as expected. THIS IS NOT A THOROUGH TEST. Will need to test full
20  * CHKFREE api when Cross Valley CVFCU begins migration
21  * ===========================
22  *
23  * NOTE: CheckFree wants consistent use of either <ExternalSubscriberId> or
24  * <SubscriberId> for the Mobile calls. We chose <SubscriberId>.
25  *
26  * NOTE: This plugin uses caching. Certain lists are stored in the cu_vendorcache
27  * table. The lists are referenced with a key/string in the cache. The
28  * function to read the list will handle if the value needs to be read
29  * from the vendor if the cache doesn't exist.
30  * Cache Keys
31  * ckfrAcctList account list
32  * ckfrPayeeList payee list
33  * ckfrHistory payment history list
34  * ckfrPending pending payments; flushed if new, stop, or edit payment
35  *
36  * Make sure to always use the Type field for cache table entry where clause
37  * because that is part of the unique key.
38  *
39  * Note: To debug some functions you can write output to a file, such as like:
40  * $fp = fopen( "/tmp/miketest", "w+" );
41  * if ( $fp ) {
42  * fprintf( $fp, "In bpPmtStop\n" );
43  * fprintf( $fp, print_r( $parms, true ) );
44  * fprintf( $fp, print_r( $response, true ) );
45  * }
46  *
47  */
48 #- SubscriberEnroll
49 #- SubscriberGetInfo
50 #- SubscriberModify
51 
52 #- GetBankAccountList
53 #- BankAccountAdd
54 #- BankAccountModify
55 #- BankAccountInactivate
56 
57 define( "MP_CHKFREE_ERROR_CODE", "5012" );
58 define( "SERVICE_NAME", "CHKFREE" ); // name in Trusted Detail
59 // cache keys
60 define( "CACHE_KEY_ACCTS", "ckfrAcctList" );
61 define( "CACHE_KEY_PAYEE", "ckfrPayeeList" );
62 define( "CACHE_KEY_HIST", "ckfrHistory" );
63 define( "CACHE_KEY_PMTS", "ckfrPending" );
64 
65 // Insert a log entry.
66 function LogCheckFreeActivity( $logData ) {
67  // make sure entry isn't too long
68  $logPoint = substr( $logData["logPoint"], 0, 35 );
69  $sessionId = substr( $logData["token"], -20 ); // assuming lower characters are more significant
70  $txnId = substr( $logData["txnId"], -20 ); // assuming lower characters are more significant
71  $request = pg_escape_string(trim($logData["request"])); // handle quoting, etc
72  $reply = pg_escape_string(trim($logData["reply"])); // handle quoting, etc
73 
74 
75  // entry time is added automatically
76  $sql = "INSERT INTO cu_vendorlog (cu, user_id, service, sub_service,
77  session_id, txn_id, user_ip, request, response)
78  VALUES ('{$logData["Cu"]}', '{$logData["memberId"]}', 'CHKFREE',
79  '$logPoint', '$sessionId', '$txnId',
80  '{$logData["userIP"]}', '$request', '$reply')";
81 
82  db_query($sql, $logData["dbConn"] );
83 
84 } // end LogCheckFreeActivity
85 
86 // Read the cache value for a given list.
87 function ReadCheckFreeCache($dbh, $user, $subscriber, $cu, $cacheType, $session) {
88  $sql = "SELECT session, entry, data
89  FROM cu_vendorcache
90  WHERE cu = '$cu'
91  AND username = '$user'
92  AND type = '$cacheType'";
93 
94  $rs = db_query( $sql, $dbh );
95 
96  // check for mulitple entries in case some error caused multiple entries to exist
97  $returnData = "";
98  $row = 0;
99  while ($cacheRow = db_fetch_array($rs, $row++)) {
100  // if already have found data, remove any more
101  if ( strlen( $returnData ) > 0 ) {
102  DeleteCheckFreeCache($dbh, $user, $subscriber, $cu, $cacheType, $cacheRow["session"], $cacheRow["entry"]);
103  } else if ( $cacheRow["session"] == $session ) {
104  // valid session, return the data
105  $returnData = $cacheRow["data"];
106  } else {
107  // invalid session, remove this entry
108  DeleteCheckFreeCache($dbh, $user, $subscriber, $cu, $cacheType, $cacheRow["session"], "");
109  }
110  }
111 
112  $returnStructure = json_decode( $returnData, true );
113 
114  return $returnStructure;
115 } // end ReadCheckFreeCache
116 
117 // Delete a given cache entry. This is how the cache is flagged as flushed.
118 // Use the $cacheType, $session, and/or $timestamp to refine how much cache to flush.
119 function DeleteCheckFreeCache($dbh, $user, $subscriber, $cu, $cacheType, $session, $timestamp) {
120  $sql = "DELETE FROM cu_vendorcache
121  WHERE cu = '$cu'
122  AND username = '$user'";
123 
124  if ( strlen( $cacheType ) ) {
125  $sql .= " AND type = '$cacheType'";
126  }
127 
128  if ( strlen( $session ) ) {
129  $sql .= " AND session = '$session'";
130  }
131 
132  if ( strlen( $timestamp ) ) {
133  $sql .= " AND entry = '$timestamp'";
134  }
135 
136  db_query( $sql, $dbh );
137 } // end DeleteCheckFreeCache
138 
139 // Write the cache value for a given list. Parameter 'data' is expected to be a structure.
140 function WriteCheckFreeCache($dbh, $user, $subscriber, $cu, $cacheType, $session, $data) {
141  // we need every variable
142  if ( !$dbh || !$user || !$subscriber || !$cu || !$cacheType || !$session || !$data ) {
143  return;
144  }
145 
146  try {
147  // convert to a json object
148  $jsonData = json_encode( $data );
149  } catch ( Exception $e ) {
150  $jsonData = "";
151  }
152 
153  if ( strlen( $jsonData ) ) {
154  $jsonData = pg_escape_string($jsonData); // handle quoting, etc
155 
156  $sql = "INSERT INTO cu_vendorcache (cu, username, subscriber, session, type, data)
157  VALUES ('$cu', '$user', '$subscriber', '$session', '$cacheType', '$jsonData' )";
158 
159  $result = db_query( $sql, $dbh );
160  }
161 } // end WriteCheckFreeCache
162 
163 
164 function bpsmEnrollSub($HB_ENV,$parms) {
165  try {
166  $return=array('status'=>array('response'=>'true','message'=>'success'));
167 
168  $cred = bpSetCred($parms);
169  if (HCU_array_key_value('message',$cred) != 'success') {
170  throw new Exception($cred['message']);
171  }
172  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
173  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
174  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
175  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
176  $parms['Token']=$parms['passwith']['Token'];
177  $parms['clientIP']=$_SERVER['REMOTE_ADDR'];
178  $parms['billpayid']=$parms['passwith']['billpayid'];
179  $parms['live']=$HB_ENV['live'];
180  $parms['Cu']=$HB_ENV['Cu'];
181  $parms['Cn']=$HB_ENV['Cn'];
182  $parms['Ml']=$HB_ENV['Ml'];
183  $parms['rt']=$HB_ENV['rt'];
184 
185  $mirInfo = $parms['MIR'];
186  # if mirInfo["data"]["EMail"] is blank use $Ml instead - make sure we have it?
187  if ($mirInfo['status']['response'] != 'true') {
188  throw new Exception($mirInfo['status']['message']);
189  }
190  if (is_array($mirInfo['info'])) {
191  foreach($mirInfo['info'] as $mirkey => $mirval) {
192  $parms["mir{$mirkey}"] = $mirval;
193  }
194  }
195  if (is_array($parms['passwith']['payaccounts'])) {
196  foreach($parms['passwith']['payaccounts'][0] as $akey => $aval) {
197  $parms["payacct{$akey}"] = $aval;
198  }
199  }
200  /*
201  * SubscriberEnroll $reqparms = array('SponsorID'=>1,
202  'Cn'=>1,
203  'clientAppText'=>1,
204  'clientAppVer'=>1,
205  'Token'=>1,
206  'clientIP'=>1,
207  'billpayid'=>1,
208  'miraccountnumber' => 1,
209  'mirlastname' => 1,
210  'miremail' => 1,
211  'mirssn' => 1,
212  'mirdob' => 1,
213  'mirphone' => 1,
214  'miraddress1' => 1,
215  'mircity' => 1,
216  'mirstate' => 1,
217  'mirzip' => 1,
218  'serviceurl' => 1,
219  'servicecert' => 1,
220  'serviceca'=> 1
221  );
222  */
223  $enrSub = ckfrSubscriberEnroll($parms);
224 
225  if ($enrSub['status']['response'] != 'true') {
226  throw new Exception($enrSub['status']['message']);
227  }
228  $return['data']=$enrSub['data'];
229 
230  } catch (Exception $e) {
231  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'line'=>$e->getLine(),'data'=>array());
232  }
233  return $return;
234 }
235 
236 function bpsmModifySub($HB_ENV,$parms) {
237  try {
238  $return=array('status'=>array('response'=>'true','message'=>'success'));
239  $cred = bpSetCred($parms);
240  if (HCU_array_key_value('message',$cred) != 'success') {
241  throw new Exception($cred['message']);
242  }
243  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
244  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
245  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
246  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
247  $parms['Token']=$parms['passwith']['Token'];
248  $parms['clientIP']=$_SERVER['REMOTE_ADDR'];
249  $parms['billpayid']=$parms['passwith']['billpayid'];
250  $parms['live']=$HB_ENV['live'];
251  $parms['Cu']=$HB_ENV['Cu'];
252  $parms['Cn']=$HB_ENV['Cn'];
253  $parms['Ml']=$HB_ENV['Ml'];
254  $parms['rt']=$HB_ENV['rt'];
255 
256  $mirInfo = $parms['MIR'];
257  # if mirInfo["info"]["EMail"] is blank use $Ml instead - make sure we have it?
258  if ($mirInfo['status']['response'] != 'true') {
259  throw new Exception($mirInfo['status']['message']);
260  }
261  if (is_array($mirInfo['info'])) {
262  foreach($mirInfo['info'] as $mirkey => $mirval) {
263  $parms["mir{$mirkey}"] = $mirval;
264  }
265  }
266  /*
267  * SubscriberModify $reqparms = array('SponsorID'=>1,
268  'clientAppText'=>1,
269  'clientAppVer'=>1,
270  'Token'=>1,
271  'clientIP'=>1,
272  'billpayid'=>1,
273  'miraccountnumber' => 1,
274  'mirlastname' => 1,
275  'miremail' => 1,
276  'mirssn' => 1,
277  'mirdob' => 1,
278  'mirphone' => 1,
279  'miraddress1' => 1,
280  'mircity' => 1,
281  'mirstate' => 1,
282  'mirzip' => 1,
283  'serviceurl' => 1,
284  'servicecert' => 1,
285  'serviceca'=> 1
286  );
287  */
288  $enrSub = ckfrSubscriberModify($parms);
289 
290  if ($enrSub['status']['response'] != 'true') {
291  throw new Exception($enrSub['status']['message']);
292  }
293  $return['data']=$enrSub['data'];
294 
295  } catch (Exception $e) {
296  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'data'=>array());
297  }
298  return $return;
299 }
300 function bpsmInfoSub($HB_ENV,$parms) {
301  try {
302  $return=array('status'=>array('response'=>'true','message'=>'success'));
303  $cred = bpSetCred($parms);
304  if (HCU_array_key_value('message',$cred) != 'success') {
305  throw new Exception($cred['message']);
306  }
307  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
308  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
309  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
310  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
311  $parms['Token']=$parms['passwith']['Token'];
312  $parms['clientIP']=$_SERVER['REMOTE_ADDR'];
313  $parms['billpayid']=$parms['passwith']['billpayid'];
314  /*
315  * SubscriberGetInfo $reqparms = array('SponsorID'=>1,
316  'Cn'=>1,
317  'clientAppText'=>1,
318  'clientAppVer'=>1,
319  'Token'=>1,
320  'clientIP'=>1,
321  'billpayid'=>1,
322  'serviceurl' => 1,
323  'servicecert' => 1,
324  'serviceca'=> 1
325  );
326 
327  */
328  $enrSub = ckfrSubscriberGetInfo($parms);
329 
330  if ($enrSub['status']['response'] != 'true' && $enrSub["data"]["Result"]["ResultInfo"]["Code"]!='301') {
331  throw new Exception($enrSub['status']['message']);
332  }
333  $return['data']=$enrSub['data'];
334 
335  } catch (Exception $e) {
336  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'data'=>array());
337  }
338  return $return;
339 }
340 
341 function bpsmAcctList($HB_ENV,$parms) {
342  try {
343  $return=array('status'=>array('response'=>'true','message'=>'success'));
344  $cred = bpSetCred($parms);
345  if (HCU_array_key_value('message',$cred) != 'success') {
346  throw new Exception($cred['message']);
347  }
348  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
349  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
350  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
351  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
352  $parms['Token']=$parms['passwith']['Token'];
353  $parms['clientIP']=$_SERVER['REMOTE_ADDR'];
354  $parms['billpayid']=$parms['passwith']['billpayid'];
355  /*
356  * GetBankAccountList $reqparms = array('SponsorID'=>1,
357  'Cn'=>1,
358  'clientAppText'=>1,
359  'clientAppVer'=>1,
360  'Token'=>1,
361  'billpayid'=>1,
362  'serviceurl' => 1,
363  'servicecert' => 1,
364  'serviceca'=> 1
365  );
366 
367  */
368  $enrSub = ckfrGetBankAccountList($parms);
369 
370  if ($enrSub['status']['response'] != 'true') {
371  throw new Exception($enrSub['status']['message']);
372  }
373  $return['data']=$enrSub['data'];
374 
375  } catch (Exception $e) {
376  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'data'=>array());
377  }
378  return $return;
379 }
380 function bpsmAddAcct($HB_ENV,$parms) {
381  try {
382  $return=array('status'=>array('response'=>'true','message'=>'success'));
383  $cred = bpSetCred($parms);
384  if (HCU_array_key_value('message',$cred) != 'success') {
385  throw new Exception($cred['message']);
386  }
387  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
388  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
389  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
390  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
391  $parms['Token']=$parms['passwith']['Token'];
392  $parms['clientIP']=$_SERVER['REMOTE_ADDR'];
393  $parms['billpayid']=$parms['passwith']['billpayid'];
394  /*
395  * BankAccountAdd $reqparms = array('SponsorID'=>1,
396  'clientAppText'=>1,
397  'clientAppVer'=>1,
398  'Token'=>1,
399  'clientIP'=>1,
400  'billpayid'=>1,
401  'serviceurl' => 1,
402  'servicecert' => 1,
403  'serviceca'=> 1,
404  'rt'=>1,
405  'acctNumber'=>1,
406  'acctDescription'=>1
407  );
408 
409 
410  */
411  $enrSub = ckfrBankAccountAdd($parms);
412 
413  if ($enrSub['status']['response'] != 'true') {
414  throw new Exception($enrSub['status']['message']);
415  }
416  $return['data']=$enrSub['data'];
417 
418  } catch (Exception $e) {
419  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'data'=>array());
420  }
421  return $return;
422 }
423 
424 function bpsmEchoPing($HB_ENV,$parms) {
425  try {
426  $return=array('status'=>array('response'=>'true','message'=>'success'));
427  $cred = bpSetCred($parms);
428  if (HCU_array_key_value('message',$cred) != 'success') {
429  throw new Exception($cred['message']);
430  }
431  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
432  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
433  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
434  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
435 
436  $echoPing = ckfrEchoPing($parms);
437 
438  if ($echoPing['status']['response'] != 'true') {
439  throw new Exception($echoPing['status']['message']);
440  }
441  $return['data']=$echoPing['data'];
442 
443  } catch (Exception $e) {
444  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'data'=>array());
445  }
446  return $return;
447 }
448 
449 function bpAuth($parms) {
450  try {
451  $cred = bpSetCred($parms);
452  if (HCU_array_key_value('message',$cred) != 'success') {
453  throw new Exception($cred['message']);
454  }
455  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
456  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
457  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
458  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
459 
460  // some parameters for mobile solution
461  $parms["clientAppText"] = $parms["mblAppText"];
462  $parms["clientAppVer"] = $parms["mblAppVer"];
463 
464  // some more parameters needed to communicate with Fiserv
465  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
466  $parms['billpayid'] = $parms['BillpayId'];
467 
468  // Fiserv needs a constant id in their SessionCorrID field, so we use the Token and it is a timestamp
469  $parms['Token'] = time();
470 
471  $response = ckfrSubscriberGetInfo($parms);
472 
473  if ($response['status']['response'] != 'true' && $response["data"]["Result"]["ResultInfo"]["Code"] != '301') {
474  throw new Exception($response['status']['message']);
475  }
476 
477  # normalize the name for scalability
478  if ( $response["status"]["response"] != 'true' ) {
479  if ( empty($response["status"]["message"]) ) {
480  $response["status"]["message"] = "Subscriber Validation Failed. {$response["data"]["Result"]["ResultInfo"]["Code"]}"; // . print_r( $response, true );
481  }
482  } else {
483  $output["Token"] = $parms['Token'];
484  $output["DateModel"] = "PayeeProcess"; // only one type supported
485  $output["BillpayId"] = $parms["BillpayId"];
486  $output['MoblPayName']= (trim($parms['MoblPayName']) == '' ? htmlentities('Pay Bills') : htmlentities($parms['MoblPayName']));
487  $output['Extras'] = htmlentities($parms['ExtraOptions']);
488  $response['data']= $output;
489 
490  // need to return a successful response code since we cannot add it at the lower levels
491  $response["status"]["code"] = "000";
492  }
493 
494  $return = $response;
495 
496  } catch (Exception $e) {
497  $return = array('status'=>array('response'=>'false','message'=>$e->getMessage(),'code'=>'999'),'data'=>array('Token'=>'0'));
498  }
499 
500  return $return;
501 }
502 
503 function bpHist( $parms ) {
504  $cred = bpSetCred($parms);
505  if (HCU_array_key_value('message',$cred) != 'success') {
506  throw new Exception($cred['message']);
507  }
508  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
509  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
510  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
511  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
512 
513  // this function is in the MobileManagement endpoint
514  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
515  $parms["clientAppText"] = $parms["mblAppText"];
516  $parms["clientAppVer"] = $parms["mblAppVer"];
517 
518  $parms['Token'] = $parms["passwith"]["Token"];
519  $parms['billpayid'] = $parms['BillpayId'];
520  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
521 
522  $response = ckfrGetPaymentList( $parms, "historical" );
523 
524  if ( $response["status"]["response"] != 'true' ) {
525  if ( empty($response["status"]["message"]) )
526  $response["status"]["message"] = 'Get History Failed';
527  $return = $response;
528  } else {
529  // put into a consistent structure
530  $output = array();
531 
532  if ( isset( $response["data"]["Payments"] ) && count( $response["data"]["Payments"] ) > 0 ) {
533  // need to figure out if there is just one payment, or if there are multiple
534  if ( isset( $response["data"]["Payments"]["TransactionDate"] ) ) {
535  $payment = $response["data"]["Payments"];
536 
537  $outputElem = array();
538  $outputElem["TxnId"] = $payment["TransactionId"];
539  $outputElem["Type"] = "Payment"; // payment or transfer - needed to help figure out display issues
540  $outputElem["ToName"] = $payment["Payee"]["Name"];
541  $outputElem["Amount"] = number_format( $payment["Amount"], 2 );
542  $outputElem["Date"] = date( "m/d/Y", strtotime( $payment["TransactionDate"] ) );
543 
544  // need to have any dates go back correctly formatted
545  $paymentDate = strtotime( $payment["PaymentDate"]["Date"] );
546 
547  // this info will be shown as is with any underscores ('_') or vertical bars ('|') changes to spaces
548  $Additional = array( "From" => $payment["BankAccountId"]["AccountNumber"],
549  "Payment_Date" => date( "m/d/Y", $paymentDate ),
550  "Confirmation" => $payment["ConfirmationNumber"],
551  "Status" => $payment["Status"] );
552  if ( strlen( $payment["PaymentDeliveryMethod"] ) ) {
553  $Additional["Rush"] = $payment["PaymentDeliveryMethod"];
554  }
555  if ( strlen( $payment["RecurringModelId"] ) ) {
556  $Additional["Recurring"] = $payment["RecurringModelId"];
557  }
558  if ( strlen( $payment["PaymentFee"] ) ) {
559  $Additional["Payment_Fee"] = $payment["PaymentFee"];
560  }
561  if ( strlen( $payment["CheckNumber"] ) ) {
562  $Additional["Check_Number"] = $payment["CheckNumber"];
563  }
564  if ( strlen( $payment["EbillId"] ) ) {
565  $Additional["EBill_ID"] = $payment["EbillId"];
566  }
567 
568  $outputElem["AdditionalInfo"] = $Additional;
569 
570  $output[] = $outputElem;
571  } else {
572  foreach( $response["data"]["Payments"] as $payment ) {
573  $outputElem = array();
574  $outputElem["TxnId"] = $payment["TransactionId"];
575  $outputElem["Type"] = "Payment"; // payment or transfer - needed to help figure out display issues
576  $outputElem["ToName"] = $payment["Payee"]["Name"];
577  $outputElem["Amount"] = number_format( $payment["Amount"], 2 );
578  $outputElem["Date"] = date( "m/d/Y", strtotime( $payment["TransactionDate"] ) );
579 
580  // need to have any dates go back correctly formatted
581  $paymentDate = strtotime( $payment["PaymentDate"]["Date"] );
582 
583  // this info will be shown as is with any underscores ('_') or vertical bars ('|') changes to spaces
584  $Additional = array( "From" => $payment["BankAccountId"]["AccountNumber"],
585  "Payment_Date" => date( "m/d/Y", $paymentDate ),
586  "Confirmation" => $payment["ConfirmationNumber"],
587  "Status" => $payment["Status"] );
588  if ( strlen( $payment["PaymentDeliveryMethod"] ) ) {
589  $Additional["Rush"] = $payment["PaymentDeliveryMethod"];
590  }
591  if ( strlen( $payment["RecurringModelId"] ) ) {
592  $Additional["Recurring"] = $payment["RecurringModelId"];
593  }
594  if ( strlen( $payment["PaymentFee"] ) ) {
595  $Additional["Payment_Fee"] = $payment["PaymentFee"];
596  }
597  if ( strlen( $payment["CheckNumber"] ) ) {
598  $Additional["Check_Number"] = $payment["CheckNumber"];
599  }
600  if ( strlen( $payment["EbillId"] ) ) {
601  $Additional["EBill_ID"] = $payment["EbillId"];
602  }
603 
604  $outputElem["AdditionalInfo"] = $Additional;
605 
606  $output[] = $outputElem;
607  }
608 
609  usort( $output, "histSort" );
610  }
611 
612  # normalize the name for scalability
613  $return = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
614  $return['data'] = $output;
615  } else {
616  // successful, but didn't get any payments, so get a message
617  if ( isset( $response["data"]["Result"]["ResultInfo"]["Description"] ) ) {
618  $message = $response["data"]["Result"]["ResultInfo"]["Description"];
619  } else {
620  $message = "No payments found.";
621  }
622 
623  $return = array('status'=>array('response'=>'true','message'=>$message,'code'=>"000"),'data'=>"");
624  }
625 
626  }
627 
628  return $return;
629 }
630 
631 function bpSched( $parms ) {
632  $cred = bpSetCred($parms);
633  if (HCU_array_key_value('message',$cred) != 'success') {
634  throw new Exception($cred['message']);
635  }
636  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
637  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
638  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
639  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
640 
641  // this function is in the MobileManagement endpoint
642  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
643  $parms["clientAppText"] = $parms["mblAppText"];
644  $parms["clientAppVer"] = $parms["mblAppVer"];
645 
646  $parms['Token'] = $parms["passwith"]["Token"];
647  $parms['billpayid'] = $parms['BillpayId'];
648  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
649 
650  $response = ckfrGetPaymentList( $parms, "pending" );
651 
652  if ( $response["status"]["response"] != 'true' ) {
653  if ( empty($response["status"]["message"]) )
654  $response["status"]["message"] = 'Get Scheduled Payments Failed';
655  $return = $response;
656  } else {
657  // put into a consistent structure
658  $output = array();
659 
660  if ( isset( $response["data"]["Payments"] ) && count( $response["data"]["Payments"] ) > 0 ) {
661  // need to figure out if there is just one payment, or if there are multiple
662  if ( isset( $response["data"]["Payments"]["TransactionDate"] ) ) {
663  $payment = $response["data"]["Payments"];
664 
665  $fromId = implode( "|", $payment["BankAccountId"] );
666  $outputElem = array();
667  $outputElem["TxnId"] = $payment["TransactionId"];
668  $outputElem["Type"] = "Payment"; // payment or transfer - needed to help figure out display issues
669  $outputElem["ToId"] = $payment["Payee"]["Id"];
670  $outputElem["ToName"] = $payment["Payee"]["Name"];
671  $outputElem["FromId"] = $fromId;
672  $outputElem["Amount"] = number_format( $payment["Amount"], 2 );
673  $outputElem["Date"] = date( "m/d/Y", strtotime( $payment["PaymentDate"]["Date"] ) );
674 
675  // need to have any dates go back correctly formatted
676  $transactionDate = strtotime( $payment["TransactionDate"] );
677 
678  // this info will be shown as is with any underscores ('_') or vertical bars ('|') changes to spaces
679  $Additional = array( "Paid_From" => $payment["BankAccountId"]["AccountNumber"],
680  "Transaction_Date" => date( "m/d/Y", $transactionDate ),
681  "Confirmation" => $payment["ConfirmationNumber"],
682  "Status" => $payment["Status"] );
683  if ( strlen( $payment["PaymentDeliveryMethod"] ) ) {
684  $Additional["Rush"] = $payment["PaymentDeliveryMethod"];
685  }
686  if ( strlen( $payment["RecurringModelId"] ) ) {
687  $Additional["Recurring"] = $payment["RecurringModelId"];
688  }
689  if ( strlen( $payment["PaymentFee"] ) ) {
690  $Additional["Payment_Fee"] = $payment["PaymentFee"];
691  }
692  if ( strlen( $payment["CheckNumber"] ) ) {
693  $Additional["Check_Number"] = $payment["CheckNumber"];
694  }
695  if ( strlen( $payment["EbillId"] ) ) {
696  $Additional["Ebill_Id"] = $payment["EbillId"];
697  }
698 
699  $outputElem["AdditionalInfo"] = $Additional;
700 
701  $output[] = $outputElem;
702  } else {
703  foreach( $response["data"]["Payments"] as $payment ) {
704  $fromId = implode( "|", $payment["BankAccountId"] );
705  $outputElem = array();
706  $outputElem["TxnId"] = $payment["TransactionId"];
707  $outputElem["Type"] = "Payment"; // payment or transfer - needed to help figure out display issues
708  $outputElem["ToId"] = $payment["Payee"]["Id"];
709  $outputElem["ToName"] = $payment["Payee"]["Name"];
710  $outputElem["FromId"] = $fromId;
711  $outputElem["Amount"] = number_format( $payment["Amount"], 2 );
712  $outputElem["Date"] = date( "m/d/Y", strtotime( $payment["PaymentDate"]["Date"] ) );
713 
714  // need to have any dates go back correctly formatted
715  $transactionDate = strtotime( $payment["TransactionDate"] );
716 
717  // this info will be shown as is with any underscores ('_') or vertical bars ('|') changes to spaces
718  $Additional = array( "From" => $payment["BankAccountId"]["AccountNumber"],
719  "Transaction_Date" => date( "m/d/Y", $transactionDate ),
720  "Confirmation"=> $payment["ConfirmationNumber"],
721  "Status" => $payment["Status"] );
722  if ( strlen( $payment["PaymentDeliveryMethod"] ) ) {
723  $Additional["Rush"] = $payment["PaymentDeliveryMethod"];
724  }
725  if ( strlen( $payment["RecurringModelId"] ) ) {
726  $Additional["Recurring"] = $payment["RecurringModelId"];
727  }
728  if ( strlen( $payment["PaymentFee"] ) ) {
729  $Additional["Payment_Fee"] = $payment["PaymentFee"];
730  }
731  if ( strlen( $payment["CheckNumber"] ) ) {
732  $Additional["Check_Number"] = $payment["CheckNumber"];
733  }
734 
735  $outputElem["AdditionalInfo"] = $Additional;
736 
737  $output[] = $outputElem;
738  }
739 
740  usort( $output, "schedSort" );
741  }
742 
743  # normalize the name for scalability
744  $return = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
745  $return['data'] = $output;
746  } else {
747  // successful, but didn't get any payments, so get a message
748  if ( isset( $response["data"]["Result"]["ResultInfo"]["Description"] ) ) {
749  $message = $response["data"]["Result"]["ResultInfo"]["Description"];
750  } else {
751  $message = "No payments found.";
752  }
753 
754  $return = array('status'=>array('response'=>'true','message'=>$message,'code'=>"000"),'data'=>"");
755  }
756 
757  }
758  return $return;
759 }
760 
761 function bpSourceAccts( $parms ) {
762  try {
763  $cred = bpSetCred($parms);
764  if (HCU_array_key_value('message',$cred) != 'success') {
765  throw new Exception($cred['message']);
766  }
767  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
768  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
769  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
770  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
771 
772  // this function is in the MobileManagement endpoint
773  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
774  $parms["clientAppText"] = $parms["mblAppText"];
775  $parms["clientAppVer"] = $parms["mblAppVer"];
776 
777  // some more parameters needed to communicate with Fiserv
778  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
779  $parms['billpayid'] = $parms['BillpayId'];
780  $parms['Token'] = $parms["passwith"]["Token"];
781 
782  $response = ckfrGetBankAccountList( $parms );
783 
784  if ($response["status"]["response"] != 'true'){
785  if (empty($response["status"]["message"]))
786  $response["status"]["message"]='Get Bank Accounts Failed';
787  } else {
788  // put into a consistent structure
789  $output = array();
790  if ( isset( $response["data"]["BankAccounts"] ) && count( $response["data"]["BankAccounts"] ) ) {
791  // need to figure out if there is just one account, or if there are multiple
792  if ( isset( $response["data"]["BankAccounts"]["AccountId"] ) ) {
793  // just one account - get the values
794  $value = $response["data"]["BankAccounts"];
795 
796  $outputElem = array();
797  $outputElem["Name"] = (isset( $value["AccountNickName"] ) && count( $value["AccountNickName"] ) > 0) ? $value["AccountNickName"] : "";
798  $accountId = implode( "|", $value["AccountId"] );
799  $outputElem["FromId"] = $accountId;
800  $outputElem["CanRush"] = "0"; // this is just for AccountList results - no rush allowed
801 
802  // make sure we have a name for the account
803  if ( strlen( trim( $outputElem["Name"] ) ) == 0 ) {
804  $outputElem["Name"] = $value["AccountId"]["AccountNumber"];
805  }
806 
807  $output[] = $outputElem;
808  } else {
809  // multiple accounts - loop through
810  for ( $i = 0; $i < count( $response["data"]["BankAccounts"] ); $i++ ) {
811  $value = $response["data"]["BankAccounts"][$i];
812  $outputElem = array();
813  $outputElem["Name"] = (isset( $value["AccountNickName"] ) && count( $value["AccountNickName"] ) > 0) ? $value["AccountNickName"] : "";
814  $accountId = implode( "|", $value["AccountId"] );
815  $outputElem["FromId"] = $accountId;
816  $outputElem["CanRush"] = "0"; // this is just for AccountList results - no rush allowed
817 
818  // make sure we have a name for the account
819  if ( strlen( trim( $outputElem["Name"] ) ) == 0 ) {
820  $outputElem["Name"] = $value["AccountId"]["AccountNumber"];
821  }
822 
823  $output[] = $outputElem;
824  }
825  }
826  }
827 
828  if ( !count( $output ) ) {
829  throw new Exception("No source accounts received from vendor.");
830  }
831 
832  # normalize the name for scalability
833  $response = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
834  $response['data']= $output;
835  }
836  } catch (Exception $e) {
837  $response["status"]["response"] = "false";
838  $response["status"]["message"] = $e->getMessage();
839  $response["code"] = MP_CHKFREE_ERROR_CODE;
840  $response["data"] = array();
841  }
842 
843  return $response;
844 }
845 
846 /* The dest account can be a payee list for payments, or a list of accounts for transfers.
847  *
848  */
849 function bpDestAccts( $parms ) {
850  try {
851  $cred = bpSetCred($parms);
852  if (HCU_array_key_value('message',$cred) != 'success') {
853  throw new Exception($cred['message']);
854  }
855  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
856  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
857  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
858  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
859 
860  // this function is in the MobileManagement endpoint
861  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
862  $parms["clientAppText"] = $parms["mblAppText"];
863  $parms["clientAppVer"] = $parms["mblAppVer"];
864 
865  // some more parameters needed to communicate with Fiserv
866  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
867  $parms['billpayid'] = $parms['BillpayId'];
868  $parms['Token'] = $parms["passwith"]["Token"];
869 
870  $response = ckfrGetPayeeList( $parms );
871 
872  if ($response["status"]["response"] != 'true'){
873  if (empty($response["status"]["message"]))
874  $response["status"]["message"]='Get Payee List Failed';
875  } else {
876  // put into a consistent structure
877  $output = array();
878  if ( isset( $response["data"]["Payees"] ) && count( $response["data"]["Payees"] ) ) {
879  // need to figure out if there is just one account, or if there are multiple
880  if ( isset( $response["data"]["Payees"]["Name"] ) ) {
881  // just one account - get the values
882  $value = $response["data"]["Payees"];
883 
884  $outputElem = array();
885  $outputElem["Name"] = $value["Name"];
886  $outputElem["Type"] = $value["Type"];
887  $outputElem["ToId"] = $value["Id"];
888 
889  // To determine if can rush a payement, need to check the PaymentServices array and see if there is an
890  // OvernightCheck PaymentService.
891  $outputElem["CanRush"] = "0";
892 
893  // make sure we have a name for the account
894  if ( strlen( trim( $outputElem["Name"] ) ) == 0 ) {
895  $outputElem["Name"] = "Unknown";
896  }
897 
898  $output[] = $outputElem;
899  } else {
900  // multiple accounts - loop through
901  for ( $i = 0; $i < count( $response["data"]["Payees"] ); $i++ ) {
902  $value = $response["data"]["Payees"][$i];
903  $outputElem = array();
904  $outputElem["Name"] = $value["Name"];
905  $outputElem["Type"] = ""; // not even sure where this is used
906  $outputElem["ToId"] = $value["Id"];
907 
908  // To determine if can rush a payement, need to check the PaymentServices array and see if there is an
909  // OvernightCheck PaymentService.
910  $outputElem["CanRush"] = "0";
911 
912  // make sure we have a name for the account
913  if ( strlen( trim( $outputElem["Name"] ) ) == 0 ) {
914  $outputElem["Name"] = "Unknown";
915  }
916 
917  $output[] = $outputElem;
918  }
919  }
920  }
921 
922  if ( !count( $output ) ) {
923  throw new Exception("No destination accounts received from vendor.");
924  }
925 
926  # normalize the name for scalability
927  $response = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
928  $response['data']= $output;
929  }
930  } catch (Exception $e) {
931  $response["status"]["response"] = "false";
932  $response["status"]["message"] = $e->getMessage();
933  $response["code"] = MP_CHKFREE_ERROR_CODE;
934  $response["data"] = array();
935  }
936 
937  return $response;
938 }
939 
940 function bpPmtAdd( $parms ) {
941  $cred = bpSetCred($parms);
942  if (HCU_array_key_value('message',$cred) != 'success') {
943  throw new Exception($cred['message']);
944  }
945  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
946  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
947  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
948  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
949 
950  // this function is in the MobileManagement endpoint
951  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
952  $parms["clientAppText"] = $parms["mblAppText"];
953  $parms["clientAppVer"] = $parms["mblAppVer"];
954 
955  // some more parameters needed to communicate with Fiserv
956  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
957  $parms['billpayid'] = $parms['BillpayId'];
958  $parms['Token'] = $parms["passwith"]["Token"];
959 
960  $parms['Payment']['From'] = $parms["passwith"]["FromId"];
961  $parms['Payment']['To'] = $parms["passwith"]["ToId"];
962  $parms['Payment']['Amount'] = $parms["passwith"]["Amount"];
963  $parms['Payment']['Rush'] = $parms["passwith"]["Rush"];
964  $parms['Payment']['Date'] = $parms["passwith"]["Date"];
965  $response = ckfrAddPayment( $parms );
966 
967  if ($response["status"]["response"] != 'true'){
968  if (empty($response["status"]["message"]))
969  $response["status"]["message"]='Submit Payment Failed';
970 
971 // $response["status"]["message"] .= print_r( $parms, true );
972  } else {
973  // put into a consistent structure
974  $outputElem = array();
975  $outputElem["Confirmation"] = $response["data"]["PaymentResponses"]["ConfirmationNumber"];
976  $outputElem["EstimatedArrival"] = $response["data"]["PaymentResponses"]["NextPaymentDate"]["Date"];
977 
978  # normalize the name for scalability
979  $response = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
980  $response['data'] = $outputElem;
981  }
982 
983  return $response;
984 }
985 
986 // This is not currently supported in CheckFree (02/03/2016).
987 function bpTrnAdd( $parms ) {
988  $cred = bpSetCred($parms);
989  if (HCU_array_key_value('message',$cred) != 'success') {
990  throw new Exception($cred['message']);
991  }
992  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
993  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
994  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
995  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
996 
997  $parms['Account']['types'] = "PayFrom";
998  $parms['Token'] = $parms["passwith"]["Token"];
999 
1000  $parms['Payment']['From'] = $parms["passwith"]["FromId"];
1001  $parms['Payment']['To'] = $parms["passwith"]["ToId"];
1002  $parms['Payment']['Amount'] = $parms["passwith"]["Amount"];
1003  $parms['Payment']['Date'] = $parms["passwith"]["Date"];
1004 
1005  $response = array();
1006 
1007  if ($response["status"]["response"] != 'true'){
1008  if (empty($response["status"]["message"]))
1009  $response["status"]["message"]='Submit Transfer Failed';
1010  } else {
1011  // put into a consistent structure
1012  $outputElem = array();
1013  $outputElem["Confirmation"] = $response["ipaydata"][0]["Confirmation"];
1014  $outputElem["EstimatedArrival"] = $response["ipaydata"][0]["EstimatedArrival"];
1015 
1016  # normalize the name for scalability
1017  $response = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
1018  $response['data']= $outputElem;
1019  }
1020 
1021  return $response;
1022 }
1023 
1024 function bpPmtEdit( $parms ) {
1025  $cred = bpSetCred($parms);
1026  if (HCU_array_key_value('message',$cred) != 'success') {
1027  throw new Exception($cred['message']);
1028  }
1029  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
1030  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
1031  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
1032  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
1033 
1034  // this function is in the MobileManagement endpoint
1035  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
1036  $parms["clientAppText"] = $parms["mblAppText"];
1037  $parms["clientAppVer"] = $parms["mblAppVer"];
1038 
1039  // some more parameters needed to communicate with Fiserv
1040  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
1041  $parms['billpayid'] = $parms['BillpayId'];
1042  $parms['Token'] = $parms["passwith"]["Token"];
1043 
1044  $parms['Payment']['Id'] = $parms["passwith"]["TxnId"];
1045  $parms['Payment']['From'] = $parms["passwith"]["FromId"];
1046  $parms['Payment']['Amount'] = $parms["passwith"]["Amount"];
1047  $parms['Payment']['Date'] = $parms["passwith"]["Date"];
1048  $response = ckfrModPayment( $parms );
1049 
1050  if ($response["status"]["response"] != 'true'){
1051  if (empty($response["status"]["message"]))
1052  $response["status"]["message"]='Edit Payment Failed';
1053  } else {
1054  // put into a consistent structure
1055  $outputElem = array();
1056  $outputElem["Confirmation"] = $response["data"]["PaymentModResponse"]["ConfirmationNumber"];
1057  $outputElem["EstimatedArrival"] = $response["data"]["PaymentModResponse"]["NextPaymentDate"]["Date"];
1058 
1059  # normalize the name for scalability
1060  $response = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
1061  $response['data']= $outputElem;
1062  }
1063 
1064  return $response;
1065 }
1066 
1067 function bpPmtStop($parms) {
1068  $cred = bpSetCred($parms);
1069  if (HCU_array_key_value('message',$cred) != 'success') {
1070  throw new Exception($cred['message']);
1071  }
1072  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
1073  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
1074  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
1075  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
1076 
1077  // this function is in the MobileManagement endpoint
1078  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
1079  $parms["clientAppText"] = $parms["mblAppText"];
1080  $parms["clientAppVer"] = $parms["mblAppVer"];
1081 
1082  // some more parameters needed to communicate with Fiserv
1083  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
1084  $parms['billpayid'] = $parms['BillpayId'];
1085  $parms['Token'] = $parms["passwith"]["Token"];
1086  $parms['transactionId'] = $parms["passwith"]["TxnId"];
1087 
1088  $response = ckfrPaymentCancel($parms);
1089 
1090  if ($response["status"]["response"] != 'true') {
1091  if (empty($response["status"]["message"]))
1092  $response["status"]["message"] = 'Stop Payment Failed';
1093  } else {
1094  # normalize the name for scalability
1095  $response = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
1096  $response['data']["StopResult"] = 1;
1097  }
1098 
1099  return $response;
1100 }
1101 
1102 function bpGetPaymentDates( $parms ) {
1103  try {
1104  $return=array('status'=>array('response'=>'true','message'=>'success'));
1105  $cred = bpSetCred($parms);
1106  if (HCU_array_key_value('message',$cred) != 'success') {
1107  throw new Exception($cred['message']);
1108  }
1109  $parms['serviceurl'] = HCU_array_key_value('serviceurl', $cred);
1110  $parms['servicecert'] = HCU_array_key_value('servicecert', $cred);
1111  $parms['servicekey'] = HCU_array_key_value('servicekey', $cred);
1112  $parms['serviceca'] = HCU_array_key_value('serviceca', $cred);
1113 
1114  // this function is in the MobileManagement endpoint
1115  $parms["serviceurl"] = str_replace( "Subscriber", "Mobile", $parms["serviceurl"] );
1116  $parms["clientAppText"] = $parms["mblAppText"];
1117  $parms["clientAppVer"] = $parms["mblAppVer"];
1118 
1119  // some more parameters needed to communicate with Fiserv
1120  $parms['clientIP'] = $_SERVER['REMOTE_ADDR'];
1121  $parms['billpayid'] = $parms['BillpayId'];
1122  $parms['Token'] = $parms["passwith"]["Token"];
1123  # CheckFree always gets dates relative to Payee
1124  $parms['PayeeId']=$parms["passwith"]["PayeeId"];
1125 
1126  $response = ckfrGetPayeeList($parms);
1127 
1128  if ($response['status']['response'] != 'true') {
1129  throw new Exception($response['status']['message']);
1130  }
1131 
1132  $payee = array();
1133  if ( isset( $response["data"]["Payees"]["Name"] ) ) {
1134  // just the one payee was returned
1135  $payee = $response["data"]["Payees"];
1136  } else {
1137  // have a list so need to find the right one
1138  foreach ($response['data']["Payees"] as $payee) {
1139  if ($payee['Id'] == $parms['PayeeId']) {
1140  # this is the $account we want, break out of foreach(reqdata['data']);
1141  break;
1142  }
1143  }
1144  }
1145 
1146  if ( $payee["Id"] == $parms["PayeeId"] ) {
1147  $lead = $payee["LeadDays"];
1148  $firstpay = $payee["EarliestPaymentDate"]["Date"];
1149  $nextpay = $payee["NextPaymentDate"]["Date"];
1150  $cutoff = $payee["CutoffTime"];
1151  } else {
1152  throw new Exception("Payee not found - No payment dates");
1153  }
1154 
1155  $datelist = array();
1156  # test $firstpay to make sure it is a date?
1157  $defaultTZ = date_default_timezone_get(); # so we can put it back
1158  date_default_timezone_set('UTC');
1159  $now = time();
1160  if($now > strtotime( $cutoff )) {
1161  $Start = strtotime( $nextpay );
1162  } else {
1163  $Start = strtotime( $firstpay );
1164  }
1165  # if Start is false (strtotime failed) use current time
1166  $Start = ($Start ? $Start : $now);
1167  $End = $Start + (90 * 24 * 60 * 60);
1168  $holidays = ListHolidays(date('Y',$Start),date('Y',$End));
1169  for ($i = $Start; $i <= $End; $i += 86400) {
1170  $i = GetNextBusiness($i);
1171  $item = array();
1172  $idate = gmdate('Y-m-d',$i);
1173  if (!in_array($idate,$holidays)) {
1174  $item['Proc'] = gmdate('Y-m-d',$i);
1175  if (strtoupper($parms['datemodel']) == 'DUE') {
1176  $item['Due'] = gmdate('Y-m-d',GetNextBusiness($i+($lead*86400)));
1177  }
1178 
1179  $datelist[] = $item;
1180  }
1181  }
1182 
1183  date_default_timezone_set($defaultTZ);
1184 
1185  $return = array('status'=>array('response'=>'true','message'=>"",'code'=>"000"),'data'=>"");
1186  $return['data']['EarliestPay'] = $firstpay;
1187  $return['data']['NextPay'] = $nextpay;
1188  $return['data']['Cutoff'] = $cutoff;
1189  $return['data']['LeadDays'] = $lead;
1190  # build RushOptions list like this:
1191  // $return['data']['RushOptions'][]=array('Display'=>'Overnight','Value'=>'OVERNIGHT_CHECK','Price'=>'14.95');
1192  $return['data']['RushOptions'] = array();
1193  $return['data']['PaymentDates'] = $datelist;
1194 
1195  } catch (Exception $e) {
1196  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_CHKFREE_ERROR_CODE,'data'=>array());
1197  }
1198 
1199  return $return;
1200 }
1201 
1202 function bpGetTerms($parms) {
1203  try {
1204  # CheckFree has no Get Terms functionality - just return empty success
1205  $return=array('status'=>array('response'=>'true','message'=>'success','code'=>"000"),'data'=>array('Terms'=>''));
1206  } catch (Exception $e) {
1207  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_CHKFREE_ERROR_CODE,'data'=>array());
1208  }
1209  return $return;
1210 }
1211 
1212 function bpGetRushOptions($parms) {
1213  try {
1214  # CheckFree has no separate Rush Options functionality - just return empty success
1215  $return=array('status'=>array('response'=>'true','message'=>'success', "code"=>"000"),'data'=>array());
1216  } catch (Exception $e) {
1217  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_CHKFREE_ERROR_CODE,'data'=>array());
1218  }
1219  return $return;
1220 }
1221 
1222 function bpAcceptTerms($parms) {
1223  try {
1224  # CheckFree has no Accept Terms functionality - just return empty success
1225  $return=array('status'=>array('response'=>'true','message'=>'success', "code"=>"000"),'data'=>array());
1226  } catch (Exception $e) {
1227  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_CHKFREE_ERROR_CODE,'data'=>array());
1228  }
1229  return $return;
1230 }
1231 
1232 function bpGetFeatureList($parms) {
1233  try {
1234  # Need to decide what the data looks like here -- string list of available features
1235  # maybe something out of trusteddetail (which comes to this function in $parms)
1236  # to allow customizing by cu
1237  $extraOptions = htmlentities($parms['ExtraOptions']);
1238 
1239  $return=array('status'=>array('response'=>'true','message'=>'success', "code"=>"000"),
1240  'data'=>array("extras" => $extraOptions, 'featurelist'=>""));
1241  } catch (Exception $e) {
1242  $return=array('status'=>array('response'=>'false','message'=>$e->getMessage()),'code'=>MP_CHKFREE_ERROR_CODE,'data'=>array());
1243  }
1244  return $return;
1245 }
1246 
1247 function schedSort($a, $b)
1248 {
1249  $atime = strtotime($a['Date']);
1250  $btime = strtotime($b['Date']);
1251  if ($atime == $btime) {
1252  if ($a['ToName'] == $b['ToName']) {
1253  if ( $a["TxnId"] == $b["TxnId"] ) {
1254  return 0;
1255  }
1256  return ($a['TxnId'] < $b['TxnId']) ? -1 : 1;
1257  }
1258  return ($a['ToName'] < $b['ToName']) ? -1 : 1;
1259  }
1260  return ($atime < $btime) ? -1 : 1;
1261 }
1262 
1263 function histSort($a, $b) {
1264  $atime = strtotime($a['Date']);
1265  $btime = strtotime($b['Date']);
1266  if ($atime == $btime) {
1267  if ($a['ToName'] == $b['ToName']) {
1268  if ( $a["TxnId"] == $b["TxnId"] ) {
1269  return 0;
1270  }
1271  return ($a['TxnId'] < $b['TxnId']) ? -1 : 1;
1272  }
1273  return ($a['ToName'] < $b['ToName']) ? -1 : 1;
1274  }
1275  return ($atime > $btime) ? -1 : 1;
1276 }
1277 
1278 
1279 function ckfrembcurl($soapString, $soapHeaders, $soapServer, $soapCertfile='', $soapKeyfile='', $soapCACert='') {
1280 // CURLOPT_SSL_VERIFYHOST => 0,
1281 // CURLOPT_VERBOSE => 1,
1282 // CURLOPT_STDERR => '/tmp/chkfreetrace',
1283 // CURLINFO_HEADER_OUT => 1,
1284  $useEmbedded = false;
1285 
1286  if ($useEmbedded) {
1287  $curlopts = array(
1288  CURLOPT_SSL_VERIFYPEER => 0,
1289  CURLOPT_RETURNTRANSFER => 1,
1290  CURLOPT_HEADER => 0,
1291  CURLOPT_POST => 1,
1292  CURLOPT_POSTFIELDS => "$soapString",
1293  CURLOPT_URL => "$soapServer");
1294  if (!empty($soapCertfile)) {
1295  $curlopts[CURLOPT_SSLCERT] = "$soapCertfile";
1296  }
1297  if (!empty($soapKeyfile)) {
1298  $curlopts[CURLOPT_SSLKEY] = "$soapKeyfile";
1299  }
1300  if (!empty($soapCACert)) {
1301  $curlopts[CURLOPT_CAINFO] = "$soapCACert";
1302  }
1303 
1304  $ch = @curl_init();
1305  @curl_setopt_array($ch, $curlopts);
1306  @curl_setopt($ch, CURLOPT_HTTPHEADER, $soapHeaders);
1307 
1308  $response = @curl_exec($ch);
1309  if (curl_errno($ch)) {
1310  $response = '';
1311 // $response = curl_error($ch);
1312  }
1313  @curl_close($ch);
1314  } else {
1315  // * Call to Command-line curl command
1316 
1317  // * build the command line call
1318  // ** Data value
1319  $clData = "--data-binary '$soapString' ";
1320 
1321  // * *Build Headers
1322  $clHeaders = "";
1323  if (is_array($soapHeaders)) {
1324  foreach ($soapHeaders as $hdrLine) {
1325  $clHeaders .= "-H '$hdrLine' ";
1326  }
1327  }
1328  // * Include Cert File
1329  if (!empty($soapCertfile)) {
1330  $clCert = "--cert '$soapCertfile' ";
1331  }
1332  // * Include Key File
1333  if (!empty($soapKeyfile)) {
1334  $clKey= "--key '$soapKeyfile' ";
1335  }
1336  // * Include CA File
1337  if (!empty($soapCACert)) {
1338  $clCA = "--cacert $soapCACert";
1339  }
1340 
1341  // ** Soap Action
1342  $clAction = "'$soapServer'";
1343 
1344  $curlExec = "/usr/bin/curl $clData $clHeaders $clCert $clKey $clCA $clAction";
1345 
1346  $clCurl = popen($curlExec, "r");
1347  $response = '';
1348 
1349  if (!$clCurl) {
1350  $response = '';
1351  } else {
1352  while ($buff = fread ($clCurl, 1500)) {
1353  $response .= $buff;
1354  }
1355  $pipe_err = pclose($clCurl);
1356  }
1357  }
1358  return $response;
1359 }
1360 function ckfrEchoPing($parms) {
1361  try {
1362  $reqparms = array('serviceurl' => 1,
1363  'servicecert' => 1,
1364  'servicekey' => 1,
1365  'serviceca'=> 1
1366  );
1367  $missing = array_diff_key($reqparms,$parms);
1368  if (sizeof($missing)) {
1369  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
1370  }
1371 
1372  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
1373  $soapString = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
1374  <soapenv:Header/>
1375  <soapenv:Body>
1376  <v3:echo>test</v3:echo>
1377  </soapenv:Body>
1378 </soapenv:Envelope>";
1379 
1380 // $cmd = "/usr/bin/curl --trace-ascii '/tmp/trace_x' --data-binary '$soapString' -H 'Content-Type: text/xml; charset=utf-8' --cert {$parms['servicecert']}";
1381 // $cmd .= " --key {$parms['servicekey']} --cacert {$parms['serviceca']}";
1382 // $cmd .= " -H 'SOAPAction: \"http://fiserv.com/builder/v3_0/EchoPing\"' '{$parms['serviceurl']}'";
1383 // $response = getcurl($cmd);
1384 // $return["status"]["response"] = 'true';
1385 // $return["status"]["message"] = 'Success';
1386 // $return["data"]["cmd"]=$cmd;
1387 // $return["data"]["response"]=print_r($response,true);
1388 // return $return;
1389 
1390  $soapHeaders = array();
1391  $soapHeaders[] = "Content-Type: text/xml; charset=UTF-8";
1392  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/EchoPing"';
1393  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
1394 
1395  if (empty($response)) {
1396  throw new Exception("EchoPing No Response");
1397  }
1398  # call parse function to format response array
1399 
1400  $xmlreturn = hcuGetCFXMLResponse($response, 'EchoPingResult', 'http://schemas.xmlsoap.org/soap/envelope/');
1401  if (!is_array($xmlreturn) || $xmlreturn["data"]["Result"]["Success"] != 'true') {
1402  throw new Exception("EchoPing Invalid XML Response {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
1403  }
1404 
1405  $return["status"]["response"] = 'true';
1406  $return["status"]["message"] = 'Success';
1407  $return["data"] = $xmlreturn["data"];
1408 
1409  } catch (Exception $e) {
1410  $return["status"]["response"] = 'false';
1411  $return["status"]["message"] = $e->getMessage();
1412  $return["status"]["line"] = $e->getLine();
1413  $return["data"] = array();
1414  $return["data"]["xmlreturns"] = print_r($xmlreturn,true);
1415  }
1416  return $return;
1417 }
1418 
1419 function ckfrSubscriberEnroll($parms) {
1420 
1421  try {
1422  $reqparms = array('SponsorID'=>1,
1423  'clientAppText'=>1,
1424  'clientAppVer'=>1,
1425  'Token'=>1,
1426  'clientIP'=>1,
1427  'billpayid'=>1,
1428  'billingclass'=>1,
1429  'rt'=>1,
1430  'miraccountnumber' => 1,
1431  'mirfirstname' => 1,
1432  'mirlastname' => 1,
1433  'miremail' => 1,
1434  'mirssn' => 1,
1435  'mirdob' => 1,
1436  'mirphone' => 1,
1437  'miraddress1' => 1,
1438  'mircity' => 1,
1439  'mirstate' => 1,
1440  'mirzip' => 1,
1441  'payacctmicraccount' => 1,
1442  'payacctdescription' => 1,
1443  'serviceurl' => 1,
1444  'servicecert' => 1,
1445  'serviceca'=> 1
1446  );
1447  $missing = array_diff_key($reqparms,$parms);
1448  if (sizeof($missing)) {
1449  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
1450  }
1451  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
1452  if (strlen($parms["mirzip"])==5) {
1453  $ZIPclause = "<v3:Zip5>{$parms['mirzip']}</v3:Zip5>";
1454  } else if (strlen($parms["mirzip"]) == 9) {
1455  $ZIPclause = "<v3:Zip5>" . substr($parms['mirzip'],0,5) . "</v3:Zip5>";
1456  $ZIPclause .= "<v3:Zip4>" . substr($parms['mirzip'],5,4) . "</v3:Zip4>";
1457  } else {
1458  $ZIPclause = '';
1459  }
1460  $parms["miraddress2"] = trim($parms["miraddress2"]);
1461  if (empty($parms["miraddress2"])) {
1462  $addr2='';
1463  } else {
1464  $addr2="
1465  <v3:Address2>{$parms["miraddress2"]}</v3:Address2>
1466  ";
1467  }
1468  $parms["mircity"] = str_replace($rmlist, "", $parms["mircity"]);
1469  $parms["mirstate"] = str_replace($rmlist, "", $parms["mirstate"]);
1470  $parms["mirssn"] = str_replace("-", "", $parms["mirssn"]);
1471  # decode the ProdList if given in parms
1472  if (sizeof($parms['ProductList']) > 0) {
1473  $ProdList = json_decode($parms['ProductList'],TRUE);
1474  }
1475  # if no ProdList (not given, or decode failed) set the default
1476  if (!is_array($ProdList)) {
1477  $ProdList = array('WBP' => '0411');
1478  }
1479 
1480  $products = "
1481  <v3:Products> ";
1482  foreach ($ProdList as $cfprod => $cfver) {
1483  $products .= "
1484  <v3:Product>
1485  <v3:Name>$cfprod</v3:Name>
1486  <v3:Version>$cfver</v3:Version>
1487  </v3:Product>";
1488  }
1489  $products .= "
1490  </v3:Products>";
1491 
1492  $now = time();
1493  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
1494  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
1495  <soapenv:Header/>
1496  <soapenv:Body>
1497  <v3:enrollRequest>
1498  <v3:Header>
1499  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
1500  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
1501  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
1502  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
1503  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
1504  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
1505  <v3:CorrID>{$now}</v3:CorrID>
1506  </v3:Header>
1507 
1508  <v3:Subscriber>
1509  <v3:ExternalSubscriberId>$subscriber</v3:ExternalSubscriberId>
1510  <v3:BillingClass>{$parms['billingclass']}</v3:BillingClass>
1511  <v3:UserId>{$subscriber}</v3:UserId>
1512  <v3:Password>{$parms['billpaypw']}</v3:Password>
1513  <v3:TaxId>{$parms['mirssn']}</v3:TaxId>
1514  <v3:Name>
1515  <v3:First>{$parms['mirfirstname']}</v3:First>
1516  <v3:Last>{$parms['mirlastname']}</v3:Last>
1517  </v3:Name>
1518  <v3:Address>
1519  <v3:Address1>{$parms['miraddress1']}</v3:Address1>$addr2
1520  <v3:City>{$parms['mircity']}</v3:City>
1521  <v3:State>{$parms['mirstate']}</v3:State>
1522  $ZIPclause
1523  </v3:Address>
1524  <v3:EmailAddress>
1525  <v3:value>{$parms['miremail']}</v3:value>
1526  </v3:EmailAddress>
1527  <v3:DayPhone>{$parms['mirphone']}</v3:DayPhone>
1528  <v3:BirthDate>
1529  <v3:Date>{$parms['mirdob']}</v3:Date>
1530  </v3:BirthDate>
1531  <v3:AllowedToSolicit>N</v3:AllowedToSolicit>
1532  </v3:Subscriber>
1533  <v3:PerformAccountConfirmation>false</v3:PerformAccountConfirmation>
1534  <v3:BankAccount>
1535  <v3:AccountId>
1536  <v3:RoutingTransitNumber>{$parms['rt']}</v3:RoutingTransitNumber>
1537  <v3:AccountType>DDA</v3:AccountType>
1538  <v3:AccountNumber>{$parms['payacctmicraccount']}</v3:AccountNumber>
1539  </v3:AccountId>
1540  <v3:AccountNickName>{$parms['payacctdescription']}</v3:AccountNickName>
1541  <v3:IsBillPaymentEnabled>true</v3:IsBillPaymentEnabled>
1542  <v3:IsBankingEnabled>false</v3:IsBankingEnabled>
1543  <v3:IsDefaultPpsReceiveAccount>false</v3:IsDefaultPpsReceiveAccount>
1544  <v3:IsBillingAccount>true</v3:IsBillingAccount>
1545  <v3:IsPreferredAccount>true</v3:IsPreferredAccount>
1546  <v3:CheckPrintAddress>
1547  <v3:Address1>{$parms['miraddress1']}</v3:Address1>$addr2
1548  <v3:City>{$parms['mircity']}</v3:City>
1549  <v3:State>{$parms['mirstate']}</v3:State>
1550  $ZIPclause
1551  </v3:CheckPrintAddress>
1552  </v3:BankAccount>
1553  $products
1554  </v3:enrollRequest>
1555  </soapenv:Body>
1556 </soapenv:Envelope>\n";
1557  $soapHeaders = array();
1558  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
1559  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/SubscriberEnroll"';
1560  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
1561 
1562  if ( $parms["logging"] == "enabled" ) {
1563  $logParms = $parms["environment"]; // get the environment info passed in
1564  $logParms["token"] = $parms['Token']; // the id used across all communications in session
1565  $logParms["txnId"] = $now; // the id for this transaction
1566  $logParms["logPoint"] = "enrollRequest"; // this action in a readable form
1567  $logParms["request"] = $soapString; // the request
1568  $logParms["reply"] = $response; // the response
1569  LogCheckFreeActivity( $logParms );
1570  }
1571 
1572  if (empty($response)) {
1573  throw new Exception("SubMaint No Response");
1574  }
1575 // $tfile = fopen ("/tmp/checkfree_sso","a");
1576 // fwrite ($tfile, "ProdList: {$parms['ProductList']}\n");
1577 // fwrite ($tfile, "$soapString\n");
1578 // fwrite ($tfile, "$response\n");
1579 // fwrite ($tfile, print_r($parms,true));
1580 // fclose ($tfile);
1581 
1582  # call parse function to format response array
1583 
1584  $xmlreturn = hcuGetCFXMLResponse($response, 'SubscriberEnrollResult', 'http://schemas.xmlsoap.org/soap/envelope/');
1585  if (!is_array($xmlreturn)) {
1586  throw new Exception("SubscriberEnroll Invalid XML Response");
1587  }
1588  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
1589  throw new Exception("SubscriberEnroll Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
1590  }
1591  $return["status"]["response"] = 'true';
1592  $return["status"]["message"] = 'Success';
1593  $return["data"] = $xmlreturn["data"];
1594 
1595  } catch (Exception $e) {
1596  $return["status"]["response"] = 'false';
1597  $return["status"]["message"] = $e->getMessage();
1598 // $return["status"]["message"] = "(" . $e->getline() . ") " . $e->getMessage();
1599 // $return["status"]["line"] = $e->getLine();
1600 // $return["status"]["req"] = $soapString;
1601 // $return["status"]["reply"] = $response;
1602 // $return["status"]["parms"] = $parms;
1603  $return["data"] = array();
1604  }
1605  return $return;
1606 }
1607 function ckfrSubscriberGetInfo($parms) {
1608 
1609  try {
1610  $reqparms = array('SponsorID'=>1,
1611  'clientAppText'=>1,
1612  'clientAppVer'=>1,
1613  'Token'=>1,
1614  'clientIP'=>1,
1615  'billpayid'=>1,
1616  'serviceurl' => 1,
1617  'servicecert' => 1,
1618  'serviceca'=> 1
1619  );
1620  $missing = array_diff_key($reqparms,$parms);
1621  if (sizeof($missing)) {
1622  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
1623  }
1624  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
1625 // <v3:ExternalSubscriberId>cf_18277_1</v3:ExternalSubscriberId>
1626 
1627  $now = time();
1628  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
1629  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
1630  <soapenv:Header/>
1631  <soapenv:Body>
1632  <v3:subscriberGetInfoRequest>
1633  <v3:Header>
1634  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
1635  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
1636  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
1637  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
1638  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
1639  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
1640  <v3:CorrID>{$now}</v3:CorrID>
1641  </v3:Header>
1642  </v3:subscriberGetInfoRequest>
1643  </soapenv:Body>
1644 </soapenv:Envelope>\n";
1645 
1646  $soapHeaders = array();
1647  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
1648  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/SubscriberGetInfo"';
1649  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
1650 
1651  if ( $parms["logging"] == "enabled" ) {
1652  $logParms = $parms["environment"]; // get the environment info passed in
1653  $logParms["token"] = $parms['Token']; // the id used across all communications in session
1654  $logParms["txnId"] = $now; // the id for this transaction
1655  $logParms["logPoint"] = "subscriberGetInfoRequest"; // this action in a readable form
1656  $logParms["request"] = $soapString; // the request
1657  $logParms["reply"] = $response; // the response
1658  LogCheckFreeActivity( $logParms );
1659  }
1660 
1661  if (empty($response)) {
1662  throw new Exception("SubMaint No Response");
1663  }
1664 
1665  # call parse function to format response array
1666 
1667  $xmlreturn = hcuGetCFXMLResponse($response, 'SubscriberGetInfoResult', 'http://schemas.xmlsoap.org/soap/envelope/');
1668 
1669  if (!is_array($xmlreturn)) {
1670  throw new Exception("SubscriberGetInfo Invalid XML Response");
1671  }
1672  /*
1673  <SubscriberGetInfoResult xmlns="http://fiserv.com/builder/v3_0">
1674  <Result>
1675  <Success>false</Success>
1676  <ResultInfo>
1677  <ResultCategory>ERROR</ResultCategory>
1678  <Code>301</Code>
1679  <Description>Subscriber does not exist.</Description>
1680  </ResultInfo>
1681  </Result>
1682  </SubscriberGetInfoResult>
1683  */
1684 
1685  if ($xmlreturn["data"]["Result"]["Success"] != 'true' && $xmlreturn["data"]["Result"]["ResultInfo"]["Code"]!='301') {
1686  throw new Exception("SubscriberGetInfo Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
1687  }
1688  $return["status"]["response"] = 'true';
1689  $return["status"]["message"] = 'Success';
1690  $return["data"] = $xmlreturn["data"];
1691 
1692  } catch (Exception $e) {
1693  $return["status"]["response"] = 'false';
1694  $return["status"]["message"] = $e->getMessage();
1695 // $return["status"]["message"] = "(" . $e->getline() . ") " . $e->getMessage() . print_r($xmlreturn["data"],true);
1696  $return["status"]["line"] = $e->getLine();
1697 // $return["response"]=$response;
1698 // $return["xmlretrun"]=$xmlreturn;
1699  $return["data"] = array();
1700  }
1701  return $return;
1702 }
1703 
1704 function ckfrGetBankAccountList($parms) {
1705 
1706  try {
1707  $reqparms = array('SponsorID'=>1,
1708  'clientAppText'=>1,
1709  'clientAppVer'=>1,
1710  'Token'=>1,
1711  'billpayid'=>1,
1712  'serviceurl' => 1,
1713  'servicecert' => 1,
1714  'serviceca'=> 1
1715  );
1716  $missing = array_diff_key($reqparms,$parms);
1717  if (sizeof($missing)) {
1718  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
1719  }
1720 
1721  // see if the data is cached
1722  $cacheType = CACHE_KEY_ACCTS;
1723  $cachedData = ReadCheckFreeCache( $parms["environment"]["dbConn"],
1724  $parms["environment"]["memberId"],
1725  $parms["BillpayId"],
1726  $parms["environment"]["Cu"],
1727  $cacheType,
1728  $parms["Token"] );
1729 
1730  if ( !is_array( $cachedData ) ) {
1731  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
1732 
1733  $now = time();
1734  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
1735  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
1736  <soapenv:Header/>
1737  <soapenv:Body>
1738  <v3:listrq>
1739  <v3:Header>
1740  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
1741  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
1742  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
1743  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
1744  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
1745  <v3:CorrID>{$now}</v3:CorrID>
1746  </v3:Header>
1747  </v3:listrq>
1748  </soapenv:Body>
1749 </soapenv:Envelope>\n";
1750 
1751  $soapHeaders = array();
1752  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
1753  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/BankAccountList"';
1754  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
1755 
1756  if ( $parms["logging"] == "enabled" ) {
1757  $logParms = $parms["environment"]; // get the environment info passed in
1758  $logParms["token"] = $parms['Token']; // the id used across all communications in session
1759  $logParms["txnId"] = $now; // the id for this transaction
1760  $logParms["logPoint"] = "listrq"; // this action in a readable form
1761  $logParms["request"] = $soapString; // the request
1762  $logParms["reply"] = $response; // the response
1763  LogCheckFreeActivity( $logParms );
1764  }
1765 
1766  if (empty($response)) {
1767  throw new Exception("SubMaint No Response");
1768  }
1769  # call parse function to format response array
1770 
1771  $xmlreturn = hcuGetCFXMLResponse($response, 'GetBankAccountListResult', 'http://schemas.xmlsoap.org/soap/envelope/');
1772  if (!is_array($xmlreturn)) {
1773  throw new Exception("GetBankAccountList Invalid XML Response");
1774  }
1775  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
1776  throw new Exception("GetBankAccountList Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
1777  }
1778 
1779  WriteCheckFreeCache( $parms["environment"]["dbConn"],
1780  $parms["environment"]["memberId"],
1781  $parms["BillpayId"],
1782  $parms["environment"]["Cu"],
1783  $cacheType,
1784  $parms["Token"],
1785  $xmlreturn["data"]);
1786 
1787  $return["data"] = $xmlreturn["data"];
1788  } else {
1789  $return["data"] = $cachedData;
1790  }
1791 
1792  $return["status"]["response"] = 'true';
1793  $return["status"]["message"] = 'Success';
1794 
1795  } catch (Exception $e) {
1796  $return["status"]["response"] = 'false';
1797  $return["status"]["message"] = $e->getMessage();
1798  $return["status"]["line"] = $e->getLine();
1799  $return["data"] = array();
1800 // $return["extra"] = "Sent: $soapString returned: $response parsed into: " . print_r( $xmlreturn, true );
1801  }
1802  return $return;
1803 }
1804 
1805 function ckfrGetPayeeList($parms) {
1806 
1807  try {
1808  $reqparms = array('SponsorID'=>1,
1809  'clientAppText'=>1,
1810  'clientAppVer'=>1,
1811  'Token'=>1,
1812  'billpayid'=>1,
1813  'serviceurl' => 1,
1814  'servicecert' => 1,
1815  'serviceca'=> 1
1816  );
1817  $missing = array_diff_key($reqparms,$parms);
1818  if (sizeof($missing)) {
1819  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
1820  }
1821 
1822  // see if the data is cached
1823  $cacheType = CACHE_KEY_PAYEE;
1824  $cachedData = ReadCheckFreeCache( $parms["environment"]["dbConn"],
1825  $parms["environment"]["memberId"],
1826  $parms["BillpayId"],
1827  $parms["environment"]["Cu"],
1828  $cacheType,
1829  $parms["Token"] );
1830 
1831  if ( !is_array( $cachedData ) ) {
1832  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
1833 
1834  $now = time();
1835  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
1836  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
1837  <soapenv:Header/>
1838  <soapenv:Body>
1839  <v3:pyreq>
1840  <v3:Header>
1841  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
1842  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
1843  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
1844  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
1845  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
1846  <v3:CorrID>{$now}</v3:CorrID>
1847  </v3:Header>
1848  </v3:pyreq>
1849  </soapenv:Body>
1850 </soapenv:Envelope>\n";
1851 
1852  $soapHeaders = array();
1853  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
1854  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/PayeeList"';
1855  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
1856 
1857  if ( $parms["logging"] == "enabled" ) {
1858  $logParms = $parms["environment"]; // get the environment info passed in
1859  $logParms["token"] = $parms['Token']; // the id used across all communications in session
1860  $logParms["txnId"] = $now; // the id for this transaction
1861  $logParms["logPoint"] = "pyreq"; // this action in a readable form
1862  $logParms["request"] = $soapString; // the request
1863  $logParms["reply"] = $response; // the response
1864  LogCheckFreeActivity( $logParms );
1865  }
1866 
1867  if (empty($response)) {
1868  throw new Exception("GetPayeeList No Response");
1869  }
1870  # call parse function to format response array
1871 
1872  $xmlreturn = hcuGetCFXMLResponse($response, 'GetPayeeListResult', 'http://schemas.xmlsoap.org/soap/envelope/');
1873  if (!is_array($xmlreturn)) {
1874  throw new Exception("GetPayeeList Invalid XML Response");
1875  }
1876  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
1877  throw new Exception("GetPayeeList Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
1878  }
1879 
1880  WriteCheckFreeCache( $parms["environment"]["dbConn"],
1881  $parms["environment"]["memberId"],
1882  $parms["BillpayId"],
1883  $parms["environment"]["Cu"],
1884  $cacheType,
1885  $parms["Token"],
1886  $xmlreturn["data"]);
1887 
1888  $return["data"] = $xmlreturn["data"];
1889  } else {
1890  $return["data"] = $cachedData;
1891  }
1892 
1893  $return["status"]["response"] = 'true';
1894  $return["status"]["message"] = 'Success';
1895  } catch (Exception $e) {
1896  $return["status"]["response"] = 'false';
1897  $return["status"]["message"] = $e->getMessage();
1898  $return["status"]["line"] = $e->getLine();
1899  $return["data"] = array();
1900 // $return["extra"] = "Sent: $soapString returned: $response parsed into: " . print_r( $xmlreturn, true );
1901  }
1902  return $return;
1903 }
1904 
1905 function ckfrGetPaymentList($parms, $type) {
1906 
1907  try {
1908  $reqparms = array('SponsorID'=>1,
1909  'clientAppText'=>1,
1910  'clientAppVer'=>1,
1911  'Token'=>1,
1912  'clientIP'=>1,
1913  'billpayid'=>1,
1914  'serviceurl' => 1,
1915  'servicecert' => 1,
1916  'serviceca'=> 1
1917  );
1918  $missing = array_diff_key($reqparms,$parms);
1919  if (sizeof($missing)) {
1920  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
1921  }
1922  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
1923 
1924  if ( strtoupper( $type ) == "PENDING" ) {
1925  $filterType = "Pending";
1926  $numDays = 90;
1927  $cacheType = CACHE_KEY_PMTS;
1928  } else {
1929  $filterType = "Historical";
1930  $numDays = -90;
1931  $cacheType = CACHE_KEY_HIST;
1932  }
1933 
1934  // see if the data is cached
1935  $cachedData = ReadCheckFreeCache( $parms["environment"]["dbConn"],
1936  $parms["environment"]["memberId"],
1937  $parms["BillpayId"],
1938  $parms["environment"]["Cu"],
1939  $cacheType,
1940  $parms["Token"] );
1941 
1942  if ( !is_array( $cachedData ) ) {
1943  // request the list from CheckFree
1944  $now = time();
1945  $startDate = date( "Y-m-d" );
1946  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
1947  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
1948  <soapenv:Header/>
1949  <soapenv:Body>
1950  <v3:plreq>
1951  <v3:Header>
1952  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
1953  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
1954  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
1955  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
1956  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
1957  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
1958  <v3:CorrID>{$now}</v3:CorrID>
1959  </v3:Header>
1960  <v3:Paging>
1961  <v3:MaxPaymentsReturned>100</v3:MaxPaymentsReturned>
1962  </v3:Paging>
1963  <v3:PaymentFilter>
1964  <v3:StartingPaymentDate>
1965  <v3:Date>$startDate</v3:Date>
1966  </v3:StartingPaymentDate>
1967  <v3:NumberOfDays>$numDays</v3:NumberOfDays>
1968  <v3:StatusFilter>$filterType</v3:StatusFilter>
1969  </v3:PaymentFilter>
1970  </v3:plreq>
1971  </soapenv:Body>
1972 </soapenv:Envelope>\n";
1973 
1974  $soapHeaders = array();
1975  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
1976  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/PaymentList"';
1977  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
1978 
1979  if ( $parms["logging"] == "enabled" ) {
1980  $logParms = $parms["environment"]; // get the environment info passed in
1981  $logParms["token"] = $parms['Token']; // the id used across all communications in session
1982  $logParms["txnId"] = $now; // the id for this transaction
1983  $logParms["logPoint"] = "plreq"; // this action in a readable form
1984  $logParms["request"] = $soapString; // the request
1985  $logParms["reply"] = $response; // the response
1986 
1987  LogCheckFreeActivity( $logParms );
1988  }
1989 
1990  if (empty($response)) {
1991  throw new Exception("SubMaint No Response");
1992  }
1993  # call parse function to format response array
1994 
1995  $xmlreturn = hcuGetCFXMLResponse($response, 'GetPaymentListResult', 'http://schemas.xmlsoap.org/soap/envelope/');
1996  if (!is_array($xmlreturn)) {
1997  throw new Exception("GetPaymentList Invalid XML Response");
1998  }
1999 
2000  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
2001  if ( strlen( $xmlreturn['faultcode'] ) > 0 ) {
2002  throw new Exception("GetPaymentList failed with the following error: [{$xmlreturn['faultcode']}] {$xmlreturn['faultstring']}");
2003  }
2004 
2005  throw new Exception("GetPaymentList Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
2006  }
2007 
2008  // save the list in the cache
2009  WriteCheckFreeCache( $parms["environment"]["dbConn"],
2010  $parms["environment"]["memberId"],
2011  $parms["BillpayId"],
2012  $parms["environment"]["Cu"],
2013  $cacheType,
2014  $parms["Token"],
2015  $xmlreturn["data"]);
2016 
2017  $return["data"] = $xmlreturn["data"];
2018  } else {
2019  $return["data"] = $cachedData;
2020  }
2021 
2022  $return["status"]["response"] = 'true';
2023  $return["status"]["message"] = 'Success';
2024  } catch (Exception $e) {
2025  $return["status"]["response"] = 'false';
2026  $return["status"]["message"] = $e->getMessage();
2027  $return["status"]["line"] = $e->getLine();
2028  $return["data"] = array();
2029 // $return["extra"] = "Sent: $soapString returned: $response parsed into: " . print_r( $xmlreturn, true );
2030  }
2031  return $return;
2032 }
2033 
2034 // CheckFree allows for multiple payments to be added at once but we will only do one at a time.
2035 function ckfrAddPayment($parms) {
2036 
2037  try {
2038  $reqparms = array('SponsorID'=>1,
2039  'clientAppText'=>1,
2040  'clientAppVer'=>1,
2041  'Token'=>1,
2042  'billpayid'=>1,
2043  'serviceurl' => 1,
2044  'servicecert' => 1,
2045  'serviceca'=> 1
2046  );
2047  $missing = array_diff_key($reqparms,$parms);
2048  if (sizeof($missing)) {
2049  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2050  }
2051  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2052 
2053  $paymentDate = date( "Y-m-d", strtotime( $parms["Payment"]['Date'] ) );
2054 
2055  $accountParts = explode( "|", $parms["Payment"]["From"] );
2056 
2057  $routing = $accountParts[0];
2058  $accountType = $accountParts[1];
2059  $account = $accountParts[2];
2060 
2061  $now = time();
2062  $rush = $parms["Payment"]["Rush"] == "Expedited" ? "ExpeditedPayment" : "RegularPayment";
2063  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2064  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2065  <soapenv:Header/>
2066  <soapenv:Body>
2067  <v3:pmtsrq>
2068  <v3:Header>
2069  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2070  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2071  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2072  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2073  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2074  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2075  <v3:CorrID>{$now}</v3:CorrID>
2076  </v3:Header>
2077  <v3:Payments>
2078  <!--Zero or more repetitions:-->
2079  <v3:PaymentAddInput>
2080  <v3:SequenceNumber>1</v3:SequenceNumber>
2081  <v3:PayeeId>{$parms["Payment"]['To']}</v3:PayeeId>
2082  <v3:BankAccountId>
2083  <v3:RoutingTransitNumber>$routing</v3:RoutingTransitNumber>
2084  <v3:AccountType>$accountType</v3:AccountType>
2085  <v3:AccountNumber>$account</v3:AccountNumber>
2086  </v3:BankAccountId>
2087  <v3:PaymentAmount>{$parms["Payment"]['Amount']}</v3:PaymentAmount>
2088  <v3:PaymentDate>
2089  <v3:Date>$paymentDate</v3:Date>
2090  </v3:PaymentDate>
2091  <v3:PaymentDeliveryMethod>$rush</v3:PaymentDeliveryMethod>
2092  </v3:PaymentAddInput>
2093  </v3:Payments>
2094  </v3:pmtsrq>
2095  </soapenv:Body>
2096 </soapenv:Envelope>\n";
2097 
2098  $soapHeaders = array();
2099  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2100  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/AddPayments"';
2101  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2102 
2103  if ( $parms["logging"] == "enabled" ) {
2104  $logParms = $parms["environment"]; // get the environment info passed in
2105  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2106  $logParms["txnId"] = $now; // the id for this transaction
2107  $logParms["logPoint"] = "pmtsrq"; // this action in a readable form
2108  $logParms["request"] = $soapString; // the request
2109  $logParms["reply"] = $response; // the response
2110  LogCheckFreeActivity( $logParms );
2111  }
2112 
2113  if (empty($response)) {
2114  throw new Exception("SubMaint No Response");
2115  }
2116  # call parse function to format response array
2117 
2118  $xmlreturn = hcuGetCFXMLResponse($response, 'AddPaymentsResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2119  if (!is_array($xmlreturn)) {
2120  throw new Exception("AddPayments Invalid XML Response");
2121  }
2122  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
2123  throw new Exception("AddPayments Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
2124  }
2125  $return["status"]["response"] = 'true';
2126  $return["status"]["message"] = 'Success';
2127  $return["data"] = $xmlreturn["data"];
2128 
2129  // remove any cached data
2130  $cacheType = CACHE_KEY_PMTS;
2131  DeleteCheckFreeCache( $parms["environment"]["dbConn"],
2132  $parms["environment"]["memberId"],
2133  $parms["BillpayId"],
2134  $parms["environment"]["Cu"],
2135  $cacheType,
2136  $parms["Token"],
2137  "" );
2138 
2139  if ( $parms["logging"] == "enabled" ) {
2140  $logParms = $parms["environment"]; // get the environment info passed in
2141  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2142  $logParms["txnId"] = $now; // the id for this transaction
2143  $logParms["logPoint"] = "pmtsrq"; // this action in a readable form
2144  $logParms["request"] = print_r( $parms, true ); // the request
2145  $logParms["reply"] = print_r( $return, true ); // the response
2146  LogCheckFreeActivity( $logParms );
2147  }
2148 
2149  } catch (Exception $e) {
2150  $return["status"]["response"] = 'false';
2151  $return["status"]["message"] = $e->getMessage();
2152  $return["status"]["line"] = $e->getLine();
2153  $return["data"] = array();
2154 // $return["extra"] = "Sent: $soapString returned: $response parsed into: " . print_r( $xmlreturn, true );
2155  }
2156  return $return;
2157 }
2158 
2159 // Note that expedited payments don't seem to be allowed.
2160 function ckfrModPayment($parms) {
2161 
2162  try {
2163  $reqparms = array('SponsorID'=>1,
2164  'clientAppText'=>1,
2165  'clientAppVer'=>1,
2166  'Token'=>1,
2167  'billpayid'=>1,
2168  'serviceurl' => 1,
2169  'servicecert' => 1,
2170  'serviceca'=> 1
2171  );
2172  $missing = array_diff_key($reqparms,$parms);
2173  if (sizeof($missing)) {
2174  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2175  }
2176  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2177 
2178  $paymentDate = date( "Y-m-d", strtotime( $parms["Payment"]['Date'] ) );
2179 
2180  $accountParts = explode( "|", $parms["Payment"]["From"] );
2181 
2182  $routing = $accountParts[0];
2183  $accountType = $accountParts[1];
2184  $account = $accountParts[2];
2185 
2186  $now = time();
2187  $txnId = $parms["Payment"]["Id"];
2188  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2189  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2190  <soapenv:Header/>
2191  <soapenv:Body>
2192  <v3:paymentModifyRq>
2193  <v3:Header>
2194  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2195  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2196  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2197  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2198  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2199  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2200  <v3:CorrID>{$now}</v3:CorrID>
2201  </v3:Header>
2202  <v3:Payment>
2203  <v3:TransactionId>$txnId</v3:TransactionId>
2204  <v3:BankAccountId>
2205  <v3:RoutingTransitNumber>$routing</v3:RoutingTransitNumber>
2206  <v3:AccountType>$accountType</v3:AccountType>
2207  <v3:AccountNumber>$account</v3:AccountNumber>
2208  </v3:BankAccountId>
2209  <v3:PaymentAmount>{$parms["Payment"]['Amount']}</v3:PaymentAmount>
2210  <v3:PaymentDate>
2211  <v3:Date>$paymentDate</v3:Date>
2212  </v3:PaymentDate>
2213  </v3:Payment>
2214  </v3:paymentModifyRq>
2215  </soapenv:Body>
2216 </soapenv:Envelope>\n";
2217 
2218  $soapHeaders = array();
2219  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2220  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/ModifyPayment"';
2221  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2222 
2223  if ( $parms["logging"] == "enabled" ) {
2224  $logParms = $parms["environment"]; // get the environment info passed in
2225  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2226  $logParms["txnId"] = $now; // the id for this transaction
2227  $logParms["logPoint"] = "paymentModifyRq"; // this action in a readable form
2228  $logParms["request"] = $soapString; // the request
2229  $logParms["reply"] = $response; // the response
2230  LogCheckFreeActivity( $logParms );
2231  }
2232 
2233  if (empty($response)) {
2234  throw new Exception("SubMaint No Response");
2235  }
2236  # call parse function to format response array
2237 
2238  $xmlreturn = hcuGetCFXMLResponse($response, 'PaymentModifyResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2239  if (!is_array($xmlreturn)) {
2240  throw new Exception("ModifyPayment Invalid XML Response");
2241  }
2242  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
2243  throw new Exception("ModifyPayment Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
2244  }
2245  $return["status"]["response"] = 'true';
2246  $return["status"]["message"] = 'Success';
2247  $return["data"] = $xmlreturn["data"];
2248 
2249  // remove any cached data
2250  $cacheType = CACHE_KEY_PMTS;
2251  DeleteCheckFreeCache( $parms["environment"]["dbConn"],
2252  $parms["environment"]["memberId"],
2253  $parms["BillpayId"],
2254  $parms["environment"]["Cu"],
2255  $cacheType,
2256  $parms["Token"],
2257  "");
2258  } catch (Exception $e) {
2259  $return["status"]["response"] = 'false';
2260  $return["status"]["message"] = $e->getMessage();
2261  $return["status"]["line"] = $e->getLine();
2262  $return["data"] = array();
2263 // $return["extra"] = "Sent: $soapString returned: $response parsed into: " . print_r( $xmlreturn, true );
2264  }
2265  return $return;
2266 }
2267 
2268 function ckfrPaymentCancel($parms) {
2269 
2270  try {
2271  $reqparms = array('SponsorID'=>1,
2272  'clientAppText'=>1,
2273  'clientAppVer'=>1,
2274  'Token'=>1,
2275  'billpayid'=>1,
2276  'serviceurl' => 1,
2277  'servicecert' => 1,
2278  'serviceca'=> 1
2279  );
2280  $missing = array_diff_key($reqparms,$parms);
2281  if (sizeof($missing)) {
2282  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2283  }
2284  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2285 
2286  $now = time();
2287  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2288  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2289  <soapenv:Header/>
2290  <soapenv:Body>
2291  <v3:paymentCancelRq>
2292  <v3:Header>
2293  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2294  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2295  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2296  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2297  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2298  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2299  <v3:CorrID>{$now}</v3:CorrID>
2300  </v3:Header>
2301  <v3:PaymentInfo>
2302  <v3:TransactionId>{$parms["transactionId"]}</v3:TransactionId>
2303  </v3:PaymentInfo>
2304  </v3:paymentCancelRq>
2305  </soapenv:Body>
2306 </soapenv:Envelope>\n";
2307 
2308  $soapHeaders = array();
2309  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2310  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/CancelPayment"';
2311  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2312 
2313  if ( $parms["logging"] == "enabled" ) {
2314  $logParms = $parms["environment"]; // get the environment info passed in
2315  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2316  $logParms["txnId"] = $now; // the id for this transaction
2317  $logParms["logPoint"] = "paymentCancelRq"; // this action in a readable form
2318  $logParms["request"] = $soapString; // the request
2319  $logParms["reply"] = $response; // the response
2320  LogCheckFreeActivity( $logParms );
2321  }
2322 
2323  if (empty($response)) {
2324  throw new Exception("SubMaint No Response");
2325  }
2326  # call parse function to format response array
2327 
2328  $xmlreturn = hcuGetCFXMLResponse($response, 'PaymentCancelResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2329  if (!is_array($xmlreturn)) {
2330  throw new Exception("CancelPayment Invalid XML Response");
2331  }
2332  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
2333  throw new Exception("CancelPayment Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
2334  }
2335  $return["status"]["response"] = 'true';
2336  $return["status"]["message"] = 'Success';
2337  $return["data"] = $xmlreturn["data"];
2338 
2339  // remove any cached data
2340  $cacheType = CACHE_KEY_PMTS;
2341  DeleteCheckFreeCache( $parms["environment"]["dbConn"],
2342  $parms["environment"]["memberId"],
2343  $parms["BillpayId"],
2344  $parms["environment"]["Cu"],
2345  $cacheType,
2346  $parms["Token"],
2347  "" );
2348 
2349  } catch (Exception $e) {
2350  $return["status"]["response"] = 'false';
2351  $return["status"]["message"] = $e->getMessage();
2352  $return["status"]["line"] = $e->getLine();
2353  $return["data"] = array();
2354 // $return["extra"] = "Sent: $soapString returned: $response parsed into: " . print_r( $xmlreturn, true );
2355  }
2356  return $return;
2357 }
2358 
2359 function ckfrSubscriberModify($parms) {
2360 
2361  try {
2362  $reqparms = array('SponsorID'=>1,
2363  'clientAppText'=>1,
2364  'clientAppVer'=>1,
2365  'Token'=>1,
2366  'clientIP'=>1,
2367  'billpayid'=>1,
2368  'miraccountnumber' => 1,
2369  'mirlastname' => 1,
2370  'miremail' => 1,
2371  'mirssn' => 1,
2372  'mirdob' => 1,
2373  'mirphone' => 1,
2374  'miraddress1' => 1,
2375  'mircity' => 1,
2376  'mirstate' => 1,
2377  'mirzip' => 1,
2378  'serviceurl' => 1,
2379  'servicecert' => 1,
2380  'serviceca'=> 1
2381  );
2382  $missing = array_diff_key($reqparms,$parms);
2383  if (sizeof($missing)) {
2384  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2385  }
2386  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2387  if (strlen($parms["mirzip"])==5) {
2388  $ZIPclause = "<v3:Zip5>{$parms['mirzip']}</v3:Zip5>";
2389  } else if (strlen($parms["mirzip"]) == 9) {
2390  $ZIPclause = "<v3:Zip5>" . substr($parms['mirzip'],0,5) . "</v3:Zip5>";
2391  $ZIPclause .= "<v3:Zip4>" . substr($parms['mirzip'],5,4) . "</v3:Zip4>";
2392  } else {
2393  $ZIPclause = '';
2394  }
2395  $parms["miraddress2"] = trim($parms["miraddress2"]);
2396  if (empty($parms["miraddress2"])) {
2397  $addr2='';
2398  } else {
2399  $addr2="
2400  <v3:Address2>{$parms["miraddress2"]}</v3:Address2>
2401  ";
2402  }
2403  $parms["mircity"] = str_replace($rmlist, "", $parms["mircity"]);
2404  $parms["mirstate"] = str_replace($rmlist, "", $parms["mirstate"]);
2405  $parms["mirssn"] = str_replace("-", "", $parms["mirssn"]);
2406 
2407  $now = time();
2408  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2409  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2410  <soapenv:Header/>
2411  <soapenv:Body>
2412  <v3:subscriberModifyRequest>
2413  <v3:Header>
2414  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2415  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2416  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2417  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2418  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2419  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2420  <v3:CorrID>{$now}</v3:CorrID>
2421  </v3:Header>
2422  <v3:Subscriber>
2423  <v3:ExternalSubscriberId>$subscriber</v3:ExternalSubscriberId>
2424  <v3:BillingClass>{$parms['billingclass']}</v3:BillingClass>
2425  <v3:UserId>{$subscriber}</v3:UserId>
2426  <v3:Password>{$parms['billpaypw']}</v3:Password>
2427  <v3:TaxId>{$parms['mirssn']}</v3:TaxId>
2428  <v3:Name>
2429  <v3:First>{$parms['mirfirstname']}</v3:First>
2430  <v3:Last>{$parms['mirlastname']}</v3:Last>
2431  </v3:Name>
2432  <v3:Address>
2433  <v3:Address1>{$parms['miraddress1']}</v3:Address1>$addr2
2434  <v3:City>{$parms['mircity']}</v3:City>
2435  <v3:State>{$parms['mirstate']}</v3:State>
2436  $ZIPclause
2437  </v3:Address>
2438  <v3:EmailAddress>
2439  <v3:value>{$parms['miremail']}</v3:value>
2440  </v3:EmailAddress>
2441  <v3:DayPhone>{$parms['mirphone']}</v3:DayPhone>
2442  <v3:BirthDate>
2443  <v3:Date>{$parms['mirdob']}</v3:Date>
2444  </v3:BirthDate>
2445  <v3:AllowedToSolicit>N</v3:AllowedToSolicit>
2446  </v3:Subscriber>
2447  </v3:subscriberModifyRequest>
2448  </soapenv:Body>
2449 </soapenv:Envelope>\n";
2450 
2451  $soapHeaders = array();
2452  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2453  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/SubscriberModify"';
2454  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2455 
2456  if ( $parms["logging"] == "enabled" ) {
2457  $logParms = $parms["environment"]; // get the environment info passed in
2458  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2459  $logParms["txnId"] = $now; // the id for this transaction
2460  $logParms["logPoint"] = "subscriberModifyRequest"; // this action in a readable form
2461  $logParms["request"] = $soapString; // the request
2462  $logParms["reply"] = $response; // the response
2463  LogCheckFreeActivity( $logParms );
2464  }
2465 
2466  if (empty($response)) {
2467  throw new Exception("SubMaint No Response");
2468  }
2469 // $tfile = fopen ("/tmp/checkfree_sso","a");
2470 // fwrite ($tfile, "$soapString\n");
2471 // fwrite ($tfile, "$response\n");
2472 // fclose ($tfile);
2473 
2474  # call parse function to format response array
2475 
2476  $xmlreturn = hcuGetCFXMLResponse($response, 'SubscriberModifyResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2477  if (!is_array($xmlreturn)) {
2478  throw new Exception("SubscriberModify Invalid XML Response");
2479  }
2480  if ($xmlreturn["data"]["Result"]["Success"] != 'true') {
2481  throw new Exception("SubscriberModify Failed {$xmlreturn["data"]["Result"]["ResultInfo"]["Code"]} {$xmlreturn["data"]["Result"]["ResultInfo"]["Description"]}");
2482  }
2483  $return["status"]["response"] = 'true';
2484  $return["status"]["message"] = 'Success';
2485  $return["data"] = $xmlreturn["data"];
2486 
2487  } catch (Exception $e) {
2488  $return["status"]["response"] = 'false';
2489  $return["status"]["message"] = $e->getMessage();
2490 // $return["status"]["message"] = "(" . $e->getline() . ") " . $e->getMessage();
2491  $return["status"]["line"] = $e->getLine();
2492  $return["data"] = array();
2493  }
2494  return $return;
2495 }
2496 
2497 function hcuGetCFXMLResponse($cfxXML, $cfxITEM, $cfxNS) {
2498  try {
2499  $xml = simplexml_load_string($cfxXML,"SimpleXMLElement",LIBXML_NOWARNING);
2500  if (!is_object($xml)) {
2501  throw new Exception("Invalid XML");
2502  }
2503  $xml->registerXPathNamespace('cfx', $cfxNS);
2504  $dataobj = $xml->xpath("//cfx:Body");
2505  if (!is_array($dataobj)) {
2506  throw new Exception("xPath Failed");
2507  }
2508  $errorresponse = $xml->xpath("//cfx:Fault");
2509 
2510  if (is_array($errorresponse) && count($errorresponse)) {
2511  $fault = trim( $errorresponse[0]->faultcode );
2512  $faultString = trim( $errorresponse[0]->faultstring );
2513  $resp_arr = array('faultcode' => $fault,
2514  'faultstring' => $faultString);
2515  $resp_arr["status"]["response"] = 'false';
2516  } else {
2517  $dataresponse = objectToArray($dataobj);
2518  if (!is_array($dataresponse)) {
2519  throw new Exception("objectToArray conversion Failed");
2520  }
2521  $resp_arr["status"]["response"] = 'true';
2522  $resp_arr["status"]["message"] = 'Success';
2523  $resp_arr["data"] = $dataresponse[0][$cfxITEM];
2524  }
2525  } catch (Exception $e) {
2526  $resp_arr["status"]["response"] = 'false';
2527  $resp_arr["status"]["message"] = $e->getMessage();
2528  $resp_arr["status"]["line"] = $e->getLine();
2529 // $resp_arr["parms"]=array('cfxXML'=>$cfxXML, 'cfxITEM'=>$cfxITEM, 'cfxNS'=>$cfxNS);
2530 // $resp_arr["xpath"]=print_r($dataobj,true);
2531 // $resp_arr = false;
2532  }
2533 
2534  return $resp_arr;
2535 }
2536 function objectToArray( $object )
2537  {
2538 // print "objectToArray called with " . print_r($object,true);
2539  if( !is_object( $object ) && !is_array( $object ) )
2540  {
2541  return $object;
2542  }
2543  if( is_object( $object ) )
2544  {
2545  $object = get_object_vars( $object );
2546  }
2547  return array_map( 'objectToArray', $object );
2548  }
2549 
2550 function ckfrBankAccountAdd($parms) {
2551 
2552  try {
2553  $reqparms = array('SponsorID'=>1,
2554  'clientAppText'=>1,
2555  'clientAppVer'=>1,
2556  'Token'=>1,
2557  'clientIP'=>1,
2558  'billpayid'=>1,
2559  'serviceurl' => 1,
2560  'servicecert' => 1,
2561  'serviceca'=> 1,
2562  'rt'=>1,
2563  'payacctmicraccount' => 1,
2564  'payacctdescription' => 1
2565  );
2566  $missing = array_diff_key($reqparms,$parms);
2567  if (sizeof($missing)) {
2568  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2569  }
2570  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2571  $parms["miremail"] = str_replace($rmlist, "", $parms["miremail"]);
2572 
2573  $now = time();
2574  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2575  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2576  <soapenv:Header/>
2577  <soapenv:Body>
2578  <v3:bankAccountAddRequest>
2579  <v3:Header>
2580  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2581  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2582  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2583  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2584  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2585  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2586  <v3:CorrID>{$now}</v3:CorrID>
2587  </v3:Header>
2588  <v3:PerformAccountConfirmation>false</v3:PerformAccountConfirmation>
2589  <v3:BankAccount>
2590  <v3:AccountId>
2591  <v3:RoutingTransitNumber>{$parms['rt']}</v3:RoutingTransitNumber>
2592  <v3:AccountType>DDA</v3:AccountType>
2593  <v3:AccountNumber>{$parms['payacctmicraccount']}</v3:AccountNumber>
2594  </v3:AccountId>
2595  <v3:AccountNickName>{$parms['payacctdescription']}</v3:AccountNickName>
2596  <v3:IsBillPaymentEnabled>true</v3:IsBillPaymentEnabled>
2597  <v3:IsBankingEnabled>false</v3:IsBankingEnabled>
2598  <v3:IsDefaultPpsReceiveAccount>false</v3:IsDefaultPpsReceiveAccount>
2599  <v3:IsBillingAccount>false</v3:IsBillingAccount>
2600  <v3:IsPreferredAccount>false</v3:IsPreferredAccount>
2601  </v3:BankAccount>
2602  </v3:bankAccountAddRequest>
2603  </soapenv:Body>
2604 </soapenv:Envelope>\n";
2605 
2606  $soapHeaders = array();
2607  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2608  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/BankAccountAdd"';
2609  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2610 
2611  if ( $parms["logging"] == "enabled" ) {
2612  $logParms = $parms["environment"]; // get the environment info passed in
2613  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2614  $logParms["txnId"] = $now; // the id for this transaction
2615  $logParms["logPoint"] = "bankAccountAddRequest"; // this action in a readable form
2616  $logParms["request"] = $soapString; // the request
2617  $logParms["reply"] = $response; // the response
2618  LogCheckFreeActivity( $logParms );
2619  }
2620 
2621  if (empty($response)) {
2622  throw new Exception("SubMaint No Response");
2623  }
2624 // $tfile = fopen ("/tmp/checkfree_sso","a");
2625 // fwrite ($tfile, "$soapString\n");
2626 // fwrite ($tfile, "$response\n");
2627 // fclose ($tfile);
2628  # call parse function to format response array
2629 
2630  $xmlreturn = hcuGetCFXMLResponse($response, 'BankAccountAddResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2631  if (!is_array($xmlreturn) || $xmlreturn["status"]["response"] != 'true') {
2632  throw new Exception("BankAccountAdd Invalid XML Response {$xmlreturn["status"]["message"]}");
2633  }
2634  $return["status"]["response"] = 'true';
2635  $return["status"]["message"] = 'Success';
2636  $return["data"] = $xmlreturn["data"];
2637 
2638  } catch (Exception $e) {
2639  $return["status"]["response"] = 'false';
2640  $return["status"]["message"] = $e->getMessage();
2641  $return["status"]["line"] = $e->getLine();
2642  $return["data"] = array();
2643  }
2644  return $return;
2645 }
2646 function ckfrBankAccountModify($parms) {
2647 
2648  try {
2649  $reqparms = array('SponsorID'=>1,
2650  'clientAppText'=>1,
2651  'clientAppVer'=>1,
2652  'Token'=>1,
2653  'clientIP'=>1,
2654  'billpayid'=>1,
2655  'miraccountnumber' => 1,
2656  'miremail' => 1,
2657  'serviceurl' => 1,
2658  'servicecert' => 1,
2659  'serviceca'=> 1
2660  );
2661  $missing = array_diff_key($reqparms,$parms);
2662  if (sizeof($missing)) {
2663  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2664  }
2665  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2666  $parms["miremail"] = str_replace($rmlist, "", $parms["miremail"]);
2667 
2668  $now = time();
2669  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2670  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2671  <soapenv:Header/>
2672  <soapenv:Body>
2673  <v3:bankAccountModifyRequest>
2674  <v3:Header>
2675  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2676  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2677  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2678  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2679  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2680  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2681  <v3:CorrID>{$now}</v3:CorrID>
2682  </v3:Header>
2683  <v3:BankAccount>
2684  <v3:AccountId>
2685  <v3:RoutingTransitNumber>?</v3:RoutingTransitNumber>
2686  <v3:AccountType>?</v3:AccountType>
2687  <v3:AccountNumber>?</v3:AccountNumber>
2688  <v3:AccountNickName>?</v3:AccountNickName>
2689  <v3:IsBillPaymentEnabled>?</v3:IsBillPaymentEnabled>
2690  <v3:IsBankingEnabled>?</v3:IsBankingEnabled>
2691  <v3:BankingOptions>
2692  <v3:DownloadTransactionsEnabled>?</v3:DownloadTransactionsEnabled>
2693  <v3:CanUseAsTransferSource>?</v3:CanUseAsTransferSource>
2694  <v3:CanUseAsTransferDestination>?</v3:CanUseAsTransferDestination>
2695  </v3:BankingOptions>
2696  <v3:IsDefaultPpsReceiveAccount>?</v3:IsDefaultPpsReceiveAccount>
2697  <v3:IsBillingAccount>?</v3:IsBillingAccount>
2698  <v3:IsPreferredAccount>?</v3:IsPreferredAccount>
2699  <v3:BusinessName>?</v3:BusinessName>
2700  <v3:PrimaryAccountOwner>?</v3:PrimaryAccountOwner>
2701  <v3:SecondaryAccountOwner>?</v3:SecondaryAccountOwner>
2702  <v3:StartingCheckNumber>?</v3:StartingCheckNumber>
2703  <v3:CheckPrintAddress>
2704  <v3:Address1>?</v3:Address1>
2705  <v3:Address2>?</v3:Address2>
2706  <v3:City>?</v3:City>
2707  <v3:State>?</v3:State>
2708  <v3:Zip5>?</v3:Zip5>
2709  <v3:Zip4>?</v3:Zip4>
2710  <v3:Zip2>?</v3:Zip2>
2711  </v3:CheckPrintAddress>
2712  <v3:CheckPrintAddressInternational>
2713  <v3:Address1>?</v3:Address1>
2714  <v3:Address2>?</v3:Address2>
2715  <v3:City>?</v3:City>
2716  <v3:State>?</v3:State>
2717  <v3:PostalCode>?</v3:PostalCode>
2718  <v3:CountryCode>?</v3:CountryCode>
2719  <v3:ProvinceName>?</v3:ProvinceName>
2720  </v3:CheckPrintAddressInternational>
2721  </v3:BankAccount>
2722  </v3:bankAccountModifyRequest>
2723  </soapenv:Body>
2724 </soapenv:Envelope>\n";
2725 
2726  $soapHeaders = array();
2727  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2728  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/BankAccountModify"';
2729  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2730 
2731  if ( $parms["logging"] == "enabled" ) {
2732  $logParms = $parms["environment"]; // get the environment info passed in
2733  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2734  $logParms["txnId"] = $now; // the id for this transaction
2735  $logParms["logPoint"] = "bankAccountModifyRequest"; // this action in a readable form
2736  $logParms["request"] = $soapString; // the request
2737  $logParms["reply"] = $response; // the response
2738  LogCheckFreeActivity( $logParms );
2739  }
2740 
2741  if (empty($response)) {
2742  throw new Exception("SubMaint No Response");
2743  }
2744  # call parse function to format response array
2745 
2746  $xmlreturn = hcuGetCFXMLResponse($response, 'BankAccountModifyResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2747  if (!is_array($xmlreturn) || $xmlreturn["status"]["response"] != 'true') {
2748  throw new Exception("BankAccountModify Invalid XML Response {$xmlreturn["status"]["message"]}");
2749  }
2750  $return["status"]["response"] = 'true';
2751  $return["status"]["message"] = 'Success';
2752  $return["data"] = $xmlreturn["data"];
2753 
2754  } catch (Exception $e) {
2755  $return["status"]["response"] = 'false';
2756  $return["status"]["message"] = $e->getMessage();
2757  $return["status"]["line"] = $e->getLine();
2758  $return["data"] = array();
2759  }
2760  return $return;
2761 }
2762 function ckfrBankAccountInactivate($parms) {
2763 
2764  try {
2765  $reqparms = array('SponsorID'=>1,
2766  'clientAppText'=>1,
2767  'clientAppVer'=>1,
2768  'Token'=>1,
2769  'clientIP'=>1,
2770  'billpayid'=>1,
2771  'serviceurl' => 1,
2772  'servicecert' => 1,
2773  'serviceca'=> 1
2774  );
2775  $missing = array_diff_key($reqparms,$parms);
2776  if (sizeof($missing)) {
2777  throw new Exception("Missing Parameters (" . join(", ",array_keys($missing)) . " )");
2778  }
2779  $subscriber = substr("000000000{$parms['billpayid']}", -9, 9);
2780  $parms["miremail"] = str_replace($rmlist, "", $parms["miremail"]);
2781 
2782  $now = time();
2783  $soapString = '<?xml version="1.0" encoding="utf-8"?>';
2784  $soapString .= "\n<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:v3=\"http://fiserv.com/builder/v3_0\">
2785  <soapenv:Header/>
2786  <soapenv:Body>
2787  <v3:bankAccountInactivateRequest>
2788  <v3:Header>
2789  <v3:SponsorId>{$parms['SponsorID']}</v3:SponsorId>
2790  <v3:SubscriberId>{$subscriber}</v3:SubscriberId>
2791  <v3:ClientAppText>{$parms['clientAppText']}</v3:ClientAppText>
2792  <v3:ClientAppVersion>{$parms['clientAppVer']}</v3:ClientAppVersion>
2793  <v3:SubscriberIpAddress>{$parms['clientIP']}</v3:SubscriberIpAddress>
2794  <v3:SessionCorrID>{$parms['Token']}</v3:SessionCorrID>
2795  <v3:CorrID>{$now}</v3:CorrID>
2796  </v3:Header>
2797  <v3:AccountId>
2798  <v3:RoutingTransitNumber>?</v3:RoutingTransitNumber>
2799  <v3:AccountType>?</v3:AccountType>
2800  <v3:AccountNumber>?</v3:AccountNumber>
2801  </v3:AccountId>
2802  </v3:bankAccountInactivateRequest>
2803  </soapenv:Body>
2804 </soapenv:Envelope>\n";
2805 
2806  $soapHeaders = array();
2807  $soapHeaders[] = "Content-Type: text/xml; charset=utf-8";
2808  $soapHeaders[] = 'SOAPAction: "http://fiserv.com/builder/v3_0/BankAccountInactivate"';
2809  $response = ckfrembcurl($soapString, $soapHeaders, $parms['serviceurl'],$parms['servicecert'],$parms['servicekey'],$parms['serviceca']);
2810 
2811  if ( $parms["logging"] == "enabled" ) {
2812  $logParms = $parms["environment"]; // get the environment info passed in
2813  $logParms["token"] = $parms['Token']; // the id used across all communications in session
2814  $logParms["txnId"] = $now; // the id for this transaction
2815  $logParms["logPoint"] = "bankAccountInactivateRequest"; // this action in a readable form
2816  $logParms["request"] = $soapString; // the request
2817  $logParms["reply"] = $response; // the response
2818  LogCheckFreeActivity( $logParms );
2819  }
2820 
2821  if (empty($response)) {
2822  throw new Exception("SubMaint No Response");
2823  }
2824  # call parse function to format response array
2825 
2826  $xmlreturn = hcuGetCFXMLResponse($response, 'BankAccountInactivateResult', 'http://schemas.xmlsoap.org/soap/envelope/');
2827  if (!is_array($xmlreturn) || $xmlreturn["status"]["response"] != 'true') {
2828  throw new Exception("BankAccountInactivate Invalid XML Response {$xmlreturn["status"]["message"]}");
2829  }
2830  $return["status"]["response"] = 'true';
2831  $return["status"]["message"] = 'Success';
2832  $return["data"] = $xmlreturn["data"];
2833 
2834  } catch (Exception $e) {
2835  $return["status"]["response"] = 'false';
2836  $return["status"]["message"] = $e->getMessage();
2837  $return["status"]["line"] = $e->getLine();
2838  $return["data"] = array();
2839  }
2840  return $return;
2841 }
2842 /**
2843  *
2844  * @param type $parms
2845  * @return array including status and data
2846  * either test or production values for servicecert, servicekey, serviceurl, serviceca
2847  * note that service cert and key are now stored encrypted; this returns the retrieved,
2848  * decrypted values as servicecert and servicekey
2849  *
2850  * @throws Exception and returns empty data array on error
2851  */
2852 function bpSetCred($parms) {
2853 
2854  // ** Get the Cert File Secrets ID from trusted details
2855  // ** Get the Key File Secrets ID from trusted details
2856  try {
2857  /** assume success * */
2858  $return = array('status' => 'true', 'message' => 'success');
2859 
2860  if (HCU_array_key_value('pilot', $parms) == 1) {
2861  $tdCertFileId = $parms['certcred'];
2862  $tdKeyFileId = $parms['certkey'];
2863  $serviceurl = HCU_array_key_value('certurl', $parms);
2864  $serviceca = HCU_array_key_value('certca', $parms);
2865  } else {
2866  $tdCertFileId = $parms['prodcred'];
2867  $tdKeyFileId = $parms['prodkey'];
2868  $serviceurl = HCU_array_key_value('produrl', $parms);
2869  $serviceca = HCU_array_key_value('prodca', $parms);
2870  }
2871 
2872  /**
2873  * Retrieve and decrypt the cert file --
2874  */
2875  $hcuCertFile = GetAwsCertFile($tdCertFileId, HOMECU_ENC_CERT_DIR, HOMECU_DOCK_CERT_DIR);
2876 
2877  /**
2878  * Retrieve and decrypt the key file --
2879  */
2880  $hcuKeyFile = GetAwsCertFile($tdKeyFileId, HOMECU_ENC_CERT_DIR, HOMECU_DOCK_CERT_DIR);
2881 
2882  /** Did the files from trusted detail get created as expected? * */
2883  if (($hcuCertFile == '' || !(is_readable($hcuCertFile))) || ($hcuKeyFile == '' || !(is_readable($hcuKeyFile)))) {
2884  throw new Exception("Security Files missing or unreadable");
2885  }
2886 
2887  $return['data'] = array('servicecert' => $hcuCertFile, 'servicekey' => $hcuKeyFile, 'serviceurl' => $serviceurl, 'serviceca' => $serviceca);
2888  } catch (Exception $e) {
2889  $return = array('status' => 'false', 'message' => $e->getMessage(), 'data' => array());
2890  }
2891  return $return;
2892 }
2893 
2894 // NOTE: This function is duplicated in PSCUPAY_API.i
2895 function ListHolidays($Start, $End) {
2896 //================================================= ================
2897 //This function programmatically determines Federal Holidays landing
2898 // between the given start and end YY
2899 // adapted from code Written by Jana Bauer,
2900 // which was adapted from code obtained at
2901 //http://www.tek-tips.com/faqs.cfm?fid=6003
2902 //================================================= ================
2903 
2904  $holidays = array();
2905  for ($i = $Start; $i <= $End; $i++) {
2906  for ($m = 1; $m <= 12; $m++) {
2907  switch ($m) {
2908  case 3:
2909  case 4:
2910  case 6:
2911  case 8:
2912 // No holidays in these months
2913  break;
2914 
2915  case 1:
2916  // New Year's Day 1/1 or Following Monday
2917  $dtHoliday = mktime(12, 0, 0, 1, 1, $i);
2918 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
2919  $holidays[] = date('Y-m-d',$dtHoliday);
2920  // MLK Day 3rd Monday in January
2921  $dow = idate('w', $dtHoliday);
2922  # find first Monday
2923  switch ($dow) {
2924  case 0: #Sunday
2925  $dtHoliday += 86400;
2926  break;
2927  case 1: #already Monday
2928  break;
2929  case 2:
2930  $dtHoliday += (86400 * 6);
2931  break;
2932  case 3:
2933  $dtHoliday += (86400 * 5);
2934  break;
2935  case 4:
2936  $dtHoliday += (86400 * 4);
2937  break;
2938  case 5:
2939  $dtHoliday += (86400 * 3);
2940  break;
2941  case 6:
2942  $dtHoliday += (86400 * 2);
2943  break;
2944  }
2945  $dtHoliday += (86400 * 14); # add 2 weeks to get 3rd Monday
2946  $holidays[] = date('Y-m-d',$dtHoliday);
2947  break;
2948 
2949  case 2:
2950  // President's Day 3rd Monday in February
2951  $dtHoliday = mktime(12, 0, 0, 2, 1, $i);
2952  $dow = idate('w', $dtHoliday);
2953  # find first Monday
2954  switch ($dow) {
2955  case 0: #Sunday
2956  $dtHoliday += 86400;
2957  break;
2958  case 1: #already Monday
2959  break;
2960  case 2:
2961  $dtHoliday += (86400 * 6);
2962  break;
2963  case 3:
2964  $dtHoliday += (86400 * 5);
2965  break;
2966  case 4:
2967  $dtHoliday += (86400 * 4);
2968  break;
2969  case 5:
2970  $dtHoliday += (86400 * 3);
2971  break;
2972  case 6:
2973  $dtHoliday += (86400 * 2);
2974  break;
2975  }
2976  $dtHoliday += (86400 * 14); # add 2 weeks to get 3rd Monday
2977  $holidays[] = date('Y-m-d',$dtHoliday);
2978  break;
2979 
2980  case 5:
2981  // Memorial Day Last Monday in May
2982  $dtHoliday = mktime(12, 0, 0, 5, 31, $i);
2983  $dow = idate('w', $dtHoliday);
2984  # find last day & back up
2985  switch ($dow) {
2986  case 0: #Sunday
2987  $dtHoliday -= (86400 * 6);
2988  break;
2989  case 1: #already Monday
2990  break;
2991  case 2:
2992  $dtHoliday -= 86400;
2993  break;
2994  case 3:
2995  $dtHoliday -= (86400 * 2);
2996  break;
2997  case 4:
2998  $dtHoliday -= (86400 * 3);
2999  break;
3000  case 5:
3001  $dtHoliday -= (86400 * 4);
3002  break;
3003  case 6:
3004  $dtHoliday -= (86400 * 5);
3005  break;
3006  }
3007  $holidays[] = date('Y-m-d',$dtHoliday);
3008  break;
3009 
3010  case 7:
3011  // Independence Day 7/4 or Following Monday
3012  $dtHoliday = mktime(12, 0, 0, 7, 4, $i);
3013 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
3014  $holidays[] = date('Y-m-d',$dtHoliday);
3015 
3016  break;
3017 
3018  case 9:
3019  // Labor Day 1st Monday in September
3020  $dtHoliday = mktime(12, 0, 0, 9, 1, $i);
3021  $dow = idate('w', $dtHoliday);
3022  # find first Monday
3023  switch ($dow) {
3024  case 0: #Sunday
3025  $dtHoliday += 86400;
3026  break;
3027  case 1: #already Monday
3028  break;
3029  case 2:
3030  $dtHoliday += (86400 * 6);
3031  break;
3032  case 3:
3033  $dtHoliday += (86400 * 5);
3034  break;
3035  case 4:
3036  $dtHoliday += (86400 * 4);
3037  break;
3038  case 5:
3039  $dtHoliday += (86400 * 3);
3040  break;
3041  case 6:
3042  $dtHoliday += (86400 * 2);
3043  break;
3044  }
3045  $holidays[] = date('Y-m-d',$dtHoliday);
3046  break;
3047 
3048  case 10:
3049  // Columbus Day 2nd Monday in October
3050  $dtHoliday = mktime(12, 0, 0, 10, 1, $i);
3051  $dow = idate('w', $dtHoliday);
3052  # find first Monday
3053  switch ($dow) {
3054  case 0: #Sunday
3055  $dtHoliday += 86400;
3056  break;
3057  case 1: #already Monday
3058  break;
3059  case 2:
3060  $dtHoliday += (86400 * 6);
3061  break;
3062  case 3:
3063  $dtHoliday += (86400 * 5);
3064  break;
3065  case 4:
3066  $dtHoliday += (86400 * 4);
3067  break;
3068  case 5:
3069  $dtHoliday += (86400 * 3);
3070  break;
3071  case 6:
3072  $dtHoliday += (86400 * 2);
3073  break;
3074  }
3075  $dtHoliday += (86400 * 7); # add 1 week to get 2nd Monday
3076  $holidays[] = date('Y-m-d',$dtHoliday);
3077  break;
3078 
3079  case 11:
3080  // Veteran's Day 11/11 or Following Monday
3081  $dtHoliday = mktime(12, 0, 0, 11, 11, $i);
3082 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
3083  $holidays[] = date('Y-m-d',$dtHoliday);
3084 
3085  // Thanksgiving Day 4th Thursday in November
3086  $dtHoliday = mktime(12, 0, 0, 11, 1, $i);
3087  $dow = idate('w', $dtHoliday);
3088  # find first Thursday
3089  switch ($dow) {
3090  case 0: #Sunday
3091  $dtHoliday += (86400 * 4);
3092  break;
3093  case 1: #Monday
3094  $dtHoliday += (86400 * 3);
3095  break;
3096  case 2:
3097  $dtHoliday += (86400 * 2);
3098  break;
3099  case 3:
3100  $dtHoliday += 86400;
3101  break;
3102  case 4:
3103  break;
3104  case 5:
3105  $dtHoliday += (86400 * 6);
3106  break;
3107  case 6:
3108  $dtHoliday += (86400 * 5);
3109  break;
3110  }
3111  $dtHoliday += (86400 * 21); # add 3 weeks to get 4th Thursday
3112  $holidays[] = date('Y-m-d',$dtHoliday);
3113  break;
3114 
3115  case 12:
3116  // Christmas Day 12/25 or Following Monday
3117  $dtHoliday = mktime(12, 0, 0, 12, 25, $i);
3118 // $holidays[] = date('Y-m-d',GetNearestWeekday($dtHoliday));
3119  $holidays[] = date('Y-m-d',$dtHoliday);
3120 
3121  break;
3122  }
3123  }
3124  }
3125 
3126  return $holidays;
3127 }
3128 
3129 function GetNextBusiness($dtTimeStamp) {
3130 // Not currently called - if holiday falls on weekend leave it be
3131 //Note Sunday = 0, Saturday = 6
3132  $intWeekday = idate('w', $dtTimeStamp);
3133  switch ($intWeekday) {
3134  case 0: #Sunday - move forward to Monday
3135  $dtTimeStamp += 86400;
3136  break;
3137  case 6: #Saturday - move forward to Monday
3138  $dtTimeStamp += (86400*2);
3139  break;
3140  case 1: # Monday - Friday - do nothing
3141  case 2:
3142  case 3:
3143  case 4:
3144  case 5:
3145  default:
3146  break;
3147  }
3148  return $dtTimeStamp;
3149 }
3150 
3151 ?>