银联支付:

ChinaPay的会员商户接入支付平台,以方便商户开展网上支付交易。

持卡人从商户网站中生成订单信息,通过公共支付交易平台中的支付网关子系统进行支付的过程,其交易流程包括订单确认、支付处理、支付完成三个部分,具体流程说明如下:

【流程一】订单确认

1.    持卡人浏览商户网站,选择支付项目,生成订单信息

2. 持卡人确认订单信息,开始支付

【流程二】支付处理

3.持卡人确认支付信息,商户网站开始向支付网关申请支付,支付网关验证商户身份合法性和订单报文的完整性

4.支付网关向持卡人显示支付渠道选择界面,持卡人选择支付渠道

5.持卡人在所选择渠道上,输入用户帐号、密码及其他安全验证信息

6.持卡人的安全认证信息得到确认后,进行支付

【流程三】支付完成

7.支付渠道向支付网关返回支付结果

8.支付网关向持卡人显示支付结果,同时通知商户网站支付结果

9.商户网站向持卡人显示商户交易结果

10.  支付操作完成。

NetPayClient for C#使用说明

名 称

放置的路径

用 途

netpay.dll

根据项目工程的需要放置对应路径下

用于提供数字签名的方法调用

MerPrk.key

可以放置到任意路径下,但是需要调用方法指定文件位置和名称

商户签名私钥

PgPubk.key

可以放置到任意路径下,但是需要调用方法指定文件位置和名称

ChinaPay签名公钥

l  创建公/私钥对象buildKey

publicboolean buildKey (String MerId, int KeyUsage, String KeyFile)

用于创建私/公钥的对象,用于签名或者验证签名。

参数说明:

StringMerId  商户号,长度为15个字节的数字串,由ChinaPay分配。

intKeyUsage  使用私/公钥的方式,固定为 0 。

String KeyFile 私/公钥的文件路径(包含文件名称)。例如:"d:\\MerPrk.key”

返回值:

true 表示找到正确的私/公钥文件,并且可以调用签名方法签名或者签名验证方法验证签名, false

表示创建私/公钥对象失败,不可以使用签名方法和签名验证方法。

注:该方法在netpay. NETPAY中, 也可通过NetPay.NETPAY.PrivateKeyFlag或者NetPay.NETPAY.PublicKeyFlag判断当前公私钥的状态。

l  订单签名函数signOrder

方法说明:

publicString signOrder(String MerId, String OrdId, String TransAmt, String CuryId,String TransDate, String TransType)

对传入的参数进行数字签名。

参数说明:

StringMerId     商户号,长度为15个字节的数字串,由ChinaPay分配。

StringOrdId     订单号,长度为16个字节的数字串,由商户系统生成,失败的订单号允许重复支付。

StringTransAmt 交易金额,长度为12个字节的数字串,例如:数字串"000000001234"表示12.34元。

StringCuryId      货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为"156" 。

StringTransDate 交易日期,长度为8个字节的数字串,表示格式为:YYYYMMDD。

String TransType 交易类型,长度为4个字节的数字串,取值范围为:"0001"和"0002", 其中"0001"表示消费交易,"0002"表示退货交易。

 

返回值:

StringCheckValue[256] 即NetPayClient根据上述输入参数生成的商户数字签名,长度为256字节的字符串。

注:该方法在netpay. NETPAY中。

l  验证交易应答函数verifyTransResponse

方法说明:

publicboolean verifyTransResponse(String MerId, String OrdId, String TransAmt, StringCuryId, String TransDate, String TransType, String OrderStatus, StringCheckValue)

作用:

验证传入参数的数字签名是否正确。

参数说明:

StringMerId       商户号,长度为15个字节的数字串,由ChinaPay分配。

StringOrdId        订单号,长度为16个字节的数字串,由商户系统生成,失败的订单号允许重复支付。

StringTransAmt 交易金额,长度为12个字节的数字串,例如:数字串"000000001234"表示12.34元。

StringCuryId      货币代码, 长度为3个字节的数字串,目前只支持人民币,取值为"156" 。

StringTransDate 交易日期,长度为8个字节的数字串,表示格式为: YYYYMMDD。

StringTransType 交易类型,长度为4个字节的数字串,取值范围为:"0001"和"0002",其中"0001"表示消费交易,"0002"表示退货交易。

