C# 使用X509Certificate2获取数字证书信息对接联通沃支付
1.支付公司準備標準聯調信息
?包括????????.訂單查詢接口地址: ? ??
????????????????.訂單退款接口地址: ? ?
????????????????.接 ? ? 口 ? ? 文 ? 檔:
????????????????.商 ?戶 ? ? 號 ? ? 碼 :
????????????????.分 ? ? 賬 ? ?信 ? ?息:
????????????????.證 ? 書 ? ?密 ? ? 碼 :
????????????????.DEMO ? ? ? ? ? ? ? :?
????????????????.證 ? ?書 ? 路 ? ? 徑:
????????????????.沃 ? ? 賬 ? ?戶 ? 號(付款用):
????????????????.支 ? 付 ? 密 ? ? ?碼(付款用):
證書包括一個私鑰證書一個公鑰證書,密碼相同
2.使用X509Certificate2根據私鑰證書生成簽名
所謂簽名即你要給對方傳遞的參數的經給私鑰證書加密后的密文,單筆支付模塊需要你將參數明文、密文都傳遞過去。第二步只是說明如何生成參數。
將要生成的簽名的參數遍歷成一個字符串,需根據參數名的ASKII碼排序(一定要排,不然對方驗簽通不過),并使用管道符“|”拼接起來,例如 amount=8200|callbackUrl=http://localhost:8003/orderPayCallback.jsp|charSet=GBK|customerEmail=jkdfda@qq.com。
/// <summary>/// 獲取證書私鑰對簽名進行SHA256加密/// </summary>/// <param name="str">要加密的參數字符串</param>/// <returns></returns>public byte[] CaRsaEncrypt(){//例子,實際參數不止這些string str = "amount=8200|callbackUrl=http://localhost:8003/orderPayCallback.jsp|charSet=GBK|customerEmail=jkdfda@qq.com";//證書物理路徑、密碼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;}}總結
以上是生活随笔為你收集整理的C# 使用X509Certificate2获取数字证书信息对接联通沃支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 明月浩空html播放器,明月浩空音乐-绚
- 下一篇: 基于C++中常见内存错误的总结