银联接口C#
银联支付:
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 = https://www.it610.com/article/NetPay.NETPAY. signOrder(MerId, OrdId, TransAmt, CuryId, TransDate, TransType) ;
showInfo(">>明文:" + ostr + "\r\n\r\n");
showInfo(">>密文:" + ChkValue + "\r\n\r\n");
}
// 对一段字符串的签名
string plainData ="https://www.it610.com/article/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 = "https://www.it610.com/article/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)的应该包括如下(注意各字段的大小写):
说明:
status 表示交易转态,只有"1001"的时候才为交易成功,其他均为失败,因此在验证签名数据为ChinaPay发出的以后,还需要判定交易状态代码为"1001"。
【银联接口C#】当消费支付交易完成时,ChinaPay会将交易应答信息发送给商户,对于页面交易接收地址和后台交易接收地址都会收到交易接收数据,而对于接收到的应答数据,商户需要对其验证签名以确定是由ChinaPay发出的应答数据。使用的NetPayClient的“验证交易应答函数”。方法名称为:publicboolean verifyTransResponse(String MerId, String OrdId, String TransAmt, StringCuryId, String TransDate, String TransType, String OrderStatus, StringCheckValue)
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 2020-04-07vue中Axios的封装和API接口的管理
- 调取接口时报404错误(ID:16)
- CICC(脑机接口,科幻几近成真())
- 接口|axios接口报错-参数类型错误解决
- 190403|190403 - Jmeter压测接口
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- 微信小程序请求接口格式
- 简易有效Api接口防攻击策略