回调接口

一 服务器异步通知说明

代理商推送至电子门票系统的订单,当订单发生“预订”、“支付”、“取票”、“过闸(消费)”、“退票”等事件后,电子门票服务器系统会根据代理商设置的回调参数,依据订单事件的发生顺序,依次回调给代理商。

在您进行回调对接前,请勿必理解以下内容。

回调通知是由代理商设置许可的,在默认情况下,电子门票系统服务器不会对任何代理商的订单事件发起回调通知。仅当代理商通过API设置回调许可及参数后,电子门票系统服务器才会执行回调(设置回调许可及参数请参看"api/ProviderConfig"或"Source/SetAgentParameters.aspx"接口)。

回调通知总是订单为线索回调,严格按订单事件的发生顺序进行回调,某个订单的前一事件回调未完成或未成功时,该订单的后序事件将不会进行回调。回调是否成功是依据您对回调返回的数据作出的判断,因此,当一个事件的数据您不需要或不关心时,请您回复成功。

同一个代理商的多个订单的回调是并发进行的,不同代理商的回调也是并发进行的。

回调发生在订单相应的事件发生之后,两者之间是异步关系,回调不成功或未回调不会阻塞订单的其他事件。回调通常发生在事件发生后的15秒之内。

回调失败之后,电子门票系统仍然会以一定的时间间隔反复偿试,直至该事件发生后24小时止。

账户被禁用的代理商,即使其留存在电子门票系统的剩余订单发生了需要回调的事件,且该代理商被禁用前处于“需要回调”的状态,这些订单的事件也是不会回调的。

除代理商本人之外,供应商(景区、演艺剧场、影院)的工作人员也可以帮助您设置回调的许可及参数。因此,对于回调本身而言,"api/ProviderConfig"或"Source/SetAgentParameters.aspx"接口不是必须调用的接口。

二 代理商回调参数设置

2.1 代理商回调参数设置

电子门票系统依据代理商配置的回调参数向被回调对象发起回调操作。有以下参数需要指定。

2.2 参数列表

参数名称 是否必需设置 示例 描述
返回的数据类型 JSON 支持JSON和XML两种数据类型。默认为“JSON” 。
回调地址 www.xxxx.com/xxx 代理商接收回调通知的API地址,此地址必须是公网可访问的URL。
回调方法 GET 支持GET、POST方法。默认为“GET”。

三 服务器回调内容说明

3.1 回调通知地址请求样例

样例:www.xxxx.com/xxx?parm="Parma的内容"&sign="签名的内容";

3.2 回调返回参数列表

字段名 变量名 示例值 描述
任务编号 autoid 1
类型 type 1 1发起预订,2关闭订单,3前台现付取票,4预付款支付,5返款余额支付 6第三方支付,7退票 ,8过闸,9退款申请,0退款办理。A 订单交割 B返款单交割
预订单号 orderid YD-2018-03-07-000002 电子门票系统中的预订单号
售票单号 sellbillid SP-2018-03-07-000002 电子门票系统中的售票单号
第三方业务单据ID senderid 1234567890543 代理商提供的业务单据ID
门票卡号 ticketid TYAB121144200
日期 date yyyyMMdd 日期
时间 time HHmmss 时间
内容 content 创建预订单成功! 当前操作结果的文字描述
起始状态 startstatus 0 执行当前操作时,对象的起始状态,LX为1,2,3,4,5,6,9,10时,此状态来源为订单状态.为7,8,9时此状态来源于门票状态
终止状态 endstatus 4 执行当前操作时,对象的终止状态,LX为1,2,3,4,5,6,9,10时,此状态来源为订单状态.为7,8,9时此状态来源于门票状态

