前期准备

支付组件注册(PS:当时工行技术根本没有给我这个组件,被坑了,当时还想骂那个技术一下,签名什么的,难道我随便按照自己的想法签一个也可以?后来终于给我了)

组件注册说明

一、API配置说明:

1.将ICBCEBankUtil.dll和infosecapi.dll两个dll文件拷贝到系统system32目录下(其中,如果是64位系统,则拷贝到SysWOW64目录下);
2.打开DOS窗口,进入system32目录/SysWOW64目录;
3.运行“regsvr32 ICBCEBankUtil.dll”命令注册控件;

二、函数说明:

1、初始化
init(
BSTR certFN,银行证书文件名
BSTR certFNM,商户证书文件名
BSTR keyFN,私钥文件名
BSTR key私钥保护口令
)
返回值:
-100:银行证书文件名传递错
-101:商户证书文件名传递错
-102:私钥文件名传递错
-103:私钥保护口令传递错
-110:打开银行证书文件错
-111:打开商户证书文件错
-112:打开私钥文件错
2、签名
signC(
BSTR src,明文字符串
int srcLen,明文长度
)
返回值:
如果成功则返回BASE64编码后的签名串,否则返回空串
如果返回空串,可调用getRC取得错误码
3、获取错误码(只在出错时有效)
getRC
返回值
-100:明文字符串传递错误
-1:明文错误
-2:私钥错
-3:私钥解密错
-4:私钥保护口令错
4、验证签名
verifySignC(
BSTR src,明文字符串
int srcLen,明文字符串长度
BSTR sSrc,签名BASE64编码字符串
int sSrcLen签名BASE64编码字符串长度
)
返回值:
0:成功
-1:验证失败
-2:解码失败
-100:明文字符串传递有误
-101:签名字符串传递有误
5、获取证书
getCert(
int which证书类型:0银行证书,1商户证书
)
返回值:BASE64编码后的证书
注册好以后将infosecapi.dll引用到项目中。
2.证书引用
然后将public.crt、商户.crt、商户.key 这三个文件放到项目某个文件夹下

开发阶段

