适用于卡密购买采购
全接口使用post application/json请求,编码格式utf8
加密密钥为商户密钥的前32位 AES/ECB/PKCS5Padding 128位 结果hex
请求全参数ascii从小到大排序,例如a=1&b=2&key=商户密钥,md5后转小写,空参数与sign不参与签名
cards加密方式
Java解密
x
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));}
/api/v1/openapi/card-buy/create
| 字段 | 类型 | 描述 |
|---|---|---|
| customerId | Int | 商户ID |
| orderNo | String(8-32位) | 请保证绝对唯一性,订单号 |
| buyNum | Int(1-1000) | 购买数量 |
| face | Int | 面值(校验) |
| productId | Int | 系统商品编号 |
| notifyUrl | String(可为空) | 异步通知请求地址 |
| createTime | String(14位) | 时间戳记格式(yyyyMMddHHmmss) |
| sign | String(32) | 参考sign签名计算方式 |
返回字段
| 字段 | 类型 | 描述 |
|---|---|---|
| orderNo | String | 订单号 |
| status | String | 0接收成功,1下单失败,2订单存疑 |
| message | String | 备注信息 |
/api/v1/openapi/card-buy/query
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| customerId | 是 | string | 商户ID |
| orderNo | 是 | string | 商户订单号 |
| sign | 是 | string | 签名 |
返回参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| code | Int | 0=查询成功,1查询失败(非订单状态失败) |
| status | string | 订单状态 |
| customerId | Int | 商户ID |
| outTradeNo | string | 商户订单 |
| orderNo | string | 系统订单 |
| face | Int | 面值 |
| buyNum | Int | 购买数量 |
| totalMoney | string | 扣费金额 |
| price | string | 单价 |
| cards | string | 卡密信息,请使用密钥解密hex,array,加密后参与签名 |
| finishTime | string | 完成时间(yyyyMMddHHmmss) |
| message | string | 描述 |
| sign | string | 签名 |
status
| key | Value |
|---|---|
| process | 采购中 |
| fail | 采购失败 |
| success | 订单成功 |
cards
| 字段 | 类型 | 描述 | |
|---|---|---|---|
| cardNo | String | 卡号 | |
| cardPwd | String | 卡密 | |
| expireTime | String | 有效期(yyyy-MM-dd HH:mm:ss) | |
| face | Int | 面值 |
异步通知
| 字段 | 类型 | 描述 | |
|---|---|---|---|
| status | string | 订单状态 | |
| customerId | Int | 商户ID | |
| outTradeNo | string | 商户订单 | |
| orderNo | string | 系统订单 | |
| face | Int | 面值 | |
| buyNum | Int | 购买数量 | |
| totalMoney | string | 扣费金额 | |
| price | string | 单价 | |
| cards | string | 卡密信息,请使用密钥解密hex,array,加密后参与签名 | |
| finishTime | string | 完成时间(yyyyMMddHHmmss) | |
| message | string | 描述 | |
| sign | string | 签名 |
status
| key | Value |
|---|---|
| fail | 采购失败 |
| success | 订单成功 |
cards
| 字段 | 类型 | 描述 | |
|---|---|---|---|
| cardNo | String | 卡号 | |
| cardPwd | String | 卡密 | |
| expireTime | String | 有效期(yyyy-MM-dd HH:mm:ss) | |
| face | Int | 面值 |
{ "buyNum": 1, "cards": "3DA6A67E4AFC3D45E863CC4AC2A2C46F4B43DD18DC59261AC11400C303927FD811DAB481693CCD89D02A1960DB4864DEEB208BDB2E81044E5490420126C3FE1425269E656B38DCFB15F946D1758333CDEE73CC99AD733DC869D0E1FD456126F6DFC75F851F45A92E5FB5716ECB64D937", "customerId": 20002, "face": 10, "finishTime": "20220816110859", "message": "采购完成", "orderNo": "20220816110854100504", "outTradeNo": "1660619332120", "price": 9.75, "sign": "3a59111f43a73da8e39b3b741fc72d35", "status": "success", "totalMoney": 9.75}