StringOrderStatus 交易状态,长度为4个字节的数字串。详见交易状态码说明。

StringCheckValue 校验值,即ChinaPay对交易应答的数字签名,长度为256字节的字符串。

返回值:

true 表示成功,即该交易应答为ChinaPay所发送,商户根据“交易状态”进行后续处理;否则表示失败,即无效应答,商户可忽略该应答。

注:该方法在netpay. NETPAY中。

l  对一段字符串的签名函数Sign

方法说明:

publicString Sign (String SignMsg)

作用:

对传入的参数字符串进行数字签名。

参数说明:

StringSignMsg 用于要签名的字符串

返回值:

String CheckValue[256]即NetPayClient根据上述输入参数生成的商户数字签名,长度为256字节的        字符串。

注:该方法在netpay. NETPAY中。

l  对一段字符串的签名验证函数verifyAuthToken

方法说明:

publicboolean verifyAuthToken (String PlainData, String CheckValue)

作用:

验证目标字符串的数字签名是否正确。

参数说明:

StringPlainData     用于数字签名的字符串。

StringCheckValue  校验值,要验证的字符串的数字签名,长度为256字节的字符串。

返回值:

true 表示验证通过成功;否则表示失败。

注:该方法在netpay. NETPAY中。

示例代码

string MerId, OrdId,TransAmt, CuryId, TransDate, TransType,ChkValue;

string plainData,ChkValue2 ;

//初始化key文件:

if (NetPay.NETPAY.buildKey("808080290000001", 0, "c:\\key\\MerPrk.key"))

{

showInfo(">>设置私钥:成功。\r\n\r\n");

}

// 对订单的签名

if (NetPay.NETPAY.PrivateKeyFlag)

{

string ChkValue = NetPay.NETPAY. signOrder(MerId, OrdId, TransAmt, CuryId, TransDate, TransType) ;

showInfo(">>明文:" + ostr + "\r\n\r\n");

showInfo(">>密文:" + ChkValue + "\r\n\r\n");

}

// 对一段字符串的签名

string plainData = "8080802900000010000000010273765000000000001156201008060001";

if (NetPay.NETPAY.PrivateKeyFlag)

{

string ChkValue2 = NetPay.NETPAY. Sign(plainData);

showInfo(">>明文:" + ostr + "\r\n\r\n");

showInfo(">>密文:" + ChkValue + "\r\n\r\n");

}

String MerId,OrdId, TransAmt, CuryId, TransDate, TransType,ChkValue;

String plainData,ChkValue2

//初始化key文件:

if (NetPay.NETPAY.buildKey("999999999999999", 0, "c:\\key\\PgPubk.key"))

{

showInfo(">>设置公钥:成功。\r\n\r\n");

}

//验签订单

if (NetPay.NETPAY.PublicKeyFlag)

{

bool flag= NetPay.NETPAY.verifyTransResponse(MerId,OrdId, TransAmt,CuryId, TransDate, TransType, OrderStatus, ChkValue);  // ChkValue为ChinaPay应答传回的域段

showInfo(">> 明文:" + ostr + "\r\n\r\n");

showInfo(">>密文:" + check + "\r\n\r\n");

showInfo(">>验签:" + result + "\r\n\r\n");

if(!flag) {

//签名验证错误处理

}

}

// 对一段字符串的签名验证

plainData = "testsign data ";

if (NetPay.NETPAY.PublicKeyFlag)

{

bool result = NetPay.NETPAY.verifyAuthToken(plainData, ChkValue2); // ChkValue2为ChinaPay应答传回的域段

showInfo(">>明文:" + ostr + "\r\n\r\n");

showInfo(">>密文:" + check + "\r\n\r\n");

showInfo(">>验签:" + result + "\r\n\r\n");

if(!flag) {

//签名验证错误处理

}

}

支付版本:

接入地址:

ChinaPay的网上支付服务采用WEB服务的方式允许商户接入,接收交易数据的地址为:

测试环境:http://payment-test.chinapay.com/pay/TransGet

生产环境:https://payment.chinapay.com/pay/TransGet

l  交易提交数据内容

商户向ChinaPay的支付接入地址提交订单信息,提交页面中表单(FORM)的应该包括如下(注意各字段的大小写):

<form action="https://payment.ChinaPay.com/pay/TransGet"METHOD=POST> (这里action的内容为提交交易数据的URL地址)

