600d加密滑板包跟佳能400d单反相机加密滑板包有啥区别?emmmm...?

中间包基础知识_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
中间包基础知识
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩10页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢“不给力啊,老湿!”:RSA加密与破解 - 文章 - 伯乐在线
& “不给力啊,老湿!”:RSA加密与破解
加密和解密是自古就有技术了。经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫无意义的数字苦恼,忽然灵光一闪,翻出一本厚书,将第一个数字对应页码数,第二个数字对应行数,第三个数字对应那一行的某个词。数字变成了一串非常有意义的话:
Eat the beancurd with the peanut. Taste like the ham.
主角喜极而泣……
这种加密方法是将原来的某种信息按照某个规律打乱。某种打乱的方式就叫做密钥(cipher code)。发出信息的人根据密钥来给信息加密,而接收信息的人利用相同的密钥,来给信息解密。就好像一个带锁的盒子。发送信息的人将信息放到盒子里,用钥匙锁上。而接受信息的人则用相同的钥匙打开。加密和解密用的是同一个密钥,这种加密称为对称加密(symmetric encryption)。
如果一对一的话,那么两人需要交换一个密钥。一对多的话,比如总部和多个特工的通信,依然可以使用同一套密钥。但这种情况下,对手偷到一个密钥的话,就知道所有交流的信息了。二战中盟军的情报战成果,很多都来自于破获这种对称加密的密钥。
二战中德军的传奇加密机:Enigma
为了更安全,总部需要给每个特工都设计一个不同的密钥。如果是FBI这样庞大的机构,恐怕很难维护这么多的密钥。在现代社会,每个人的信用卡信息都需要加密。一一设计密钥的话,银行怕是要跪了。
对称加密的薄弱之处在于给了太多人的钥匙。如果只给特工锁,而总部保有钥匙,那就容易了。特工将信息用锁锁到盒子里,谁也打不开,除非到总部用唯一的一把钥匙打开。只是这样的话,特工每次出门都要带上许多锁,太容易被识破身份了。总部老大想了想,干脆就把造锁的技术公开了。特工,或者任何其它人,可以就地取材,按照图纸造锁,但无法根据图纸造出钥匙。钥匙只有总部的那一把。
上面的关键是锁和钥匙工艺不同。知道了锁,并不能知道钥匙。这样,银行可以将“造锁”的方法公布给所有用户。每个用户可以用锁来加密自己的信用卡信息。即使被别人窃听到,也不用担心:只有银行才有钥匙呢!这样一种加密算法叫做非对称加密(asymmetric encryption)。非对称加密的经典算法是RSA算法。它来自于数论与计算机计数的奇妙结合。
为了了解RSA加密,请听一个卧底的自白:
我是潜伏在龙凤大酒楼的卧底。想让下面信息以加密的方式发送到总部:
A CHEF HIDE A BED
厨子藏起来了一张床!这是如此的重要,需要立即通知总部。千万重要的是,不能让反革命的厨子知道。
第一步是转码,也就是将英文转换成某个对应的数字。这个对应很容易建立,比如:
将上面的信息转码,获得下面的数字序列:
A CHEF HIDE A BED
A CHEF HIDE A BED&1 3856 8945 1 254
这串数字完全没有什么秘密可言。厨子发现了这串数字之后,很容易根据数字顺序,对应字母表猜出来。
为了和狡猾的厨子斗智斗勇,我们需要对这串数字进一步加密。使用总部发给我们的锁,两个数字:3和10。我们分为两步处理。
第一步是求乘方。第一个数字是3,也就是说,总部指示我们,求上面数字串的3次方:
原字符串: 1
三次乘方: 1
27 512 125 216 512 729
第二步是求余数。第二个上锁的数字是10,将上面每个三次乘方除以10,获得其余数:
余数: 1 7 2 5 6 2 9 4 5 1 8 5 4
将这串数字发回总部。中途被厨子偷看到,但一时不能了解其中的意思。如果还是像刚才一样对应字母表的话,信息是:
AGBEFBIDEAHED
这串字母完全不包含正常的单词。
信息到了总部。总部开始用神奇的钥匙来解读。这个钥匙是3。(偷偷告诉你的,别告诉厨子。)
(这里钥匙不小心和之前锁中的一个数字相同。这只是巧合。)
解锁过程也是两步。第一步求钥匙次的乘方,即3次方。第二步求它们除以10(锁之一)的余数。
加密信息:1
三次乘方:1 343
64 (这里用的是钥匙的“3”)
除十得余:1
正是我们发送的信息。对应字母表,总部可以立即知道原来的信息。
再次强调,为了演示方便,选用了简单的锁和钥匙。锁和钥匙只是凑巧相同。为此,我们做一个小练习。
练习:总部新公布出来的锁是2987(次乘方)和3937(为除数)。
1) 作为特工,用上面的算法为信息加密(你可能需要一些编程来计算,尝试用?)。
猜到钥匙是什么了呢?不是上面两个数字中的任何一个,而是143!
2) 作为值班人员,验证143是钥匙,可以解密信息。
为了简便,你可以只检验一个简单的信息,比如“IE”。
下面是我根据这个练习写的一个Python小程序。这里的转码用的是ASCII编码标准,而不是上面的A对应1,B对应2。
# By Vamei
#==== Agent ========
# coding covert: string to number
# By ASCII convention
def convert(original):
return map(ord, original)
# the input is a list of integers
def encrypt(input_list):
f = lambda x: (x**
return map(f, input_list)
#==== Headquarter =====
# the input is the result of the encrypt function
def decrypt(encrypted_list):
f = lambda x: (x**143)%3937
return map(f, encrypted_list)
# convert numbers back to a string
def inv_convert(decrypt_list):
f = lambda x: str(unichr(x))
result = map(f, decrypt_list)
return "".join(result)
message = "Go to hell!"
secret = encrypt(convert(message))
print(secret)
public = inv_convert(decrypt(secret))
print(public)
12345678910111213141516171819202122232425262728293031
# By Vamei&#==== Agent ========# coding covert: string to number# By ASCII conventiondef convert(original):&&&&return map(ord, original)&# the input is a list of integersdef encrypt(input_list):&&&&f = lambda x: (x**2987)%3937&&&&return map(f, input_list)&#==== Headquarter =====# the input is the result of the encrypt functiondef decrypt(encrypted_list):&&&&f = lambda x: (x**143)%3937&&&&return map(f, encrypted_list)&# convert numbers back to a stringdef inv_convert(decrypt_list):&&&&f = lambda x: str(unichr(x))&&&&result = map(f, decrypt_list)&&&&return "".join(result)&# Testmessage = "Go to hell!"secret = encrypt(convert(message))print(secret)public = inv_convert(decrypt(secret))print(public)
费马与欧拉
发觉自己被愚弄了,厨子很生气,后果很严重。厨子发奋看了书,知道了这个加密方法叫RSA,是三为发明人 R. Rivest, A. Shamir和L. Adelman名字首字母合起来的。RSA算法是1977年发明的。全称是RSA Public Key System。这个”Public Key”是公共密钥,也就是我们上面说的锁。再读下去,厨子大窘。这个1977年的,现代计算机加密的RSA算法,居然源于17世纪。
1. 费马小定律
RSA的原理借助了数论中的“欧拉定理”(Euler’s theorem)。17世纪的费马首先给出一个该定理的特殊形式,即“费马小定理”:
p是一个正的质数,a是任意一个不能被p整除的整数。那么,\(a^{p-1}  1\)能被p整除。
我们并不需要太深入了解费马小定理,因为等下就会看到这个定理的“升级版”。但这个定理依然很美妙,它优美的得到乘方和整除的某种特殊关系。使用一个例子来说明它。比如\(p = 7?a = 3\)。那么费马小定律表示,\(3^{ 7  1}  1\)可以被7整除。
事实上,上面的数字计算得到\(3^6  1 = 728\),它确实可以被7整除。
练习:尝试一个其它的例子,比如\(p = 5? a = 4\),验证费马小定律是否成立。
*** 数学小贴士:
1) 除 (divide),商和余数:两个整数相除,有一个为整数的商,和一个余数。比如\(10/3 = 3, ,?1\)。我们用一个特别的方式记录这一叙述:
\(10 equiv 1 (mod, 3)\)
也可以写成另一种方式:
\([10]_3 = [1]_3\)
这一表述方式与“10除以3,得3余1”这样的方式并没有什么区别。但采用标准的数学方式更容易和别人交流。
如果我们知道:
\([a]_n = [b]_n\)
那么存在某个整数t,且:
\(a = nt + b\)
2) 整除 (divisible):当一个整数a除以另一个整数b,余数为0时,那么我们说a可以被b整除。比如说,4可以被2整除。即
\([4]_2 = [0]_2\)
3) 质数 (prime number):一个质数是只能被\( pm 1\)和这个数自身整除的整数(不包括\( pm 1\))。比如\(2?3?5?7?11?13\)等等。
费马是一名律师,也是一名业余数学家。他对数学贡献很大,堪称“业余数学家之王”。比如他和帕斯卡的通信算是概率论的开端。还有“费马大定理”,或者称为“费马猜想”。费马有在书边写注释的习惯。他在页边角写下了费马猜想,并说:
我发现了一个美妙的证明,但由于空白太小而没有写下来。
费马自己的证明没有再被发现。“费马猜想”的证明是300多年后,以现代数学为工具证得的,而这些数学工具在费马的时代是不存在的。这导致现代的数学家怀疑费马是不是在吹牛。费马小定理是费马的另一个定理。在费马那里,也还是个猜想。证明要等到欧拉。
程序员们:注释要完整啊!
2. 欧拉定律
时间流过一百年。欧拉是18世纪的瑞典数学家。这位数学巨人写了75本数学专著,几乎把当时所有的数学领域都征服了一遍。欧拉后来被叶卡捷琳娜二世邀请到俄国。据说,无神论者狄徳罗造访俄国,他宣称上帝并不存在,靠雄辩击败了整个俄国宫廷。欧拉曾醉心神学,对上帝很虔诚。欧拉看不下去了,上前说,“先生,\(e^{ipi} + 1= 0\),所以上帝存在。请回答!” 狄徳罗败给这个问题,灰溜溜的走了。
(这个传说的可信度不高,因为狄徳罗本人也是一位颇有造诣的数学家。)
欧拉定理(Euler’s theorem)是欧拉在证明费马小定理的过程中,发现的一个适用性更广的定理。
首先定义一个函数,叫做欧拉Phi函数,即\(phi(n)\),其中,n是一个正整数。
\(phi(n)\) = 总数(从1到n-1,与n互质的整数)
比如5,那么1,2,3,4,都与5互质。与5互质的数有4个。\(phi(5) = 4\)
再比如6,与1,5互质,与2,3,4并不互质。因此,\(phi(6) = 2\)
对于一个质数p来说,它和1, 2, 3, …, p – 1都互质,所以\(phi(p) = p  1\)。比如\(phi(7) = 6, phi(11) = 10\)
*** “互质”的数学小贴士:
1) 因子 (factor):每个整数都可以写成质数相乘的形式,每个这样的质数称为该整数的一个因子。
2) 互质 (relative prime):如果两个整数没有公共因子,这两个质数互质。
欧拉定理叙述如下:
如果n是一个正整数,a是任意一个非0整数,且n和a互质。那么,\(a^{phi(n)}  1\)可以被n整除。
由于质数p有\(phi(p) = p  1\)。因此,从欧拉定理可以推出费马小定理。我们可以只使用欧拉定理,把费马小定理抛到脑后了。我们用一个例子简单的检验欧拉定理。如果n是6,那么\(phi(6) = 2\)。让a是11,和6互质。\(11^2  1\)为120,确实可以被n,也就是6整除,符合欧拉定理。
数学中还有一个关于Phi函数的推论:
m和n是互质的正整数。那么,\(phi(mn) = phi(m) phi(n)\)
下面我们要进入实质的证明。除了上面的(1)和(2)推论,还需要提前说明一个问题,即:
\([ab]_n = [a]_n[b]_n\)
证明:假设a和b除以n的余数为\(c_1, c_2\)。a和b可以写成\(a = nt_1 + c_1, b = nt_2 + c_2\)。那么,\(ab = n^2t_1t_2 + nt_1c_2 + nt_2c_1 + c_1c_2\)。因此ab除以n的余数为\(c_1c_2\)。即\([ab]_n = [a]_n[b]_n\)。
根据此可以推论,\([a^m]_n = [a]_n^m\)。
演一出叫做“西游记”的大戏,选角开始:
先选择两个质数p和q,分别是沙和尚和白龙马。让\(n = pq\),n是唐僧。一路向西,唐僧靠的是沙和尚和白龙马出力:一个背行李,一个驮人。
而\(k = phi(n) = (p  1)(q  1)\)。这里使用了(2)以及“质数p的Phi函数值为p-1”。k是八戒,也就是Phi(唐僧),就是唐僧的一个跟屁虫。
选择任意d,并保证它与k互质。d是观音。观音姐姐在高老庄,真的是把八戒给“质”了一把。
取整数e,使得\([de]_k = [1]_k\)。也就是说\(de = kt + 1\),t为某一整数。e是悟空,横行无忌。
我们记得公开的用来上锁的两个数字,它们分别是悟空e和唐僧n。悟空威力大,负责乘方。唐僧太唠叨:一切妖怪见到它,就变成了余数。悟空和唐僧合作,就把世界搞乱了。
总部的观音姐姐d看不下去了。观音姐姐威力也大,也是乘方。再逼着唐僧重新唠叨。世界就恢复了。
善哉,善哉!
我们看一下这一魔幻大片“西游记”的现实主义原理。根据欧拉定理(1),对于任意z,如果z与n互质,那么:
\([z^{phi(n)}]_n = [z^k]_n = [1]_n\)
\([z^{de}]_n = [z^{kt + 1}]_n = [(z^k)^tz]_n = [z]_n\)
上面主要使用了\(de = kt + 1\)以及(3)。也就是说:
\([z^{de}]_n = [z]_n\)
根据(3)的推论,有
\(([z^e]_n)^d = [z]_n\)
妖怪z,经过e和d的各一道,又变回了妖!上面过程中,悟空e和观音d忙得不亦乐乎,唐僧n就在一旁边唠叨边打酱油了。
这一等式,也正是我们加密又解密的过程 (加密: 悟空次方 + 唐僧唠叨。解密: 观音次方 + 唐僧唠叨)。悟空和唐僧是公钥,扔出去亮相。观音是私钥,偷偷藏起来,必要的时候才出来。
(上面都默认余数是最小正余数,也就是说,10除以3的余数为1,而不是4。尽管4也可以算是10的余数,即\([4]_3 = [10]_3\)。)
姐姐,饶了我吧。
3和8两个妖怪见到唐僧5,都被唠叨成了余数3。这样就观音姐姐就算法力无边,还是没法还原。为了让唐僧求余的时候,不会把数字弄混了,RSA算法要求所有妖怪z小于唐僧n。为了对足够多的字符转码加密,n必须大过最大的妖怪。
但唐僧n大更重要的原因是要保护马仔。想破解,必须找到观音。回顾我们选择角色的过程。我们可以这样破解:唐僧n是公开的,1) 先找到它的隐藏手下沙和尚和白龙马。2) 沙和尚和白龙马知道了,那么二师兄k就保不住了。3) de = kt + 1,即找到一个e,可以让de – 1被k整除。观音姐姐就找到了。
上面的整个破解过程中,最困难的是第一步,即找到两个隐藏的打手。通常,p和q都会选的非常大,比如说200位。这导致唐僧n也非常大,有400位。寻找一个400位数字的质数分解并不容易,我们要做的除法运算次数大约为\(sqrt{10^{400}}/2\)。这是\(10^{199}\)次除法运算!天河2号每秒浮点运算是\(10^{16}\)级别。那么,找到隐藏打手的工作,大约需要\(10^{174}\)年……。这个活,看来只能佛祖干了。
练习 如果唐僧不够大的话,马仔就危险了。想想之前的厨子,知道悟空是3,唐僧是10。隐藏打手是谁? 八戒呢? 观音呢?
总之,带头大哥不够“罩”的话,团伙就要被一窝端了。
正如我在“”中提到的,数学可以是程序员军火库中有力的武器。加密、解密这一事关IT安全的大课题,却和数论这一纯粹数学学科发生奇妙的关系。RSA算法的数学基础在于欧拉定理。这一诞生了几百年没有什么实用性的数学理论,却在网络时代,找到自己的栖身之处。
RSA算法是非对称算法。公开的加密方式,私有的解密方式。RSA安全的关键在于很难对一个大的整数进行因子分解。下一次,如果看到RSA被破解之类的消息,卧底必须大喊一声:“不给力呀,老湿!”
这篇文章已经充分的准备了数学,但(1), (2), (3)还可以深挖下去。如果这篇文章收获够多“赞”,就准备写一个续篇。讨论一下欧拉定理的证明,以及一些特殊情况下的RSA破解。
可能感兴趣的话题
教科书式的RSA是一种连CPA安全级别都达到不了的,有兴趣可以拜读 Introduction to Modern Cryptogaphy
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线欢迎来到作文网!
作文网订阅号
(www_zuowen_com)一手好文 一生受用
中学生考试升学必备
& 学滑板_400字
扫描二维码,在手机上浏览
学滑板_400字
???? 第一次学滑板可不容易了,我发现滑板只有两个轮子,我想:这滑板肯定很难学,开始学习了!
???? 刚开始的时候,我很紧张,爸爸说:“先把左脚放上去。”我放上去了,爸爸又说:“左脚在滑三步,再站上去。”我滑了三步,但是爸爸说的站上去我不敢站上去,怎么办呢?爸爸看见了就扶我了一下,爸爸说:“现在我们就学到这里。”我说:“爸爸,我还想试一试怎么站上去。”爸爸说:“你真是一个好学的好孩子,好,我们再试一下。”第二次我更有自信了!我站了上去了,滑了三步,我就站上去了。这次,我终于成功了!可是,我还没来得及高兴,我又想学怎么样滑。爸爸说:“好吧。”爸爸又说:“要想学怎么样滑,先学会两只脚不要动,只要腿动就可以了。”爸爸说的每一个字我都牢牢的记着。我先做刚刚学过的站上去,再滑三步。我开始滑,刚开始滑的时候还好,后来,我忽然摔了一跤,痛死我了。我没放弃,我还是继续滑,终于有一次我成功了。
???? 我己经学会了滑滑板。&&&&五年级:刘奇作文网专稿 未经允许不得转载
不够精彩?
我要点评:学滑板_400字
的其他文章
写作达人推荐13324人阅读
Java银联在线支付(3)
直接把银联的联调测试文档贴来了
中国银联股份有限公司规范性文档
中国银联股份有限公司 发布
中国银联全渠道系统商户接入
测试指引-银联网关支付产品
版本修订信息
修改文档格式,新增测试地址与测试卡号等信息
网关产品主要适用于持卡人在商户网站B2C购物支付场景,持卡通过点击银联在线支付logo,并在银联在线支付网关完成支付信息录入,最终完成支付。
从PC端发起的交易为WEB网关支付交易,从移动端发起的交易为WAP网关支付交易以及APP网关交易。
首次接入测试先了解前台交易与后台交易的区别,可参考业务术语描述,随后可从开发步骤向导开始阅读,了解开发过程中的具体操作步骤,此章节中提到的签名机制请参照。开发过程中需要用到的测试与生产交易地址请参考配置文件。交易测试卡号请参考。如开发与测试过程中遇到了解决不了的问题可在FAQ中查找解决方案,也可通过中的方法来获取测试支持。
《中国银联全渠道系统商户接入测试指引》文档是面向具有一定的网站开发能力的网站开发、维护和管理人员。
具体交易的接口、报文规范、响应码说明,请阅读开发包中接口文档。
参与方描述
指加入银联网络,与银联签订《银联卡无卡支付业务合作协议》等协议开展银联无卡支付以及行业类应用业务的商户。
指加入银联网络,与银联签订《银联卡无卡支付业务合作协议》开展银联无卡支付收单业务的境内成员机构。
1.3&& 业务术语
通过 HTTP/HTTPS协议把需要传输的数据发送给接收方的过程。
通过 HTTP/HTTPS协议把需要传输的数据返回给接收方的过程。
服务器后台通知。中国银联全渠道系统根据得到的数据处理完成后,全渠道系统主动发起通知给商户的网站,同时携带处理完成的结果信息反馈给商户网站。
前台类交易
主要指用户需要参与交互的支付类交易,包括消费、预授权/担保消费交易。
后台类交易
主要指用户不需要参与交互,由商户后续发起的交易,包括消费撤销、退货、预授权撤销、预授权完成、预授权完成撤销等交易。
全渠道系统/ACP
中国银联全渠道系统,是整合了银联在线和银联移动支付功能的新交易处理系统。
接入网关支付产品的商户为选测。
必测是指提交了入网申请表、必须测试通过才能投产上线的,选测是指不需要入网申请表可以直接投产上线的,是否在测试环境测试由商户自己决定。
收单机构接入
商户接入(接入产品为除无跳转支付、后台直接支付、代收和便民缴费以外的其他产品)
商户接入(接入产品为无跳转支付、后台直接支付、代收和便民缴费)
1.4.2 支持获取途径
业务问题详见开发包中《中国银联全渠道系统业务运营服务指引》相关人员联系方式。
测试问题支持人员联系方式详见下表:
收单机构可联系银联服务专员,并且在提交了入网申请后银联服务专员会主动联系商定窗口并提供测试支持服务
邮箱(邮件标题为:商户号+商户名称+联系QQ),提供商户号和联系QQ,银联测试服务专员会将商户接口人的联系QQ加入到银联统一服务QQ中提供支持服务(商户也可以通过服务电话021-9来提供自己的商户号和联系QQ)
银联市场服务代表在为商户提交了入网申请后,会有银联服务专员主动联系(一般为QQ)商定联调窗口并提供测试支持服务
服务邮箱和服务电话仅供选测类商户联系测试支持人员,并且邮箱和电话不直接反馈支持问题,支持服务均在银联统一服务QQ中提供。
2&&&& 联调步骤向导
商户或收单机构全渠道系统开发包和本测试指引进行接入开发。
本步骤可选。开发完成后可通过银联提供的联调测试环境进行联机接口验证测试,测试地址参考测配置文件说明。
在测试环境完成联调测试后,由银联业务运营人员(联系方式参见《中国银联全渠道系统业务运营服务指引》)引导协助商户完成生产交易证书的申请,商户将接口更新部署到生产环境和银联生产环境完成对接。
测试地址详见配置文件描述。
3.2& 测试卡号
平安银行借记卡:0000018
证件号:218366
密码:123456
姓名:全渠道
平安银行贷记卡:0000
姓名:互联网
证件号:218366
有效期:1711
消费类交易(前台类)
持卡人进支付时,由银联或发卡行展示支付页面,引导持卡人完成后续支付的交易。
前台资金类交易
消费撤销类交易
指因人为原因而撤销已完成的消费;消费撤销必须是撤销CUPS当日当批的消费
后台资金类交易
退货类交易
对于已结算的消费交易,通过该交易发起退款交易。
后台资金类交易
交易状态查询类交易
对未收到应答的或交易状态未知的交易,可通过该交易进行查询。
查询类交易
文件传输类交易
联机下载对账文件等文件下载类交易
后台非资金交易
预授权类交易
预授权交易用于受理方向持卡人的发卡方确认交易许可。受理方将预估的消费金额作为预授权金额,发送给持卡人的发卡方。
前台或后台资金类交易
授权撤销类交易
对已成功的预授权交易,在结算前使用该交易进行取消。
后台资金类交易
授权完成类交易
对已批准的预授权交易,用该交易进行支付结算;
后台资金类交易
授权完成撤销类交易
预授权完成撤销交易必须是对原始预授权完成交易的全额撤销。预授权完成撤销后的预授权仍然有效。
后台资金类交易
后台非资金类交易
电子现金非指定账户圈存
后台资金类交易
电子现金指定账户圈存
后台资金类交易
圈存脚本通知
后台资金类交易
IC卡脱机消费通知
后台资金类交易
产品介绍详见《网关支付产品入网材料》包中的《银联全渠道系统网关产品.pptx》。
从技术实现方式上交易大致可划分为前台类交易、后台资金类类交易、后台非资金类交易、查询类交易、批量类交易。本节将描述各种交易的大致流程。
所有报文域以key/value的表单方式通过HTTP Post到银联全渠道系统支付平台。对于前台类需要持卡人交互的交易,交易通过异步跳转的方式完成,对于涉及资金的前台类交易,银联全渠道系统支付平台可通过商户后台通知地址向商户发送后台通知。对于后台类涉及资金清算类无需持卡人交互的交易,交易结果异步响应给商户,商户通过接受后台通知或者发起交易查询获取交易处理结果。对于后台类非资金类无需持卡人交互的交易,交易结果同步响应给商户。对应交易状态查询类交易,交易结果同步响应给商户。
前台类交易是指交易请求方(如商户、收单机构)与ACP之间的交易信息通过用户浏览器进行传递的交易,是一种异步的、需要持卡人参与完成的交易类型。对于涉及金额的前台类交易(即交易请求中有金额字段)ACP系统均会给请求方后台通知(后台通知报文要素同前台应答的要素),请求方也必须实现接收后台通知。对于交易状态未知的交易请求方必须发起交易状态查询交易。
1.&&&&& 每个交易需要的报文要素是不一样的,具体每个交易需要的要求,请参考接口文档;
2.&&&&& 图1-1中第8步前台应答返回的URL为请求报文中的“frontUrl”字段指定的URL;
3.&&&&& 图1-1中第7步后台应答返回的URL为请求报文中的“backUrl”字段指定的URL;
后台类资金类交易是指交易请求方(如商户、收单机构),将交易信息(涉及资金清算的交易)直接通过请求方服务器发送至ACP服务器的交易方式。是一种异步的、不需要持卡人参与完成的交易类型。因涉及资金的清算,ACP系统均会给请求方后台通知(后台通知报文要素同前台应答的要素),请求方也必须实现接收后台通知。对于交易状态未知的交易请求方必须发起交易状态查询交易。
1.&&&& 每个交易需要的报文要素是不一样的,具体每个交易需要的要求,请参考开发包中接口规范文档;
2.&&&& 图1-3中第4步中的应答仅代表该笔后台请求交易已经受理,不代表全部处理成功;是否处理成功,需通过接受后台通知或者发起“交易状态查询交易”进行查询;
3.&&&& 第5步后台应答返回的URL为请求报文中的“backUrl”字段指定的URL。
后台类非资金类交易是指交易请求方(如商户、收单机构)将交易信息(不涉及资金清算的交易)直接通过请求方服务器发送至ACP服务器的交易方式。后台非资金类交易均为同步短连接方式,不需要持卡人参与完成的交易类型。若通讯超时,则交易请求方可以重复发起交易。
查询交易是指交易请求方(如商户、收单机构)将交易查询报文信息直接通过请求方服务器发送至ACP服务器的交易方式。查询类交易均为同步短连接方式,不需要持卡人参与完成的交易类型。,若通讯超时,则交易请求方可以重复发起交易。
5&&&&开发步骤向导
1. 以表单的方式组装要发送给银联全渠道系统的数据对象(包括IC卡交易信息域,VPC交易信息域,风控信息域等各域)。每个域填写方法可参考文档开发包中接口文档。
2. 将组装好的数据排序好并用&连接后签名,生成signature字段,可使用插件包提供的方法“SDKUtil.sign(未签名报文, 报文字符集);”具体签名机制请参照第8章节。可通过调用插件包提供的签名方法来完成签名。
3. 把所有要发送给银联全渠道系统的域包括signature和signMethod,组成表单以POST方式送给银联全渠道系统前台交易的地址。
4. 交易完成后,银联全渠道系统将把交易结果分别返回通知到商户通的前台应答地址和后台应答地址上,商户接收到交易通知后可分别调用“SDKUtil.convertResultStringToMap(应答报文);”方法进行应答报文解析,和“SDKUtil.validate(应答报文, 报文字符集)”方法进行签名验证。
1. 商户按照不同的交易组装报文,交易报文请参考开发包中接口规范。
2. 把组装好的数据排序好并用&连接后签名,生成signature字段,可使用插件包提供的方法“SDKUtil.sign(未签名报文, 报文字符集);”,具体签名机制请参照第7章节。
3. 把所有数据,包括signature和signMethod用key=value并用&符号链接的方式组装成字符串,通过插件包提供的方法进行发送。
4. 接收到返回报文后,通过插件包提供的方法进行验证签名,调用“SDKUtil.convertResultStringToMap(应答报文);”方法进行应答报文解析,和“SDKUtil.validate(应答报文, 报文字符集)”方法进行签名验证。
1. 商户按照不同的交易组装报文,交易报文请参考开发包中接口规范。
2. 把组装好的数据排序好并用&连接后签名,生成signature字段,可使用插件包提供的方法“SDKUtil.sign(未签名报文, 报文字符集);”,具体签名机制请参照第8章节。
3. 数据,包括signature和signMethod用key=value并用&符号链接的方式组装成字符串,通过插件包提供的方法进行发送。
4. 返回报文后,通过插件包提供的方法进行验证签名,调用“SDKUtil.convertResultStringToMap (应答报文);”方法进行应答报文解析,和“SDKUtil.validate (应答报文, 报文字符集)”方法进行签名验证。
5.4&&单笔查询交易接口开发步骤
1.照单笔查询交易的规范组装报文,交易报文请参考开发包中接口文档
2.好的数据排序好并用&连接后签名,生成signature字段,可使用插件包提供的方法“SDKUtil.sign(未签名报文, 报文字符集);”,具体签名机制请参照第7章节。
3.数据,包括signature和signMethod用key=value并用&符号链接的方式组装成字符串,通过SDK提供的方法进行发送。
4.返回报文后,通过插件包提供的方法进行验证签名,调用“SDKUtil.convertResultStringToMap(应答报文);”方法进行应答报文解析,和“SDKUtil.validate(应答报文, 报文字符集)”方法进行签名验证。
5.5&&文件传输类交流开发步骤
文件的格式,参照接口文档,文件名,文件头,文件,文件以inputfilepost方式提交到服务器,以文件流的方式获取字节流信息,先需要解压缩文件内容的byte[]数组,用SecureUtil.deflater方法,后BASE64编码,用SecureUtil.base64Encode方法,返回,最终以字符串方式提交到处理服务器,服务器响应报文里有filecontent字段,先用SecureUtil.base64Decode解码,后用SecureUtil.inflater方法解压缩,返回byte[],接下来就可以通过文件输出的方法,生成文件。
文件转字符串
前台交易,商户或机构需要提供两个地址frontUrl和backUrl(通过报文域上送),分别接收银联全渠道系统的前台应答和后台通知。前台应答是通过浏览器,用户点击“返回商户”按钮发送给商户的,后台通知是银联全渠道系统异步把交易状态为成功的交易通知给商户。具体详细关于前台应答和后台通知请参照接口文档。不管收到前台应答还是后台通知,商户都需要验签。
在交易结束后,银联全渠道系统通过后台通知将交易结果发给商户或机构。后台通知以标准的HTTP协议的POST方法向商户的后台通知URL发送,并设置一个超时计时器,通常设置为10s。商户在收到通知,解析后应立即返回应答报文。仅当POST返回码为200时,才认为商户已经成功收到并且能正确解析后台通知,其他返回码则被认为通知失败。如果计时器超时,没有收到应答报文,也被认为通知失败。
第一次通知失败后,会通过退避策略进行通知重发,最多发送五次。由于网络等原因,商户会收到重复的后台通知。
商户或机构在接收到银联全渠道系统的前台应答或后台通知后,首先必须验证该消息的签名,然后根据订单号等信息,更新相应系统中的订单支付状态。前台通知因存在用户支付完毕后直接关闭浏览器的情况,而不能保证每次都送达。后台通知由银联银联全渠道系统通知服务器主动发起,若发送失败,银联全渠道系统会继续发送,一共发送5次,若还是发送失败,也不继续发送。商户在未收到后台应答,建议请求20分钟后主动发起交易查询交易来查询交易状态。
另外,退货等后台类交易(若有开发)是异步过程,银联全渠道系统收到后台类交易请求后会回复一个请求已接受的应答。在交易处理后,银联全渠道系统会发送后台通知给商户,建议商户无论是否收到后台通知,在请求2分钟后主动发起交易查询交易来查询交易状态。
注:银联全渠道系统只针对成功交易会发送后台通知,失败交易不发送后台通知。因此,如未收到后台通知,建议商户主动发起交易查询交易,查询交易状态。
另外后台通知接收需要注意以下几点:
1.后台通知采用POST的方式来发送,POST的地址是商户上送的backUrl域,backUrl域需要保证该地址的正确性。
2.后台通知中,只要是非通信类错误(如通信超时,无法解析域名,没有路由等),都认为商户已经收到,不会进行重发。如果商户因为非通信类问题没有及时收到应答(比如应用切换等情况),或者收到应答时处理失败(处理逻辑的验证应该在测试环境下已经验证通过),商户应该对没有及时收到应答的交易通过查询接口来查询该交易的状态。
3.确定通知成功由以下几个要素
a)&&&& 通知URL填写正确(商户必须要保证URL的正确性)
b)&&&& 通信正确(通信失败时必须重发)
c)&&&&& 商户能够正确验签(测试环境要测试通过)
因此,只要生产上能够证明通信是正确的,即可认为通知成功。如果商户端因为某种特殊原因,没有正确处理后台通知,可以通过交易查询接口来纠正交易的状态。
7&&&&查询接口说明
已收到后台通知,则不需要发起查询。
2.&&&&& 在订单发起后半小时未收到后台通知,则需要发起查询。
3.&&&&& 具体的查询交易开发方法可。
1.&&&&& 如果已收到后台通知,则不需要发起查询。
2.&&&&& 在订单发起后半小时未收到后台通知,则需要发起查询。
3.&&&&& 具体的查询交易开发方法可参见第4.5章节。
后台交易采用同步机制,交易结果同步返回。
1.&&&&& 如果已接收到明确的交易结果应答,则不需要发起查询。
2.&&&&& 前台交易,若未接收到全渠道系统的明确交易应答时需发起单笔查询交易,查询明确的交易结果。
3.&&&&& 后台交易,若出现交易超时的情况则需要发起单笔查询交易,查询明确的交易结果。
8&&&&签名机制
对于报文的签名处理机制如下:
首先,对报文中出现签名域(signature)之外的所有数据元采用key=value的形式按照名称排序,然后以&作为连接符拼接成待签名串。其次,对待签名串使用SHA-1算法做摘要,并转成16进制,再使用银联颁发给商户的商户RSA私钥证书对摘要做签名操作(签名时算法选择SHA-1)。最后,对签名做Base64编码,将编码后的签名串放在签名(signature)表单域里和其他表单域一起通过HTTP Post的方式传输给银联全渠道系统支付平台。
对于报文的验签处理机制如下:
首先,对报文中出现签名域(signature)之外的所有数据元采用key=value的形式按照名称排序,然后以&作为连接符拼接成待签名串。其次,对待签名串使用SHA-1算法做摘要,并转成16进制,再使用商户入网时银联提供的银联全渠道系统支付通讯RSA公钥证书对摘要和报文中的签名信息做签名验证操作。
对于持卡人密码银联全渠道系统支付平台使用RSA公钥证书对ANSI X9.8带主帐号格式的PIN加密并做Base64编码后传输,以保障密码的安全性。依据商户可选配置,对于CVN2、有效期、卡号使用RSA公钥证书分别做加密并Base64处理。
对于敏感信息银行卡验证信息及身份信息部分内容,采用Base64编码后传输,以做数据屏蔽。
对于文件内容,使用DEFLATE压缩算法压缩后,Base64编码的方式传输,压缩编码后的内容参与签名摘要运算。
1. 商户签名证书:商户接入银联支付后会收到两码,通过在CFCA网站下载pfx证书。此证书用于请求报文的签名。测试证书随开发包提供。
2. 商户的密码加密证书:商户会收到一个密码加密的公钥证书,此证书用于对银行卡密码的加密、cvn2、有效期及卡号等的加密。测试证书随开发包提供。
3. 商户的交易报文验证签名证书:验证银联支付返回的报文是否合法。测试证书随开发包提供。
1.&&&& 登入CFCA官网网址:,点击“生产系统证书下载”;
2.&&&& 在生产证书下载选项中点击 à 证书下载;
3.&&&& 首次下载证书,请按照页面提示安装相应程序,以保证证书顺利下载;
4.&&&& 点击左侧“用户证书下载”,并点击“接受此协议”;
5.&&&& 输入CFCA提供的两码(用户参考号、用户授权码),制证方式默认,软件CSP默认,点击下
6.&&&& 完成下载操作后,页面会出现下载成功的提示。下载的证书自动存放在IE中。
证书导出流程
1. 打开浏览器,点选 工具 à Internet选项 à 内容 à 证书;
2. 以商户号:001为例说明整个导出流程
在个人证书中找到相对应的证书,点选导出;
3.跳出证书导出向导对话框,点击下一步;
4.&&&&& 选择导出私钥(如需要在服务网站上传证书公钥,请选择第二个选项以下载公钥证书,后续操作选择默认方式,再选择路径导出),点击下一步;
5.&&&&& 导出文件格式默认点击下一步;
6.&&&&& 键入证书私钥,建议不要超过6位;
7.&&&&& 指定导出证书的文件名,并选择目录存放证书,点击下一步;
8.&&&&& 点击完成,证书导出成功。
11&&&&&&&&开发包插件使用
插件包只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。代码仅供参考
插件以JAR包的形式提供给商户,工程名称为upacp_sdk_java。
1.& log4j.properties:插件的日志机制使用log4j实现,可将提供的配置文件合并到项目的log4j配置中,并根据环境需要修改日志路径;
2.&acp_sdk.properties:测试环境参数配置文件(不含手机控件支付)
具体配置:
######& SDK 配置文件配置文件中日志和证书的存放路径根据实际情况配置,交易地址和证书根据测试环境、生产环境配套配置#####
#SDK 日志目录配置
##########################交易发送地址配#############################
######(以下配置为认证环境:入网测试环境用,生产环境配置见文档说明)#######
##前台交易请求地址
=https://101.231.204.80:5000/gateway/api/frontTransReq.do
##&app&交易请求地址
##https://101.231.204.80:5000/gateway/api/appTransReq.do
##后台交易请求地址
=https://101.231.204.80:5000/gateway/api/backTransReq.do
##后台交易请求地址(若为有卡交易配置该地址)
#https://101.231.204.80:5000/gateway/api/cardTransReq.do
##单笔查询请求地址
=https://101.231.204.80:5000/gateway/api/queryTrans.do
##批量交易请求地址
=https://101.231.204.80:5000/gateway/api/batchTrans.do
##文件传输类交易地址
=https://101.231.204.80:9080/
########################签名证书配置################################
######(以下配置为测试环境:入网测试环境用,生产环境配置见下述文档说明)#######
##签名证书路径
=d:\\certs\\001_acp.pfx
##签名证书密码
##签名证书类型
##########################加密证书配置################################
##密码加密证书路径
=d:\\certs\\encrypt.cer
3.acp_sdk.properties:生产环境参数配置文件
具体配置:
##########################交易发送地址配#############################
######(以下配置为生产环境用)#######
##前台交易请求地址
=https://gateway.95516.com/gateway/api/frontTransReq.do
##&app&交易请求地址
##https://gateway.95516.com /gateway/api/appTransReq.do
##后台交易请求地址
=https://gateway.95516.com/gateway/api/backTransReq.do
##后台交易请求地址(若为有卡交易配置该地址)
#https://gateway.95516.com /gateway/api/cardTransReq.do
##单笔查询请求地址
=https://gateway.95516.com/gateway/api/queryTrans.do
##批量交易请求地址
=https://gateway.95516.com/gateway/api/batchTrans.do
##文件传输类交易地址
=https://filedownload.95516.com/
&########################签名证书配置################################
##签名证书路径(请拿到生产环境证书后修改签名路径、证书名称、证书密码)
=d:\\certs\\001_acp.pfx
##签名证书密码
##签名证书类型
##########################加密证书配置################################
##密码加密证书路径
=d:\\certs\\encrypt.cer
主要类与方法说明
com.unionpay.acp.sdk.SDKConfig.java:负责读取acp_sdk.properties及设置参数。
方法:public void loadPropertiesFromSrc()
从标准CLASS类路径下LOAD配置文件。
方法:public void loadPropertiesFromPath(String rootPath)
从标准CLASS类路径下LOAD配置文件。
方法:public void loadProperties(Properties pro)
使用传入的Properties对象LOAD配置。
主要类与方法说明
com.unionpay.acp.sdk.SDKUtil.java:主要负责组装报文、证书签名、发送报文、接收报文、验证签名、加密解密等操作,具体请查看代码。
方法:publicstatic String send(String url, Map&String, String& data, String encoding,intconnectionTimeout, intreadTimeout)
发送后台交易。
方法:publicstaticboolean sign(Map&String, String& data, String encoding)
生成签名。
方法:publicstaticboolean validate(Map&String, String& resData, String encoding)
验证签名。
方法:publicstatic String coverMap2String(Map&String, String& data)
将Map形式的表单交易数据转换为key1=value1&key2=value2的形式
方法:publicstatic Map&String, String& coverResultString2Map(String result)
将形如key=value&key=value的字符串转换为相应的Map对象
方法:publicstatic String encryptPin(String card, String pwd, String encoding)
密码加密,输入参数依次为卡号、密码、字符集。
主要类与方法说明
com.unionpay.acp.sdk.SDKConstants.java:常量类。
定义可能用到的各种常量和所有域名。
主要类与方法说明
com.unionpay.acp.sdk.CertUtil.java: 证书操作工具类,主要是导入pfx、cer等证书与获取获取私钥、获取公钥操作。
主要类与方法说明
com.unionpay.acp.sdk.SecureUtil.java主要负责报文的签名、验证签名及加密解密;
提供MD5、SHA-1以及RSA签名的方法类。
主要类与方法说明
com.unionpay.acp.sdk.HttpClient.java 是通信类,具体请参考代码的说明。
提供和服务器通信的HTTP客户端类。
方法:publicint send(Map&String, String& data, String encoding) throwsException
将请求参数以HTTP表单的方式进行一次HTTP POST通信。
Sample说明
com.unionpay.acp.sdksample.front:包下为前台交易demo
方法:com.unionpay.acp.sdksample.back:包下为后台交易demo
具体内容见DEMO代码中的注释和说明。
配置文件加载说明
1)&&& acp_sdk.properties
i.&&&& 从classpath加载
SDKConfig.getConfig().loadPropertiesFromSrc();
ii.&&& 从properties对象中加载
SDKConfig.getConfig().loadProperties(pro);
iii.&& 从指定目录下加载rootPath不包含文件名
SDKConfig.getConfig().loadPropertiesFromPath(rootPath);
2)&&& log4j.properties:放在工程的classpath目录下,系统自动加载
插件按编码为gbk编写,工程名称为upacp_sdk_php,供系统集成。
openssl证书需下载使用 其中的php_openssl.dll,ssleay32.dll,libeay32.dll3个文件拷到& windows/system32/文件夹下,在重启Apache服务
1. SDKConfig.php测试环境配置文件:具体配置项和说明如下;
具体配置:
######& SDK 配置文件配置文件中日志和证书的存放路径根据实际情况配置,交易地址和证书根据测试环境、生产环境配套配置#####
##########################交易发送地址配#############################
######(以下配置为认证环境:入网测试环境用,生产环境配置见文档说明)#######
##前台交易请求地址
##后台交易请求地址
##后台交易请求地址(若为有卡交易配置该地址)
constSDK_Card_Request_Url = 'https://101.231.204.80:5000/gateway/api/cardTransReq.do';
##单笔查询请求地址
##批量交易请求地址
##文件传输类交易地址
##APP交易地址
constSDK_App_Request_Url = 'https://101.231.204.80:5000/gateway/api/appTransReq.do';
########################签名证书配置################################
######(以下配置为测试环境:入网测试环境用,生产环境配置见下述文档说明)#######
##签名证书路径
##签名证书密码
##签名证书类型
##前台通知地址 (商户自行配置通知地址)
const SDK_FRONT_NOTIFY_URL = 'http://127.0.0.1/upacp_sdk_php/demo/response.php';
// 后台通知地址 (商户自行配置通知地址)
const SDK_BACK_NOTIFY_URL = 'http://127.0.0.1/upacp_sdk_php/demo/response.php';
//文件下载目录
const SDK_FILE_DOWN_PATH = 'd:/file/';
//日志 目录
const SDK_LOG_FILE_PATH = 'D:/logs/';
//日志级别
const SDK_LOG_LEVEL = 'INFO';
##########################加密证书配置################################
##密码加密证书路径
2. SDKConfig.php ,生产测试环境配置文件:具体配置项和说明如下;
具体配置:
##########################交易发送地址配#############################
######(以下配置为生产环境用)#######
##前台交易请求地址
##后台交易请求地址
##后台交易请求地址(若为有卡交易配置该地址)
constSDK_Card_Request_Url = 'https://gateway.95516.com/gateway/api/cardTransReq.do';
##单笔查询请求地址
##批量交易请求地址
##文件传输类交易地址
##APP交易地址
##前台通知地址 (商户自行配置通知地址)
const SDK_FRONT_NOTIFY_URL = 'http://127.0.0.1/upacp_sdk_php/demo/response.php';
##后台通知地址 (商户自行配置通知地址)
const SDK_BACK_NOTIFY_URL = 'http://127.0.0.1/upacp_sdk_php/demo/response.php';
##文件下载目录
const SDK_FILE_DOWN_PATH = 'd:/file/';
##日志 目录
const SDK_LOG_FILE_PATH = 'D:/logs/';
##日志级别
const SDK_LOG_LEVEL = 'INFO';
########################签名证书配置################################
##签名证书路径(请拿到生产环境证书后修改签名路径、证书名称、证书密码)
##签名证书密码
##签名证书类型
##验签证书路径
##########################加密证书配置################################
##密码加密证书路径
主要类与方法说明
upacp_sdk_php.gbk.common.php:负责将请求报文排序后转化为字符串、将字符串转为数组
解压、压缩、构建自动提交表单等
function coverParamsToString($params)
功能: 将请求报文排序后转化为字符串
输入: 请求数组
输出: 排序后的 key1=val1&key2=val2&....
function coverStringToArray($str)
功能: 将字符串转为数组
输入: key1=val1&key2=val2&....
输出: 数组元素 array(key1=&val1,key2=&val2...)
function deal_params(&$params)
功能: 处理返回报文 解码客户信息
输入: 客户信息
输出: 将客户信息组装成customerInfo项
function deflate_file(&$params)
功能: 压缩文件
输入: 带有文件上传的请求报文
输出: 将上传文件压缩后组装进报文
function deal_file($params)
功能: 解压缩文件
输入: 带有文件下载的返回报文
输出: 处理文件内容并保存到指定目录下
function create_html($params, $action)
功能: 构造自动提交的表单
输入: 请求数组($params) ,请求的远程url
输出: 自动提交的form表单字符串
主要类与方法说明
upacp_sdk_php.gbk.httpClient.php:后台交易 客户端通信等
httpClient.php
function sendHttpRequest($params, $url)
功能: 后台交易 HttpClient通信
输入: 请数据,及远程通信url
输出: 后台交易响应信息
function getRequestParamString($params)
功能: 请求数据 urlencode处理后转为key=val&...串
输入: 请求数组
输出: urlencode处理后的key=val&...串
主要类与方法说明
upacp_sdk_php.gbk.secureUtil.php:负责签名,验签,加载证书,取公钥/私钥,加密卡号/cvn2/有效期等方法类
secureUtil.php
function sign(&$params)
功能: 请求数据签名
输入: 请求数组
输出: 带签名的请求数组
function verify($params)
功能: 验签
输入: 返回报文
输出: 成功/失败
function getPulbicKeyByCertId($certId)
功能: 根据证书ID 加载 证书
输入: 证书ID
输出: 证书公钥信息
function getCertId($cert_path)
功能: 取私钥证书ID
输入: 私钥证书路径
输出: 证书ID
function getCertIdByCerPath($cert_path)
功能: 取公钥证书ID
输入: 公钥证书路径
输出: 证书ID
function getSignCertId()
功能: 取签名证书ID
输入: 签名证书路径
输出: 证书ID
function getPublicKey($cert_path)
功能: 获取证书公钥
输入: 证书路径
输出: 公钥
function getPrivateKey($cert_path)
功能: 获取证书私钥
输入: 证书路径
输出: 私钥
function encryptPan($pan)
功能: 加密 卡号
输入: 卡号
输出: 加密后卡号
function encryptPin($pan, $pwd)
功能: pin 加密
输入: 卡号,密码
输出: 加密后密码
function encryptCvn2($cvn2)
功能: cvn2 加密
输入: cvn2
输出: 加密后cvn2
function encryptDate($certDate)
功能: 有效期 加密
输入: 有效期
输出: 加密后有效期
主要类与方法说明
upacp_sdk_php.gbk.PublicEncrypte.php:密码加密
upacp_sdk_php.gbk.PinBlock.php:密码转pin
upacp_sdk_php.gbk.log.class.php:日志类
插件.net Framework4.0环境以上编写,ICSharpCode.SharpZipLib手动添加,引用工程名称为upacp_sdk_php,供系统集成。
1.& Web.config:入网测试环境参数配置文件
具体配置:
######& SDK 配置文件配置文件中日志和证书的存放路径根据实际情况配置,交易地址和证书根据测试环境、生产环境配套配置#####
##########################交易发送地址配#############################
######(以下配置为认证环境:入网测试环境用,生产环境配置见文档说明)#######
##前台交易请求地址
##后台交易请求地址
##后台交易请求地址(若为有卡交易配置该地址)
&add key=&sdk.cardRequestUrl& value=&https://101.231.204.80:5000/gateway/api/cardTransReq.do& /&
##批量交易请求地址
##查询地址
##文件传输类交易地址
##APP交易地址
&add key=&sdk.appRequestUrl& value=&https://101.231.204.80:5000/gateway/api/appTransReq.do& /&
########################签名证书配置################################
######(以下配置为测试环境:入网测试环境用,生产环境配置见下述文档说明)#######
##签名证书路径
##签名证书密码
##签名证书类型
##########################加密证书配置################################
##密码加密证书路径
2. &Web.config: 生产环境参数配置文件
具体配置:
##########################交易发送地址配#############################
######(以下配置为生产环境用)#######
##前台交易请求地址
##后台交易请求地址
##后台交易请求地址(若为有卡交易配置该地址)
&add key=&sdk.cardRequestUrl& value=&https://gateway.95516.com/gateway/api/cardTransReq.do& /&
##单笔查询请求地址
##批量交易请求地址
##文件传输类交易地址
##APP交易地址
########################签名证书配置################################
##签名证书路径(请拿到生产环境证书后修改签名路径、证书名称、证书密码)
##签名证书密码
##签名证书类型
&add key=&sdk.validateCert.dir& value=&d:\certs\& /&
##########################加密证书配置################################
##密码加密证书路径
主要类与方法说明
com.unionpay.acp.sdk.SDKConfig.cs:负责读取web.config
//功能:读取配置文件获取签名证书路径
private static string signCertPath = config.AppSettings.Settings[&sdk.signCert.path&].V
//功能:读取配置文件获取签名证书密码
private static string signCertPwd = config.AppSettings.Settings[&sdk.signCert.pwd&].V
//功能:读取配置文件获取验签目录
private static string validateCertDir = config.AppSettings.Settings[&sdk.validateCert.dir&].V
//功能:加密公钥证书路径
private static string encryptCert = config.AppSettings.Settings[&sdk.encryptCert.path&].V
//功能:有卡交易路径;&
private static string cardRequestUrl = config.AppSettings.Settings[&sdk.cardRequestUrl&].V
//功能:app交易路径;&
private static string appRequestUrl = config.AppSettings.Settings[&sdk.appRequestUrl&].V
//功能:读取配置文件获取交易查询地址&
private static string singleQueryUrl = config.AppSettings.Settings[&sdk.singleQueryUrl&].V
//功能:读取配置文件获取文件传输类交易地址
private static string fileTransUrl = config.AppSettings.Settings[&sdk.fileTransUrl&].V&
功能:读取配置文件获取前台交易地址
private static string frontTransUrl = config.AppSettings.Settings[&sdk.frontTransUrl&].V
功能:读取配置文件获取后台交易地址
private static string backTransUrl = config.AppSettings.Settings[&sdk.backTransUrl&].V
//功能:读取配批量交易地址
private static string batTransUrl = config.AppSettings.Settings[&sdk.batTransUrl&].V
主要类与方法说明
com.unionpay.acp.sdk.SDKUtil.cs:主要负责组装报文、证书签名、发送报文、接收报文、验证签名、加密解密等操作,具体请查看代码。
获取签名。
public static bool Sign(Dictionary&string, string& data, Encoding encoder)
public static bool Validate(Dictionary&string, string& data, Encoding encoder)
public static string CreateAutoSubmitForm(string url, Dictionary&string, string& data, Encoding encoder)
将Dictionary内容排序后输出为键值对字符串,供打印报文使用
&public static string PrintDictionaryToString(Dictionary&string, string& data)
将形如key=value&key=value的字符串转换为相应的Dictionary对象
public static Dictionary&string, string& CoverstringToDictionary(string data)
pinblock 16进制计算
public static string printHexString(byte[] b)
密码加密,输入参数依次为卡号、密码、字符集
Publicstatic string encryptPin(string card, string pwd, string encoding)
数据加密,输入参数依次为数据、字符集
Publicstatic string encryptData(string data,string encoding)
主要类与方法说明
com.unionpay.acp.sdk.CertUtil.cs: 证书操作工具类,主要是导入pfx证书与获取获取私钥操作。
获取签名证书私钥
public static RSACryptoServiceProvider GetSignProviderFromPfx()
获取签名证书的证书序列号
&public static string GetSignCertId()
通过证书id,获取验证签名的证书
public static RSACryptoServiceProvider GetValidateProviderFromPath(string certId)
主要类与方法说明
com.unionpay.acp.sdk.SecureUtil.cs主要负责报文的软签名、验证签名、加密;
压缩、解压、Base64编码/解码,pinblock计算等提供SHA-1及RSA的方法类。
&public static byte[] Sha1X16(string dataStr, Encoding encoding)
&public static byte[] SignBySoft(RSACryptoServiceProvider provider, byte[] data)
&public static bool ValidateBySoft(RSACryptoServiceProvider provider, byte[] base64DecodingSignStr, byte[] srcByte)
Base64编码
public static string EncodeBase64(Encoding encode, string source)
Base64解码
&public static string DecodeBase64(Encoding encode, string result)
Inflater解压缩
public static byte[] inflater(byte[] inputByte)
deflater压缩
&public static byte[] deflater(byte[] inputByte)
private static byte[] pin2PinBlock(string aPin)
获取卡号密码pinblock计算
public static byte[] pin2PinBlockWithCardNO(string aPin, string aCardNO)
private static byte[] formatPan(string aPan)
public static byte[] encryptedData(byte[] encData)
主要类与方法说明
com.unionpay.acp.sdk.HttpClient.cs 是通信类,具体请参考代码的说明。
提供和服务器通信的HTTP客户端类。
将请求参数以HTTP表单的方式进行一次HTTP POST通信。
Publicint Send(Dictionary&string, string&sParaTemp, Encoding encoding)
12&&&&&&&&常见问题问答
Q:如何获取测试商户号与测试证书?
A:测试环境申请测试用户后点击“我的测试&测试参数”中查看商户号,并点击下载测试证书,注册地址:,生产环境请联系业务部门,具体联系方式如下:
发送邮件至: 进行业务申请和咨询,银联有专门的人员进行处理。
其他专项服务:请见《业务运营服务指引(商户) 》日常业务运营服务。
Q:如何签名?
A:对报文中出现签名域(signature)之外的所有数据元采用key=value的形式按照名称排序,然后以&作为连接符拼接成待签名串。其次,对待签名串使用SHA-1算法做摘要,并转成16进制,再使用银联颁发给商户的商户RSA私钥证书对摘要做签名操作(签名时算法选择SHA-1)。最后,对签名做Base64编码,将编码后的签名串放在签名(signature)表单域里和其他表单域一起通过HTTP Post的方式传输给银联全渠道系统支付平台。
Q:报文域中frontUrl和backUrl要填什么?
A:frontUrl和backUrl为报文上送要素,银联系统将前台通知报文返回到报文中的frontUrl地址,将后台通知报文返回到报文中的backUrl地址。
Q:如何获取与配置银联入网测试环境地址?
A : 可参见11章节测试环境参数配置,配置文件可在开发包中找到(开发包获取地址:https://open.unionpay.com/ajweb/help/file/)。具体接入地址如下:
银联入网测试环境地址:
前台交易请求地址
https://101.231.204.80:5000/gateway/api/frontTransReq.do
后台交易请求地址(无卡)
https://101.231.204.80:5000/gateway/api/backTransReq.do
后台交易请求地址(有卡)
https://101.231.204.80:5000/gateway/api/cardTransReq.do
单笔查询请求地址
https://101.231.204.80:5000/gateway/api/queryTrans.do
批量交易请求地址
https://101.231.204.80:5000/gateway/api/batchTrans.do
文件传输类交易地址
https://101.231.204.80:9080/
APP交易请求地址
https://101.231.204.80:5000/gateway/api/appTransReq.do
Q:银联全渠道系统商户接入生产环境地址?
A : 可参见11章节生产环境参数配置,配置文件可在开发包中找到(开发包获取地址:https://open.unionpay.com/ajweb/help/file/)。将配置文件中测试地址修改为如下地址:
银联入网测试环境地址:
前台交易请求地址
https://gateway.95516.com/gateway/api/frontTransReq.do
后台交易请求地址(无卡)
https://gateway.95516.com/gateway/api/backTransReq.do
后台交易请求地址(有卡)
https://gateway.95516.com/gateway/api/cardTransReq.do
单笔查询请求地址
https://gateway.95516.com/gateway/api/queryTrans.do
批量交易请求地址
https://gateway.95516.com/gateway/api/batchTrans.do
文件传输类交易地址
https://filedownload.95516.com/
APP交易请求地址
https://gateway.95516.com /gateway/api/appTransReq.do
Q:商户接收到银联的前台通知和后台通知,以哪个为准?
A:交易状态请以后台通知结果为准。银联系统会将后台通知结果以post的方式发送到报文中backUrl后台通知地址上,如商户未收到通知,系统会持续发送,如发送成功则不再发送,5次通知失败则不再发送,失败交易则不发送。
后台通知中,只要是非通信类错误(如通信超时,无法解析域名,没有路由等),都认为商户已经收到,不会进行重发。如果商户因为非通信类问题没有及时收到应答(比如应用切换等情况),或者收到应答时处理失败(处理逻辑的验证应该在测试环境下已经验证通过),商户应该对没有及时收到应答的交易通过查询接口来查询该交易的状态。具体参见第6章节。
Q:上午做的交易,下午做撤销会报非当日交易不能撤销?
A:测试环境的日切时间在下午1点半,早上的交易会归为前一日,下午的交易才是当日交易。
Q:如果调用数次查询接口后,一直得到处理中状态,该怎么办?
A:对于网银支付模式与非网银支付模式描述如下:
网银支付模式:
Q:消费撤销和退货有何不同?
A:当天的交易可以执行消费撤销,消费撤销只能全额。
&当天或隔天的交易都可以做退货,退货可以进行多次退货,每次金额小于原始金额,订单退款总金额不能大于此订单原始金额。
Q:标准网关支付跳转银联页面HTTP400报错是什么原因?
A:银联全渠道系统对报文校验较为严格,对未定义的报文域会提示http400报错,请核对产品接口规范文档(https://open.unionpay.com/ajweb/help?id=74&level=0&from=1)中的报文域。
Q:什么是全渠道支付平台?
A:全渠道支付平台是中国银联全渠道接入支付平台的简称,支持移动、互联网等渠道的收单业务,包含互联网支付产品(银联在线支付、预授权支付、B2B对公支付、跨境支付、无跳转支付)、移动终端渠道产品(手机安全支付控件、WAP页面支付、平板电脑(iPad)网关支付、预授权支付、跨境支付、无跳转支付(手机端暂无))、后台模式产品( 订购、 代收、代付)。
Q:银联全渠道入网测试的账号(卡号)是什么?
A:接入银联全渠道入网测试环境需要使用银联提供的测试卡进行交易,当前仅提供两张可供测试的卡片,一张B2B企业网银的虚拟卡片,具体账号信息如下:
平安银行借记卡:0000018
证件号:218366
密码:123456
姓名:全渠道
平安银行贷记卡:0000
姓名:互联网
证件号:218366
有效期:1711
B2B企业网银农行虚拟卡
密码:789001
Q:银联全渠道相关接口文档在哪里获取?
A:由银联提供的全渠道相关文档可在商户服务网站下载(https://merchant.unionpay.com/portal/pages/login/download.jsp?locale=zh_CN),也可以在自助化测试平台首页 & 帮助中心 &下载(https://open.unionpay.com/ajweb/help/file)中获取。
访问:464729次
积分:5356
排名:第6022名
原创:122篇
转载:58篇
评论:94条
阅读:26464
阅读:3574
阅读:15113
(1)(2)(1)(7)(8)(3)(5)(9)(3)(6)(2)(1)(1)(22)(3)(4)(1)(3)(4)(2)(2)(1)(2)(18)(4)(3)(2)(7)(7)(8)(3)(8)(16)(12)

我要回帖

更多关于 佳能400d 的文章

 

随机推荐