当前位置:   article > 正文

关于银联支付交易状态码的一些分析

关于银联支付交易状态码的一些分析

  

目录

关于银联支付

一些准备

交易状态码的一些分析

小结


关于银联支付

目前B2C购物支付场景下,支付宝和微信的在线支付已经成为我们经常遇到的支付方式。另外,银联支付也是我们日常的一种支付方式,本文所指的银联支付即指中国银联网关支付产品,主要适用于持卡人在商户网站B2C购物支付场景,持卡人通过点击银联在线支付图标(可选择支付类型),并在银联在线支付网关完成支付信息录入,最终完成支付。银联在线支付支持输入卡号付款、用户登录支付、网银支付、迷你付(IC卡支付)等多种付款方式,用户通过统一入口,访问支付首页,按照提示和所列功能即可完成支付。

一些准备

做为软件开发商,实现银联在线支付,需要协助(但不必要)目标商户签署支付协议,开通商户平台。以2007版支付为例,开通过商户平台需要提交许多资料,包括企业及个人信息(如管理员用户名、名称、手机号等)备案。本文将不重点介绍如何实现在线支付,仅就支付反馈中遇到的一些问题进行分析。

在分析前,我们简单讲述一下要 POST 的一些参数和数据,参见下表:

序号字段名类型说明
1MerId数字串必填,为银联统一分配给商户的商户号,15位长度
2OrdId数字串必填,商户提交给银联的交易订单号,16位长度,请注意生成的订单号当天支付如果不成功,则再次使用相同的订单号提交后会提示重复交易,但次日该订单号仍可以做为交易失败后的“新”订单号继续在线支付。从另一个角度来说,使用固定订单号有助于商户端更新支付状态失败造成用户的重复交易。
3TransAmt数字串必填,订单交易金额,12位长度,左补0,单位为分。如 000000007890,表示七十八元九角零分,即 78.90 元。
4CuryId数字串必填,订单交易币种,3位长度,固定为人民币156
5TransDate数字串必填,订单交易日期,8位长度
6TransType数字串必填,交易类型,4位长度,0001 表示消费,0002 表示退款
7Version数字串必填,支付接入版本号,如 20070129
8BgRetUrl数字串必填,后台交易接收的回调 URL,URL地址的长度不超过80个字节
9PageRetUrl数字串必填,前台交易页面接收的回调 URL(显示给用户方的页面,交易情况显示详情页面),URL地址的长度不超过80个字节
10GateId数字串非必填,支付网关号
11Priv1数字串非必填,商户私有域,长度不超过60个字节,属于商户的备注内容
12ChkValue数字串必填,256字节长的ASCII码,是本次交易的关键数字签名

 以下是示例代码,提供了一个服务器 Form 和一些隐藏字段域 准备提交时使用

  1. <form id="payform" runat="server">
  2. <input type="hidden" name="MerId" value="" id="MerId" runat="server"/>
  3. <input type="hidden" name="OrdId" value="" id="OrdId" runat="server"/>
  4. <input type="hidden" name="TransAmt" value="" id="TransAmt" runat="server"/>
  5. <input type="hidden" name="CuryId" value="156" id="CuryId" runat="server"/>
  6. <input type="hidden" name="TransDate" value="" id="TransDate" runat="server"/>
  7. <input type="hidden" name="TransType" value="0001" id="TransType" runat="server"/>
  8. <input type="hidden" name="Version" value="" id="Version" runat="server"/>
  9. <input type="hidden" name="BgRetUrl" value="https://x.x.com/BR.aspx" id="BgRetUrl" runat="server"/>
  10. <input type="hidden" name="PageRetUrl" value="https://x.x.com/PR.aspx" id="PageRetUrl" runat="server"/>
  11. <input type="hidden" name="GateId" value="" id="GateId" runat="server"/>
  12. <input type="hidden" name="Priv1" value="" id="Priv1" runat="server"/>
  13. <input type="hidden" name="ChkValue" value="" id="ChkValue" runat="server"/>
  14. </form>

假设我们可以动态的设置 Form 的 Action (如测试环境或生产环境),示例代码如下:

  1. protected void b_insbtn_Click(object sender, EventArgs e)
  2. {
  3. if (ViewState["RunType"].ToString() == "1")
  4. {
  5. payform.Action = "https://payment.chinapay.com/pay/TransGet"; //生产环境
  6. payform.Method = "post";
  7. }
  8. else if (ViewState["RunType"].ToString() == "0")
  9. {
  10. payform.Action = "http://payment-test.chinapay.com/pay/TransGet"; //测试环境
  11. payform.Method = "post";
  12. }
  13. //后续参数配置代码....
  14. }

​代码中 https://payment.chinapay.com/pay/TransGet ,即为正式提交在线支付的入口页。

交易状态码的一些分析

当引导用户到银联支付页面,并完成支付操作后(包括未成功的交易),通过 PageRetUrl 和 BgRetUrl  回调地址我们会获取银联的交易状态码,状态码为4位数字,交易状态码为非 “1001” 的即为失败交易,我们要根据实际的返回保存到数据库并给予对应的提示。

