工商銀行オンライン支払いインタフェース
121227 ワード
以下のブログを参考にしました.http://www.cnblogs.com/gonganruyi/archive/2011/07/01/2095463.html
1、まず工商銀行が提供するICBCEBankUtil.dllを登録し、ICBCEBankUtil.dllとinfosecapi.dllをsystem 32フォルダの下CMDにコピーしてregsvr 32 ICBCEBankUtil.dll登録コントロールを入力する.WINDOWS SERVER 2008/2012などのシステムでは、管理者コマンドプロンプトを実行する必要があります.
2、銀行が提供する.pfx証明書ファイルを分割し、.keyと.crtの2つのファイルを生成し、分割時に設定した秘密鍵のパスワードを記憶する.ebb 2 cpublic.crt(公開鍵ファイル)、Name.key、Name.crtの3つのファイルを指定したディレクトリにコピーします.
3、次はコード
"post"action=""id="order">"width: 500px; margin: auto auto; padding: 10px; line-height: 30px;">
工商銀行の支払い住所にジャンプしています.....
"hidden"name="interfaceName"value=""/>
"hidden"name="interfaceVersion"value=""/>
"hidden"name="tranData"value=""/>
"hidden"name="merSignMsg"value=""/>
"hidden"name="merCert"value=""/>
"</span><span style="color:#800000;">text/javascript</span><span style="color:#800000;">"</span>> document.getElementById(<span style="color:#800000;">"</span><span style="color:#800000;">order</span><span style="color:#800000;">"</span>).submit();
支払いインタフェースHTML
// ( )
this.userIdCardNumber = Request.QueryString["userIdCardNumber"];
// ,( )
// this.money = (Convert.ToInt32(Request.QueryString["payMnoney"]) * 100).ToString();
this.money = "1";
//
string orderId = DateTime.Now.ToString("yyyyMMddHHmmss") + userIdCardNumber.Substring(userIdCardNumber.Length - 5, 5) + Inhua.Common.Rand.Number(5);
StringBuilder strXml = new StringBuilder();
strXml.Append("");
strXml.Append(" ");
//
strXml.Append(" " + icmcModel.InterfaceName + "");
//
strXml.Append(" " + icmcModel.InterfaceVersion + "");
//
strXml.Append(" ");
//
strXml.Append(" " + icmcModel.OrderDate + "");
//
strXml.Append(" " + icmcModel.CurType + "");
//
strXml.Append(" " + icmcModel.MerID + "");
//
strXml.Append(" ");
//
strXml.Append(" ");
//
strXml.Append(" " + orderId + "");
//
//strXml.Append("" + user.ExaminationModel.Examination_fees.ToString("0.00") + " ");
strXml.Append(" " + money + " ");
// 1
strXml.Append("1 ");
//
strXml.Append(" " + icmcModel.MerAcct + "");
//
strXml.Append(" " + icmcModel.Orderid + "");
//
strXml.Append(" ");
//
strXml.Append("1 ");
//
strXml.Append(" ");
strXml.Append("");
strXml.Append("");
strXml.Append("");
strXml.Append(" ");
// “1”: ,
strXml.Append(" " + icmcModel.VerifyJoinFlag + "");
// :“EN_US” ; :“ZH_CN”
strXml.Append("ZH_CN ");
strXml.Append("");
strXml.Append(" ");
//
strXml.Append("2 ");
//
strXml.Append(" " + icmcModel.NotifyType + "");
//
strXml.Append(" " + icmcModel.ResultType + "");
// reference
strXml.Append(" " + icmcModel.MerReference + "");
// IP reference ,
strXml.Append(" " + icmcModel.MerIP + "");
// / “0”: “1”,
strXml.Append("0 ");
//
strXml.Append(" ");
//
strXml.Append(" ");
//
strXml.Append(" ");
//
strXml.Append(" ");
//
strXml.Append(" ");
// 1
strXml.Append(" ");
// 2
strXml.Append(" ");
// URL
//strXml.Append(" http://localhost/");
//string url = tools.GetRootVirtualPath();System.Configuration.ConfigurationManager.AppiiciSettings["aa"]
string merURL = "http://" + icmcModel.MerIP + "/PayOnline/ReturnPayment.aspx";
strXml.Append(" " + merURL + "");
//
strXml.Append(" " + Inhua.Common.Encryption.Encrypt(userIdCardNumber) + "");
strXml.Append("");
strXml.Append("");
//
icmcModel.TranData = strXml.ToString();
CBCOnlinePayment.CBCPayOnline.GetCheckInfo(icmcModel);
支払インタフェースバックグラウンドコード
public class ICBC { private string _orderPostUrl = "https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet"; 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 = " "; ///
/// /// private string _merAcct = " "; ///
/// /// “1”: , , , ; “0”: , 。 /// private string _verifyJoinFlag = "0"; ///
/// /// 。 /// “HS”: HTTP POST , , URL merURL ; /// “AG”: 。 B2C , API 。 /// private string _notifyType = "HS"; ///
/// URL /// URL, , url, post URL /// : URL http ( https ), 80 。 /// private string _merURL; ///
/// /// /// “0”: , ; /// “1”, 。 /// HS , AG , , , 。 /// private string _resultType = "1"; ///
/// /// private string _orderDate = System.DateTime.Now.ToString("yyyyMMddHHmmss"); /// /// /// , /// API tranData xml , , BASE64 merSignMsg; /// : tranData xml , tranData BASE64 ; /// private string _merSignMsg; /// /// /// , BASE64 ; /// private string _merCert; /// /// /// private string _goodsID = "001"; /// /// /// private string _goodsName = ""; /// /// /// private string _goodsNum = "1"; /// /// /// private string _carriageAmt; /// /// 1 /// private string _remark1; /// /// 2 /// private string _remark2; /// /// /// private string _merHint; /// /// xml , BASE64 ; /// ; /// : /// xml ; BASE64 ; /// xml ; /// private string _tranData; /// /// ( , “*. B2C .com”), , , 。 /// private string _merReference = System.Configuration.ConfigurationManager.AppSettings["WebUrl"]; private string _merIP = System.Configuration.ConfigurationManager.AppSettings["WebIP"]; private bool _isCheck = false; /// /// /// public bool IsCheck { get { return _isCheck; } set { _isCheck = value; } } /// /// /// public string MerReference { get { return _merReference; } set { _merReference = value; } } /// /// IP /// public string MerIP { get { return _merIP; } set { _merIP = value; } } /// /// /// public string TranData { get { return _tranData; } set { _tranData = value; } } /// /// /// public string OrderPostUrl { get { return _orderPostUrl; } set { _orderPostUrl = value; } } /// /// /// public string InterfaceName { get { return _interfaceName; } set { _interfaceName = value; } } /// /// /// public string InterfaceVersion { get { return _interfaceVersion; } set { _interfaceVersion = value; } } /// /// /// public string Orderid { get { return _orderid; } set { _orderid = value; } } /// /// /// public string Amount { get { return _amount; } set { _amount = value; } } /// /// RMB:001 /// public string CurType { get { return _curType; } set { _curType = value; } } /// /// /// public string MerID { get { return _merID; } set { _merID = value; } } /// /// /// public string MerAcct { get { return _merAcct; } set { _merAcct = value; } } /// /// /// “1”: , , , ; /// “0”: , 。 /// public string VerifyJoinFlag { get { return _verifyJoinFlag; } set { _verifyJoinFlag = value; } } /// /// /// “HS”: HTTP POST , , URL merURL ; /// “AG”: 。 B2C , API 。 /// public string NotifyType { get { return _notifyType; } set { _notifyType = value; } } /// /// URL /// public string MerURL { get { return _merURL; } set { _merURL = value; } } /// /// /// public string ResultType { get { return _resultType; } set { _resultType = value; } } /// /// /// public string OrderDate { get { return _orderDate; } set { _orderDate = value; } } /// /// /// public string MerSignMsg { get { return _merSignMsg; } set { _merSignMsg = value; } } /// /// /// public string MerCert { get { return _merCert; } set { _merCert = value; } } /// /// /// public string GoodsID { get { return _goodsID; } set { _goodsID = value; } } /// /// /// public string GoodsName { get { return _goodsName; } set { _goodsName = value; } } /// /// /// public string GoodsNum { get { return _goodsNum; } set { _goodsNum = value; } } /// /// /// public string CarriageAmt { get { return _carriageAmt; } set { _carriageAmt = value; } } /// /// 1 /// public string Remark1 { get { return _remark1; } set { _remark1 = value; } } /// /// 2 /// public string Remark2 { get { return _remark2; } set { _remark2 = value; } } /// /// /// public string MerHint { get { return _merHint; } set { _merHint = value; } } }
public static class CBCPayOnline
{
private static string amount;
///
///
///
static string strCertFN = HttpContext.Current.Server.MapPath(" ");
///
///
///
static string strCertFNM = HttpContext.Current.Server.MapPath(" ");
///
///
///
static string strKeyFN = HttpContext.Current.Server.MapPath(" ");
///
///
///
static string strKey = " ";
static string api_url = "https://corporbank.icbc.com.cn/servlet/ICBCINBSEBusinessServlet";
static string post_params = "APIName=EAPI&APIVersion=001.001.002.001&MerReqData=";
static string cert_path = HttpContext.Current.Server.MapPath("~/..");
// HttpContext.Current.Server.MapPath("~/..");
public static void Load()
{
System.Threading.Thread t = new System.Threading.Thread(CheckOrder);
t.Start();
}
static CBCPayOnline()
{
}
///
///
///
public static void CheckOrder()
{
var query = SpringFactory.BusinessFactory.GetBusinessAnonymousUser();
while (true)
{
var list = query.GetOrderPayList();
ICBC icbcInfo = new ICBC();
string outMess = "";
foreach (var l1 in list)
{
try
{
var user = SpringFactory.BusinessFactory.GetStudent(l1.userName);
string mess = CheckOrder(l1.OrderID, l1.PayDate.ToString("yyyyMMdd"), icbcInfo.MerID, icbcInfo.MerAcct, out outMess);
if (mess.Length > 5)// , , xml
{
DataSet myds = new DataSet();
StringReader strReader = new StringReader(mess);
myds.ReadXml(strReader);
string stat = myds.Tables["out"].Rows[0]["tranStat"].ToString();
if (stat == "1" || stat == "0")
{
amount = myds.Tables["out"].Rows[0]["amount"].ToString();
user.PaymentSucceed(amount, l1.OrderID);
}
else//
{
SpringFactory.BusinessFactory.GetStudent(l1.userName).OrderFaild(l1.OrderID);
}
}
else
{
string pays = "";
switch (mess)
{
case "40972": pays = "API "; break;
case "40973": pays = "API "; break;
case "40976": pays = "API "; break;
case "40977": pays = " "; break;
case "40978": pays = " "; break;
case "40979": pays = " "; break;
case "40980": pays = "API "; break;
case "40981": pays = " "; break;
case "40982": pays = " "; break;
case "40983": pays = " "; break;
case "40987": pays = " "; break;
case "40947": pays = " "; break;
case "40948": pays = " "; break;
case "40949": pays = " "; break;
case "40950": pays = " "; break;
case "40951": pays = " id "; break;
case "40952": pays = " id "; break;
case "40953": pays = " id "; break;
case "40954": pays = " "; break;
}
//
if (mess == "40972")
{
var result = SpringFactory.BusinessFactory.GetStudent(l1.userName);
result.OrderFaild(l1.OrderID);
}
else//
{
var result = SpringFactory.BusinessFactory.GetStudent(l1.userName);
result.AddOrderLogs(l1.Amount.ToString(), false, l1.OrderID, " :" + mess + pays);
}
}
}
catch (Exception e)
{
var result = SpringFactory.BusinessFactory.GetStudent(l1.userName);
result.AddOrderLogs("0", false, l1.OrderID, e.ToString());
}
}
System.Threading.Thread.Sleep(1000 * 60 * 30);
}
}
///
///
///
///
///
public static string ChenkOrder(string orderID, DateTime? payDate, string userIdCardNumber)
{
if (orderID.Length != 24)
{
return " , 24 ";
}
ICBC icbcInfo = new ICBC();
//
var payModel = SpringFactory.BusinessFactory.GetBusinessAnonymousUser().GetOrderModel(orderID, userIdCardNumber);
//
var logModel = SpringFactory.BusinessFactory.GetBusinessAnonymousUser().GetPayLogsByOrderId(orderID, userIdCardNumber);
if (logModel != null)
{
return " , 。";
}
string outMess = "";
string zfrq = orderID.Substring(0, 8);
if (payDate != null)
{
zfrq = payDate.Value.ToString("yyyyMMdd");
}
else
{
if (payModel != null)
{
zfrq = payModel.PayDate.ToString("yyyyMMdd");
}
}
string mess = CheckOrder(orderID, zfrq, icbcInfo.MerID, icbcInfo.MerAcct, out outMess);
if (mess.Length > 5)// , , xml
{
DataSet myds = new DataSet();
StringReader strReader = new StringReader(mess);
try
{
myds.ReadXml(strReader);
}
catch
{
throw new Exception(" :" + mess);
}
var user = SpringFactory.BusinessFactory.GetStudent(payModel.userName);
string stat = myds.Tables["out"].Rows[0]["tranStat"].ToString();
if (stat == "1" || stat == "0")
{
if (payModel != null)
{
amount = myds.Tables["out"].Rows[0]["amount"].ToString();
user.PaymentSucceed(amount, orderID);
return " !\r
" + orderID + "\r
:" + amount;
}
else
{
return " , ";
}
}
else
{
string pays = "";
if (stat == "2")
pays = " ";
else
pays = " ";
if (payModel != null)
{
var result = SpringFactory.BusinessFactory.GetStudent(payModel.userName);
result.OrderFaild(orderID);
}
return pays;
}
}
else
{
string pays = "";
switch (mess)
{
case "40972": pays = "API "; break;
case "40973": pays = "API "; break;
case "40976": pays = "API "; break;
case "40977": pays = " "; break;
case "40978": pays = " "; break;
case "40979": pays = " "; break;
case "40980": pays = "API "; break;
case "40981": pays = " "; break;
case "40982": pays = " "; break;
case "40983": pays = " "; break;
case "40987": pays = " "; break;
case "40947": pays = " "; break;
case "40948": pays = " "; break;
case "40949": pays = " "; break;
case "40950": pays = " "; break;
case "40951": pays = " id "; break;
case "40952": pays = " id "; break;
case "40953": pays = " id "; break;
case "40954": pays = " "; break;
}
//
if (mess == "40972")
{
if (payModel != null)
{
var result = SpringFactory.BusinessFactory.GetStudent(payModel.userName);
result.OrderFaild(orderID);
}
}
else//
{
if (payModel != null)
{
var result = SpringFactory.BusinessFactory.GetStudent(payModel.userName);
result.AddOrderLogs(payModel.Amount.ToString(), false, orderID, " :" + mess + pays);
}
}
return pays;
}
}
///
///
///
///
///
public static DataTransfer.ICBC GetCheckInfo(DataTransfer.ICBC argIcbc)
{
string strMerSignMsg = string.Empty;
B2CUtil icbcObj = new B2CUtil();
int jg = icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey);
if (jg == 0)
{
argIcbc.MerSignMsg = icbcObj.signC(argIcbc.TranData, argIcbc.TranData.Length);
if (argIcbc.MerSignMsg == "")
{
int returnCode = icbcObj.getRC();
SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(" :" + returnCode + ", ");
}
argIcbc.MerCert = icbcObj.getCert(1);
byte[] bytes = Encoding.Default.GetBytes(argIcbc.TranData);
argIcbc.TranData = Convert.ToBase64String(bytes);
}
else
{
SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(jg.ToString() + ", ");
}
return argIcbc;
}
///
///
///
///
///
public static DataTransfer.ICBC GetCheckReturnInfo(DataTransfer.ICBC argIcbc)
{
string strMerSignMsg = string.Empty;
B2CUtil icbcObj = new B2CUtil();
if (icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey) == 0)
{
argIcbc.TranData = Decode(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;
}
///
///
///
///
///
public static string Encode(string data)
{
try
{
return Inhua.Common.Encryption.Encrypt(data);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
///
///
///
///
///
public static string Decode(string str)
{
byte[] outputb = Convert.FromBase64String(str);
string orgStr = Encoding.Default.GetString(outputb);
return orgStr;
}
///
///
///
///
///
///
///
///
///
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(" ");
sb.Append(strOrderNum);
sb.Append(" ");
sb.Append(strTranDate);
sb.Append(" ");
sb.Append(strShopCode);
sb.Append(" ");
sb.Append(strShopAccount);
sb.Append("");
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 (Exception ex)
{
var result = SpringFactory.BusinessFactory.GetBusinessAnonymousUser();
result.AddLogs(" 1:" + " " + ex.Message);
errInfo = " ";
return "99";
}
}
///
/// SSL
///
///
///
///
///
///
///
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;
}
}
if (Request.Form["notifyData"] != null)
{
try
{
ICBC icbcInfo = new ICBC();
icbcInfo.TranData = Request.Form["notifyData"];
icbcInfo.MerSignMsg = Request.Form["signMsg"].ToString();
icbcInfo = CBCOnlinePayment.CBCPayOnline.GetCheckReturnInfo(icbcInfo);
//
this.userIdCardNumber = Inhua.Common.Encryption.Decrypt(Request.Form["merVAR"].ToString());
var query = SpringFactory.BusinessFactory.GetStudent(userIdCardNumber);
if (icbcInfo.IsCheck)
{
DataSet myds = new DataSet();
StringReader strReader = new StringReader(icbcInfo.TranData);
myds.ReadXml(strReader);
DataTable mytable = new DataTable();
mytable = myds.Tables["bank"];
string payDate = myds.Tables["orderInfo"].Rows[0]["orderDate"].ToString().Trim();
string amount = myds.Tables["subOrderInfo"].Rows[0]["amount"].ToString().Trim();
string orderid = myds.Tables["subOrderInfo"].Rows[0]["orderid"].ToString().Trim();
if (null != mytable && mytable.Rows.Count > 0)
{
if (mytable.Rows[0]["tranStat"].ToString().Trim() == "1")
{
//
string s2 = payDate.Substring(0, 4) + "-" + payDate.Substring(4, 2) + "-" + payDate.Substring(6, 2) + " " + payDate.Substring(8, 2) + ":" + payDate.Substring(10, 2);
DateTime time1 = DateTime.Parse(s2);
query.PaymentSucceed(amount, orderid);// ,
}
else
{
SpringFactory.BusinessFactory.GetStudent(this.userIdCardNumber).AddOrderLogs("0", false, "", " ");
}
}
}
}
catch (Exception ex)
{
SpringFactory.BusinessFactory.GetStudent(this.userIdCardNumber).AddOrderLogs("0", false, "", ex.Message);
}
}
else
{
var result = SpringFactory.BusinessFactory.GetBusinessAnonymousUser();
result.AddLogs(" , !");
}
}
コールバックページコード
、 する のある について します( はwindows server 2012のサーバーにエラーが しました):
1、サービスに した 、 いページタイムズの の に すエラーにジャンプします.
の にICBCEBankUtil.dllが されていない だと われましたが、 に も したことがあり、 を しています. してやっとこの を し、IIS を き、アプリケーションプール-あなたのプログラムが するアプリケーションプールを - クリック- -32ビットアプリケーション をTrue(デフォルトFalse)に することを にします.
の に します.
2、 はインタフェースを する にローカルで がなくて、サーバーに してからずっとシステムを えて のファイルが つからないことを して、サーバーの で のファイルは して、どういうことで、したことがありますか? けを めますコードは のとおりです.
だと べた httpRequest.ClientCertificates.Add(new X509Certificate2(cert_path, cert_password));このコードの 、「 されたファイルが つからない」という が てきましたが、 ファイルはすでにサーバーに されています.Nを り して い しました. のX 509 Certificate 2 cert=new X 509 Certificate 2(cert_path、「12345678」)に しました.パラメータを して、X 509 Certificate 2 cert= X 509 Certificate 2(cert_path,cert_password,X 509 KeyStorageFlags.MachineKeySet). な は の を にしてください.http://q.cnblogs.com/q/54288/