1.首先必须细读:《中国工商银行网上银行新B2C在线支付接口说明V1.0.0.11》这个文档(PS:工行人员当时没有给我这个文档,打电话过去问技术,技术让我细读这个文档,根本没有这个文档,还说他发给客户了的,问客户也说没有发过,当时真的是被坑好多,后来网上找到了一个)。
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){//对订单数据进行签名,得到订单签名数据 MerSignMsgargIcbc.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;}elseargIcbc.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.Stringreturn Convert.ToBase64String(b);}public static string Base64Encode(Byte[] b){///转成Base64形式的System.Stringreturn 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.Stringreturn 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>");//商户referencestrXml.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>");//备注字段1strXml.Append("<remark1></remark1>");//备注字段2strXml.Append("<remark2></remark2>");//返回商户URLstrXml.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;}}

三、注意事项

1.在支付发送数据时,支付金额应该是以“分”为单位,也就是金额是一个整数。

2.在进行测试的时候,订单提交时间必须和他们服务器时间一致,而他们,工行测试服务器时间是被他们设置了的,根本不是正常时间,最重要的一点是,时间每天都在变化,比如今天是2016年8月22号,明天可能是2016年8月26号之类的,之前他们没有直接诶告诉我,被坑死了。时间不对,支付不了。

3.在测试时,支付成功后不会跳转到我们的支付返回地址,这个也必须注意一下,这也是他们测试服务器的原因,本人在这里也是被坑了,这样的话我们也无法更新本地订单支付状态表。

转载自个人—波霸38(泥沙)的博客

工行在线支付接口实战开发流程及源码相关推荐

  1. php 银行支付通道_PHP银联在线支付接口的开发实例

    本文主要和大家分享PHP银联在线支付接口的开发实例,希望能帮助到大家. 1. 登录银联自助化测试平台(登陆地址:open.unionpay.com),登录后,点击我的产品,如下:点击右方需要测试的接口 ...

  2. java二次开发流程,源码修改流程(Hadoop)

    1.困难 在实际业务场景中,目前现有的框架在很大情况下可能不能满足现有的需求,用代码进行二次开发就是最好的选择.在一开始进行的时候,根本无从下手是一方面,因为源码的量特别大,如果是在官方的源码中,基本 ...

  3. 最新彩虹易支付二次开发的系统源码+PHP内核

    正文: 彩虹易支付系统 二次开发首发 2022/10/26: 1.新增用户登陆邮箱提醒(防止金额金额被刷) 特别提醒(后台必须配置好邮箱信息,不然用户中心不会被触发邮箱) 2.新增工单系统 3. 新增 ...

  4. 【用户画像】标签任务开发流程(源码之实体类、工具类、配置文件、DAO层)

    文章目录 一 代码实现 0 开发主线 1 实体类 (1)TagInfo (2)TaskInfo (3)TaskTagRule 2 工具类 (1)连接sql的工具类 测试 (2)专门读取properti ...

  5. KV260 FPGA工程开发流程及源码

    源码在我的博客的资源CSDN资源.

  6. 支付宝在线支付接口开发教程

    1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约.并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台.在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款 ...

  7. 支付宝在线支付接口开发教程与总结

    1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约.并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台.在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款 ...

  8. Paypal 在线支付接口应用从零开始,第2节,[支付API原理及流程]

    今天看看Paypal支付流程和简单的认证原理,我画了一张图.应该能表达这两点意思了 我们的站点名字,为了好理解,暂且就定为西狐的网站吧. 点此查看清晰原图 恩,理论知识很重要哈,先把这图理解了,下一步 ...

  9. PHP银联在线支付接口开发日志

    银联在线支付接口开发日志 1. 登录银联自助化测试平台(登陆地址:open.unionpay.com),登录后,点击我的产品,如下:点击右方需要测试的接口,本例以 手机网页支付(WAP支付)为例. 2 ...

最新文章

  1. Java面试查漏补缺
  2. R向量化操作(Data Transformations)
  3. 模糊搜索怎么实现_干货 | 你真的了解自己是怎么搜索的吗_01
  4. am335x修改sd卡cd管脚
  5. CVPR2021 用更好的目标检测器提取视觉特征!微软提出VinVL,基于更好的视觉特征,达到更强的多模态性能...
  6. CIF、QCIF、HD1、D1格式介绍
  7. 举牌人表情包使用nodejs实现
  8. Spark-on-YARN
  9. 【Python】:拓展Queue实现有序不重复队列
  10. windows2008r2安装笔记
  11. JNI 在实际项目中的使用方法
  12. 通过VBA将excel数据导入至word文档
  13. iOS 模拟器调试web/h5代码
  14. 干货丨开源硬件与行业革新
  15. 如何使用ABBYY软件编辑PDF文本
  16. 161张Menhera酱表情包 无水印汉化版
  17. html图片自动旋转
  18. 目标检测入门实战:贪吃蛇小游戏
  19. 【ArcGIS小技巧视频教程】(1):GIS数据来源下载攻略
  20. photoshop--色彩管理

热门文章

  1. 法国多地遭风雪袭击 巴黎奥利机场部分班机停飞
  2. latex中文加粗失效(楷体)
  3. pku1222(高斯消元1)
  4. 反击式开关电源,变压器计算方法,及相关器件的选型
  5. SWOT 模型帮你诚实面对自己——高科技人才在跨国大公司的生存之道(二)
  6. Python之数据处理案例
  7. G1D26-DP presentationNLP相关
  8. 20150712 We can locate ourselves with the GPS
  9. js 日期对象 31 号 setMonth 的锅 1
  10. c语言三元组求矩阵加法,矩阵相加的算法(存储结构为三元组表)