# 查课表Pro数据同步

# 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",  // 校园账号,一般是学号
    "type":"0",                // 课表类型(0-本科;1-研究生;2-教师;-1-未知)
    "session":"201601",        // 学期数,固定格式“年份+学期编号”,如201601
    "timetable": [             // 每节课的信息
        {
            "course_id":"672364823"    // 课程编号
            "course_class":"1",        // 课程开始节次
            "begin_time":"08:00",   // 课程开始时间(时:分)
            "end_time":"10:00",     // 课程结束时间(时:分)
            "course_name":"数值分析",  // 课程名字
            "teacher":"麦克",          // 课程老师名字
            "day":"1",                 // 周几上课:1-周一;2-周二;以此类推
            "class_name":"数学实验班", // 班级名称
            "week":"5",                // 第几周
            "address":"中2-1204",      // 上课地点
            "required_course":"1",     // 是否必修(1-是;0-否;-1-未知)
        },
        {
            "course_class":"1",
            ...
        },
        ...
    ]
}

注意: 1、timetable中每条数据为一节课。例:一周有12节课,一学期有18周,则timetable中应该有12*18条数据。 2、"session"字段表示学期数,需要强一致性,格式统一为“年份(4位)+学期编号(2位)”,如201601,表示2016年度第一学期。若格式不对,请求无效

# 附件

# 1. 签名算法

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

# 2 数据加密

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

KEY = APP_KEY
IV = APP_SECRET 前16位。

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