Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
Codecrew
/
Moya
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
30
Merge Requests
2
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit 2ca46422
authored
Mar 28, 2015
by
Tuomas Riihimäki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Checkout refactoring for bill validation check requests
1 parent
44b77763
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
468 additions
and
158 deletions
code/moya-beans-client/ejbModule/fi/codecrew/moya/util/CheckoutBank.java
code/moya-beans/ejbModule/fi/codecrew/moya/beans/CheckoutFiBean.java
code/moya-beans/ejbModule/fi/codecrew/moya/checkoutfi/CheckoutFiCheckParam.java
code/moya-beans/ejbModule/fi/codecrew/moya/checkoutfi/CheckoutFiParam.java
code/moya-beans/ejbModule/fi/codecrew/moya/checkoutfi/CheckoutQuery.java
code/moya-beans/src/test/java/fi/codecrew/moya/beans/CheckoutFiBeanTests.java
code/moya-beans-client/ejbModule/fi/codecrew/moya/util/CheckoutBank.java
View file @
2ca4642
...
...
@@ -37,8 +37,7 @@ public class CheckoutBank {
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
CheckoutBank
.
class
);
public
CheckoutBank
(
Node
bank
)
{
if
(
bank
.
getNodeType
()
!=
1
)
{
if
(
bank
.
getNodeType
()
!=
Node
.
ELEMENT_NODE
)
{
throw
new
RuntimeException
(
"Wrong type of node "
+
bank
+
" type "
+
bank
.
getNodeType
());
}
key
=
bank
.
getNodeName
();
...
...
@@ -47,8 +46,7 @@ public class CheckoutBank {
String
iconval
=
null
;
String
nameval
=
null
;
String
urlval
=
null
;
for
(
int
j
=
0
;
j
<
attrs
.
getLength
();
++
j
)
{
for
(
int
j
=
0
;
j
<
attrs
.
getLength
();
++
j
)
{
Node
attr
=
attrs
.
item
(
j
);
if
(
attr
.
getNodeName
().
equals
(
"icon"
))
{
iconval
=
attr
.
getNodeValue
();
...
...
@@ -63,18 +61,14 @@ public class CheckoutBank {
url
=
urlval
;
NodeList
children
=
bank
.
getChildNodes
();
for
(
int
i
=
0
;
i
<
children
.
getLength
();
++
i
)
{
for
(
int
i
=
0
;
i
<
children
.
getLength
();
++
i
)
{
Node
childnode
=
children
.
item
(
i
);
if
(
childnode
.
getNodeType
()
==
1
)
{
if
(
childnode
.
getNodeType
()
==
Node
.
ELEMENT_NODE
)
{
String
paramName
=
childnode
.
getNodeName
();
String
paramValue
=
childnode
.
getTextContent
();
getPostParams
().
add
(
new
Valuepair
(
paramName
,
paramValue
));
logger
.
info
(
"Added param for {} name {} value {}"
,
new
Object
[]
{
key
,
paramName
,
paramValue
});
}
}
// System.out.println();
}
...
...
code/moya-beans/ejbModule/fi/codecrew/moya/beans/CheckoutFiBean.java
View file @
2ca4642
...
...
@@ -18,14 +18,18 @@
*/
package
fi
.
codecrew
.
moya
.
beans
;
import
java.io.BufferedInputStream
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.math.BigDecimal
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.EnumMap
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.List
;
...
...
@@ -41,13 +45,12 @@ import javax.xml.parsers.DocumentBuilder;
import
javax.xml.parsers.DocumentBuilderFactory
;
import
javax.xml.parsers.ParserConfigurationException
;
import
org.apache.http.HttpResponse
;
import
org.apache.http.NameValuePair
;
import
org.apache.http.client.ClientProtocolException
;
import
org.apache.http.client.entity.UrlEncodedFormEntity
;
import
org.apache.http.client.methods.CloseableHttpResponse
;
import
org.apache.http.client.methods.HttpPost
;
import
org.apache.http.impl.client.CloseableHttpClient
;
import
org.apache.http.impl.client.DefaultHttpClient
;
import
org.apache.http.impl.client.HttpClientBuilder
;
import
org.apache.http.message.BasicNameValuePair
;
import
org.slf4j.Logger
;
...
...
@@ -58,7 +61,9 @@ import org.w3c.dom.Node;
import
org.w3c.dom.NodeList
;
import
org.xml.sax.SAXException
;
import
fi.codecrew.moya.checkoutfi.CheckoutFiCheckParam
;
import
fi.codecrew.moya.checkoutfi.CheckoutFiParam
;
import
fi.codecrew.moya.checkoutfi.CheckoutQuery
;
import
fi.codecrew.moya.clientutils.BortalLocalContextHolder
;
import
fi.codecrew.moya.enums.apps.BillPermission
;
import
fi.codecrew.moya.facade.BillFacade
;
...
...
@@ -99,7 +104,66 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
private
BillPBean
billpbean
;
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
CheckoutFiBean
.
class
);
private
static
final
BigDecimal
TO_CENTS
=
BigDecimal
.
valueOf
(
100
);
static
final
BigDecimal
TO_CENTS
=
BigDecimal
.
valueOf
(
100
);
static
final
String
DATEFORMAT
=
"yyyyMMdd"
;
static
final
Set
<
String
>
DISCARD_BANKS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"ape"
,
"tilisiirto"
,
"neopay"
));
/**
* Notice! This is a long running function which creates a remote HTTP
* query.
*
*/
public
boolean
isBillPaid
(
Bill
bill
)
{
QueryBuilder
<
CheckoutFiCheckParam
>
cb
=
initQuerybuilder
(
CheckoutFiCheckParam
.
class
,
CheckoutFiCheckParam
.
values
());
if
(!
cb
.
isCredentialsValid
())
{
throw
new
EJBException
(
"Invalid Credentials"
);
}
final
String
priceInCents
=
Integer
.
valueOf
(
bill
.
totalPrice
().
multiply
(
TO_CENTS
).
intValue
()).
toString
();
cb
.
addParam
(
CheckoutFiCheckParam
.
STAMP
,
getStamp
(
bill
));
cb
.
addParam
(
CheckoutFiCheckParam
.
REFERENCE
,
bill
.
getReferenceNumber
().
toString
());
cb
.
addParam
(
CheckoutFiCheckParam
.
MERCHANT
,
cb
.
getMerchantId
());
cb
.
addParam
(
CheckoutFiCheckParam
.
AMOUNT
,
priceInCents
);
CloseableHttpResponse
response
=
null
;
boolean
ret
=
false
;
try
{
response
=
sendQuery
(
cb
);
InputStream
queryContent
=
response
.
getEntity
().
getContent
();
String
returnValue
=
parsePollXml
(
queryContent
);
int
statusInt
=
Integer
.
parseInt
(
returnValue
);
// Verkkokauppaohjelmisto voi hyväksyä maksun suoritetuksi
// kun maksun tila on 2,5,6,7,8,9 tai 10.
switch
(
statusInt
)
{
case
2
:
case
5
:
case
6
:
case
7
:
case
8
:
case
9
:
case
10
:
ret
=
true
;
break
;
default
:
}
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error sending checkout.fi request"
,
e
);
}
finally
{
try
{
if
(
response
!=
null
)
{
response
.
close
();
}
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error closing checkout.fi request"
,
e
);
}
}
return
ret
;
}
@Override
public
boolean
isPaymentEnabled
()
...
...
@@ -107,215 +171,171 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
final
LanEventPrivateProperty
expire
=
eventbean
.
getPrivateProperty
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_KEY_EXPIRE
);
final
String
merchantid
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_ID
);
final
String
merchantPassword
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_PASSWORD
);
return
!((
expire
!=
null
&&
new
Date
().
after
(
expire
.
getDateValue
()))
||
merchantid
==
null
||
merchantid
.
isEmpty
()
||
merchantPassword
==
null
||
merchantPassword
.
isEmpty
());
final
boolean
expired
=
(
expire
==
null
||
expire
.
getDateValue
()
==
null
||
new
Date
().
after
(
expire
.
getDateValue
()));
boolean
ret
=
!
expired
&&
merchantid
!=
null
&&
!
merchantid
.
isEmpty
()
&&
merchantPassword
!=
null
&&
!
merchantPassword
.
isEmpty
();
return
ret
;
}
public
static
void
main
(
String
[]
asd
)
throws
ParserConfigurationException
,
SAXException
,
IOException
{
// DocumentBuilderFactory dbFactory =
// DocumentBuilderFactory.newInstance();
// DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
// Document doc = dBuilder.parse(xmlstr);
// // DOMParser parser = new DOMParser();
// // Document doc = parser.getDocument();
// // parser.parse(new InputSource(new StringReader(xmlReturn)));
// Element root = doc.getDocumentElement();
// root.normalize();
// // NodeList rootChildren = root.getChildNodes();
// // for (int i = 0; i < rootChildren.getLength(); ++i)
// // {
// // logger.info("Rootchild {}", rootChildren.item(i).getNodeName());
// // }
//
// Node payments = root.getElementsByTagName("banks").item(0);
protected
<
T
extends
Enum
<
T
>>
QueryBuilder
<
T
>
initQuerybuilder
(
Class
<
T
>
clz
,
CheckoutQuery
[]
params
)
{
final
LanEventPrivateProperty
expire
=
eventbean
.
getPrivateProperty
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_KEY_EXPIRE
);
final
String
merchantid
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_ID
);
final
String
merchantPassword
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_PASSWORD
);
Date
date
=
null
;
if
(
expire
!=
null
)
{
date
=
expire
.
getDateValue
();
}
QueryBuilder
<
T
>
ret
=
new
QueryBuilder
<
T
>(
clz
,
params
,
date
,
merchantid
,
merchantPassword
);
return
ret
;
private
static
final
String
DATEFORMAT
=
"yyyyMMdd"
;
private
static
final
Set
<
String
>
DISCARD_BANKS
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"ape"
,
"tilisiirto"
,
"neopay"
));
}
@Override
@RolesAllowed
(
BillPermission
.
S_CREATE_VERKKOMAKSU
)
public
List
<
CheckoutBank
>
getToken
(
Bill
bill
)
{
if
(
bill
.
isFoowavePaymentOver
())
{
if
(
bill
.
isFoowavePaymentOver
())
{
return
null
;
}
QueryBuilder
<
CheckoutFiParam
>
queryBuilder
=
initQuerybuilder
(
CheckoutFiParam
.
class
,
CheckoutFiParam
.
values
());
final
LanEventPrivateProperty
expire
=
eventbean
.
getPrivateProperty
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_KEY_EXPIRE
);
final
String
merchantid
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_ID
);
final
String
merchantPassword
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_PASSWORD
);
if
((
expire
!=
null
&&
new
Date
().
after
(
expire
.
getDateValue
()))
||
merchantid
==
null
||
merchantid
.
isEmpty
()
||
merchantPassword
==
null
||
merchantPassword
.
isEmpty
())
{
if
(!
queryBuilder
.
isCredentialsValid
())
{
return
null
;
}
final
String
priceInCents
=
Integer
.
valueOf
(
bill
.
totalPrice
().
multiply
(
TO_CENTS
).
intValue
()).
toString
();
final
Map
<
CheckoutFiParam
,
String
>
postParams
=
new
HashMap
<
CheckoutFiParam
,
String
>();
final
String
returnUrl
=
new
StringBuilder
(
BortalLocalContextHolder
.
isSsl
()
?
"https://"
:
"http://"
)
final
String
returnUrl
=
new
StringBuilder
()
.
append
(
BortalLocalContextHolder
.
isSsl
()
?
"https://"
:
"http://"
)
.
append
(
BortalLocalContextHolder
.
getHostname
())
.
append
(
"/MoyaWeb/checkout/"
)
.
toString
();
final
StringBuilder
stamp
=
new
StringBuilder
();
stamp
.
append
(
bill
.
getId
());
stamp
.
append
(
STAMP_SPLITCHAR
);
stamp
.
append
(
bill
.
getSentDate
().
getTimeInMillis
()
/
1000
);
final
String
priceInCents
=
Integer
.
valueOf
(
bill
.
totalPrice
().
multiply
(
TO_CENTS
).
intValue
()).
toString
();
postParams
.
put
(
CheckoutFiParam
.
STAMP
,
stamp
.
toString
(
));
postParams
.
put
(
CheckoutFiParam
.
AMOUNT
,
priceInCents
);
postParams
.
put
(
CheckoutFiParam
.
REFERENCE
,
bill
.
getReferenceNumber
().
toString
());
postParams
.
put
(
CheckoutFiParam
.
MERCHANT
,
merchantid
);
postParams
.
put
(
CheckoutFiParam
.
RETURN
,
returnUrl
+
"return.jsf"
);
postParams
.
put
(
CheckoutFiParam
.
CANCEL
,
returnUrl
+
"cancel.jsf"
);
postParams
.
put
(
CheckoutFiParam
.
REJECT
,
returnUrl
+
"reject.jsf"
);
postParams
.
put
(
CheckoutFiParam
.
DELAYED
,
returnUrl
+
"delayed.jsf"
);
postParams
.
put
(
CheckoutFiParam
.
DELIVERY_DATE
,
new
SimpleDateFormat
(
DATEFORMAT
).
format
(
new
Date
()));
queryBuilder
.
addParam
(
CheckoutFiParam
.
STAMP
,
getStamp
(
bill
));
queryBuilder
.
addParam
(
CheckoutFiParam
.
AMOUNT
,
priceInCents
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
REFERENCE
,
bill
.
getReferenceNumber
().
toString
());
queryBuilder
.
addParam
(
CheckoutFiParam
.
MERCHANT
,
queryBuilder
.
getMerchantId
()
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
RETURN
,
returnUrl
+
"return.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
CANCEL
,
returnUrl
+
"cancel.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
REJECT
,
returnUrl
+
"reject.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
DELAYED
,
returnUrl
+
"delayed.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
DELIVERY_DATE
,
new
SimpleDateFormat
(
DATEFORMAT
).
format
(
new
Date
()));
List
<
NameValuePair
>
nameValuePairs
=
new
ArrayList
<
NameValuePair
>();
StringBuilder
mdString
=
new
StringBuilder
();
for
(
CheckoutFiParam
v
:
CheckoutFiParam
.
values
())
{
String
value
=
null
;
if
(
postParams
.
containsKey
(
v
))
{
value
=
postParams
.
get
(
v
);
}
else
{
value
=
v
.
getDefaultValue
();
CloseableHttpResponse
response
=
null
;
List
<
CheckoutBank
>
ret
=
null
;
InputStream
queryContent
=
null
;
try
{
response
=
sendQuery
(
queryBuilder
);
queryContent
=
response
.
getEntity
().
getContent
();
ret
=
parseTokenXml
(
queryContent
);
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error sending checkout.fi request"
,
e
);
}
finally
{
try
{
if
(
queryContent
!=
null
)
queryContent
.
close
();
}
catch
(
IOException
e1
)
{
logger
.
warn
(
"Error closing checkout.fi inputstream"
,
e1
);
}
if
(
value
!=
null
)
{
mdString
.
append
(
value
);
nameValuePairs
.
add
(
new
BasicNameValuePair
(
v
.
name
(),
value
));
try
{
if
(
response
!=
null
)
{
response
.
close
();
}
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error closing checkout.fi request"
,
e
);
}
mdString
.
append
(
"+"
);
}
mdString
.
append
(
merchantPassword
);
CloseableHttpResponse
response
=
null
;
try
{
final
String
calculatedHash
=
PasswordFunctions
.
calculateMd5
(
mdString
.
toString
());
logger
.
info
(
"Calculated checksum {} from {}"
,
mdString
.
toString
(),
calculatedHash
);
return
ret
;
nameValuePairs
.
add
(
new
BasicNameValuePair
(
"MAC"
,
calculatedHash
));
}
private
static
CloseableHttpResponse
sendQuery
(
QueryBuilder
<?>
queryBuilder
)
throws
ClientProtocolException
,
IOException
{
CloseableHttpResponse
response
=
null
;
final
HttpPost
postRequest
=
new
HttpPost
(
REMOTE_URL
);
postRequest
.
setEntity
(
new
UrlEncodedFormEntity
(
nameValuePairs
));
postRequest
.
setEntity
(
new
UrlEncodedFormEntity
(
queryBuilder
.
getNameValuePairs
()
));
HttpClientBuilder
cliBuilder
=
HttpClientBuilder
.
create
();
CloseableHttpClient
cli
=
cliBuilder
.
build
();
response
=
cli
.
execute
(
postRequest
);
// final DefaultHttpClient client = new DefaultHttpClient();
// HttpResponse response = client.execute(postRequest);
// final StringWriter writer = new StringWriter();
//
// IOUtils.copy(, writer, "UTF8");
//
// final String xmlReturn = writer.toString();
// // logger.info("Got response from checkout.fi msg {}, {} ",
// // response.getStatusLine().getStatusCode(), xmlReturn);
return
response
;
}
return
parseTokenXml
(
response
.
getEntity
().
getContent
());
static
final
String
getStamp
(
Bill
bill
)
{
final
StringBuilder
stamp
=
new
StringBuilder
();
stamp
.
append
(
bill
.
getId
());
stamp
.
append
(
STAMP_SPLITCHAR
);
stamp
.
append
(
bill
.
getSentDate
().
getTimeInMillis
()
/
1000
);
return
stamp
.
toString
();
}
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error sending checkout.fi request"
,
e
);
}
finally
{
protected
static
String
parsePollXml
(
InputStream
queryContent
)
{
String
ret
=
null
;
try
{
if
(
response
!=
null
)
{
response
.
close
();
DocumentBuilderFactory
dbFactory
=
DocumentBuilderFactory
.
newInstance
();
DocumentBuilder
dBuilder
=
dbFactory
.
newDocumentBuilder
();
Document
doc
=
dBuilder
.
parse
(
queryContent
);
Element
root
=
doc
.
getDocumentElement
();
// root.normalize();
Node
status
=
root
.
getElementsByTagName
(
"status"
).
item
(
0
);
if
(
status
!=
null
)
{
ret
=
status
.
getTextContent
();
if
(
ret
!=
null
)
{
ret
=
ret
.
trim
();
}
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error closing checkout.fi request"
,
e
);
}
}
catch
(
SAXException
|
IOException
|
ParserConfigurationException
e
)
{
ret
=
null
;
logger
.
warn
(
"Error parsing response from checkout response:"
,
e
);
}
return
null
;
return
ret
;
}
// @Override
// public List<CheckoutBank> testXml()
// {
// List<CheckoutBank> ret = null;
// try {
// BufferedReader reader = new BufferedReader(new
// FileReader("/Users/tuomari/Documents/git/bortal/code/LanBortalBeans/ejbModule/fi.codecrew.moya/beans/checkoutTestfile.xml"));
// StringBuilder sb = new StringBuilder();
//
// String line = null;
// while ((line = reader.readLine()) != null) {
// sb.append(line);
// sb.append("\n");
// }
//
// reader.close();
// String str = sb.toString();
// ret = parseTokenXml(str);
//
// } catch (Throwable t)
// {
// logger.warn("error testing", t);
// }
// // logger.warn("str: {}", str);
// return ret;
// }
private
static
List
<
CheckoutBank
>
parseTokenXml
(
InputStream
inputStream
)
{
protected
static
List
<
CheckoutBank
>
parseTokenXml
(
InputStream
inputStream
)
{
try
{
// DOMParser parser = new DOMParser();
// parser.parse(new InputSource(new StringReader(xmlReturn)));
DocumentBuilderFactory
dbFactory
=
DocumentBuilderFactory
.
newInstance
();
DocumentBuilder
dBuilder
=
dbFactory
.
newDocumentBuilder
();
// InputStream xmlstr = IOUtils.toInputStream(inputStream);
Document
doc
=
dBuilder
.
parse
(
inputStream
);
// Document doc = parser.getDocument();
Element
root
=
doc
.
getDocumentElement
();
root
.
normalize
();
// NodeList rootChildren = root.getChildNodes();
// for (int i = 0; i < rootChildren.getLength(); ++i)
// {
// logger.info("Rootchild {}", rootChildren.item(i).getNodeName());
// }
Node
payments
=
root
.
getElementsByTagName
(
"banks"
).
item
(
0
);
NodeList
paymentElements
=
payments
.
getChildNodes
();
List
<
CheckoutBank
>
retbanks
=
new
ArrayList
<
CheckoutBank
>();
for
(
int
i
=
0
;
i
<
paymentElements
.
getLength
();
++
i
)
{
for
(
int
i
=
0
;
i
<
paymentElements
.
getLength
();
++
i
)
{
Node
bank
=
paymentElements
.
item
(
i
);
if
(
bank
.
getNodeType
()
==
1
)
{
if
(
bank
.
getNodeType
()
==
1
)
{
CheckoutBank
newBank
=
new
CheckoutBank
(
bank
);
if
(!
DISCARD_BANKS
.
contains
(
newBank
.
getKey
()))
{
if
(!
DISCARD_BANKS
.
contains
(
newBank
.
getKey
()))
{
retbanks
.
add
(
newBank
);
}
}
}
return
retbanks
;
}
catch
(
SAXException
|
IOException
|
ParserConfigurationException
e
)
{
logger
.
warn
(
"Error parsing response from checkout response:"
+
inputStream
,
e
);
}
finally
{
try
{
inputStream
.
close
();
}
catch
(
IOException
e
)
{
logger
.
warn
(
"Error closing the input stream"
,
e
);
}
}
return
null
;
}
@Override
public
boolean
validateReturn
(
CheckoutReturnType
returnType
,
String
version
,
String
stamp
,
String
reference
,
String
payment
,
String
status
,
String
algorithm
,
String
mac
)
{
if
(
returnType
==
null
||
mac
==
null
||
mac
.
isEmpty
()
||
stamp
==
null
||
stamp
.
isEmpty
())
{
if
(
returnType
==
null
||
mac
==
null
||
mac
.
isEmpty
()
||
stamp
==
null
||
stamp
.
isEmpty
())
{
return
false
;
}
String
merchantPass
=
eventbean
.
getPrivatePropertyString
(
LanEventPrivatePropertyKey
.
CHECKOUT_FI_MERCHANT_PASSWORD
);
...
...
@@ -363,13 +383,12 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
case
8
:
case
9
:
case
10
:
ret
=
true
;
if
(
bill
.
getAccountEvent
()
==
null
&&
bill
.
getPaidDate
()
==
null
)
{
&&
bill
.
getPaidDate
()
==
null
)
{
logger
.
info
(
"Trying to mark bill {} paid"
,
bill
);
billpbean
.
markPaid
(
bill
,
Calendar
.
getInstance
(),
false
);
logbean
.
sendMessage
(
MoyaEventType
.
BANKING_MESSAGE
,
permbean
.
getCurrentUser
(),
"Marking bill paid from checkout. Received bill status "
,
statusInt
,
" for bill "
,
bill
,
" stamp "
,
stamp
,
" payment: "
,
payment
,
" reference "
,
reference
);
ret
=
true
;
}
else
{
logbean
.
sendMessage
(
MoyaEventType
.
BANKING_MESSAGE
,
permbean
.
getCurrentUser
(),
"Bill already marked paid: "
,
bill
,
" status "
,
status
,
" stamp "
,
stamp
,
" payment "
,
payment
);
}
...
...
@@ -396,4 +415,67 @@ public class CheckoutFiBean implements CheckoutFiBeanLocal {
return
ret
;
}
static
class
QueryBuilder
<
T
extends
Enum
<
T
>>
{
private
final
Map
<
CheckoutQuery
,
String
>
values
=
new
HashMap
<>();;
private
final
Date
expireDate
;
private
final
String
merchantId
;
private
final
String
merchantPassword
;
private
final
CheckoutQuery
[]
types
;
QueryBuilder
(
Class
<
T
>
clz
,
CheckoutQuery
[]
types
,
Date
expire
,
String
merchantId
,
String
merchantPassword
)
{
this
.
expireDate
=
expire
;
this
.
merchantId
=
merchantId
;
this
.
merchantPassword
=
merchantPassword
;
this
.
types
=
types
;
}
public
boolean
isCredentialsValid
()
{
return
expireDate
!=
null
&&
new
Date
().
before
(
expireDate
)
&&
getMerchantId
()
!=
null
&&
!
getMerchantId
().
isEmpty
()
&&
merchantPassword
!=
null
&&
!
merchantPassword
.
isEmpty
();
}
public
void
addParam
(
CheckoutQuery
key
,
String
value
)
{
values
.
put
(
key
,
value
);
}
public
List
<
NameValuePair
>
getNameValuePairs
()
{
List
<
NameValuePair
>
nameValuePairs
=
new
ArrayList
<
NameValuePair
>();
StringBuilder
mdString
=
new
StringBuilder
();
for
(
CheckoutQuery
v
:
types
)
{
String
value
=
null
;
if
(
values
.
containsKey
(
v
))
{
value
=
values
.
get
(
v
);
}
else
{
value
=
v
.
getDefaultValue
();
}
logger
.
info
(
"Add key {},value {}"
,
v
.
name
(),
value
);
if
(
value
!=
null
)
{
mdString
.
append
(
value
);
nameValuePairs
.
add
(
new
BasicNameValuePair
(
v
.
name
(),
value
));
}
mdString
.
append
(
"+"
);
}
mdString
.
append
(
merchantPassword
);
final
String
calculatedHash
=
PasswordFunctions
.
calculateMd5
(
mdString
.
toString
());
logger
.
info
(
"Calculated checksum {} from {}"
,
mdString
.
toString
(),
calculatedHash
);
nameValuePairs
.
add
(
new
BasicNameValuePair
(
"MAC"
,
calculatedHash
));
return
nameValuePairs
;
}
public
String
getMerchantId
()
{
return
merchantId
;
}
}
}
code/moya-beans/ejbModule/fi/codecrew/moya/checkoutfi/CheckoutFiCheckParam.java
0 → 100644
View file @
2ca4642
package
fi
.
codecrew
.
moya
.
checkoutfi
;
public
enum
CheckoutFiCheckParam
implements
CheckoutQuery
{
// DO NOT CHANGE THE ORDER OF THESE!
// The md5 checksum is calculated from
// these values...
VERSION
(
"0001"
),
STAMP
(
null
),
REFERENCE
(
null
),
MERCHANT
(
null
),
AMOUNT
(
null
),
CURRENCY
(
"EUR"
),
FORMAT
(
"1"
),
ALGORITHM
(
"1"
),
// MAC gets added automatically in querybuilder
;
private
final
String
defaultValue
;
private
CheckoutFiCheckParam
(
String
def
)
{
defaultValue
=
def
;
}
public
String
getDefaultValue
()
{
return
defaultValue
;
}
}
code/moya-beans/ejbModule/fi/codecrew/moya/checkoutfi/CheckoutFiParam.java
View file @
2ca4642
...
...
@@ -18,7 +18,7 @@
*/
package
fi
.
codecrew
.
moya
.
checkoutfi
;
public
enum
CheckoutFiParam
{
public
enum
CheckoutFiParam
implements
CheckoutQuery
{
// DO NOT CHANGE THE ORDER OF THESE!
// The md5 checksum is calculated from
...
...
@@ -45,7 +45,10 @@ public enum CheckoutFiParam {
FAMILYNAME
(
null
),
ADDRESS
(
null
),
POSTCODE
(
null
),
POSTOFFICE
(
null
),
;
POSTOFFICE
(
null
),
// MAC gets added automatically in querybuilder
;
private
final
String
defaultValue
;
...
...
code/moya-beans/ejbModule/fi/codecrew/moya/checkoutfi/CheckoutQuery.java
0 → 100644
View file @
2ca4642
package
fi
.
codecrew
.
moya
.
checkoutfi
;
public
interface
CheckoutQuery
{
public
String
name
();
public
String
getDefaultValue
();
}
code/moya-beans/src/test/java/fi/codecrew/moya/beans/CheckoutFiBeanTests.java
0 → 100644
View file @
2ca4642
package
fi
.
codecrew
.
moya
.
beans
;
import
static
org
.
testng
.
AssertJUnit
.*;
import
java.io.BufferedReader
;
import
java.io.ByteArrayInputStream
;
import
java.io.FileReader
;
import
java.io.InputStream
;
import
java.io.UnsupportedEncodingException
;
import
java.math.BigDecimal
;
import
java.math.RoundingMode
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map.Entry
;
import
org.apache.http.NameValuePair
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.testng.annotations.Test
;
import
fi.codecrew.moya.beans.CheckoutFiBean.QueryBuilder
;
import
fi.codecrew.moya.checkoutfi.CheckoutFiParam
;
import
fi.codecrew.moya.clientutils.BortalLocalContextHolder
;
import
fi.codecrew.moya.model.Bill
;
import
fi.codecrew.moya.model.BillLine
;
import
fi.codecrew.moya.model.LanEvent
;
import
fi.codecrew.moya.model.Product
;
import
fi.codecrew.moya.util.CheckoutBank
;
@Test
public
class
CheckoutFiBeanTests
extends
CheckoutFiBean
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
CheckoutFiBeanTests
.
class
);
@Test
public
void
testQuery
()
{
QueryBuilder
<
CheckoutFiParam
>
queryBuilder
=
new
QueryBuilder
<
CheckoutFiParam
>(
CheckoutFiParam
.
class
,
CheckoutFiParam
.
values
(),
new
Date
(
System
.
currentTimeMillis
()
+
60000
),
"375917"
,
"SAIPPUAKAUPPIAS"
);
assertTrue
(
"Credentials are valid!"
,
queryBuilder
.
isCredentialsValid
());
final
String
returnUrl
=
new
StringBuilder
()
.
append
(
"https://"
)
.
append
(
"localhost"
)
.
append
(
"/MoyaWeb/checkout/"
)
.
toString
();
LanEvent
lanevent
=
new
LanEvent
();
lanevent
.
setReferenceNumberBase
(
100000
);
Date
d
=
new
Date
(
1427495053008
l
);
Bill
bill
=
new
Bill
();
bill
.
setEvent
(
lanevent
);
bill
.
setId
(
67890
);
bill
.
setBillNumber
(
12345
);
bill
.
setAddr1
(
"Teemu Teekkari"
);
bill
.
setAddr2
(
"Hervannantie 1"
);
bill
.
setAddr3
(
"33600 Tampere"
);
bill
.
setAddr4
(
"FINLAND"
);
bill
.
setSentDateTime
(
d
);
Product
prod
=
new
Product
();
prod
.
setName
(
"Hurr"
);
prod
.
setPrice
(
new
BigDecimal
(
111.11
).
setScale
(
4
,
RoundingMode
.
HALF_UP
));
bill
.
getBillLines
().
add
(
new
BillLine
(
bill
,
prod
,
new
BigDecimal
(
5
)));
logger
.
info
(
"Total price{}"
+
bill
.
getTotalPrice
());
final
String
priceInCents
=
Integer
.
valueOf
(
bill
.
totalPrice
().
multiply
(
TO_CENTS
).
intValue
()).
toString
();
final
Map
<
String
,
String
>
requiredParams
=
new
HashMap
<>();
requiredParams
.
put
(
"VERSION"
,
"0001"
);
requiredParams
.
put
(
"COUNTRY"
,
"FIN"
);
requiredParams
.
put
(
"CURRENCY"
,
"EUR"
);
requiredParams
.
put
(
"DEVICE"
,
"10"
);
requiredParams
.
put
(
"CONTENT"
,
"1"
);
requiredParams
.
put
(
"TYPE"
,
"0"
);
requiredParams
.
put
(
"ALGORITHM"
,
"2"
);
requiredParams
.
put
(
"LANGUAGE"
,
"FI"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
STAMP
,
getStamp
(
bill
));
requiredParams
.
put
(
"STAMP"
,
"67890a1427495053"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
AMOUNT
,
priceInCents
);
requiredParams
.
put
(
"AMOUNT"
,
"55555"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
REFERENCE
,
bill
.
getReferenceNumber
().
toString
());
// 112345 + checksum(2)
requiredParams
.
put
(
"REFERENCE"
,
"1123452"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
MERCHANT
,
queryBuilder
.
getMerchantId
());
requiredParams
.
put
(
"MERCHANT"
,
"375917"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
RETURN
,
returnUrl
+
"return.jsf"
);
requiredParams
.
put
(
"RETURN"
,
"https://localhost/MoyaWeb/checkout/return.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
CANCEL
,
returnUrl
+
"cancel.jsf"
);
requiredParams
.
put
(
"CANCEL"
,
"https://localhost/MoyaWeb/checkout/cancel.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
REJECT
,
returnUrl
+
"reject.jsf"
);
requiredParams
.
put
(
"REJECT"
,
"https://localhost/MoyaWeb/checkout/reject.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
DELAYED
,
returnUrl
+
"delayed.jsf"
);
requiredParams
.
put
(
"DELAYED"
,
"https://localhost/MoyaWeb/checkout/delayed.jsf"
);
queryBuilder
.
addParam
(
CheckoutFiParam
.
DELIVERY_DATE
,
new
SimpleDateFormat
(
DATEFORMAT
).
format
(
d
));
requiredParams
.
put
(
"DELIVERY_DATE"
,
"20150328"
);
requiredParams
.
put
(
"MAC"
,
"7FBDC5A633794B7292E6B02020330E64"
);
List
<
NameValuePair
>
nvpairs
=
queryBuilder
.
getNameValuePairs
();
for
(
NameValuePair
p
:
nvpairs
)
{
assertTrue
(
"Missing required param: "
+
p
.
getName
()
+
" val "
+
p
.
getValue
(),
requiredParams
.
containsKey
(
p
.
getName
()));
String
val
=
requiredParams
.
remove
(
p
.
getName
());
assertEquals
(
"Wrong value for "
+
p
.
getName
(),
val
,
p
.
getValue
());
}
for
(
Entry
<
String
,
String
>
p
:
requiredParams
.
entrySet
())
{
logger
.
warn
(
"Not found param {} with value {}"
,
p
.
getKey
(),
p
.
getValue
());
}
}
@Test
public
void
testXml
()
{
InputStream
testfile1
=
getClass
().
getResourceAsStream
(
"checkoutTestfile.xml"
);
List
<
CheckoutBank
>
ret
=
CheckoutFiBean
.
parseTokenXml
(
testfile1
);
// Huom! Neopay, ape ja tilisiirto poistettu parsinnassa.
assertEquals
(
8
,
ret
.
size
());
for
(
int
i
=
0
;
i
<
ret
.
size
();
++
i
)
{
CheckoutBank
bnk
=
ret
.
get
(
i
);
switch
(
i
)
{
case
0
:
assertEquals
(
"nordea"
,
bnk
.
getKey
());
assertEquals
(
17
,
bnk
.
getPostParams
().
size
());
break
;
case
1
:
assertEquals
(
"osuuspankki"
,
bnk
.
getKey
());
assertEquals
(
13
,
bnk
.
getPostParams
().
size
());
break
;
case
2
:
assertEquals
(
"samlink"
,
bnk
.
getKey
());
assertEquals
(
13
,
bnk
.
getPostParams
().
size
());
break
;
case
3
:
assertEquals
(
"sampo"
,
bnk
.
getKey
());
assertEquals
(
9
,
bnk
.
getPostParams
().
size
());
break
;
case
4
:
assertEquals
(
"handelsbanken"
,
bnk
.
getKey
());
assertEquals
(
13
,
bnk
.
getPostParams
().
size
());
break
;
case
5
:
assertEquals
(
"spankki"
,
bnk
.
getKey
());
assertEquals
(
17
,
bnk
.
getPostParams
().
size
());
break
;
case
6
:
assertEquals
(
"alandsbanken"
,
bnk
.
getKey
());
assertEquals
(
18
,
bnk
.
getPostParams
().
size
());
break
;
case
7
:
assertEquals
(
"tapiola"
,
bnk
.
getKey
());
assertEquals
(
18
,
bnk
.
getPostParams
().
size
());
break
;
case
8
:
assertEquals
(
"neopay"
,
bnk
.
getKey
());
assertEquals
(
9
,
bnk
.
getPostParams
().
size
());
break
;
case
9
:
assertEquals
(
"tilisiirto"
,
bnk
.
getKey
());
assertEquals
(
6
,
bnk
.
getPostParams
().
size
());
break
;
case
10
:
assertEquals
(
"ape"
,
bnk
.
getKey
());
assertEquals
(
4
,
bnk
.
getPostParams
().
size
());
break
;
default
:
fail
(
"Wrong number of banks: "
+
i
);
break
;
}
}
}
private
static
final
String
pollReturnXML
=
"<?xml version=\"1.0\"?> <trade> <status> 2 </status></trade> "
;
private
static
final
String
LATIN1
=
"ISO-8859-1"
;
@Test
public
void
testPollXml
()
throws
UnsupportedEncodingException
{
String
ret
=
CheckoutFiBean
.
parsePollXml
(
new
ByteArrayInputStream
(
pollReturnXML
.
getBytes
(
LATIN1
)));
assertEquals
(
"2"
,
ret
);
}
}
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment