适用于一手官方充值卡供货,非卡密寄售,请与商务沟通确认对接文档
加密密钥为商户密钥的前32位 AES/ECB/PKCS5Padding 128位 结果hex转大写,cards所有接口请勿明文传递
请求全参数ascii从小到大排序,例如a=1&b=2&key=商户密钥,商户密钥末尾拼接,md5后转小写,空参数与sign不参与签名
cards加密方式
Java解密
public static String decrypt(String base64Data, String keyStr) throws Exception { Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); SecretKeySpec key = new SecretKeySpec(keyStr.getBytes(StandardCharsets.UTF_8), "AES"); cipher.init(2, key); return new String(cipher.doFinal(HexBin.decode(base64Data)));}php解密
xxxxxxxxxx$decrypted = openssl_decrypt(base64_encode(pack("H*",加密后的hex)), 'aes-256-ecb', '32位密钥');sign 计算方法
xxxxxxxxxxpublic static String makeSign(SortedMap<String, String> sortedMap, String key) { StringBuilder stringBuilder = new StringBuilder(); for (String s : sortedMap.keySet()) { if (!StringUtils.hasText(sortedMap.get(s)) || "sign".equals(s)) { continue; } stringBuilder.append(s).append("=").append(sortedMap.get(s)).append("&"); } stringBuilder.append("key=").append(key); return DigestUtils.md5DigestAsHex(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));}| 字段 | 类型 | 描述 | |
|---|---|---|---|
| cardNo | String | 卡号 | |
| cardPwd | String | 卡密 | |
| expireTime | String | 有效期(yyyy-MM-dd HH:mm:ss) | |
| face | Int | 面值 |
| 字段 | 类型 | 示例 | 描述 |
|---|---|---|---|
| customerId | Int | 20001 | 商户编号 |
| orderId | String | 20221110165331114070 | 采购单号 |
| productCode | String | JW100 | 商品编号(由供应商提供) |
| productId | Int | 2048 | 系统商品编号 |
| price | BigDecimal | 10.0002 | 单价,四位小数 |
| notifyUrl | String | http://xxx.com | 回调通知地址 |
| face | Int | 1000 | 面值(单个面值) |
| buyNum | Int | 10 | 买入数量,1-100 |
| totalMoney | BigDecimal | 10000 | 订单总金额(订单完成后结算金额) |
| sign | String | b3af409bb8423187c75e6c7f5b683908 | 32位小写md5 |
| 字段 | 类型 | 示例 | 描述 |
|---|---|---|---|
| code | String | 0 | 订单状态(0=下单成功,1=采购失败,2=未知异常) |
| message | String | 采购中 | 提示信息 |
| 字段 | 类型 | 示例 | 描述 |
|---|---|---|---|
| customerId | Int | 20001 | 商户编号 |
| orderId | String | 20221110165331114070 | 采购单号 |
| face | Int | 1000 | 面值(单个面值) |
| sign | String | b3af409bb8423187c75e6c7f5b683908 | 32位小写md5 |
| 字段 | 类型 | 示例 | 描述 |
|---|---|---|---|
| code | int | 0 | 查询状态(0=查询成功,1=查询失败) |
| status | int | 0 | 采购单状态(0=采购成功,1=订单失败,2=处理中) |
| customerId | int | 20001 | 商户编号 |
| orderId | string | 20221110165331114070 | 采购单号(创建订单orderId一致) |
| cards | List | 4C55F88B4D93E60274E599AD1F | 加密后hex大写 |
| message | string | 采购成功 | 提示信息 |
通知地址为创建订单时传递的notifyUrl地址
| 字段 | 类型 | 示例 | 描述 |
|---|---|---|---|
| cards | List | 4C55F88B4D93E60274E599AD1F | hex后的加密内容 |
| customerId | int | 20001 | 商户编号 |
| message | string | 采购成功 | 提示信息 |
| orderId | string | 20221110165331114070 | 采购单号(创建订单orderId一致) |
| status | string | 0 | 采购单状态(0=成功,1=失败) |
| sign | string | b3af409bb8423187c75e6c7f5b683908 | 小写32位md5 |