代理商推送至电子门票系统的订单,当订单发生“预订”、“支付”、“取票”、“过闸(消费)”、“退票”等事件后,电子门票服务器系统会根据代理商设置的回调参数,依据订单事件的发生顺序,依次回调给代理商。
在您进行回调对接前,请勿必理解以下内容。
回调通知是由代理商设置许可的,在默认情况下,电子门票系统服务器不会对任何代理商的订单事件发起回调通知。仅当代理商通过API设置回调许可及参数后,电子门票系统服务器才会执行回调(设置回调许可及参数请参看"api/ProviderConfig"或"Source/SetAgentParameters.aspx"接口)。
回调通知总是订单为线索回调,严格按订单事件的发生顺序进行回调,某个订单的前一事件回调未完成或未成功时,该订单的后序事件将不会进行回调。回调是否成功是依据您对回调返回的数据作出的判断,因此,当一个事件的数据您不需要或不关心时,请您回复成功。
同一个代理商的多个订单的回调是并发进行的,不同代理商的回调也是并发进行的。
回调发生在订单相应的事件发生之后,两者之间是异步关系,回调不成功或未回调不会阻塞订单的其他事件。回调通常发生在事件发生后的15秒之内。
回调失败之后,电子门票系统仍然会以一定的时间间隔反复偿试,直至该事件发生后24小时止。
账户被禁用的代理商,即使其留存在电子门票系统的剩余订单发生了需要回调的事件,且该代理商被禁用前处于“需要回调”的状态,这些订单的事件也是不会回调的。
除代理商本人之外,供应商(景区、演艺剧场、影院)的工作人员也可以帮助您设置回调的许可及参数。因此,对于回调本身而言,"api/ProviderConfig"或"Source/SetAgentParameters.aspx"接口不是必须调用的接口。
自2023-12-29日起,应飞猪的要求,回调将支持“V1”和“V2”两个版本,如果您没有特别指定或以前完成的对接,则始终(默认)使用V1版本的格式发起回调。
电子门票系统依据代理商配置的回调参数向被回调对象发起回调操作。有以下参数需要指定。
| 参数名称 | 支持的版本 | 是否必需设置 | 示例 | 描述 |
| 返回的数据类型 | V1,V2 | 否 | JSON | 支持JSON和XML两种数据类型。默认为“JSON” 。 |
| 回调地址 | V1,V2 | 是 | www.xxxx.com/xxx | 代理商接收回调通知的API地址,此地址必须是公网可访问的URL。 |
| 回调方法 | V1,V2 | 否 | GET | 支持GET、POST方法。默认为“GET”。 |
| 回调数据版本 | V2 | 否 | "V1"或"V2" | 不指定时总是V1。 |
V1版本样例:www.xxxx.com/xxx?parm="Parma的内容"&sign="签名的内容",其中"www.xxxx.com/xxx"为OTA提供的回调目标地址,当OTA提供的回调目标地址带有预置的URL参数时(如飞猪),则系统会在预置参数后拼接parm和sign参数。
V2版本样例:www.xxxx.com/xxx?parm="Parma的内容"&sign="签名的内容"&Ver=V2,其中"www.xxxx.com/xxx"为OTA提供的回调目标地址,当OTA提供的回调目标地址带有预置的URL参数时(如飞猪),则系统会在预置参数后拼接parm、sign和Ver参数。
方法1:使用本站点的API接口api/ProviderConfig可以直行设置。
方法2:联系供应商处与您对接的营销部人员或业务员,请供应商的工作人员直接设置,这个操作与方法1是等价的。供应商处的工作人员如何操作《游宝星电子门票系统核心客户端》软件为对接方设置回调请点击此处看视频教程。
| 字段名 | 变量名 | 示例值 | 描述 |
| 任务编号 | 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时此状态来源于门票状态 |
| 字段名 | 变量名 | 示例值 | 描述 |
| 任务编号 | 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时此状态来源于门票状态 |
| 是否还有待消费项目 | hasotherpermits | 1 | 至回调的发生时刻止,当前票是否还有其他的待消费项目,此值可以用于OTA决定是否仍要展示过闸凭证。只有当回调是票相关事件的回调时(此时ticketid不为空),此值才有含义。“1”表示有,“0”或其他值表示没有。 |
<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>
<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>
<hasotherpermits>1</hasotherpermits>
</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"
}}
{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",
"hasotherpermits":"1"
}}
算法描述:
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);
V1版本
string url = HDDZ + "?parm=" + System.Web.HttpUtility.HtmlEncode(parm) + "&sign=" + sign;
V2版本
string url = HDDZ + "?parm=" + System.Web.HttpUtility.HtmlEncode(parm) + "&sign=" + sign + "&Ver=V2";
其中HDDZ为代理商设置的2.1节所示的“回调地址参数”;parm为本章所阐述的XML或JSON字符串;sign为3.5节所阐述的签名。当HDDZ带有预置参数时,本小节所示的参数会在预置参数后拼接。
代理商的API收到来自电子门票系统的通知,成功完成处理或代理商软件系统认为事件不需要处理的,请回复“SUCCESS”(表示成功,门票系统收到此值后不会再对当前订单的当前事件再次回调)。其他的情形请回复“FAILUE”(表示回调不成功,门票系统未收到“SUCCESS”时均表示不成功,在此事件发生后的24小时内,将多次重复回调,直致成功为止)。