`
jiasongmao
  • 浏览: 670916 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

中国建设银行接口使用详细说明

    博客分类:
  • .NET
阅读更多

声明:本博文转载于: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 ,如下所示:

https://ibsbjstar.ccb.com.cn/app/ccbMain?MERCHANTID=123456789&POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01

&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

分享到:
评论
1 楼 WSZ1102_shu 2010-09-21  
没有JAVA的代码吗?

相关推荐

    行/企业网银直联接口开发说明文档(201307).doc

    银行相关/银行接口规范/建行/企业网银直联接口开发说明文档(201307).doc

    建行互联网被扫支付接口Socket商户验签jar包

    -- 中国建设银行商户通知验签配置文件 --&gt; &lt;!-- 通讯端口1024~65535之间未被使用的端口 --&gt; &lt;value&gt;55533 &lt;!-- 通讯端口1024~65535之间未被使用的端口 --&gt; &lt;value&gt;5 &lt;!-- 可按照不同的柜台号配置不同...

    中国银联银行卡交换系统技术规范 第5部分 通讯接口规范.pdf

    中国银联银行卡交换系统技术规范第五部分涉及的是通讯接口的标准化要求,这一规范对于中国银联系统中涉及跨行交易的网络通讯接口技术条件进行了明确说明。下面将从几个方面来详细阐述这一规范文档中涵盖的知识点。 ...

    熊猫付接口文档1

    文档还附带了部分银行编码,如中国邮政储蓄银行(PSBC)、中国工商银行(ICBC)等,这些编码在进行网银支付时可能需要使用。 在实际应用中,开发者需要严格按照文档提供的规则生成签名,处理请求和响应,并正确...

    2021-2025年中国开放银行行业蓝海市场战略研究报告.pdf

    报告通过建设银行、浦发银行、众邦银行和苏宁银行等案例,说明了中国银行业如何实施开放银行战略。这些银行通过自建平台或合作共建的方式,结合自身特点,探索服务模式和业务创新,推动了银行技术和服务能力的释放。...

    外汇会计网络处理系统项目需求说明书.doc

    《外汇会计网络处理系统项目需求说明书》是中国建设银行会计部与信息技术部于2002年4月共同编写的文档,旨在明确并详细阐述外汇会计网络处理系统的优化需求。这份需求说明书是项目实施的重要指导文件,它涵盖了项目...

    01 中国银联银行卡交换系统技术规范基础介绍

    综上所述,《中国银联银行卡交换系统技术规范》作为国内银行卡支付领域的重要指导性文件,不仅详细规定了交易处理流程和技术要求,还明确了业务规则与技术实现之间的关系,对于推动我国银行卡支付行业的健康发展具有...

    2021-2025年中国开放银行行业调研及全员营销战略研究报告.pdf

    中国的开放银行发展模式多样,包括数据共享模式、开放服务模式、平台开放等,其中数据共享模式以API为主要接口,开放服务模式通过场景生态连接客户并输出金融服务,平台开放则通过多方共建生态。 2020-2021年中国...

    中国联通电子商务平台支付系统技术规范书.doc

    在电子商务平台中建设独立的支付系统,为用户和电子商务站点提供统一的支付接口,并实现和各银行支付系统的连接。该系统涵盖了CA认证系统、支付网关、电子商务站点、电子商务应用系统等具体的项目。 3. 功能需求 ...

    2021-2025年中国开放银行行业快速做大市场规模策略研究报告.pdf

    这份《2021-2025年中国开放银行行业快速做大市场规模策略研究报告》为我们提供了对中国开放银行行业未来几年发展趋势的深入分析。报告从企业做大规模的市场策略、市场调研、企业做大规模的前提与关键因素、以及具体...

    民生银行外汇清算系统详细设计方案

    中国民生银行外汇清算系统详细设计说明书是一份详尽的文档,旨在规范系统的设计与开发过程,确保系统的稳定性和高效性。这份文档不仅涵盖了系统的基本框架和功能,还涉及了技术实施、安全策略以及维护计划等多个方面...

    银行业数据治理实践银行业金融机构监管数据标准化规范银行客户基本信息描述规范

    银行业金融机构监管数据标准化规范(2021版)采集技术接口说明.doc 银行业金融机构监管数据标准化规范(2021版)检核规则.xlsx 银行业金融机构监管数据标准化规范(2021版)通用说明.doc 案例分析--商业银行如何通过...

    银行数据治理建设方案-基本信息描述规范-金融机构监管数据标准化规范-数据生命周期安全规范-合规监管与精准业务分析.zip

    银行业金融机构监管数据标准化规范(2023版)采集技术接口说明 银行业金融机构监管数据标准化规范(2023版)检核规则 银行业深度研究报告:金融聚焦改革系列之利率篇,改革未竟,存款利率仍具下行空间-华创证券 银行...

    EMP2.2更新说明

    EMP,即宇信易诚提供的商业银行IT应用平台产品体系,是一个全面的解决方案,满足开发、运行、监控管理等IT建设需求,并基于SOA体系架构。EMP产品体系支持构件化,即通过可扩展的业务处理逻辑组装方式,采用基础组件...

    电话银行服务系统.doc

    中国建设银行广州市分行的多媒体电话中心电话银行服务系统投标书详细阐述了UT斯达康(中国)有限公司提供的解决方案。 第一章概述中,可能涉及的是电话银行服务系统的概念、目标以及在银行服务中的重要性。电话银行...

    网银+扫码+H5聚合支付1

    * 附录 1 列出了各银行的编号,包括中国工商银行、中国农业银行、中国银行、建设银行、招商银行、浦发银行、广发银行、邮政储蓄银行、中信银行、民生银行、光大银行、华夏银行、兴业银行、平安银行、交通银行、北京...

    商户通知验签算法详解V1.01

    中国建设银行(建行)为了确保与商户之间通信的数据不被篡改,并保证数据的完整性,会在向商户发送商户通知请求时,对返回的参数数据进行数字签名。商户在接收到这些通知后,必须对这些参数数据进行验签,以验证数据...

    软件项目立项报告(实例)

    该项目旨在为xxxx建设一个支付平台,实现与中国工商银行和中国农业银行的接口对接,同时支持综合信息服务平台(116系统)的预付费功能。首先,将搭建一个支付平台的测试网,初期任务包括卡系统基础设施建设、银行...

    ATM-JAVA.rar_atm

    【标题】"ATM-JAVA.rar_atm" 涉及到的是一个使用Java编程语言实现的模拟中国建设银行ATM机系统。这个系统旨在提供与真实ATM机相似的功能,帮助用户理解和学习ATM机背后的软件工作原理。 【描述】中的主要知识点包括...

Global site tag (gtag.js) - Google Analytics