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

  

目录

关于银联支付

一些准备

交易状态码的一些分析

小结


关于银联支付

目前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 和一些隐藏字段域 准备提交时使用

<form id="payform" runat="server"><input type="hidden" name="MerId" value="" id="MerId" runat="server"/>
<input type="hidden" name="OrdId" value="" id="OrdId" runat="server"/>
<input type="hidden" name="TransAmt" value="" id="TransAmt" runat="server"/>
<input type="hidden" name="CuryId" value="156" id="CuryId" runat="server"/> 
<input type="hidden" name="TransDate" value="" id="TransDate" runat="server"/>
<input type="hidden" name="TransType" value="0001" id="TransType" runat="server"/> 
<input type="hidden" name="Version" value="" id="Version" runat="server"/> 
<input type="hidden" name="BgRetUrl" value="https://x.x.com/BR.aspx" id="BgRetUrl" runat="server"/>
<input type="hidden" name="PageRetUrl" value="https://x.x.com/PR.aspx" id="PageRetUrl" runat="server"/>
<input type="hidden" name="GateId" value="" id="GateId" runat="server"/>
<input type="hidden" name="Priv1" value="" id="Priv1" runat="server"/>
<input type="hidden" name="ChkValue" value="" id="ChkValue" runat="server"/></form>

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

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

​代码中 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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NumPy算法封装:优化你的科学计算

NumPy算法封装&#xff1a;优化你的科学计算 作为一名资深的Python程序员&#xff0c;我深知NumPy库在科学计算中的重要性。NumPy不仅提供了强大的多维数组对象ndarray&#xff0c;而且封装了一系列高效的算法&#xff0c;极大地简化了我们的编程工作。本文将深入探讨NumPy的算…

IActionResult 介绍

IActionResult 是 ASP.NET Core MVC 中的一个接口&#xff0c;它代表了一个动作&#xff08;Action&#xff09;方法的返回类型。在 ASP.NET Core MVC 中&#xff0c;控制器&#xff08;Controller&#xff09;中的每个动作方法都可以返回一个 IActionResult 或其派生类型的实例…

jdk1.8 List集合Stream流式处理