3.3 数据类型为"XML"时parm的示例

        <parm>
            <autoid>1</autoid>
            <type>1</type>
            <orderid>YD-2018-03-07-000002</orderid>
            <sellbillid>SP-2018-03-07-000002</sellbillid>
            <senderid>1234567890543</senderid>
            <ticketid>TYAB121144200</ticketid>
            <date>20180307</date>
            <time>030700</time>
            <content>创建预订单成功!</content>
            <startstatus>0</startstatus>
            <endstatus>4</endstatus>
        </parm>
    

3.4 数据类型为"JSON"时parm的示例

        {parm:                    
        { 
        "autoid":"1",                        
        "type":"1",
        "orderid":"YD-2018-03-07-000002",
        "sellbillid":"SP-2018-03-07-000002",
        "senderid":"1234567890543",                        
        "ticketid": "TYAB121144200",
        "date":"20180307",                        
        "time":"030700",                        
        "content":"创建预订单成功!",                        
        "startstatus":"0",                        
        "endstatus":"4"
        }}
    

3.5 sign参数的生成

算法描述:

sign = ToHexStr(Md5(Utf8.GetBytes(parm+key+pwd)))。

其中:parm为前文中所述的xml或json字符串;key为代理商的会话密钥;pwd为UPPER_MD5(代理商的密码)。

C#语言生成sign源码示例:

        #region GetSign
        /// <summary>
        /// 签名
        /// </summary>
        /// <param name="parm">parm内容</param>
        /// <param name="key">Web账户秘钥</param>
        /// <param name="pwd">Web账户密码</param>
        /// <returns>签名后的字符串</returns>
        public string GetSign(string parm, string key, string pwd)
        {
            string value = parm + key.Trim() + pwd.Trim();
            return MD5(value);
        }
        #endregion
        #region MD5
        /// <summary>
        /// 将字符串进行Md5运算,结果仍是字符串
        /// </summary>
        /// <param name="s_key">被加密的字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string MD5(string s_key)
        {
            MD5 m = new MD5CryptoServiceProvider();
            byte[] s = m.ComputeHash(System.Text.Encoding.UTF8.GetBytes(s_key));
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            foreach (byte b in s)
            {
                sb.Append(b.ToString("x2"));
            }
            string password = sb.ToString();
            return password;
        }
        #endregion

        #region GetHexStrFromByteArr
        /// <summary>
        /// 将字节数组转换为数字字符,每个字节两个字符
        /// </summary>
        /// <param name="parm"></param>
        /// <returns></returns>
        private string GetHexStrFromByteArr(byte[] parm)
        {
            StringBuilder sb = new StringBuilder();
            if (parm == null)
            {
                return "";
            }
            foreach(byte b in parm)
            {
                sb.Append(b.ToString("x2").ToUpper());
            }
            return sb.ToString();
        }
        #endregion

        LogWrite.Instance.WriteLog("需要同步的事件:" + autoid.ToString());
        LogWrite.Instance.WriteLog("parm=" + parm);

        //2018-08-23添加,传一个只有0-9,A-F的参数值
        byte[] temparr = System.Text.Encoding.UTF8.GetBytes(parm);
        parm = this.GetHexStrFromByteArr(temparr);
        string sign = this.GetSign(parm, wezhtable[0].MY, wezhtable[0].WEBMM);
    

3.6 回调链接的拼接

string url = HDDZ + "?parm=" + System.Web.HttpUtility.HtmlEncode(parm) + "&sign=" + sign;

其中HDDZ为代理商设置的2.1节所示的“回调地址参数”;parm为本章所阐述的XML或JSON字符串;sign为3.5节所阐述的签名。

四 回调的回复

代理商的API收到来自电子门票系统的通知,成功完成处理或代理商软件系统认为事件不需要处理的,请回复“SUCCESS”(表示成功,门票系统收到此值后不会再对当前订单的当前事件再次回调)。其他的情形请回复“FAILUE”(表示回调不成功,门票系统未收到“SUCCESS”时均表示不成功,在此事件发生后的24小时内,将多次重复回调,直致成功为止)。