<input type=hidden name="MerId"value="808080290000001"/> (MerId为ChinaPay统一分配给商户的商户号,15位长度,必填)

<input type=hidden name="OrdId"value="0000000000000006"/> (商户提交给ChinaPay的交易订单号,16位长度,必填)

<input type=hidden name="TransAmt"value="000000001234"/> (订单交易金额,12位长度,左补0,                                        必填,单位为分)

<input type=hidden name="CuryId"value="156"/> (订单交易币种,3位长度,固定为人民币156,                                         必填)

<input type=hidden name="TransDate"value="20070801"/>(订单交易日期,8位长度,必填)

<input type=hidden name="TransType"value="0001"/> (交易类型,4位长度,必填)

<input type=hidden name="Version"value="20070129"/>(支付接入版本号,必填)

<input type=hidden name="BgRetUrl"value="http://www.example.com/pay/Bgreturn.jsp"/> (后台交易接收URL,长度不要超过80个字节,必填)

<input type=hidden name="PageRetUrl"value="www.example.com/pay/Pgreturn.jsp "/> (页面交易接收URL,长度不要超过80个字节,必填)

<input type=hidden name="GateId"value="">(支付网关号,可选)

<input type=hidden name="Priv1"value="Memo">(商户私有域,长度不要超过60个字节)

<input type=hidden name="ChkValue" value="X…X">(256字节长的ASCII码,为此次交易提交关键数                                           据的数字签名,必填)

PageRetUrl为页面接受应答地址,用于引导使用者返回支付后的商户网站页面。

BgRetUrl 为后台接受应答地址,用于商户记录交易信息和处理,对于使用者是不可见的。商户填写该地址时,URL不能包含参数,如果需要填写参数,可把参数填写在“商户私有域”Priv1字段中。另外ChinaPay会根据后台发送的http的返回码来判定是否重新发送后台应答流水,以确保后台应答的接收。

Priv1表示 “商户私有域”,在支付版本20070129中会参与数字签名,商户通过此字段向Chinapay发送的信息,Chinapay依原样填充返回给商户。

GateId为可选项,表示 “支付网关号”,如填写GateId(支付网关号),则消费者将直接进入支付页面,否则进入网关选择页面。

OrdId,表示 “订单号”, 该域段的内容可以完全由用户自己定义。

商户发送给ChinaPay的交易数据均需要进行数字签名。对于版本号为20070129的签名数据使用客户端NetPayClient的“对一段字符串的签名函数”。方法名称为:publicString Sign (String SignMsg)

对于版本为20070129的数字签名采用的是对一段字符串的签名,因此在签名的时候需要按照一定顺序拼接字符串,顺序如下表:

MerId

OrdId

TransAmt

CuryId

TransDate

TransType

Priv1

l  交易接收数据的内容

当消费支付交易完成时,ChinaPay会将交易应答信息发送给商户,对于页面易接收地址和后台交易接收地址都会收到交易接收数据,应答的数据域段包括如下内容:(以页面Form数据为例,注意大小写,后台应答数据的发送的域段名和下面的一致)

<form name="SendToMer"method="post"   action="">(这里action的内容为提交交易数据的URL地址)

<inputtype="hidden" name="merid"    value="808080290000001"/>

<inputtype="hidden" name="orderno"   value="0000000010096806"/>

<inputtype="hidden" name="transdate"  value="20070801"/>

<inputtype="hidden" name="amount"    value="000000001234"/>

<inputtype="hidden" name="currencycode"  value="156"/>

<inputtype="hidden" name="transtype"   value="0001"/>

<inputtype="hidden" name="status"      value="1001"/>

<inputtype="hidden" name="checkvalue"  value=" X…X "/>

<inputtype="hidden" name="GateId"     value=" 0001"/>

<inputtype="hidden" name="Priv1"      value=" Memo"/>

</form>

说明:

status 表示交易转态,只有"1001"的时候才为交易成功,其他均为失败,因此在验证签名数据为ChinaPay发出的以后,还需要判定交易状态代码为"1001"。