jdk1.8 List集合Stream流式处理 一、介绍(为什么需要流Stream&#xff0c;能解决什么问题&#xff1f;)1.1 什么是 Stream&#xff1f;1.2 常见的创建Stream方法1.3 常见的中间操作1.4 常见的终端操作 二、创建流Stream2.1 Collection的.stream()方法2.2 数组创建流2.3 静态工厂…

深度学习之DeepMind的AlphaZero

AlphaZero 是 DeepMind 开发的一种人工智能程序,最初在 2017 年推出。它是一种通用的自我学习算法,能够通过自我对弈来学习并掌握各种棋类游戏,比如国际象棋、围棋和将棋。与传统的棋类 AI 不同,AlphaZero 不依赖于人工设置的规则或数据库中的棋局,而是通过自我对弈和深度…

理解进程status的二进制位表示及进程等待(是什么,为什么,怎么办)

信号编号&#xff1a;低7位 状态编号&#xff1a;次低8位 1.子进程退出后会变为僵尸进程&#xff0c;将退出结果写入自身的task_struct结构体中 2.wait/waitpid是一个系统调用->OS可以读取子进程的task_struct 1.为什么要进行进程等待&#xff1f; 1.将子进程&#xff…

C语言 | Leetcode C语言题解之第241题为运算表达式设计优先级

题目&#xff1a; 题解&#xff1a; #define ADDITION -1 #define SUBTRACTION -2 #define MULTIPLICATION -3int* diffWaysToCompute(char * expression, int* returnSize) {int len strlen(expression);int *ops (int *)malloc(sizeof(int) * len);int opsSize 0;for (in…

Mybatis-Plus只将指定字段更新为null

不需要自定义sql&#xff0c;可以使用UpdateWrapper方式更新 Employee employee new Employee(); employee.setId(1L); employee.setOssIds(null); LambdaUpdateWrapper<Employee> lambdaUpdate Wrappers.lambdaUpdate(); lambdaUpdate.eq(Employee::getId, employee.g…

单周期CPU(三)译码模块(minisys)(verilog)(vivado)

timescale 1ns / 1ps //module Idecode32 (input reset,input clock,output [31:0] read_data_1, // 输出的第一操作数output [31:0] read_data_2, // 输出的第二操作数input [31:0] Instruction, // 取指单元来的指令input [31:0] …

Gradle自定义任务:构建自动化的瑞士军刀

Gradle自定义任务&#xff1a;构建自动化的瑞士军刀 Gradle是一个灵活且功能强大的构建系统&#xff0c;它允许开发者通过编写自定义任务来扩展其功能。自定义任务可以帮助自动化复杂的构建步骤&#xff0c;执行特定的脚本&#xff0c;或者与其他系统集成。本文将详细介绍如何…

LeetCode:x的平方根(C语言)

1、问题概述&#xff1a;给你一个非负整数 x&#xff0c;计算并返回 x 的 算术平方根 &#xff0c;返回类型得是一个整数&#xff0c;小数舍弃 2、示例 示例 1&#xff1a; 输入&#xff1a;x 4 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;x 8 输出&#xff1a;…

git stash 命令详解

git stash 描述 git stash 命令用于将当前工作目录中的未提交更改&#xff08;包括暂存区和工作区的更改&#xff09;保存到一个栈中&#xff0c;并恢复工作目录到干净的 HEAD 状态。这样您可以在不提交当前更改的情况下&#xff0c;切换到其他分支或进行其他操作。后续可以通…

前台文本直接取数据库值doFieldSQL插入SQL

实现功能&#xff1a;根据选择的车间主任带出角色。 实现步骤&#xff1a;OA的“字段联动”功能下拉选项带不出表“hrmrolemembers”&#xff0c;所以采用此方法。 doFieldSQL("select roleid from HrmResource as a inner join hrmrolemembers as b on a.id b.resource…

快速排序【示例】

冒泡排序可以说是我们学习的第一个真正的排序算法&#xff0c;并且解决了桶排序浪费 空间的问题&#xff0c;但在算法的执行效率上却牺牲了很多&#xff0c;它的时间复杂度达到了 O(N^2)。假如我 们的计算机每秒钟可以运行 10 亿次&#xff0c;那么对 1 亿个数进行排序&#xf…

【京存】助力《抓娃娃》后期制作!

沈腾马丽合体爆改偷感夫妇&#xff0c;暑期开大贴脸开笑!!西虹市IP爆笑回归!! 困苦的爹&#xff0c;辛劳的妈&#xff0c;破烂的院子&#xff0c;破碎的他。西虹市做大做强的路上怎么把老马家落下了?!!! “汤里没油&#xff0c;兜里没子”的马成钢(沈腾 饰)和春兰(马丽 饰)&…

Timm使用教程

Timm使用教程 kaggle代码链接&#xff1a;https://www.kaggle.com/code/hallo123/timm-tutorial&#xff08;逐步调试运行&#xff09; 官方指导链接&#xff1a;https://huggingface.co/docs/timm/quickstart#quickstart timm&#xff08;Pytorch Image Models&#xff09;项目…

收银系统源码-线上商城diy装修

线下线上一体化收银系统越来越受门店重视&#xff0c;尤其是连锁多门店&#xff0c;想通过线下线上相互带动&#xff0c;相互引流&#xff0c;提升门店营业额。商城商城如何装修呢&#xff1f; 1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网…

使用Django Rest Framework构建API

Django Rest Framework (DRF) 是一个强大且灵活的工具集&#xff0c;用以构建Web API。它基于Django&#xff0c;一个非常流行的Python Web框架。在本文中&#xff0c;我们将深入探讨如何使用DRF来构建一个高效、结构化的API。 目录 使用Django Rest Framework构建API 一、环…

Android 11 Unable to start/bind service

今天在Android11上发现了一个的问题&#xff0c;如果目标Service的进程没有启动&#xff0c;那么无论是bindService还是startService都没有办法拉起指定的Service。 网上查了很多资料如下: 1.目标Service 设置 android:exported"true" 2.目标Service需要声明自定义权…

【SQLServer】如何设计日增几十万数据量的业务分库分表方案

随着公司的业务发展不断的壮大&#xff0c;像一些核心的业务&#xff08;如订单&#xff09;数据量会越来越大&#xff0c;此时就需要考虑分库分表方案来应对业务的发展。今天就来聊聊分库分表的一些设计方案。 1、冷热数据分离方案 在我们业务中有些数据只是最近一段时间使用…

iptables四表五链

Iptables 是 Linux 下的一个强大的工具&#xff0c;用于管理网络规则的集合&#xff0c;称为 netfilter。它定义了四个表和五个链。 四表&#xff1a; filter 表&#xff1a;负责过滤功能&#xff0c;预设的链有 INPUT、FORWARD、OUTPUT。 nat 表&#xff1a;负责网络地址转换…