关于反校验

反校验流程说明

为确保接口交互安全,部分接口在商户发起请求时 Alchemy Pay 会反向发起请求,商户在收到请求后需响应正确的结果才可进行下一步操作,具体如下:

反校验接口列表

接口名称接口地址
创建虚拟卡【接口】/open/api/card/create
虚拟卡存款(充值)【接口】/open/api/card/deposit
卡片退款【接口】/open/api/card/withdraw/refund
删除卡片【接口】/open/api/card/cancel

📘

商户在测试/上线前需提供以上 4 个接口反校验地址,否则无法测试/上线

反校验接口交互流程

以创建虚拟卡接口为例说明交互流程,其它 3 个接口交互流程一致。

接口规则

  • 请求方式:GET
  • 请求地址:商户提供
  • 请求参数
参数名类型说明
orderNoString商户发起请求时上传的客户交易流水号,原样返回

商户在收到 Alchemy Pay 请求后需要响应以下参数

响应头

参数名称参数类型说明
ach-access-keystringkey
ach-access-timestampstring13 位时间戳
ach-access-signstring签名,参考反校验签名说明

响应内容

success

📘

商户在收到 Alchemy Pay 请求后需正确返回签名才能继续进行下一步操作

反校验签名说明

(1)生成待签名字符串,固定顺序:timestamp+requestMethod+requestPath+bodyString,示例:

商户提供的反校验地址:https://www.xxxxx.com/card/reverse/check
时间戳:1700549311596
响应内容:success
待签名字符串:1700549311596GET/card/reverse/checksuccess

(2)生成签名

public class ReverseSign {

    public static String sign(String content, String secretkey) throws NoSuchAlgorithmException, InvalidKeyException {
        Base64.Encoder base = Base64.getEncoder();
        String signVal = base.encodeToString(sha256(content.getBytes(StandardCharsets.UTF_8), secretkey.getBytes(StandardCharsets.UTF_8)));
        return signVal;
    }

    public static byte[] sha256(byte[] message, byte[] secret) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac sha256_HMAC = Mac.getInstance("HmacSha256");
        SecretKeySpec secretKey = new SecretKeySpec(secret, "HmacSha256");
        sha256_HMAC.init(secretKey);
        return sha256_HMAC.doFinal(message);
    }

    public static void main(String[] args) throws Exception {
        String content = "1700549311596GET/card/reverse/checksuccess";
        String secretkey = "XXXXX";
        String sign = sign(content, secretkey);
        System.out.println(sign);
    }
}