1.支付公司准备标准联调信息
包括 .订单查询接口地址:
.订单退款接口地址:
** .接 口 文 档:**
** .商 户 号 码 :**
.分 账 信 息:
** .证 书 密 码 :**
.DEMO :
.证 书 路 径:
.沃 账 户 号(付款用):
.支 付 密 码(付款用):
证书包括一个私钥证书一个公钥证书,密码相同
2.使用X509Certificate2根据私钥证书生成签名
所谓签名即你要给对方传递的参数的经给私钥证书加密后的密文,单笔支付模块需要你将参数明文、密文都传递过去。第二步只是说明如何生成参数。
将要生成的签名的参数遍历成一个字符串,需根据参数名的ASKII码排序(一定要排,不然对方验签通不过),并使用管道符“|”拼接起来,例如 amount=8200|callbackUrl=http://localhost:8003/orderPayCallback.jsp|charSet=GBK|[email protected]。
/// <summary>
/// 获取证书私钥对签名进行SHA256加密
/// </summary>
/// <param name="str">要加密的参数字符串</param>
/// <returns></returns>
public byte[] CaRsaEncrypt()
{
//例子,实际参数不止这些
string str = "amount=8200|callbackUrl=http://localhost:8003/orderPayCallback.jsp|charSet=GBK|[email protected]";
//证书物理路径、密码
string cert = ConfigurationManager.AppSettings["cerAddress"]?.ToString(); ;
string certPwd = ConfigurationManager.AppSettings["certPwd"]?.ToString(); ;
//调用证书 传入路径、密码、存储标识枚举
X509Certificate2 privateCert = new X509Certificate2(cert, certPwd, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)privateCert.PrivateKey;
// 获取私钥
RSACryptoServiceProvider privateKey1 = new RSACryptoServiceProvider();
privateKey1.ImportParameters(privateKey.ExportParameters(true));
byte[] data = Encoding.UTF8.GetBytes(str);
//使用SHA256加密
byte[] signature = privateKey1.SignData(data, "SHA256");
//对签名密文进行Base64编码
return signature;
}
3.单笔订单支付
支付需将具体参数(参考接口文档)通过前台页面form表单提交至对方指定地址(**暂不支持后台请求接口**)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form name="form1" method="post" action="">
<input type="hidden" name="interfaceVersion" value="">
<input type="hidden" name="tranType" value="">
<input type="hidden" name="bankCode" value="">
<input type="hidden" name="merNo" value="">
<input type="hidden" name="goodsName" value="">
<input type="hidden" name="orderDate" value="">
<input type="hidden" name="orderNo" value="">
<input type="hidden" name="amount" value="">
<input type="hidden" name="charSet" value="">
<input type="hidden" name="tradeMode" value="">
<input type="hidden" name="reqTime" value="">
<input type="hidden" name="respMode" value="">
<input type="hidden" name="callbackUrl" value="">
<input type="hidden" name="serverCallUrl" value="">
<input type="hidden" name="signType" value="">
<input type="hidden" name="signMsg" value="">
<p> </p>
<button type="submit" form-type="submit|reset">
保存
</button>
</form>
</body>
</html>
其中signMsg是其他所有参数的密文签名。支付公司会对你发送的明文参数与密文签名进行验签,接下来说明如何生成密文签名。
4.在联通收银台支付后,返回商户网站
支付时回调地址作为参数传过去,支付完成后联通沃支付将页面重定向至你给他传的回调地址上,并携带参数,参数同样包括明文密文,需要在我们的回调地址方法中进行验签和业务处理后,再重定向至自己网站的支付成功页面。
//在控制器用此方式接收对方传入的参数
var @params = HttpContext.Request.Form;
在验签时,我们将对方传过来的参数按照第二步同样的方式,按参数列表的键的ASKII码排序并用管道符“|”拼接为字符(注意,要将参数列表中的signMsg密文签名去除)。
//将对方传的加密签名从Base64字符串转字节数组
byte[] signMsgBytes = Convert.FromBase64String(orderPay.PAY_BACK_SIGNMSG);
//参数字符串转字节数组
byte[] paramsBytes = Encoding.UTF8.GetBytes(paramsMsg);
//验签
Boolean VerifyResult = RSADecrypt(paramsBytes, signMsgBytes);
注意要将对方的密文签名进行base64解码后,再进行验签。
/// <summary>
/// 验证密文是否相同
/// </summary>
/// <param name="signDataToDecrypt">元数据</param>
/// <param name="DataToDecrypt">签名数据</param>
/// <returns></returns>
public Boolean RSADecrypt(Byte[] signDataToDecrypt, Byte[] DataToDecrypt)
{
try
{
//证书路径
string cert = ConfigurationManager.AppSettings["cerAddressPublic"]?.ToString(); ;
string certPwd = ConfigurationManager.AppSettings["certPwd"]?.ToString(); ;
//调用证书
X509Certificate2 privateCert = new X509Certificate2(cert, certPwd, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//获取证书公钥
var publicKey = privateCert.PublicKey.Key.ToXmlString(false);
RSA.FromXmlString(publicKey);
Boolean signaFlag = RSA.VerifyData(signDataToDecrypt, "SHA256", DataToDecrypt);
return signaFlag;
}
catch (Exception ex)
{
LogHelper.WriteErrorLog(ex);
return false;
}
}
版权归原作者 Luxin_NET 所有, 如有侵权,请联系我们删除。