做爲剛畢業的我來講,第一次開發在線支付功能,仍是工行的,真的是被坑死了,和工行的技術真的是太難溝通了,並且那個技術明顯是他們接口問題還死不認可,老是讓我細讀開發文檔,結果我代碼什麼都沒改,他調試接口後能夠運行支付了,他無話可說……但願這篇能讓一些人少走一些彎路。進入正題:javascript
1、 前期準備java
組件註冊說明web
1、API配置說明:api
1.將ICBCEBankUtil.dll和infosecapi.dll兩個dll文件拷貝到系統system32目錄下(其中,若是是64位系統,則拷貝到SysWOW64目錄下);瀏覽器
2.打開DOS窗口,進入system32目錄/SysWOW64目錄;服務器
3.運行「regsvr32 ICBCEBankUtil.dll」命令註冊控件;網絡
2、函數說明:app
一、初始化dom
init(ide
BSTR certFN,銀行證書文件名
BSTR certFNM,商戶證書文件名
BSTR keyFN,私鑰文件名
BSTR key私鑰保護口令
)
返回值:
-100:銀行證書文件名傳遞錯
-101:商戶證書文件名傳遞錯
-102:私鑰文件名傳遞錯
-103:私鑰保護口令傳遞錯
-110:打開銀行證書文件錯
-111:打開商戶證書文件錯
-112:打開私鑰文件錯
二、簽名
signC(
BSTR src,明文字符串
int srcLen,明文長度
)
返回值:
若是成功則返回BASE64編碼後的簽名串,不然返回空串
若是返回空串,可調用getRC取得錯誤碼
三、獲取錯誤碼(只在出錯時有效)
getRC
返回值
-100:明文字符串傳遞錯誤
-1:明文錯誤
-2:私鑰錯
-3:私鑰解密錯
-4:私鑰保護口令錯
四、驗證簽名
verifySignC(
BSTR src,明文字符串
int srcLen,明文字符串長度
BSTR sSrc,簽名BASE64編碼字符串
int sSrcLen簽名BASE64編碼字符串長度
)
返回值:
0:成功
-1:驗證失敗
-2:解碼失敗
-100:明文字符串傳遞有誤
-101:簽名字符串傳遞有誤
五、獲取證書
getCert(
int which證書類型:0銀行證書,1商戶證書
)
返回值:BASE64編碼後的證書
註冊好之後將infosecapi.dll引用到項目中。
2.證書引用
而後將public.crt、商戶.crt、商戶.key 這三個文件放到項目某個文件夾下
2、 開發階段
/// <summary> /// 工商銀行簽名驗證類 /// </summary> public class ICBCTest { string strCertFN = @"f:\aa\ahhfycYQHLTEST.pfx"; string strCertFNM = @"f:\aa\ahhfyc.crt"; string strKeyFN = @"f:\aa\ahhfyc.key"; //string strCertFN = System.Web.HttpContext.Current.Server.MapPath(@"user\user.crt"); //string strCertFNM = System.Web.HttpContext.Current.Server.MapPath(@"user\user.crt"); //string strKeyFN = System.Web.HttpContext.Current.Server.MapPath(@"user\user.key"); //string strKey = "12345678"; string strKey = "12345678"; /// <summary> /// 獲取工商銀行驗證信息 /// </summary> /// <returns></returns> public ICBC GetCheckInfo(ICBC argIcbc) { string strMerSignMsg = string.Empty; B2CUtil icbcObj = new B2CUtil(); if (icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey) == 0) { //對訂單數據進行簽名,獲得訂單簽名數據 MerSignMsg argIcbc.MerSignMsg = icbcObj.signC(argIcbc.TranData, argIcbc.TranData.Length); //證書公鑰 商戶用二進制方式讀取證書公鑰文件後,進行BASE64編碼後產生的字符串 argIcbc.MerCert = icbcObj.getCert(1); argIcbc.TranData = Base64Encode(argIcbc.TranData); } else { return null; } return argIcbc; } /// <summary> /// 獲取工商銀行驗證信息 /// </summary> /// <returns></returns> public ICBC GetCheckReturnInfo(ICBC argIcbc) { string strMerSignMsg = string.Empty; B2CUtil icbcObj = new B2CUtil(); if (icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey) == 0) { argIcbc.TranData = Base64Decode(argIcbc.TranData); if (icbcObj.verifySignC(argIcbc.TranData, argIcbc.TranData.Length, argIcbc.MerSignMsg, argIcbc.MerSignMsg.Length) == 0) //判斷驗證銀行簽名是否成功 { argIcbc.IsCheck = true; } else argIcbc.IsCheck = true; } else { argIcbc.IsCheck = false; } return argIcbc; } ///<summary> ///轉成Base64形式的System.String ///</summary> ///<param name="str"></param> ///<returns></returns> public static string Base64Encode(string str) { byte[] b = System.Text.Encoding.Default.GetBytes(str); //轉成Base64形式的System.String return Convert.ToBase64String(b); } public static string Base64Encode(Byte[] b) { ///轉成Base64形式的System.String return Convert.ToBase64String(b); } ///<summary> /// Base64轉回到原來的 System.String ///</summary> ///<param name="str"></param> ///<returns></returns> public static string Base64Decode(string str) { byte[] c = Convert.FromBase64String(str); //轉回到原來的 System.String return System.Text.Encoding.Default.GetString(c); } }
/// <summary> /// 工行實體信息類 /// </summary> public class ICBC { //private string _orderPostUrl = "https://mybank.icbc.com.cn/servlet/ICBCINBSEBusinessServlet"; //private string _orderPostUrl = "https://mybank3.dccnet.com.cn/servlet/NewB2cMerPayReqServlet"; private string _orderPostUrl = "https://myipad.dccnet.com.cn/servlet/ICBCINBSEBusinessServlet"; //private string _interfaceName = "ICBC_PERBANK_B2C"; private string _interfaceName = "ICBC_PERBANK_B2C"; private string _interfaceVersion = "1.0.0.11"; private string _orderid; private string _amount; private string _curType = "001"; //private string _merID = "1302EC23361694"; private string _merID = "1302EC23928826"; //private string _merAcct = "1302010119022149867"; private string _merAcct = "1302010119022141605"; private string _verifyJoinFlag = "0"; private string _notifyType = "HS"; private string _merURL; private string _resultType = "1"; private string _orderDate = DateTime.Now.ToString("yyyyMMddHHmmss"); private string _merSignMsg; private string _merCert; private string _goodsID = "10021"; private string _goodsName = "XXXX"; private string _goodsNum; private string _carriageAmt; private string _remark1; private string _remark2; private string _merHint; private string _tranData; private string _merReference = "www.XXX.com"; //private string _merReference = "localhost"; private bool _isCheck = false; /// <summary> /// 是否檢測成功 /// </summary> public bool IsCheck { get { return _isCheck; } set { _isCheck = value; } } public string MerReference { get { return _merReference; } set { _merReference = value; } } /// <summary> /// 報文數據 /// </summary> public string TranData { get { return _tranData; } set { _tranData = value; } } /// <summary> /// 工商支付接口路徑 /// </summary> public string OrderPostUrl { get { return _orderPostUrl; } set { _orderPostUrl = value; } } /// <summary> /// 接口名稱 /// </summary> public string InterfaceName { get { return _interfaceName; } set { _interfaceName = value; } } /// <summary> /// 接口版本號 /// </summary> public string InterfaceVersion { get { return _interfaceVersion; } set { _interfaceVersion = value; } } /// <summary> /// 訂單號 /// </summary> public string Orderid { get { return _orderid; } set { _orderid = value; } } /// <summary> /// 訂單金額 /// </summary> public string Amount { get { return _amount; } set { _amount = value; } } /// <summary> /// 支付幣種 RMB:001 /// </summary> public string CurType { get { return _curType; } set { _curType = value; } } /// <summary> /// 商戶代碼 /// </summary> public string MerID { get { return _merID; } set { _merID = value; } } /// <summary> /// 商戶帳號 /// </summary> public string MerAcct { get { return _merAcct; } set { _merAcct = value; } } /// <summary> /// 檢驗聯名標誌 /// 取值「1」:客戶支付時,網銀判斷該客戶是否與商戶聯名,是則按上送金額扣賬,不然展示未聯名錯誤; /// 取值「0」:不檢驗客戶是否與商戶聯名,按上送金額扣賬。 /// </summary> public string VerifyJoinFlag { get { return _verifyJoinFlag; } set { _verifyJoinFlag = value; } } /// <summary> /// 通知類型 /// 取值「HS」:在交易完成後實時將通知信息以HTTP協議POST方式,主動發送給商戶,發送地址爲商戶端隨訂單數據提交的接收工行支付結果的URL即表單中的merURL字段; /// 取值「AG」:在交易完成後不通知商戶。商戶需使用瀏覽器登陸工行的B2C商戶服務網站,或者使用工行提供的客戶端程序API主動獲取通知信息。 /// </summary> public string NotifyType { get { return _notifyType; } set { _notifyType = value; } } /// <summary> /// 返回商戶URL /// </summary> public string MerURL { get { return _merURL; } set { _merURL = value; } } /// <summary> /// 結果發送類型 /// </summary> public string ResultType { get { return _resultType; } set { _resultType = value; } } /// <summary> /// 交易日期時間 /// </summary> public string OrderDate { get { return _orderDate; } set { _orderDate = value; } } /// <summary> /// 訂單簽名數據 /// </summary> public string MerSignMsg { get { return _merSignMsg; } set { _merSignMsg = value; } } /// <summary> /// 商城證書公鑰 /// </summary> public string MerCert { get { return _merCert; } set { _merCert = value; } } /// <summary> /// 商品編號 /// </summary> public string GoodsID { get { return _goodsID; } set { _goodsID = value; } } /// <summary> /// 商品名稱 /// </summary> public string GoodsName { get { return _goodsName; } set { _goodsName = value; } } /// <summary> /// 商品數量 /// </summary> public string GoodsNum { get { return _goodsNum; } set { _goodsNum = value; } } /// <summary> /// 已含運費金額 /// </summary> public string CarriageAmt { get { return _carriageAmt; } set { _carriageAmt = value; } } /// <summary> /// 備註字段1 /// </summary> public string Remark1 { get { return _remark1; } set { _remark1 = value; } } /// <summary> /// 備註字段2 /// </summary> public string Remark2 { get { return _remark2; } set { _remark2 = value; } } /// <summary> /// 商城提示 /// </summary> public string MerHint { get { return _merHint; } set { _merHint = value; } } }
如下爲支付頁面邏輯代碼:
public partial class trainpay : System.Web.UI.Page { public ICBC icmcModel = new ICBC(); ICBCTest it = new ICBCTest(); BLL.PXBCourse bllPXBCourse = new BLL.PXBCourse(); public string money; protected void Page_Load(object sender, EventArgs e) { if (pxbID != 0 && courseID != "" && UserId != "") { //string ccid = Request.QueryString["cid"]; //Random rnd = new Random(); //int n = rnd.Next(1000, 9999); //string orderId = DateTime.Now.ToString("yyyyMMddHHmmss") + n.ToString();//訂單號 string datetime = DateTime.Now.AddDays(-1).ToString("yyyyMMddHHmmss"); //總價 try { //string ii = bllPXBCourse.Getbymoney(courseID,pxbID); string ii = "1"; if (ii != "") { //money = ii + "00"; money = ii; } else { //money = "0.01"; Response.Write("金額出錯,請聯繫管理員!"); Response.End(); } } catch { Response.Write("金額出錯,請聯繫管理員!"); Response.End(); } //數據處理 StringBuilder strXml = new StringBuilder(); strXml.Append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\"?>"); strXml.Append("<B2CReq>"); //接口名稱 strXml.Append("<interfaceName>" + icmcModel.InterfaceName + "</interfaceName>"); //接口版本號 strXml.Append("<interfaceVersion>" + icmcModel.InterfaceVersion + "</interfaceVersion>"); //訂單信息 strXml.Append("<orderInfo>"); //交易日期時間 strXml.Append("<orderDate>" + icmcModel.OrderDate + "</orderDate>"); //支付幣種 strXml.Append("<curType>" + icmcModel.CurType + "</curType>"); //商戶代碼 strXml.Append("<merID>" + icmcModel.MerID + "</merID>"); //訂單信息列表 strXml.Append("<subOrderInfoList>"); //訂單信息 strXml.Append("<subOrderInfo>"); //訂單編號 strXml.Append("<orderid>" + OrderId + "</orderid>"); //訂單金額 strXml.Append("<amount>" + money + "</amount>"); //分期付款期數 1表明全額付款 strXml.Append("<installmentTimes>1</installmentTimes>"); //商戶帳號 strXml.Append("<merAcct>" + icmcModel.MerAcct + "</merAcct>"); //商品編號 strXml.Append("<goodsID>" + DateTime.Now.ToString("yyyyMMddHHmmss").ToString() + "</goodsID>"); //商品名稱 strXml.Append("<goodsName>" + GetPxbname(pxbID) + "</goodsName>"); //商品數量 strXml.Append("<goodsNum>1</goodsNum>"); //已含運費金額 strXml.Append("<carriageAmt>0</carriageAmt>"); strXml.Append("</subOrderInfo>"); strXml.Append("</subOrderInfoList>"); strXml.Append("</orderInfo>"); strXml.Append("<custom>"); //檢驗聯名標誌 取值「1」:客戶支付時,網銀判斷該客戶是否與商戶聯名 strXml.Append("<verifyJoinFlag>" + icmcModel.VerifyJoinFlag + "</verifyJoinFlag>"); //語言版本 取值:「EN_US」爲英文版;取值:「ZH_CN」或其餘爲中文版 strXml.Append("<Language>ZH_CN</Language>"); strXml.Append("</custom>"); strXml.Append("<message>"); //支持訂單支付的銀行卡種類 strXml.Append("<creditType>2</creditType>"); //通知類型 strXml.Append("<notifyType>HS</notifyType>"); //結果發送類型 strXml.Append("<resultType>1</resultType>"); //商戶reference strXml.Append("<merReference>" + icmcModel.MerReference + "</merReference>"); //客戶端IP 當商戶reference項送空時,該項必輸 strXml.Append("<merCustomIp></merCustomIp>"); //虛擬商品/實物商品標誌位 取值「0」:虛擬商品 取值「1」,實物商品 strXml.Append("<goodsType>1</goodsType>"); //買家用戶號 strXml.Append("<merCustomID>" + UserId + "</merCustomID>"); //買家聯繫電話 strXml.Append("<merCustomPhone>110</merCustomPhone>"); //收貨地址 strXml.Append("<goodsAddress></goodsAddress>"); //訂單備註 strXml.Append("<merOrderRemark></merOrderRemark>"); //商城提示 strXml.Append("<merHint></merHint>"); //備註字段1 strXml.Append("<remark1></remark1>"); //備註字段2 strXml.Append("<remark2></remark2>"); //返回商戶URL strXml.Append("<merURL>http://www.XXX.com/pay/PayReturn.aspx</merURL>"); //返回商戶變量 //strXml.Append("<merVAR>" + OrderId + "," + UserId + "," + pxbID + "," + courseID + "</merVAR>"); strXml.Append("<merVAR>" + OrderId + "," + UserId + "</merVAR>"); strXml.Append("</message>"); strXml.Append("</B2CReq>"); icmcModel.TranData = strXml.ToString(); icmcModel = it.GetCheckInfo(icmcModel); //Payment paymo = new Payment(); //PaymentBLL paybll = new PaymentBLL(); //paymo.oid = OrderId; //paymo.uid = UserId; //paymo.pid = pxbID.ToString(); //paymo.cid = courseID; //paymo.ispay = 0;//0初始化訂單,1支付成功,2支付失敗,3簽名失敗,4數據異常 //paymo.nopay = 1;//線上1,線下2 //paymo.ordertime = DateTime.Now; //paybll.Add(paymo); } else { Response.Write("數據非法提交,請正常付費!"); Response.End(); } } //用戶 public string UserId { get { VerifyUser vuser = new VerifyUser(); return vuser.GetUserID; } } //訂單號 public string OrderId { get { string sid = string.Empty + Request.QueryString["oid"]; return sid; } } private BLL.PaymentBLL paymentBll = new PaymentBLL(); //培訓班 public int pxbID { get { //string sid = string.Empty + Request.QueryString["pid"]; Payment payment = paymentBll.GetModelbyoid(OrderId); string sid = payment.pid.ToString(); int id = 0; if (!int.TryParse(sid, out id)) return 0; return id; } } //課程編號 public string courseID { get { //string cid = Request.QueryString["cid"]; Payment payment = paymentBll.GetModelbyoid(OrderId); string cid = payment.cid; cid = cid.Replace("x", ","); return cid; } } //培訓班名稱 public string GetPxbname(int pxbid) { Community.BLL.PXB bll = new BLL.PXB(); string name = ""; Community.Model.PXB model = bll.GetModel(pxbid); if (model != null) { name = model.Name; } return name; } }
如下是支付頁面代碼:
<body> <form name="sendOrder" method="post" action="<%= icmcModel.OrderPostUrl %>" id="order"> <input type="hidden" name="interfaceName" value="<%= icmcModel.InterfaceName %>"> <input type="hidden" name="interfaceVersion" value="<%= icmcModel.InterfaceVersion %>"> <input type="hidden" name="tranData" value="<%= icmcModel.TranData %>"> <input type="hidden" name="merSignMsg" value="<%= icmcModel.MerSignMsg %>"> <input type="hidden" name="merCert" value="<%= icmcModel.MerCert %>"> </form> <script type="text/javascript"> document.order.submit(); </script> </body>
如下是支付返回頁面:
public partial class PayReturn : System.Web.UI.Page { public ICBC icmcModel = new ICBC(); protected void Page_Load(object sender, EventArgs e) { ICBCTest it = new ICBCTest(); if (Request.Form["notifyData"] != null) { Payment paymo = new Payment(); PaymentBLL paybll = new PaymentBLL(); try { //PaymentBLL paybll = new PaymentBLL(); ICBCTest icbcCheck = new ICBCTest(); ICBC icbcInfo = new ICBC(); icbcInfo.TranData = Request.Form["notifyData"]; icbcInfo.MerSignMsg = Request.Form["signMsg"].ToString(); icbcInfo = icbcCheck.GetCheckReturnInfo(icbcInfo); //自定義返回 string strOrderSN = Request.Form["merVAR"].ToString(); string[] arrorder = strOrderSN.Split(','); string oid = arrorder[0]; string uid = arrorder[1]; int pid = Convert.ToInt32(arrorder[2]); string cid = arrorder[3]; if (icbcInfo.IsCheck)//處理簽名 { DataSet myds = new DataSet(); StringReader strReader = new StringReader(icbcInfo.TranData); myds.ReadXml(strReader); DataTable mytable = new DataTable(); mytable = myds.Tables["bank"]; if (null != mytable && mytable.Rows.Count > 0) { if (mytable.Rows[0]["tranStat"].ToString().Trim() == "1") { //這裏作成功操做 try { //入庫處理 BLL.PXBCourse bllPXBCourse = new BLL.PXBCourse(); BLL.PXBUsers pxbUser = new BLL.PXBUsers(); string b = cid; string[] arrtemp = b.Split('x'); for (int i = 0; i < arrtemp.Length; i++) { int courseid = int.Parse(arrtemp[i]); int addi = bllPXBCourse.Addcoursechoose(uid, courseid, pid); } //付費成功的同時也報名成功 int res = pxbUser.GetRecordCount(" userid='" + uid + "' and pxbid=" + pid); if (res == 0) { Model.PXBUser user = new Model.PXBUser(); user.PXBID = pid; user.UserID = uid; user.BYWay = 1; user.CJWay = 1; //若是當前人不在當前培訓班,則報名 pxbUser.Add(user); } // <param name="nopay">支付方式:1爲線上支付,2爲線下支付</param> // <param name="ispay">支付狀態:0初始化訂單,1支付成功,2支付失敗,3簽名失敗,4數據異常,5支付中</param> // <param name="oid">訂單號</param> paybll.Updatepay(1,1, oid);//支付成功 Response.Write("http://122.225.101.115:444/FirstPage.aspx"); Response.End(); } catch { paybll.Updatepay(1,4, oid);//數據異常 Response.Write("數據異常,請聯繫管理員!"); Response.End(); } } else { paybll.Updatepay(1,2, oid);//支付失敗 Response.Write("支付失敗,請聯繫管理員!"); Response.End(); } } } else { paybll.Updatepay(1,3, oid);//簽名失敗 Response.Write("簽名失敗,請聯繫管理員!"); Response.End(); } } catch { Response.Write("數據異常,請聯繫管理員!"); Response.End(); } } else { Response.Write("返回失敗,請聯繫管理員!"); Response.End(); } } }
然而,比較重要的一個還有支付查詢頁面,防止好比支付成功了,但因爲網絡異常等緣由沒有返回支付成功數據等狀況下使用。
如下是支付查詢頁面邏輯代碼:
public partial class openpay : System.Web.UI.Page { /// <summary> /// 銀行證書文件地址 /// </summary> static string strCertFN = System.Web.HttpContext.Current.Server.MapPath(@"user\user.crt"); /// <summary> /// 商戶證書文件地址 /// </summary> static string strCertFNM = System.Web.HttpContext.Current.Server.MapPath(@"user\user.crt"); /// <summary> /// 私鑰文件名 /// </summary> //static string strKeyFN = System.Web.HttpContext.Current.Server.MapPath(@"user\user.key"); static string strKeyFN = System.Web.HttpContext.Current.Server.MapPath(@"user\kjks-sy.key"); /// <summary> /// 私鑰口令 /// </summary> static string strKey = "12345678"; // static string api_url = "https://corporbank.icbc.com.cn/servlet/ICBCINBSEBusinessServlet"; //static string api_url = "https://corporbank3.dccnet.com.cn/servlet/ICBCINBSEBusinessServlet"; static string api_url = "https://myipad.dccnet.com.cn/servlet/ICBCINBSEBusinessServlet"; //static string post_params = "APIName=EAPI&APIVersion=001.001.002.001&MerReqData="; static string post_params = "APIName=kjks.y.1302&APIVersion=0.0.1.0&MerReqData="; static string cert_path = HttpContext.Current.Server.MapPath("~/.."); protected void Page_Load(object sender, EventArgs e) { string outMess; string mess = CheckOrder("201408041357171136 ", "20140804", "1302EC23361694", "1302010119022149867", out outMess); } /// <summary> /// 查詢訂單 /// </summary> /// <param name="strOrderNum">訂單號</param> /// <param name="strTranDate">交易日期</param> /// <param name="strShopCode">商家代碼</param> /// <param name="strShopAccount">商城帳號</param> /// <param name="errInfo"></param> /// <returns></returns> public static string CheckOrder(string strOrderNum, string strTranDate, string strShopCode, string strShopAccount, out string errInfo) { try { errInfo = string.Empty; StringBuilder sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?><ICBCAPI><in><orderNum>"); sb.Append(strOrderNum); sb.Append("</orderNum><tranDate>"); sb.Append(strTranDate); sb.Append("</tranDate><ShopCode>"); sb.Append(strShopCode); sb.Append("</ShopCode><ShopAccount>"); sb.Append(strShopAccount); sb.Append("</ShopAccount></in></ICBCAPI>"); string post_data = post_params + sb.ToString(); string retruenstring = PostDataBySSL(post_data, api_url, cert_path, strKey, out errInfo); //var result = SpringFactory.BusinessFactory.GetBusinessAnonymousUser(); //result.AddLogs("返回3:" + (retruenstring.Length > 400 ? retruenstring.Substring(0, 400) : retruenstring)); if (retruenstring.Length <= 5) { return retruenstring; } return HttpUtility.UrlDecode(retruenstring); } catch { errInfo = "查詢繳費接口失敗"; return "99"; } } /// <summary> /// 發送SSL加密請求 /// </summary> /// <param name="post_data"></param> /// <param name="url"></param> /// <param name="cert_path"></param> /// <param name="cert_password"></param> /// <param name="errInfo"></param> /// <returns></returns> public static string PostDataBySSL(string post_data, string url, string cert_path, string cert_password, out string errInfo) { errInfo = string.Empty; try { ASCIIEncoding encoding = new ASCIIEncoding(); byte[] data = encoding.GetBytes(post_data); if (cert_path != string.Empty) ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); WebRequest webRequest = WebRequest.Create(url); HttpWebRequest httpRequest = webRequest as HttpWebRequest; if (cert_path.ToLower().EndsWith(".cer")) { httpRequest.ClientCertificates.Add(X509Certificate.CreateFromCertFile(cert_path)); } else { //SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(cert_path); httpRequest.ClientCertificates.Add(new X509Certificate2(cert_path, cert_password, X509KeyStorageFlags.MachineKeySet)); } httpRequest.KeepAlive = true; httpRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; httpRequest.ContentType = "application/x-www-form-urlencoded"; httpRequest.Method = "POST"; httpRequest.ContentLength = data.Length; Stream requestStream = httpRequest.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); Stream responseStream = null; responseStream = httpRequest.GetResponse().GetResponseStream(); string stringResponse = string.Empty; if (responseStream != null) { using (StreamReader responseReader = new StreamReader(responseStream, Encoding.GetEncoding("GBK"))) { stringResponse = responseReader.ReadToEnd(); } responseStream.Close(); } return stringResponse; } catch (Exception e) { errInfo = e.Message; // SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(e.Message); return string.Empty; } } public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; } }
3、注意事項
根據本人被坑死的經歷,告訴你們注意如下事項:
1.在支付發送數據時,支付金額應該是以「分」爲單位,也就是金額是一個整數。
2.在進行測試的時候,訂單提交時間必須和他們服務器時間一致,而他們,工行測試服務器時間是被他們設置了的,根本不是正常時間,最重要的一點是,時間天天都在變化,好比今天是2016年8月22號,明天多是2016年8月26號之類的,以前他們沒有直接誒告訴我,被坑死了。時間不對,支付不了哦。
3.在測試時,支付成功後不會跳轉到咱們的支付返回地址,這個也必須注意一下,這也是他們測試服務器的緣由,本人在這裏也是被坑了,這樣的話咱們也沒法更新本地訂單支付狀態表。
原本好久以前就該寫好的了,當時技術經理讓我作完這個功能寫一篇技術文檔給後來人借鑑下的,惋惜一直比較懶,如今我敬愛的技術經理都走了,我遇到的第一位溫柔可親的還對我這麼好的技術經理竟然都走了(PS:是個男的哦),真的很不捨。我多但願咱們部門能儘快找到一位新的技術經理,帶我飛,至少我才踏入這個社會,不少東西須要學習,有人給我引路,我會少走不少彎路,進步更快一些。