- 浏览: 670916 次
- 性别:
- 来自: 石家庄
文章分类
最新评论
-
abao1:
老贾 在安装IDEA的过程中,在激活步骤时,按如下操作即可: ...
IntelliJ IDEA 2016注册方法和注册码 -
bo_hai:
./usr/bin/java: symbol lookup ...
jmagick安装步骤 -
wxcking:
不错的, 收藏一下
JAVA使用POI生成Excel文件 -
zgyfh:
大哥,密码是多少啊?zgyfh@tom.com谢谢了!新手学习 ...
WPF做的必备示例 -
记忆无泪:
jiasongmao 写道你的邮箱是多少,我可以发源代码到邮箱 ...
WPF做的必备示例
声明:本博文转载于:http://sufei.cnblogs.com/
接口介绍
建行的接口相对于支付宝,Q业务充值和移动,联通,电信,缴费接口要复杂一些,接口分为两块,一块是商户到银行,另外一块是银行到商户
商户到银行
交易流程如下:
网上支付业务流程步骤说明:
1) 客户登录商户网站,选择商户网站商品。
2) 客户将选好的商品放入购物车,并下订单。商户提供商户代码、订单号、合计金额等信息;
3) 客户选择代理付款的银行-建行,确认后,商户代码、订单信息、合计金额通过浏览器URL传到建行网上银行站点;
网上银行自动显示支付页面,客户首先选择是否使用建行证书,然后输入龙卡号和密码,选择“确定”。支付信息经加密后传送到网银中心;
4) 网银中心接收客户支付信息,转发到银行后台业务处理系统;
5) 银行后台业务系统处理后,返回处理结果给网银;
6) 网银通知客户支付(扣帐)是否成功。如果扣帐成功,提示客户注意接收商户返回的送货信息;对于不需要立即响应的商户,
跳过步骤7、8;
7) 对于需要立即响应的商户, 如果支付成功,网银将成功结果反馈给商户。 若支付失败,不返回给商户信息
8) 对于需要立即响应的商户,收到银行扣帐成功的通知后,发给客户送货信息。如客户收到银行支付(扣帐)成功通知(步骤6),
但未收到商户送货信息,则需向商户查询。
日终时,商户与开设结算帐户的建设银行(网银成员行)进行流水核对,对已支付但未得到商户确认的交易进行退款处理。
商户到银行
其实这一步是把自己卡里的钱转到商户的帐上,就是转账,
代码实现其实很简单,我们先来分析一上要传的参考吧
个人客户在商户网站选择商品后,商户网站生成以下信息,传送到建行网站:
域名 |
名称 |
类型 |
备注 |
MERCHANTID |
商户代码 |
CHAR(9) |
由建行统一分配 |
POSID |
商户柜台代码 |
CHAR(9) |
由建行统一分配,缺省为 000000000 |
BRANCHID |
分行代码 |
CHAR(9) |
由建行统一指定 |
ORDERID |
定单号 |
CHAR(30) |
由商户提供,最长 30 位 , 按实际长度给出 |
PAYMENT |
付款金额 |
NUMBER(16,2) |
由商户提供,按实际金额给出 |
CURCODE |
币种 |
CHAR(2) |
缺省为 01 -人民币 |
REMARK1 |
备注 1 |
CHAR(30) |
网银不处理,直接传到城综网 |
REMARK2 |
备注 2 |
CHAR(30) |
网银不处理,直接传到城综网 |
TXCODE |
交易码 |
CHAR(6) |
由建行统一分配为 520100 |
MAC |
MAC 校验域 |
CHAR(32) |
采用标准 MD5 算法,由商户实现 |
注:商户要保证定单号的唯一性。
为了加快站点间接口开发,站点间接口的参数传送采用普通的 URL 方式,商户将以上信息包含在 FORM 中,在 SUBMIT 后将生成 URL ,如下所示:
&TXCODE=520100&REMARK1=&REMARK2=&MAC=qwertyuioplkjhgfdsazxcvbnm901234
参与 MAC 运算的字符及其顺序如下:
MERCHANTID=123456789&POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&
TXCODE=520100&REMARK1=&REMARK2=
注:字符串中变量名必须是大写字母。
这是建行文档说的说明,很明显这是使用Http的方式来实现的
下面我们动手来实现 一下吧,
我是把所有的参数生成了一个实体类这样方便,而且规范化,
来看看这个Model吧
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ClientSystem.AliPay { /// <summary> /// 工行传入参数 /// </summary> public class CBBTextModel { private string _MERCHANTID = ""; /// <summary> /// 商户代码 由建行统一分配 /// </summary> public string MERCHANTID { get { return _MERCHANTID; } set { _MERCHANTID = value; } } private string _POSID = ""; /// <summary> /// 商户柜台代码 由建行统一分配,缺省为000000000 /// </summary> public string POSID { get { return _POSID; } set { _POSID = value; } } private string _BRANCHID = ""; /// <summary> /// 分行代码 由建行统一指定 /// </summary> public string BRANCHID { get { return _BRANCHID; } set { _BRANCHID = value; } } private string _ORDERID = ""; /// <summary> /// 定单号 由商户提供,最长30位,按实际长度给出 /// </summary> public string ORDERID { get { return _ORDERID; } set { _ORDERID = value; } } private decimal _PAYMENT = 0m; /// <summary> /// 付款金额 由商户提供,按实际金额给出 /// </summary> public decimal PAYMENT { get { return _PAYMENT; } set { _PAYMENT = value; } } private string _CURCODE = ""; /// <summary> /// 币种 缺省为01-人民币 /// </summary> public string CURCODE { get { return _CURCODE; } set { _CURCODE = value; } } private string REMARK1 = ""; /// <summary> /// 备注1 网银不处理,直接传到城综网 /// </summary> public string REMARK11 { get { return REMARK1; } set { REMARK1 = value; } } private string REMARK2 = ""; /// <summary> /// 备注2 网银不处理,直接传到城综网 /// </summary> public string REMARK21 { get { return REMARK2; } set { REMARK2 = value; } } private string _TXCODE = ""; /// <summary> /// 交易码 由建行统一分配为520100 /// </summary> public string TXCODE { get { return _TXCODE; } set { _TXCODE = value; } } private string _MAC = ""; /// <summary> /// MAC校验域 采用标准MD5算法,由商户实现 /// </summary> public string MAC { get { return _MAC; } set { _MAC = value; } } private string _url = ""; /// <summary> /// URL /// </summary> public string Url { get { return _url; } set { _url = value; } } } }
我们来准备两个方法吧,一个是Http连接来使用的一个是Md5加密,因为在文档里写到要使用Md5加密哦
#region //预定义方法或是变量 /// <summary> /// 请求指定 URL 资源,并获取响应结果 /// </summary> /// <param name="url">需要请求的 URL 资源</param> /// <returns> /// 响应结果; /// 出现任意异常,均返回字串"Runtime Error" /// </returns> private string RequestContent(string url) { string content = string.Empty; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.KeepAlive = false; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default); content = reader.ReadToEnd(); reader.Close(); } catch (Exception) { content = "Runtime Error"; } return content; } /// <summary> /// 传入明文,返回用MD%加密后的字符串 /// </summary> /// <param name="str">要加密的字符串</param> /// <returns>用MD5加密后的字符串</returns> public static string ToMD5(string str) { return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5"); } #endregion
看一下充值按钮下面实现吧
if (textBox1.Text.Trim() == "" || textBox1.Text.Trim() == null) { MessageBoxForm objm = new MessageBoxForm("您输入的金额不能为空!!!", "提示信息"); objm.ShowDialog(); return; } string orid = OfficeInfo.ofId.ToString().Trim() + "_" + DateTime.Now.Ticks.ToString(); Alipay objalipay = new Alipay(); objalipay.APID = orid; objalipay.addTime = DateTime.Now; objalipay.total_fee = Convert.ToDecimal(textBox1.Text.ToString().Trim()); objalipay.trade_status = "客户端提交"; objalipay.Text1 = DateTime.Now.ToString(); objalipay.Text2 = "建行接口"; objalipay.Text3 = ""; objalipay.Text4 = ""; objalipay.Text5 = ""; decimal money = Convert.ToDecimal(user.GetListBy(OfficeInfo.ofPara1, 13).ToString().Trim()); if (money > Convert.ToDecimal(textBox1.Text.Trim())) { MessageBoxForm objm = new MessageBoxForm("你输入的最小金额不能低于" + money + "元!!!", "提示信息"); objm.ShowDialog(); return; } if (user.AddAlipay(OfficeInfo.ofPara1, objalipay)) { CBBTextModel objcbbText = new CBBTextModel(); //商户代码 由建行统一分配 objcbbText.MERCHANTID = "00000000000000"; //商户柜台代码 由建行统一分配,缺省为000000000 objcbbText.POSID = "00000000000000"; //分行代码 由建行统一指定 objcbbText.BRANCHID = "00000000000000"; // 定单号 由商户提供,最长30位,按实际长度给出 objcbbText.ORDERID = orid.Trim(); //付款金额 由商户提供,按实际金额给出 objcbbText.PAYMENT = Convert.ToDecimal(textBox1.Text.Trim()); //币种 缺省为01-人民币 objcbbText.CURCODE = "01"; //备注1 网银不处理,直接传到城综网 objcbbText.REMARK11 = ""; //备注2 网银不处理,直接传到城综网 objcbbText.REMARK21 = ""; //交易码 由建行统一分配为520100 objcbbText.TXCODE = "520100"; //MAC校验域 采用标准MD5算法,由商户实现 objcbbText.MAC = "qwertyuioplkjhgfdsazxcvbnm901234"; //URL objcbbText.Url = "https://ibsbjstar.ccb.com.cn/app/ccbMain"; //要加密的串 string canshu = "MERCHANTID=" + objcbbText.MERCHANTID.Trim() + "&POSID=" + objcbbText.POSID.Trim() + "&BRANCHID=" + objcbbText.BRANCHID.Trim() + "&ORDERID=" + objcbbText.ORDERID.Trim() + "&PAYMENT=" + objcbbText.PAYMENT.ToString().Trim() + "&CURCODE=" + objcbbText.CURCODE + "&TXCODE=" + objcbbText.TXCODE.Trim() + "&REMARK1=&REMARK2="; objcbbText.MAC = ToMD5(canshu.Trim()).ToLower().Trim(); string strURl = objcbbText.Url + "?" + canshu + "&MAC=" + objcbbText.MAC.Trim(); webBrowser1.Url = new Uri(strURl.Trim()); } }
在这里大家一定要注意把 objcbbText.MAC =
ToMD5(canshu.Trim()).ToLower().Trim();
加密后的字符串改成小写的
上面所提到的
string orid = OfficeInfo.ofId.ToString().Trim() + "_" + DateTime.Now.Ticks.ToString(); Alipay objalipay = new Alipay(); objalipay.APID = orid; objalipay.addTime = DateTime.Now; objalipay.total_fee = Convert.ToDecimal(textBox1.Text.ToString().Trim()); objalipay.trade_status = "客户端提交"; objalipay.Text1 = DateTime.Now.ToString(); objalipay.Text2 = "建行接口"; objalipay.Text3 = ""; objalipay.Text4 = ""; objalipay.Text5 = ""; decimal money = Convert.ToDecimal(user.GetListBy(OfficeInfo.ofPara1, 13).ToString().Trim()); if (money > Convert.ToDecimal(textBox1.Text.Trim())) { MessageBoxForm objm = new MessageBoxForm("你输入的最小金额不能低于" + money + "元!!!", "提示信息"); objm.ShowDialog(); return; } if (user.AddAlipay(OfficeInfo.ofPara1, objalipay)) {
这一部分代码是记录日志的,大家可以参考一下
我们现在只要运行程序就会出现如下界面所显示的内容
下面的操作就是输入你的卡号密码就可以了,
转账成功后我们这一步的工作就算是做完了
银行到商户
接下来的这一步 是很关键的一步,是当我们转账成功后,银行发给我们系统的一个处理结束,里面的参数如下
建行网站生成以下信息,传送到商户网站:
域名 |
名称 |
类型 |
备注 |
POSID |
商户柜台代码 |
CHAR(9) |
从商户传送的信息中获得 |
BRANCHID |
分行代码 |
CHAR(9) |
从商户传送的信息中获得 |
ORDERID |
定单号 |
CHAR(30) |
从商户传送的信息中获得 |
PAYMENT |
付款金额 |
NUMBER(16,2) |
从商户传送的信息中获得 |
CURCODE |
币种 |
CHAR(2) |
从商户传送的信息中获得 |
REMARK1 |
备注一 |
CHAR(30) |
从商户传送的信息中获得 |
REMARK2 |
备注二 |
CHAR(30) |
从商户传送的信息中获得 |
SUCCESS |
成功标志 |
CHAR(1) |
成功时返回 Y |
SIGN |
数字签名 |
CHAR(256) |
|
站点间接口的参数传送仍然采用普通的 URL 方式,信息包含在 CGI 参数,具体如下所示:
HTTP://MERCHANT.WEB.SITE/MERCHANT_CGI?POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1 = 19991101&REMARK2=merchantname&SUCCESS=Y&SIGN=4b3ef029516193b7d969ac1840083635a3e0901b8cd526caa44c1a07
2f496d7f0d4bca3942c0d9030bede37c7809b835cec787eb39e18b7596a724fba9805b24714dfbb0f4a3fb430b32e075254a114d4c38a0ac
52ef46a0ad33dec3fbfc15417402a1399e65e46996c0cf49fc7ffca9222f8cd693c8376b6f928828967bec42
注: ? 前的 URL 由商户在签约时提供
参与签名运算的字符及其顺序如下
POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1 = 19991101&REMARK2=merchantname&SUCCESS=Y
注:字符串中变量名必须是大写字母。
如果商户的程序将 MERCHANTID, POSID,BRANCHID, ORDERID, PAYMENT, CURCODE , TXCODE 和 MAC 作为隐藏域 (hidden) ,
然后使用 SUBMIT 按纽,注意在 FORM 的 METHOD 中使用“ GET ”的方式。
在这里我们首先要新建一个Asp.net的网站,只要在一个网页下面书写代码就成了。
第一步我们要写出来要加密 的串
/要加密的串 string canshu = "POSID=000000000&BRANCHID=0000000&ORDERID=" + Request.QueryString["ORDERID"].Trim() + "&PAYMENT=" + Request.QueryString["PAYMENT"].Trim() + "&CURCODE=" + Request.QueryString["CURCODE"].Trim() + "&REMARK1=" + Request.QueryString["REMARK1"].Trim() + "&REMARK2=" + Request.QueryString["REMARK2"].Trim() + "&ACC_TYPE=" + Request.QueryString["ACC_TYPE"].Trim() + "&SUCCESS=" + Request.QueryString["ACC_TYPE"].Trim();
这是在我们接收数据时要用到的,
这里建行提供了一个加密验证为
银行将客户支付信息实时通知给商户时,使用的数字签名算法是 MD5withRSA 算法。商户验证签名的公钥在商户在网银系统开户,获取数字证书后,登录到网银系统中,通过下载公钥交易获取。
商户获取的公钥用 X.509 格式表示,并且将其按照每 4 位( bit )转换为一个 16 进制数的方式表示,产生 16 进制的字符串。
网上银行使用标准 MD5withRSA 算法对给商户的响应进行签名,产生 1024 位( bit )的签名结果,并且将其按照每 4 位( bit )
发表评论
-
美了哭了,AduSkin是我见过最好看的WPF控件库
2020-03-14 19:58 674原文地址:https://www.pianshen.com/ ... -
使用NSSM把.Net Core部署至 Windows 服务
2019-10-16 08:52 545转自:https://www.cnblogs.com/emr ... -
玩转ASP.NET Core中的日志组件
2019-01-06 16:11 702转自:https://www.cnblogs.com/ ... -
CentOS 7 部署 ASP.NET Core 应用程序
2019-01-04 13:56 508CentOS 7 部署 ASP.NET Core 应用程序 ... -
GeckoWebBrowser实现自定义打印
2018-12-22 00:26 791nsIWebBrowserPrint print ... -
Winform桌面程序如何使用Geckofx45
2018-12-05 14:50 2376NuGet管理GeckoFx PM> Inst ... -
NLog的介绍使用
2018-09-28 17:36 1089NLog是什么 NLog是一个基于.NET平台编写的类库, ... -
常用的.net开源项目
2018-09-28 17:01 461常用 Json.NET:Json.Net ... -
高效实用的.NET开源项目
2018-09-28 16:58 4871.Akka.NET: 概述:更轻松地构建强大的并发 ... -
OCR框架整理
2017-08-16 09:29 582泰比ABBYY OCR SDK开发包 Asp ... -
使用Aspose.word导出word报告
2017-04-09 11:49 1643最近在做一个.net项目需要实现网站导出word报告功能,最 ... -
利用Aspose.Words 完美生成word试卷
2017-04-09 11:43 5301aspose.word生成word文档 public cl ... -
java使用wsimport生成服务代码时报错的解决办法
2017-01-18 11:27 1702今天遇到了WebService的问题:在使用jdk命令wsi ... -
OCR文字识别系统
2016-12-21 22:14 454慧视OCR文字识别系统 增值税专用发票扫描识别系统 ... -
asprise-ocr:验证码识别
2016-12-21 22:17 769asprise-ocr http://asprise ... -
jieba中文分词的.NET版本:jieba.NET
2015-09-10 09:36 806转自:http://www.cnblogs.com/ande ... -
通用身份验证类:AuthenticationCookie
2015-09-06 09:00 726/// <summary> /// C ... -
KwCombinatorics排列组合类库
2015-08-06 17:34 615KwCombinatorics类库的主页是:http: ... -
CefSharp嵌入式浏览器
2015-08-06 15:21 1054日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中。 ... -
C#开源框架(整理)
2015-07-27 09:32 2356http://www.cnblogs.com/c ...
相关推荐
银行相关/银行接口规范/建行/企业网银直联接口开发说明文档(201307).doc
-- 中国建设银行商户通知验签配置文件 --> <!-- 通讯端口1024~65535之间未被使用的端口 --> <value>55533 <!-- 通讯端口1024~65535之间未被使用的端口 --> <value>5 <!-- 可按照不同的柜台号配置不同...
中国银联银行卡交换系统技术规范第五部分涉及的是通讯接口的标准化要求,这一规范对于中国银联系统中涉及跨行交易的网络通讯接口技术条件进行了明确说明。下面将从几个方面来详细阐述这一规范文档中涵盖的知识点。 ...
文档还附带了部分银行编码,如中国邮政储蓄银行(PSBC)、中国工商银行(ICBC)等,这些编码在进行网银支付时可能需要使用。 在实际应用中,开发者需要严格按照文档提供的规则生成签名,处理请求和响应,并正确...
报告通过建设银行、浦发银行、众邦银行和苏宁银行等案例,说明了中国银行业如何实施开放银行战略。这些银行通过自建平台或合作共建的方式,结合自身特点,探索服务模式和业务创新,推动了银行技术和服务能力的释放。...
《外汇会计网络处理系统项目需求说明书》是中国建设银行会计部与信息技术部于2002年4月共同编写的文档,旨在明确并详细阐述外汇会计网络处理系统的优化需求。这份需求说明书是项目实施的重要指导文件,它涵盖了项目...
综上所述,《中国银联银行卡交换系统技术规范》作为国内银行卡支付领域的重要指导性文件,不仅详细规定了交易处理流程和技术要求,还明确了业务规则与技术实现之间的关系,对于推动我国银行卡支付行业的健康发展具有...
中国的开放银行发展模式多样,包括数据共享模式、开放服务模式、平台开放等,其中数据共享模式以API为主要接口,开放服务模式通过场景生态连接客户并输出金融服务,平台开放则通过多方共建生态。 2020-2021年中国...
在电子商务平台中建设独立的支付系统,为用户和电子商务站点提供统一的支付接口,并实现和各银行支付系统的连接。该系统涵盖了CA认证系统、支付网关、电子商务站点、电子商务应用系统等具体的项目。 3. 功能需求 ...
这份《2021-2025年中国开放银行行业快速做大市场规模策略研究报告》为我们提供了对中国开放银行行业未来几年发展趋势的深入分析。报告从企业做大规模的市场策略、市场调研、企业做大规模的前提与关键因素、以及具体...
中国民生银行外汇清算系统详细设计说明书是一份详尽的文档,旨在规范系统的设计与开发过程,确保系统的稳定性和高效性。这份文档不仅涵盖了系统的基本框架和功能,还涉及了技术实施、安全策略以及维护计划等多个方面...
银行业金融机构监管数据标准化规范(2021版)采集技术接口说明.doc 银行业金融机构监管数据标准化规范(2021版)检核规则.xlsx 银行业金融机构监管数据标准化规范(2021版)通用说明.doc 案例分析--商业银行如何通过...
银行业金融机构监管数据标准化规范(2023版)采集技术接口说明 银行业金融机构监管数据标准化规范(2023版)检核规则 银行业深度研究报告:金融聚焦改革系列之利率篇,改革未竟,存款利率仍具下行空间-华创证券 银行...
EMP,即宇信易诚提供的商业银行IT应用平台产品体系,是一个全面的解决方案,满足开发、运行、监控管理等IT建设需求,并基于SOA体系架构。EMP产品体系支持构件化,即通过可扩展的业务处理逻辑组装方式,采用基础组件...
中国建设银行广州市分行的多媒体电话中心电话银行服务系统投标书详细阐述了UT斯达康(中国)有限公司提供的解决方案。 第一章概述中,可能涉及的是电话银行服务系统的概念、目标以及在银行服务中的重要性。电话银行...
* 附录 1 列出了各银行的编号,包括中国工商银行、中国农业银行、中国银行、建设银行、招商银行、浦发银行、广发银行、邮政储蓄银行、中信银行、民生银行、光大银行、华夏银行、兴业银行、平安银行、交通银行、北京...
中国建设银行(建行)为了确保与商户之间通信的数据不被篡改,并保证数据的完整性,会在向商户发送商户通知请求时,对返回的参数数据进行数字签名。商户在接收到这些通知后,必须对这些参数数据进行验签,以验证数据...
该项目旨在为xxxx建设一个支付平台,实现与中国工商银行和中国农业银行的接口对接,同时支持综合信息服务平台(116系统)的预付费功能。首先,将搭建一个支付平台的测试网,初期任务包括卡系统基础设施建设、银行...
【标题】"ATM-JAVA.rar_atm" 涉及到的是一个使用Java编程语言实现的模拟中国建设银行ATM机系统。这个系统旨在提供与真实ATM机相似的功能,帮助用户理解和学习ATM机背后的软件工作原理。 【描述】中的主要知识点包括...