【问题标题】:Signature mismatch in Payfort payment integrationPayfort 支付集成中的签名不匹配
【发布时间】:2017-05-11 17:36:54
【问题描述】:

我正在我的 Android 应用程序中集成 Payfort 支付网关。我正在使用 FORT SDKv1.2。 在创建令牌的帖子网址中,我总是收到错误“签名不匹配”。

谁能告诉我要使用哪个签名?

网址 - https://sbpaymentservices.payfort.com/FortAPI/paymentApi

【问题讨论】:

  • 签名必须根据请求参数和规范生成
  • 我就是这样做的..但总是得到相同的结果
  • 另外,api 给出签名值作为响应。我也使用该签名值但再次得到 smae 结果。
  • 在请求和支付响应中显示您的参数是什么
  • 响应中的签名不是为了发回请求。这只是为了验证响应是否来自正确的来源。您可以从响应字段生成签名并使用返回的签名进行验证。

标签: android payfort


【解决方案1】:

让我一步一步指导你:

注意:以下是Merchant Page 2.0请求签名生成的示例:

第 1 步:在文件顶部添加这些变量

private final static String KEY_MERCHANT_IDENTIFIER = "merchant_identifier";
private final static String KEY_SERVICE_COMMAND = "service_command";
private final static String KEY_LANGUAGE = "language";
private final static String KEY_ACCESS_CODE = "access_code";
private final static String KEY_MERCHANT_REFERENCE = "merchant_reference";

private final static String MERCHANT_IDENTIFIER = "YOUR_MERCHANT_IDENTIFIER";
private final static String ACCESS_CODE = "YOUR_ACCESS_CODE";
private final static String SHA_TYPE = "SHA-256";
private final static String SHA_REQUEST_PHRASE = "YOUR_SHA_REQUEST_PHRASE ";
private final static String LANGUAGE_TYPE = "en"; 

确保您使用的是 Payfort 提供的 MERCHANT_IDENTIFIERACCESS_CODESHA_REQUEST_PHRASE

第 2 步:创建字符串

String concatenatedString = SHA_REQUEST_PHRASE +
                KEY_ACCESS_CODE + "=" + ACCESS_CODE +
                KEY_LANGUAGE + "=" + LANGUAGE_TYPE +
                KEY_MERCHANT_IDENTIFIER + "=" + MERCHANT_IDENTIFIER +
                KEY_MERCHANT_REFERENCE + "=" + YOUR_MERCHANT_REFERENCE +
                KEY_SERVICE_COMMAND + "=" + "TOKENIZATION" +
                SHA_REQUEST_PHRASE;

YOUR_MERCHANT_REFERENCE 是您唯一的商家参考。每个请求都应该是唯一的

第 3 步: 创建一个函数以从您的 第 2 步中的 concatenatedString

private String createSignature(String s) {
    try {
        // Create MD5 Hash
        MessageDigest digest = MessageDigest.getInstance(SHA_TYPE);
        digest.update(s.getBytes());
        byte messageDigest[] = digest.digest();

        return String.format("%0" + (messageDigest.length * 2) + 'x', new BigInteger(1, messageDigest));
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

终于 通过在步骤 2 中传递您的 concatenatedString 来调用 createSignature 函数。

String signature = createSignature(concatenatedString);

【讨论】:

  • 在 Apple Pay 的情况下我是否只需要包含五个参数来生成签名? docs.payfort.com/docs/apple-pay/build/…
  • 他说的是商家页面2请求参数
  • @AbhishekShukla 对于请求参数,请根据您的需要更改它,这将在 PayFort 文档中提及
  • @RamiSalim 是对的,我给了你商家页面 2 的示例
【解决方案2】:

将 'merchant_reference' 值更改为您以前没有使用过的值。它应该是独一无二的。我遇到了同样的问题,使用它解决了。

按字母顺序对数组中的密钥进行排序,在密码短语之前和之后添加,然后使用您的算法加密字符串。

在它之后,你可以在你的请求中使用它。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,发现我在生成签名时使用的算法存在问题。所以请在生成签名时检查参数序列。并检查您在帐户中设置的算法并在生成签名时使用相同的算法

    【讨论】:

      【解决方案4】:

      还要确保商家参考是字母数字,如果您想添加特殊字符,您只能添加 . _ -

      【讨论】:

        【解决方案5】:

        Here你可以找到如何生成签名

        由于将错误的 SHA 请求短语 连接到签名的开头和结尾,我遇到了这个 signature mismatch 错误。

        【讨论】:

          【解决方案6】:

          我也遇到过同样的问题,发现集成设置有问题。只需登录您的 payfort 帐户并转到支付集成设置,然后您的商家参考 ID 位置检查 SHA 类型为 SHA-256 和 SHA 响应解析,SHA 请求解析将相同的文本。此相同的文本添加到源代码参数中的访问代码和 sdk-token。请检查下图一次。

          【讨论】:

            【解决方案7】:

            使用此代码

             String concatenatedString = SHA_REQUEST_PHRASE +
                            KEY_ACCESS_CODE + "=" + ACCESS_CODE +
                            KEY_DEVICE_ID + "=" + device_id +
                            KEY_LANGUAGE + "=" + LANGUAGE_TYPE +
                            KEY_MERCHANT_IDENTIFIER + "=" + MERCHANT_IDENTIFIER +
                            KEY_SERVICE_COMMAND + "=" + SDK_TOKEN +
                            SHA_REQUEST_PHRASE;
            

            然后,在下面的方法中传递这个连接的字符串,

              private static String getSignatureSHA256(String s) {
                try {
                    // Create MD5 Hash
                    MessageDigest digest = MessageDigest.getInstance(SHA_TYPE);
                    digest.update(s.getBytes());
                    byte messageDigest[] = digest.digest();
            
                    return String.format("%0" + (messageDigest.length * 2) + 'x', new BigInteger(1, messageDigest));
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }
                return "";
            }
            

            使用以下代码获取签名,

                        String signature = getSignatureSHA256(concatenatedString);
            

            快乐编码:)

            【讨论】:

              猜你喜欢
              • 2019-10-30
              • 2020-10-08
              • 2016-11-30
              • 2019-05-24
              • 2017-06-10
              • 2020-05-19
              • 2020-12-31
              • 1970-01-01
              • 2019-05-21
              相关资源
              最近更新 更多