详细的交易状态码见下表:

交易状态码说明交易状态码说明
1001消费交易成功2063违反安全保密规定
1003退款交易成功2064原始金额不正确
1005退款撤销成功2065超出取款次数限制
1111未支付2066受卡方呼受理方安全保密部门
2000银行无应答2067捕捉
2001查发卡放2068收到的回答太迟
2002查发卡放特殊条件2075允许输入PIN的次数超限
2003无效商户2090日期切换正在处理
2004没收卡2091发卡方与交换中心不能操作
2005不予承兑2092金融机构或中间网络设施找不到或无法到达
2006出错2093交易违法、不能完成
2007特殊条件下没收卡2094重复交易
2009请求正在处理中2095调节控制错
2010卡bin未参与CPUSecure服务2096系统异常、失效
2012无效交易2097ATM\POS终端找不到
2013无效金额2098交换中心收不到收卡方应答
2014无效卡号2099PIN格式错误
2015无此发卡方20A0MAC鉴别失败
2019重新送入交易2101网关出错
2020无效应答2102密码加密出错
2021不作任何处理2111消息时间太新,请调整浏览器时间与实际时间一致
2022怀疑操作有误2112消息时间太旧,请调整浏览器时间与实际时间一致
2023不可接受的交易费2113信息不符
2030格式错误2114商户号验证出错
2031交换中心不支持的银行2115商户信息格式出错
2033过期的卡2116撤销交易信息出错
2034有作弊嫌疑2117查新个数为零
2035受卡方与安全保密部门联系2118查询个数大于100
2036受限制的卡2141系统出错
2037受卡方呼受理方安全部门2142撤销交易出错
2038超过允许的PIN试输入2143撤销交易已处理
2039无此信用卡账户2144交易已被冲正
2040请求的功能不支持2145撤销交易出错
2041挂失卡2146交换中心无应答
2042无此账户2147网管未收到该交易
2043被窃卡2148重复交易
2044无此投资账户2150通讯线路故障
2051无足够的存款2157不允许持卡人进行交易
2052无此支票账户2158该银行卡网上支付功能因系统升级而暂停
2053无此储蓄卡账户2199系统出错
2054过期的卡2257基于风险控制阻止的交易
2055不正确的PIN2997交易提交银行错误
2056无此卡记录4001HSBC交易中止
2057不允许持卡人进行的交易4055HSBC安全认证错误
2058不允许此终端进行的交易4097HSBC交易无应答
2059有作弊嫌疑5501工行网关无应答
2060受卡方与安全保密部门联系5511工行网关处理失败
2061超出取款金额限制5522工行网关未收到后台应答
2062受限制的卡
交易状态码说明交易状态码说明
8001HSBC交易失败9000电话支付订单已成功发给银行
8002HSBC交易失败9001电话支付订单发送银行失败(订单电话域非法)
8003HSBC交易失败9002电话支付订单发送银行失败(秘密数域非法)
8004HSBC交易失败9003电话支付订单发送银行失败(商户扩展域非法)
8005HSBC交易失败9004电话支付订单发送银行失败(CP保留域非法)
8006HSBC交易失败9100电话支付订单撤销成功
8007HSBC交易失败9101电话支付订单撤销失败(订单号不匹配)
8008HSBC交易失败9102电话支付订单撤销失败(金额不匹配)
8009HSBC交易失败9103电话支付订单撤销失败(交易日期不对)

在银联支付20070129版本的实际应用中,回调获取的交易状态码基本正常,但出现了一些问题就是在回调获取成功交易状态码 “1001” 后,银联继续推送了一些状态码回调,因此在开发中需要进行判断 ,一味的接收并更新状态码,可能无法达到预期的效果,尤其当状态码已经为“1001”的情况下。在实际应用中,除正常状态码反馈,我们遇到了 “2006” 和 “2148” 错误。

从 “2148” 错误可以理解,是用户的重复交易(包括当日和隔日重复交易),因此我们需要在更新数据库前对两次交易码进行比对,如果之前为 “1001” 的可以无视 “2148” 的存在。

另外我们遇到的是 “2006” 错误,从代码表中仅查询出说明为 “出错” ,这个问题我们曾致电银联客服求解,未得到任何有效答案,包括可能出现的情况。关键是,状态码会在获得“1001” 后不定期的时间内(非正常回调周期)推送到回调地址,这就比较难以判断真实发生的情况。

因此对于非“1001”的特殊情况,建立日志表跟踪非常关键,目前来看,对于“2006”的拦截很有必要,实际应用中错误更新的情况明显减少。 

小结

更多的详情请参考如下链接(中国银联开放平台):

https://open.unionpay.com/tjweb/index

在实际与银联客服的沟通中,我们尽量使用官方提供的联系邮件进行沟通,这样效率可以高一些。也便于留档查询,而且如果修改资料(包括更换联系人、修改企业信息等)手续比较繁琐,不是太友好,需要一定的时间,因此在应用上线功能时需要做好准备工作。

以上是本人的一些体会与实践,仅代表个人的一些观点,再次感谢您的阅读,欢迎讨论、指教!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号