|
| 1 | +package ca.bc.gov.open.bambora.payment.starter.managment; |
| 2 | + |
| 3 | +import ca.bc.gov.open.bambora.payment.starter.BamboraConstants; |
| 4 | +import ca.bc.gov.open.bambora.payment.starter.BamboraException; |
| 5 | +import ca.bc.gov.open.bambora.payment.starter.BamboraProperties; |
| 6 | +import ca.bc.gov.open.bambora.payment.starter.managment.models.RecurringPaymentDetails; |
| 7 | +import com.sun.jndi.toolkit.url.Uri; |
| 8 | +import org.apache.commons.codec.digest.DigestUtils; |
| 9 | + |
| 10 | +import java.net.MalformedURLException; |
| 11 | +import java.text.MessageFormat; |
| 12 | +import java.text.SimpleDateFormat; |
| 13 | +import java.util.Calendar; |
| 14 | +import java.util.Date; |
| 15 | + |
| 16 | +public class BamboraCardServiceImpl implements BamboraCardService { |
| 17 | + |
| 18 | + private final BamboraProperties bamboraProperties; |
| 19 | + |
| 20 | + public BamboraCardServiceImpl(BamboraProperties bamboraProperties) { |
| 21 | + this.bamboraProperties = bamboraProperties; |
| 22 | + } |
| 23 | + |
| 24 | + @Override |
| 25 | + public Uri setupRecurringPayment(RecurringPaymentDetails recurringPaymentDetails) { |
| 26 | + try { |
| 27 | + return buildRecurringPaymentUrl(recurringPaymentDetails); |
| 28 | + } catch (MalformedURLException e) { |
| 29 | + throw new BamboraException("Url construction failed", e.getCause()); |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + |
| 34 | + private Uri buildRecurringPaymentUrl(RecurringPaymentDetails recurringPaymentDetails) throws MalformedURLException { |
| 35 | + |
| 36 | + String operationType = (recurringPaymentDetails.getEndUserId() != null ? BamboraConstants.OperationTypes.M.toString() : BamboraConstants.OperationTypes.N.toString()); |
| 37 | + |
| 38 | + StringBuilder paramString = new StringBuilder(); |
| 39 | + |
| 40 | + paramString.append(formatBamboraParam("", BamboraConstants.PARAM_PPRDIR_SERVICE_VERSION, bamboraProperties.getHostedProfileServiceVersion())); |
| 41 | + |
| 42 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_MERCHANT_ID, bamboraProperties.getMerchantId())); |
| 43 | + |
| 44 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_LANGUAGE, BamboraConstants.LANGUAGE_TYPE)); |
| 45 | + |
| 46 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_OPERATION_TYPE, operationType)); |
| 47 | + |
| 48 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_REF1, recurringPaymentDetails.getEchoData())); |
| 49 | + |
| 50 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_RETURN_URL, recurringPaymentDetails.getRedirectURL())); |
| 51 | + |
| 52 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_ORDER_NUMBER, recurringPaymentDetails.getRedirectURL())); |
| 53 | + |
| 54 | + if (operationType.equals(BamboraConstants.OperationTypes.M.toString())) |
| 55 | + paramString.append(formatBamboraParam("&", BamboraConstants.PARAM_PPRDIR_CUSTOMER_CODE, recurringPaymentDetails.getEndUserId())); |
| 56 | + |
| 57 | + paramString.append(MessageFormat.format("&{0}={1}&{2}={3}", BamboraConstants.PARAM_TRANS_HASH_VALUE, getHash(paramString.toString()), BamboraConstants.PARAM_TRANS_HASH_EXPIRY, getExpiry())); |
| 58 | + |
| 59 | + return new Uri(MessageFormat.format("{0}?{1}", bamboraProperties.getHostedProfileUrl(), paramString.toString())); |
| 60 | + |
| 61 | + } |
| 62 | + |
| 63 | + private String getExpiry() { |
| 64 | + SimpleDateFormat sdfDate = new SimpleDateFormat(BamboraConstants.PARAM_TRANS_HASH_EXPIRY_FORMAT); |
| 65 | + Calendar cal = Calendar.getInstance(); |
| 66 | + cal.setTime(new Date()); |
| 67 | + cal.add(Calendar.MINUTE, bamboraProperties.getMinutesToExpiry()); |
| 68 | + return sdfDate.format(cal.getTime()); |
| 69 | + } |
| 70 | + |
| 71 | + private String formatBamboraParam(String prefix, String key, String value) { |
| 72 | + return MessageFormat.format("{0}{1}={2}", prefix, key, value).replace(" ", "%20"); |
| 73 | + } |
| 74 | + |
| 75 | + private String getHash(String message) { |
| 76 | + String digest = DigestUtils.md5Hex(MessageFormat.format("{0}{1}", message, bamboraProperties.getHashKey())); |
| 77 | + return digest.toUpperCase(); |
| 78 | + } |
| 79 | +} |
0 commit comments