回调说明
回调
回调的形式是HTTP POST请求,请求体中BODY为JSON格式字符串加密后的字符串,加密方式为AES-256-ECB,详见下文【解密】
响应
响应状态码为200且 内容为 success 表示响应成功, 其它为失败
重试
若未收到成功响应则触发重试机制。一般情况下,25 小时以内完成 8 次通知(通知的间隔频率:4m、10m、10m、1h、2h、6h、15h)
解密后JSON格式数据结构
- 权益订单成功回调
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
event_type | 是 | string | 回调类型,值为 orderFinished |
order_id | 是 | string[18,18] | 平台订单号 |
biz_order_id | 是 | string | 客户订单号 |
sku_id | 是 | int | SKU ID |
status | 是 | int | 订单状态,2充值成功 3充值失败 |
count | 是 | int | 商品数量 |
amount | 是 | int | 订单支付总额 |
last_time | 是 | datetime | 到账时间/确定失败时间 |
created_at | 是 | datetime | 下单时间 |
cards | 否 | array | 卡密数据 详细内容后请参考“卡密解密”,仅卡密订单存在此字段 |
- 银行立减券用户领券成功回调
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
event_type | 是 | string | 回调类型,值为 voucherReceived |
order_id | 否 | string[18,18] | 平台订单号 |
biz_order_id | 否 | string | 客户订单号 |
code | 否 | string[8,8] | 卡密 |
act_id | 否 | string[9,32] | 加密活动ID |
finished_time | 是 | YYYY-MM-DD HH:ii:ss | 领取时间 |
coupon_id | 是 | string[1,20] | 券ID 参考发放代金券批次API |
注:(order_id, biz_order_id)、(act_id, code)这两组参数,有一组必填
- 银行立减券核销回调(通过接口【发送立减券】下单的回调)
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
event_type | 是 | string | 回调类型,值为 voucherChecked |
order_id | 否 | string[18,18] | 平台订单号 |
biz_order_id | 否 | string | 客户订单号 |
checked_time | 是 | rfc3339 | 核销时间,如:2023-12-27T07:46:19.000000Z |
coupon_id | 是 | string[1,64] | 发放给用户的优惠券ID |
- 银行立减券核销回调(微信/支付宝官方回调)
数据格式参考:
解密
AES-256-ECB,密钥为 appsecret(向平台索取)
<?php
$data = array(
'event_type ' => 'orderFinished',
// 此处省略...
'created_at' => '2022-10-22 10:20:30',
);
$dataStr = json_encode($data);
$appSecret = APP_SECRET; // 向平台索取
// 加密, $encrypt即为body内容
$encrypt = openssl_encrypt($dataStr, 'aes-256-ecb', $appSecret);
// 上面的写法等价于
// $encryptRaw = openssl_encrypt($dataStr, 'aes-256-ecb', $appSecret, OPENSSL_RAW_DATA);
// $encrypt = base64_encode($encryptedRaw);
// 解密
$decrypt = openssl_decrypt($encrypt, 'aes-256-ecb', $appSecret);
// 上面的写法等价于
// $decrypt = openssl_decrypt(base64_decode($encrypt), 'aes-256-ecb', $appSecret, OPENSSL_RAW_DATA);
//解密Demo java版
//Decryptor.java
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Decryptor {
public static String decrypt(String encryptedData, String appSecret) throws Exception {
// Convert the base64 encoded string to a byte array
byte[] data = Base64.getDecoder().decode(encryptedData);
// Create a secret key from the app secret
SecretKeySpec key = new SecretKeySpec(appSecret.getBytes(), "AES");
// Create a cipher instance for AES/ECB/PKCS5Padding
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// Initialize the cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, key);
// Decrypt the data and return as a string
byte[] decrypted = cipher.doFinal(data);
return new String(decrypted);
}
}
//Test.java
public class Test {
public static void main(String[] args) throws Exception {
// The encrypted data from PHP
String encryptedData = "/X3OjB+xJf9r1lKWc2ACtg==";
// The app secret used for encryption
String appSecret = "1e5831f355e3ff7c2c680720b1aff85c";
// Call the decrypt method and print the result
String decryptedData = Decryptor.decrypt(encryptedData, appSecret);
System.out.println(decryptedData);
}
}
最后修改时间: 2 个月前