首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >令牌验证失败Visa X-pay

令牌验证失败Visa X-pay
EN

Stack Overflow用户
提问于 2018-10-10 14:47:39
回答 2查看 1K关注 0票数 0

我需要调整一个API https://sandbox.api.visa.com/cybersource/payments/flex/v1/keys?apikey={API}我是在模仿正式文档X-支付令牌,但是它失败了,出现了“令牌验证失败”错误。

代码语言:javascript
复制
{
    "responseStatus": {
        "status": 401,
        "code": "9159",
        "severity": "ERROR",
        "message": "Token validation failed",
        "info": ""
    }
}

下面是我的x支付令牌生成代码。

代码语言:javascript
复制
import java.math.BigInteger;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SignatureException;

public class T {
    private static String resoucePath = "payments/flex/v1/keys";
    private static String queryString = "apikey=6DC0NMXO53QQFE6NFOLE213HXA-pvG6xE-1NtuCd5oOQr-O-s";
    private static String requestBody = "{encryptionType:RsaOaep256}";
    private static String sharedSecret = "gAynzAGf89+V}3{Q4Jx5cp-/R@Y#PEv#1XvxnjQC";

    public static void main(String[] args) throws SignatureException {
        System.out.println(T.generateXpaytoken(resoucePath, queryString, requestBody, sharedSecret));
    }

    public static String generateXpaytoken(String resourcePath, String queryString, String requestBody, String sharedSecret) throws SignatureException {
        String timestamp = timeStamp();
        String beforeHash = timestamp + resourcePath + queryString + requestBody;
        String hash = hmacSha256Digest(beforeHash, sharedSecret);
        String token = "xv2:" + timestamp + ":" + hash;
        return token;
    }

    private static String timeStamp() {
        return String.valueOf(System.currentTimeMillis() / 1000L);
    }

    private static String hmacSha256Digest(String data, String sharedSecret) throws SignatureException {
        return getDigest("HmacSHA256", sharedSecret, data, true);
    }

    private static String getDigest(String algorithm, String sharedSecret, String data, boolean toLower) throws SignatureException {
        try {
            Mac sha256HMAC = Mac.getInstance(algorithm);
            SecretKeySpec secretKey = new SecretKeySpec(sharedSecret.getBytes(StandardCharsets.UTF_8), algorithm);
            sha256HMAC.init(secretKey);
            byte[] hashByte = sha256HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8));
            String hashString = toHex(hashByte);
            return toLower ? hashString.toLowerCase() : hashString;
        } catch (Exception e) {
            throw new SignatureException(e);
        }
    }

    private static String toHex(byte[] bytes) {
        BigInteger bi = new BigInteger(1, bytes);
        return String.format("%0" + (bytes.length << 1) + "X", bi);
    }
}

有人能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2020-02-26 08:27:50

与2020年2月一样,如果有些人仍有问题,以下几点可以帮助解决问题。

  • 请确保您已经为您的沙箱项目生成了API密钥和秘密。
  • 您可以在仪表板、->项目、->凭据、->入站和身份验证键、-> API密钥/机密中获得这些详细信息。
  • 请检查应处于活动状态的密钥的“状态”。
  • 如果您的“凭据”选项卡没有“入站和身份验证键”的详细信息,请确保添加相应的API,则此部分将自动出现。
  • Visa的“”类似于SoapUI/Postman工具,您可以很容易地测试API。不幸的是,直到2020年2月,Windows才支持这一点,将来Mac/Linux也可能会发布同样的API。
  • 您可以在页面底部的仪表板->项目->资产->中找到该工具。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52742936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档