# 查考试数据同步

# 1 请求方式

考试接口采用POST的方式向校方发送数据。

# 2 请求参数

原始数据 R

{
    "card_number":"3109005843",
    "app_key":APP_KEY,
    "nonce_str":"",(32位随机字符串)
    "timestamp":"",(时间戳)
    "sign":"9A0A8659F005D6984697E2CA0A9CF3B7"//签名
}

通过加密R可以得到R'R' = AES_CBC_ENCRYPT(R)

{
    "raw_data":R',
    "app_key":APP_KEY
}

腾讯微卡会把上面的数据以POST的方式发送到校方提供的考试接口。

加密算法见附件。

# 3 数据返回

校方接收到请求,对数据进行解密,验证签名,确认请求来源于腾讯微卡,处理后返回考试数据。

返回数据:

{
    "code":0,
    "message":"success",
    "raw_data":R',
    "app_key":APP_KEY
}

关键点:

  • 请求成功,需保证返回的code 为 0。
  • 请求失败,需保证返回的code 不为 0。
  • message 字段在 code 不为 0 时返回错误的信息。
  • app_key 跟请求时的 app_key 保持一致。
  • raw_data 对应的 R' 为加密后的数据。 通过解密R' 可得到 RR = AES_CBC_DECRYPT(R·)
{
    "card_number":"07302590",  // 校园账号,一般是学号
    "session": "201601",    // 学期,表示2016~2017年度第一学期
    "result": [             // 每个学期的数据
        {
            "course_name": "高等数学",   // 课程名称
            "time": "7月9号 9:00~11:00",     // 时间
            "location": "教学楼101",   // 地址
            "seat": "15"    // 座位号
        },
        {
            "course_name": "高等数学",   // 课程名称
            "time": "7月9号 9:00~11:00",     // 时间
            "location": "教学楼101",   // 地址
            "seat": "15"    // 座位号
        },
        ...
    ]
}

# 附件

# 1. 签名算法

签名采用微信支付 (opens new window)后端签名算法,具体算法见签名算法 (opens new window)

# 2 数据加密

采用AES对称加密算法(AES/CBC/ZeroPadding 128位模式),具体算法见加解密demo (opens new window)

KEY = APP_KEY
IV = APP_SECRET 前16位。

# 3 APP_KEY & APP_SECRET

由腾讯微卡生成,每个公众号拥有一对唯一的APP_KEYAPP_SECRET

APP_KEY和APP_SECRET的获取见接口对接指引 (opens new window)