当消费支付交易完成时,ChinaPay会将交易应答信息发送给商户,对于页面交易接收地址和后台交易接收地址都会收到交易接收数据,而对于接收到的应答数据,商户需要对其验证签名以确定是由ChinaPay发出的应答数据。使用的NetPayClient的“验证交易应答函数”。方法名称为:publicboolean verifyTransResponse(String MerId, String OrdId, String TransAmt, StringCuryId, String TransDate, String TransType, String OrderStatus, StringCheckValue)

银联接口C#的更多相关文章

  1. gmc银联接口开发demo

    1.接口文档 1.1 无gmc界面接口 (dll/ocx) dll调用(posinf.dll)函数名为:int bankall (char * request,char *response),其中第一 ...

  2. 银联接口(注意项&备忘)

    1,参考文档“证书下载.导出及上传流程.docx” 按照文档上所述,依次进行,导出的证书备用,用于配置文件的项“const SDK_ENCRYPT_CERT_PATH” 2,使用tp框架 新建一个控制 ...

  3. java 银联接口开发

    http://blog.sina.com.cn/s/blog_6c868c470100ys59.html 在线接口文档:http://wenku.baidu.com/link?url=EUgAuOKz ...

  4. php 调用银联接口 【转载】

    首先要开启openssl开启方法为 openssl证书放在Apache的bin目录中. 其中的php_openssl.dll,ssleay32.dll,libeay32.dll,3个文件拷到windo ...

  5. Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总

    Unit06 - 抽象类.接口和内部类(下) . 面向对象汇总 1.多态:  1)意义:    1.1)同一类型的引用指向不同的对象时,有不同的实现        行为的多态:cut().run(). ...

  6. Unit05 - 抽象类、接口和内部类(上)

    Unit05 - 抽象类.接口和内部类(上) 1.static final常量:  1)必须声明同时初始化  2)通过类名来访问,不能被改变  3)建议:常量名所有字母都大写(多个单词间用_)  4) ...

  7. iOS支付宝,微信,银联支付集成封装调用(下)

    一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的接口全部 ...

  8. JavaWEB后端支付银联,支付宝,微信对接

    注:本文来源于:<  JavaWEB后端支付银联,支付宝,微信对接  > JavaWEB后端支付银联,支付宝,微信对接 标签(空格分隔): java 项目概述 最近项目需要后端打通支付,所 ...

  9. Java抽象类、接口和内部类

    1.抽象方法.抽象类 1)抽象方法: 由abstract修饰 只有方法的定义,没有方法的具体实现(连{}都没有) 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个 ...

随机推荐

  1. leecode第八十九题(格雷编码)

    class Solution { public: vector<int> grayCode(int n) { vector<int> res; res.push_back(); ...

  2. MySQL学习(九)

    1 一道面试题 新建两张表 mysql> create table m -> ( -> mid int, -> hid int, -> gid int, -> mr ...

  3. Codeforces 686 D - Kay and Snowflake

    D - Kay and Snowflake 思路: 树的重心 利用重心的一个推论,树的重心必定在子树重心的连线上. 然后利用重心的性质,可知,如果有一颗子树的大小超过整棵树的大小的1/2,那么树的重心 ...

  4. css3动画实现伪弹幕效果

    如图所示: 效果还可以直接用麦唱APP把一首歌分享到微信里面看到,方法类似全民K歌的方法,都是用css3动画实现的, 代码如下:(这是我做真实效果前的一个dome) 直接粘代码就可以看到效果,里面有两 ...

  5. Java定时器的三种实现方式

    一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ...

  6. python中简单的递归(断点报错的小福利)

    首先要先理解什么是递归? 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 下面讲了一个很简单的递归函数 def clac(n): print(n) if int( ...

  7. laravel配置路由除了 / 都是404解决办法

    1.php.ini开启phpopenssl 2.conf  (nginx为例) location / { index index.html index.htm index.php l.php; #tr ...

  8. HTML如何实现滚动文字

    HTML如何实现滚动文字 一.总结 一句话总结:marquee标签,也可以用js和css来实现 marquee标签 也可jss和css <marquee><span style=&q ...

  9. BGP - 3,BGP重要概念(EBGP,IBGP,防环/黑洞/全互连/同步)

    1,防环/黑洞/同步/全互连(为出现大于号,现在通常都是要下一跳可达+关同步) a)EBGP邻居传来的路由可以通过AS_PATH防环,所以收到的不会有问题,因此直接是优化的(>),也就是直接装表 ...

  10. 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

    这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...