<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Hosted checkout flow in Integration and Testing</title>
    <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Hosted-checkout-flow/m-p/94641#M58532</link>
    <description>&lt;P&gt;I am trying to implement a hosted checkout ui. I used to generate the signature and other details from the backend and then used HTML for loading the page. But unfortunately, I am getting unauthorized and session time-out errors.&lt;BR /&gt;Can anyone help with this?&lt;BR /&gt;Here is the sample code&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;public &lt;/SPAN&gt;ResponseEntity&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; &lt;SPAN&gt;initiateHostedCheckout&lt;/SPAN&gt;(&lt;SPAN&gt;@RequestParam &lt;/SPAN&gt;Long userId,&lt;BR /&gt;                                                                 &lt;SPAN&gt;@RequestParam&lt;/SPAN&gt;(required=&lt;SPAN&gt;false&lt;/SPAN&gt;) String amount) &lt;SPAN&gt;throws &lt;/SPAN&gt;Exception {&lt;BR /&gt;    String reference = &lt;SPAN&gt;"ref-" &lt;/SPAN&gt;+ java.util.UUID.&lt;SPAN&gt;randomUUID&lt;/SPAN&gt;();&lt;BR /&gt;&lt;BR /&gt;    LinkedHashMap&amp;lt;String,String&amp;gt; base = SecureAcceptanceSigner.&lt;SPAN&gt;buildBaseFields&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getAccessKey(),&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getProfileId(),&lt;BR /&gt;            &lt;SPAN&gt;"authorization,create_payment_token"&lt;/SPAN&gt;, &lt;SPAN&gt;// transaction type to create payment token&lt;BR /&gt;&lt;/SPAN&gt;            reference,&lt;BR /&gt;            amount == &lt;SPAN&gt;null &lt;/SPAN&gt;? &lt;SPAN&gt;"0.00" &lt;/SPAN&gt;: amount,&lt;BR /&gt;            &lt;SPAN&gt;"LKR"&lt;/SPAN&gt;,&lt;BR /&gt;            String.&lt;SPAN&gt;valueOf&lt;/SPAN&gt;(userId),&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getReturnUrl(),&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getSilentPostUrl()&lt;BR /&gt;    );&lt;BR /&gt;&lt;BR /&gt;    String dataToSign = SecureAcceptanceSigner.&lt;SPAN&gt;buildDataToSign&lt;/SPAN&gt;(base);&lt;BR /&gt;    String signature = SecureAcceptanceSigner.&lt;SPAN&gt;computeHmacBase64&lt;/SPAN&gt;(&lt;SPAN&gt;props&lt;/SPAN&gt;.getSecretKey(), dataToSign);&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;// Build response map containing redirect URL and params&lt;BR /&gt;&lt;/SPAN&gt;    Map&amp;lt;String,String&amp;gt; params = &lt;SPAN&gt;new &lt;/SPAN&gt;java.util.LinkedHashMap&amp;lt;&amp;gt;(base);&lt;BR /&gt;    params.put(&lt;SPAN&gt;"signature"&lt;/SPAN&gt;, signature);&lt;BR /&gt;&lt;BR /&gt;    Map&amp;lt;String,Object&amp;gt; resp = Map.&lt;SPAN&gt;of&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;"redirectUrl"&lt;/SPAN&gt;, &lt;SPAN&gt;props&lt;/SPAN&gt;.getHostedCheckoutUrl(),&lt;BR /&gt;            &lt;SPAN&gt;"params"&lt;/SPAN&gt;, params&lt;BR /&gt;    );&lt;BR /&gt;    &lt;SPAN&gt;return &lt;/SPAN&gt;ResponseEntity.&lt;SPAN&gt;ok&lt;/SPAN&gt;(resp);&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;public class &lt;/SPAN&gt;SecureAcceptanceSigner {&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static final &lt;/SPAN&gt;DateTimeFormatter &lt;SPAN&gt;ISO &lt;/SPAN&gt;= DateTimeFormatter.&lt;SPAN&gt;ISO_INSTANT&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;LinkedHashMap&amp;lt;String,String&amp;gt; &lt;SPAN&gt;buildBaseFields&lt;/SPAN&gt;(String accessKey, String profileId,&lt;BR /&gt;                                                               String transactionType, String referenceNumber,&lt;BR /&gt;                                                               String amount, String currency, String customerId,&lt;BR /&gt;                                                               String returnUrl, String silentPostUrl) {&lt;BR /&gt;        LinkedHashMap&amp;lt;String,String&amp;gt; m = &lt;SPAN&gt;new &lt;/SPAN&gt;LinkedHashMap&amp;lt;&amp;gt;();&lt;BR /&gt;        String txnUuid = UUID.&lt;SPAN&gt;randomUUID&lt;/SPAN&gt;().toString();&lt;BR /&gt;        String signedDateTime = OffsetDateTime.&lt;SPAN&gt;now&lt;/SPAN&gt;().format(&lt;SPAN&gt;ISO&lt;/SPAN&gt;);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"unsigned_field_names"&lt;/SPAN&gt;, &lt;SPAN&gt;""&lt;/SPAN&gt;);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"access_key"&lt;/SPAN&gt;, accessKey);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"profile_id"&lt;/SPAN&gt;, profileId);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"transaction_uuid"&lt;/SPAN&gt;, txnUuid);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"signed_date_time"&lt;/SPAN&gt;, signedDateTime);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"locale"&lt;/SPAN&gt;, &lt;SPAN&gt;"en"&lt;/SPAN&gt;);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"transaction_type"&lt;/SPAN&gt;, transactionType);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"reference_number"&lt;/SPAN&gt;, referenceNumber);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"currency"&lt;/SPAN&gt;, currency == &lt;SPAN&gt;null &lt;/SPAN&gt;? &lt;SPAN&gt;"LKR" &lt;/SPAN&gt;: currency);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"amount"&lt;/SPAN&gt;, amount == &lt;SPAN&gt;null &lt;/SPAN&gt;? &lt;SPAN&gt;"0.00" &lt;/SPAN&gt;: amount);&lt;BR /&gt;        &lt;SPAN&gt;// signed_field_names - the order here determines the signing string order&lt;BR /&gt;&lt;/SPAN&gt;        String signedFieldNames = String.&lt;SPAN&gt;join&lt;/SPAN&gt;(&lt;SPAN&gt;","&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"access_key"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"profile_id"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"transaction_uuid"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"unsigned_field_names"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"signed_date_time"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"locale"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"transaction_type"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"reference_number"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"amount"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"currency"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "customer_id",&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "payment_tokenization",&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "payment_method"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "override_custom_cancel_page",&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "silent_post_url"&lt;BR /&gt;&lt;/SPAN&gt;        );&lt;BR /&gt;        m.put(&lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;, signedFieldNames);&lt;BR /&gt;&lt;SPAN&gt;//        m.put("payment_method", "card");&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("customer_id", customerId == null ? "" : customerId);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("payment_tokenization", "true");&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("override_custom_receipt_page", returnUrl == null ? "" : returnUrl);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("override_custom_cancel_page", returnUrl == null ? "" : returnUrl);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("silent_post_url", silentPostUrl == null ? "" : silentPostUrl);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;m;&lt;BR /&gt;    }&lt;BR /&gt;    &lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;String &lt;SPAN&gt;buildDataToSign&lt;/SPAN&gt;(LinkedHashMap&amp;lt;String,String&amp;gt; orderedMap) {&lt;BR /&gt;        String signedFieldsCsv = orderedMap.get(&lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;);&lt;BR /&gt;        List&amp;lt;String&amp;gt; signedFieldNames = Arrays.&lt;SPAN&gt;stream&lt;/SPAN&gt;(signedFieldsCsv.split(&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;))&lt;BR /&gt;                .map(String::trim).toList();&lt;BR /&gt;&lt;BR /&gt;        List&amp;lt;String&amp;gt; parts = &lt;SPAN&gt;new &lt;/SPAN&gt;ArrayList&amp;lt;&amp;gt;();&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(String field : signedFieldNames) {&lt;BR /&gt;            String value;&lt;BR /&gt;            &lt;SPAN&gt;if &lt;/SPAN&gt;(&lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;.equals(field)) {&lt;BR /&gt;                value = signedFieldsCsv;&lt;BR /&gt;            } &lt;SPAN&gt;else &lt;/SPAN&gt;{&lt;BR /&gt;                value = orderedMap.getOrDefault(field, &lt;SPAN&gt;""&lt;/SPAN&gt;);&lt;BR /&gt;            }&lt;BR /&gt;            parts.add(field + &lt;SPAN&gt;"=" &lt;/SPAN&gt;+ value);&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;String.&lt;SPAN&gt;join&lt;/SPAN&gt;(&lt;SPAN&gt;","&lt;/SPAN&gt;, parts);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;String &lt;SPAN&gt;computeHmacBase64&lt;/SPAN&gt;(String secretKey, String data) &lt;SPAN&gt;throws &lt;/SPAN&gt;Exception {&lt;BR /&gt;        Mac mac = Mac.&lt;SPAN&gt;getInstance&lt;/SPAN&gt;(&lt;SPAN&gt;"HmacSHA256"&lt;/SPAN&gt;);&lt;BR /&gt;        SecretKeySpec keySpec = &lt;SPAN&gt;new &lt;/SPAN&gt;SecretKeySpec(secretKey.getBytes(StandardCharsets.&lt;SPAN&gt;UTF_8&lt;/SPAN&gt;), &lt;SPAN&gt;"HmacSHA256"&lt;/SPAN&gt;);&lt;BR /&gt;        mac.init(keySpec);&lt;BR /&gt;        &lt;SPAN&gt;byte&lt;/SPAN&gt;[] raw = mac.doFinal(data.getBytes(StandardCharsets.&lt;SPAN&gt;UTF_8&lt;/SPAN&gt;));&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;Base64.&lt;SPAN&gt;getEncoder&lt;/SPAN&gt;().encodeToString(raw);&lt;BR /&gt;    }&lt;BR /&gt;}&lt;/PRE&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-01 160535.png" style="width: 400px;"&gt;&lt;img src="https://community.developer.cybersource.com/t5/image/serverpage/image-id/2688iDAAC0A7300F36ACA/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Screenshot 2025-12-01 160535.png" alt="Screenshot 2025-12-01 160535.png" /&gt;&lt;/span&gt;&lt;P&gt; &lt;/P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-01 124227.png" style="width: 400px;"&gt;&lt;img src="https://community.developer.cybersource.com/t5/image/serverpage/image-id/2689i006F9936508A6045/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Screenshot 2025-12-01 124227.png" alt="Screenshot 2025-12-01 124227.png" /&gt;&lt;/span&gt;&lt;P&gt; &lt;/P&gt;&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
    <pubDate>Mon, 01 Dec 2025 10:38:24 GMT</pubDate>
    <dc:creator>chamaran</dc:creator>
    <dc:date>2025-12-01T10:38:24Z</dc:date>
    <item>
      <title>Hosted checkout flow</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Hosted-checkout-flow/m-p/94641#M58532</link>
      <description>&lt;P&gt;I am trying to implement a hosted checkout ui. I used to generate the signature and other details from the backend and then used HTML for loading the page. But unfortunately, I am getting unauthorized and session time-out errors.&lt;BR /&gt;Can anyone help with this?&lt;BR /&gt;Here is the sample code&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;public &lt;/SPAN&gt;ResponseEntity&amp;lt;Map&amp;lt;String,Object&amp;gt;&amp;gt; &lt;SPAN&gt;initiateHostedCheckout&lt;/SPAN&gt;(&lt;SPAN&gt;@RequestParam &lt;/SPAN&gt;Long userId,&lt;BR /&gt;                                                                 &lt;SPAN&gt;@RequestParam&lt;/SPAN&gt;(required=&lt;SPAN&gt;false&lt;/SPAN&gt;) String amount) &lt;SPAN&gt;throws &lt;/SPAN&gt;Exception {&lt;BR /&gt;    String reference = &lt;SPAN&gt;"ref-" &lt;/SPAN&gt;+ java.util.UUID.&lt;SPAN&gt;randomUUID&lt;/SPAN&gt;();&lt;BR /&gt;&lt;BR /&gt;    LinkedHashMap&amp;lt;String,String&amp;gt; base = SecureAcceptanceSigner.&lt;SPAN&gt;buildBaseFields&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getAccessKey(),&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getProfileId(),&lt;BR /&gt;            &lt;SPAN&gt;"authorization,create_payment_token"&lt;/SPAN&gt;, &lt;SPAN&gt;// transaction type to create payment token&lt;BR /&gt;&lt;/SPAN&gt;            reference,&lt;BR /&gt;            amount == &lt;SPAN&gt;null &lt;/SPAN&gt;? &lt;SPAN&gt;"0.00" &lt;/SPAN&gt;: amount,&lt;BR /&gt;            &lt;SPAN&gt;"LKR"&lt;/SPAN&gt;,&lt;BR /&gt;            String.&lt;SPAN&gt;valueOf&lt;/SPAN&gt;(userId),&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getReturnUrl(),&lt;BR /&gt;            &lt;SPAN&gt;props&lt;/SPAN&gt;.getSilentPostUrl()&lt;BR /&gt;    );&lt;BR /&gt;&lt;BR /&gt;    String dataToSign = SecureAcceptanceSigner.&lt;SPAN&gt;buildDataToSign&lt;/SPAN&gt;(base);&lt;BR /&gt;    String signature = SecureAcceptanceSigner.&lt;SPAN&gt;computeHmacBase64&lt;/SPAN&gt;(&lt;SPAN&gt;props&lt;/SPAN&gt;.getSecretKey(), dataToSign);&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;// Build response map containing redirect URL and params&lt;BR /&gt;&lt;/SPAN&gt;    Map&amp;lt;String,String&amp;gt; params = &lt;SPAN&gt;new &lt;/SPAN&gt;java.util.LinkedHashMap&amp;lt;&amp;gt;(base);&lt;BR /&gt;    params.put(&lt;SPAN&gt;"signature"&lt;/SPAN&gt;, signature);&lt;BR /&gt;&lt;BR /&gt;    Map&amp;lt;String,Object&amp;gt; resp = Map.&lt;SPAN&gt;of&lt;/SPAN&gt;(&lt;BR /&gt;            &lt;SPAN&gt;"redirectUrl"&lt;/SPAN&gt;, &lt;SPAN&gt;props&lt;/SPAN&gt;.getHostedCheckoutUrl(),&lt;BR /&gt;            &lt;SPAN&gt;"params"&lt;/SPAN&gt;, params&lt;BR /&gt;    );&lt;BR /&gt;    &lt;SPAN&gt;return &lt;/SPAN&gt;ResponseEntity.&lt;SPAN&gt;ok&lt;/SPAN&gt;(resp);&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;public class &lt;/SPAN&gt;SecureAcceptanceSigner {&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static final &lt;/SPAN&gt;DateTimeFormatter &lt;SPAN&gt;ISO &lt;/SPAN&gt;= DateTimeFormatter.&lt;SPAN&gt;ISO_INSTANT&lt;/SPAN&gt;;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;LinkedHashMap&amp;lt;String,String&amp;gt; &lt;SPAN&gt;buildBaseFields&lt;/SPAN&gt;(String accessKey, String profileId,&lt;BR /&gt;                                                               String transactionType, String referenceNumber,&lt;BR /&gt;                                                               String amount, String currency, String customerId,&lt;BR /&gt;                                                               String returnUrl, String silentPostUrl) {&lt;BR /&gt;        LinkedHashMap&amp;lt;String,String&amp;gt; m = &lt;SPAN&gt;new &lt;/SPAN&gt;LinkedHashMap&amp;lt;&amp;gt;();&lt;BR /&gt;        String txnUuid = UUID.&lt;SPAN&gt;randomUUID&lt;/SPAN&gt;().toString();&lt;BR /&gt;        String signedDateTime = OffsetDateTime.&lt;SPAN&gt;now&lt;/SPAN&gt;().format(&lt;SPAN&gt;ISO&lt;/SPAN&gt;);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"unsigned_field_names"&lt;/SPAN&gt;, &lt;SPAN&gt;""&lt;/SPAN&gt;);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"access_key"&lt;/SPAN&gt;, accessKey);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"profile_id"&lt;/SPAN&gt;, profileId);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"transaction_uuid"&lt;/SPAN&gt;, txnUuid);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"signed_date_time"&lt;/SPAN&gt;, signedDateTime);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"locale"&lt;/SPAN&gt;, &lt;SPAN&gt;"en"&lt;/SPAN&gt;);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"transaction_type"&lt;/SPAN&gt;, transactionType);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"reference_number"&lt;/SPAN&gt;, referenceNumber);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"currency"&lt;/SPAN&gt;, currency == &lt;SPAN&gt;null &lt;/SPAN&gt;? &lt;SPAN&gt;"LKR" &lt;/SPAN&gt;: currency);&lt;BR /&gt;        m.put(&lt;SPAN&gt;"amount"&lt;/SPAN&gt;, amount == &lt;SPAN&gt;null &lt;/SPAN&gt;? &lt;SPAN&gt;"0.00" &lt;/SPAN&gt;: amount);&lt;BR /&gt;        &lt;SPAN&gt;// signed_field_names - the order here determines the signing string order&lt;BR /&gt;&lt;/SPAN&gt;        String signedFieldNames = String.&lt;SPAN&gt;join&lt;/SPAN&gt;(&lt;SPAN&gt;","&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"access_key"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"profile_id"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"transaction_uuid"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"unsigned_field_names"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"signed_date_time"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"locale"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"transaction_type"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"reference_number"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"amount"&lt;/SPAN&gt;,&lt;BR /&gt;                &lt;SPAN&gt;"currency"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "customer_id",&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "payment_tokenization",&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "payment_method"&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "override_custom_cancel_page",&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//                "silent_post_url"&lt;BR /&gt;&lt;/SPAN&gt;        );&lt;BR /&gt;        m.put(&lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;, signedFieldNames);&lt;BR /&gt;&lt;SPAN&gt;//        m.put("payment_method", "card");&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("customer_id", customerId == null ? "" : customerId);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("payment_tokenization", "true");&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("override_custom_receipt_page", returnUrl == null ? "" : returnUrl);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("override_custom_cancel_page", returnUrl == null ? "" : returnUrl);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;//        m.put("silent_post_url", silentPostUrl == null ? "" : silentPostUrl);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;m;&lt;BR /&gt;    }&lt;BR /&gt;    &lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;String &lt;SPAN&gt;buildDataToSign&lt;/SPAN&gt;(LinkedHashMap&amp;lt;String,String&amp;gt; orderedMap) {&lt;BR /&gt;        String signedFieldsCsv = orderedMap.get(&lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;);&lt;BR /&gt;        List&amp;lt;String&amp;gt; signedFieldNames = Arrays.&lt;SPAN&gt;stream&lt;/SPAN&gt;(signedFieldsCsv.split(&lt;SPAN&gt;"&lt;/SPAN&gt;&lt;SPAN&gt;,&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;))&lt;BR /&gt;                .map(String::trim).toList();&lt;BR /&gt;&lt;BR /&gt;        List&amp;lt;String&amp;gt; parts = &lt;SPAN&gt;new &lt;/SPAN&gt;ArrayList&amp;lt;&amp;gt;();&lt;BR /&gt;        &lt;SPAN&gt;for &lt;/SPAN&gt;(String field : signedFieldNames) {&lt;BR /&gt;            String value;&lt;BR /&gt;            &lt;SPAN&gt;if &lt;/SPAN&gt;(&lt;SPAN&gt;"signed_field_names"&lt;/SPAN&gt;.equals(field)) {&lt;BR /&gt;                value = signedFieldsCsv;&lt;BR /&gt;            } &lt;SPAN&gt;else &lt;/SPAN&gt;{&lt;BR /&gt;                value = orderedMap.getOrDefault(field, &lt;SPAN&gt;""&lt;/SPAN&gt;);&lt;BR /&gt;            }&lt;BR /&gt;            parts.add(field + &lt;SPAN&gt;"=" &lt;/SPAN&gt;+ value);&lt;BR /&gt;        }&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;String.&lt;SPAN&gt;join&lt;/SPAN&gt;(&lt;SPAN&gt;","&lt;/SPAN&gt;, parts);&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;public static &lt;/SPAN&gt;String &lt;SPAN&gt;computeHmacBase64&lt;/SPAN&gt;(String secretKey, String data) &lt;SPAN&gt;throws &lt;/SPAN&gt;Exception {&lt;BR /&gt;        Mac mac = Mac.&lt;SPAN&gt;getInstance&lt;/SPAN&gt;(&lt;SPAN&gt;"HmacSHA256"&lt;/SPAN&gt;);&lt;BR /&gt;        SecretKeySpec keySpec = &lt;SPAN&gt;new &lt;/SPAN&gt;SecretKeySpec(secretKey.getBytes(StandardCharsets.&lt;SPAN&gt;UTF_8&lt;/SPAN&gt;), &lt;SPAN&gt;"HmacSHA256"&lt;/SPAN&gt;);&lt;BR /&gt;        mac.init(keySpec);&lt;BR /&gt;        &lt;SPAN&gt;byte&lt;/SPAN&gt;[] raw = mac.doFinal(data.getBytes(StandardCharsets.&lt;SPAN&gt;UTF_8&lt;/SPAN&gt;));&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;Base64.&lt;SPAN&gt;getEncoder&lt;/SPAN&gt;().encodeToString(raw);&lt;BR /&gt;    }&lt;BR /&gt;}&lt;/PRE&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-01 160535.png" style="width: 400px;"&gt;&lt;img src="https://community.developer.cybersource.com/t5/image/serverpage/image-id/2688iDAAC0A7300F36ACA/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Screenshot 2025-12-01 160535.png" alt="Screenshot 2025-12-01 160535.png" /&gt;&lt;/span&gt;&lt;P&gt; &lt;/P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot 2025-12-01 124227.png" style="width: 400px;"&gt;&lt;img src="https://community.developer.cybersource.com/t5/image/serverpage/image-id/2689i006F9936508A6045/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Screenshot 2025-12-01 124227.png" alt="Screenshot 2025-12-01 124227.png" /&gt;&lt;/span&gt;&lt;P&gt; &lt;/P&gt;&lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 01 Dec 2025 10:38:24 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Hosted-checkout-flow/m-p/94641#M58532</guid>
      <dc:creator>chamaran</dc:creator>
      <dc:date>2025-12-01T10:38:24Z</dc:date>
    </item>
    <item>
      <title>Re: Hosted checkout flow</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Hosted-checkout-flow/m-p/94669#M58555</link>
      <description>&lt;P&gt;Unauthorized and session timeout errors usually occur when required fields are missing or mismatched in the signature. Ensure all signed and unsigned fields expected by the hosted checkout API are included, the signature is computed correctly, and the timestamp is current. Also, make sure customer_id, returnUrl, and silentPostUrl are properly set and match your account configuration.&lt;/P&gt;</description>
      <pubDate>Sat, 06 Dec 2025 10:55:27 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Hosted-checkout-flow/m-p/94669#M58555</guid>
      <dc:creator>Elio</dc:creator>
      <dc:date>2025-12-06T10:55:27Z</dc:date>
    </item>
  </channel>
</rss>

