Odyssey
IPAY_V3.i
1 <?php
2 /**
3  * Relocate iPay-specific functions from hcuConnect.prg
4  * into independent library to enable unit testing
5  * and to clean up some of the sprawl in hcuConnect.prg
6  *
7  * Note that several other functions could be moved here
8  * but start small to limit scope a little at a time
9  */
10 
11 /**
12  * Change format of passed parameters to improve test-ability
13  *
14  * @param array $MIR data packet as returned from GetMemberInfo
15  * @param array $IPAYcred array of IPAY_V3 settings
16  * @param array $HCUcred array of HomeCU settings
17  *
18  * @return string Formatted XML enrollment string to send to iPay
19  * returns false status if missing parameters or MIR missing required values
20  *
21  *
22  * These previous params from cutrusteddetail are now in IPAYcred array
23  * @param string $ipay_instid
24  * @param string $ipay_iv
25  * @param string $ipay_key
26  * @param null|int $enrollmicr trusteddetail setting to force enroll w/MICR instead of member account
27  * along with these session-specific ipay items
28  * @param string $ipay_token returned from iPay_getsession call
29  * @param string $random gmdate("U") used across multiple iPay calls'
30  *
31  * These previous params from HCU settings are now in HCUcred array
32  * @param string $billpayid billpayid from hcu banking, or selected member account
33  * @param string $ml email from hcu banking
34  * @param string $micr MICR retrieved from first hcuAccount (0th entry from accounts array)
35  *
36  */
37 function iPayV3EnrollXML($MIR, $IPAYcred, $HCUcred) {
38  # move ipay settings and config into IPAYcred array
39  # from cutrusted detail [ipay_instid, ipay_iv, ipay_key, enrollmicr] and connection dependencies [ipay_token, random]
40  # move HomeCU settings into HCUcred array
41  # from selected user and account settings [ml, billpayid, micr]
42  try {
43  #$ipay_instid, $ipay_iv, $ipay_key, $ipay_token, $random, $billpayid, $ml, $enrollmicr = null, $micr = 0
44  $reqParms = ['ipay_instid' => 1,
45  'ipay_iv' => 1,
46  'ipay_key' => 1,
47  'ipay_token' => 1,
48  'random' => 1,
49  'billpayid' => 1,
50  'ml' => 1,
51  'enrollmicr' => 1, #(default null)
52  'micr' => 1 #(default 0)
53  ];
54  $missing = array_diff_key($reqParms, $IPAYcred, $HCUcred);
55  if (sizeof($missing)) {
56  throw new Exception("Missing Settings ");
57  }
58 
59  # call FormatMIR to make sure data is valid
60  # identify the required elements expected in the MIR
61  $reqMIR = array(
62  "accountnumber" => 1,
63  "firstname" => 1,
64  "lastname" => 1,
65  "email" => 1,
66  "address1" => 1,
67  "city" => 1,
68  "state" => 1,
69  "zip" => 1
70  );
71 
72  $parsedMIR = FormatMIR($MIR['data'], $HCUcred['ml'], $reqMIR, 'Y-m-d', 'flat', false, '');
73 
74  if (!$parsedMIR['status']['response']) {
75  throw new Exception($parsedMIR['status']['message']);
76  }
77 
78  # build enrollment XML string
79 
80  if (!empty($parsedMIR["data"]["ssn"])) {
81  list($EncryptedSSN, $iv) = EncryptCredentials("{$parsedMIR["data"]["ssn"]}", $IPAYcred['ipay_key'], $IPAYcred['ipay_iv']);
82  }
83 
84  $enroll = "<Message>\n";
85  $enroll .= "<InstitutionID>{$IPAYcred['ipay_instid']}</InstitutionID>\n";
86  $enroll .= "<Security>\n";
87  $enroll .= "<IV>{$IPAYcred['ipay_iv']}</IV>\n";
88  $enroll .= "<AuthToken>{$IPAYcred['ipay_token']}</AuthToken>\n";
89  $enroll .= "</Security>\n";
90  $enroll .= "<MessageRequest>\n";
91  $enroll .= "<RequestID>{$IPAYcred['random']}</RequestID>\n";
92  $enroll .= "<SubscriberCreate>\n";
93  $enroll .= "<Info>\n";
94  $enroll .= "<UserID>{$HCUcred['billpayid']}</UserID>\n";
95  $enroll .= "<UserType>2</UserType>\n";
96  $enroll .= "</Info>\n";
97  $enroll .= "<Data>\n";
98  $enroll .= "<Subscriber>\n";
99  $enroll .= "<FIAdminApproval>0</FIAdminApproval>\n";
100  $enroll .= "<LoginID>{$HCUcred['billpayid']}</LoginID>\n";
101  # values from the MIR packet
102  # note that legacy code sends tags w/o data for empty MiddleName & Address2
103  # using HCU_array_key_exists for those to mimic legacy
104  # using HCU_array_key_value for others to skip empties
105  $enroll .= "<FirstName>{$parsedMIR["data"]["firstname"]}</FirstName>\n";
106  if (HCU_array_key_exists('middlename', $parsedMIR['data'])) {
107  $enroll .= "<MiddleName>{$parsedMIR["data"]["middlename"]}</MiddleName>\n";
108  }
109  $enroll .= "<LastName>{$parsedMIR["data"]["lastname"]}</LastName>\n";
110  $enroll .= "<Email>{$parsedMIR['data']['email']}</Email>\n";
111  if (HCU_array_key_value('homephone', $parsedMIR['data'])) {
112  $enroll .= "<HomePhone>" . Format_Phone_Dashes($parsedMIR["data"]["homephone"]) . "</HomePhone>\n";
113  }
114  if (HCU_array_key_value('workphone', $parsedMIR['data'])) {
115  $enroll .= "<WorkPhone>" . Format_Phone_Dashes($parsedMIR["data"]["workphone"]) . "</WorkPhone>\n";
116  }
117  if (HCU_array_key_value('fax', $parsedMIR['data'])) {
118  $enroll .= "<Fax>" . Format_Phone_Dashes($parsedMIR["data"]["fax"]) . "</Fax>\n";
119  }
120  $enroll .= "<SSN>$EncryptedSSN</SSN>\n";
121 
122  if ($IPAYcred['enrollmicr']) {
123  $enroll .= "<AccountNumber>{$HCUcred['micr']}</AccountNumber>\n";
124  } else {
125  $enroll .= "<AccountNumber>{$parsedMIR['data']['accountnumber']}</AccountNumber>\n";
126  }
127 
128 
129  $enroll .= "<AccountType>1</AccountType>\n";
130  $enroll .= "<Address1>{$parsedMIR["data"]["address1"]}</Address1>\n";
131  if (HCU_array_key_exists('address2', $parsedMIR['data'])) {
132  $enroll .= "<Address2>{$parsedMIR["data"]["address2"]}</Address2>\n";
133  }
134  $enroll .= "<City>{$parsedMIR["data"]["city"]}</City>\n";
135  $enroll .= "<State>{$parsedMIR["data"]["state"]}</State>\n";
136  $enroll .= "<Zip>{$parsedMIR["data"]["zip"]}</Zip>\n";
137  if (HCU_array_key_value('dob', $parsedMIR['data'])) {
138  $enroll .= "<DateOfBirth>{$parsedMIR['data']['dob']}</DateOfBirth>\n";
139  }
140  # end of MIR values
141  $enroll .= "</Subscriber>\n";
142  $enroll .= "</Data>\n";
143  $enroll .= "</SubscriberCreate>\n";
144  $enroll .= "</MessageRequest>\n";
145  $enroll .= "</Message>\n";
146 
147  $return['status'] = true;
148  $return['message'] = 'Success';
149  $return['data'] = $enroll;
150 
151  } catch (Exception $ex) {
152  $return['status'] = false;
153  $return['message'] = $ex->getMessage();
154  $return['data'] = [];
155  }
156  return $return;
157 }