简单记录:银联在线支付

1、下载ChinaPay的dll文件,解压放到BIN目录下,共4个文件。

2、引用ChinaPay_Net.dll到项目。

3、申请到的key放到网站,本例是放到根目录key文件夹下:

4、添加类:

using System;
using System.Text;
using System.Web;
using ChinaPay_Net;

/// <summary>
///Chinapay 的摘要说明
/// </summary>
public class Chinapay
{
    private static string _MerId = "808080*********";//商户号
    private static string _Action = "https://payment.ChinaPay.com/pay/TransGet";
    private static string _BgRetUrl = "http://www.XXX.com/Payment/ChinaPayBgRetUrl.aspx";
    private static string _PageRetUrl = "http://www.XXX.com/Payment/ChinaPayPageRetUrl.aspx";

    string strUrl = HttpContext.Current.Request.PhysicalApplicationPath;

    /// <summary>
    /// 创建提交表单
    /// </summary>
    /// <param name="OrdId">订单号,长度11位</param>
    /// <param name="Amount">付款金额,最多保留两位有效数字</param>
    /// <returns></returns>
    public static string getChinaPayForm(string OrderId, decimal Amount, string PrivateValue)
    {
        string CuryId = "156";
        string TransDate = DateTime.Now.ToString("yyyyMMdd");
        string TransType = "0001";

        StringBuilder sb = new StringBuilder();
        if (OrderId.Length != 11)
        {
            sb.Append("订单号必须为长度11位");
        }
        else if (Amount <= 0)
        {
            sb.Append("订单金额必须大于0");
        }
        else
        {
            string OrdId = OrderId.Substring(0, 4) + _MerId.Substring(10, 5) + OrderId.Substring(4, 7);
            string TransAmt = "000000000000" + Math.Round(Amount, 2, MidpointRounding.AwayFromZero).ToString().Replace(".", "");
            TransAmt = TransAmt.Substring(TransAmt.Length - 12, 12);
            Chinapay cp = new Chinapay();
            string ChkValue = cp.getSign(_MerId, OrdId, TransAmt, CuryId, TransDate, TransType);

            sb.Append("<form action=\"" + _Action + "\" method=\"POST\">");
            sb.Append("<input type=\"hidden\" name=\"MerId\" value=\"" + _MerId + "\" />");
            sb.Append("<input type=\"hidden\" name=\"OrdId\" value=\"" + OrdId + "\" />");
            sb.Append("<input type=\"hidden\" name=\"TransAmt\" value=\"" + TransAmt + "\" />");
            sb.Append("<input type=\"hidden\" name=\"CuryId\" value=\"" + CuryId + "\" />");
            sb.Append("<input type=\"hidden\" name=\"TransDate\" value=\"" + TransDate + "\" />");
            sb.Append("<input type=\"hidden\" name=\"TransType\" value=\"" + TransType + "\" />");
            sb.Append("<input type=\"hidden\" name=\"Version\" value=\"20040916\" />");
            sb.Append("<input type=\"hidden\" name=\"BgRetUrl\" value=\"" + _BgRetUrl + "\" />");
            sb.Append("<input type=\"hidden\" name=\"PageRetUrl\" value=\"" + _PageRetUrl + "\" />");
            sb.Append("<input type=\"hidden\" name=\"GateId\" value=\"\">");
            sb.Append("<input type=\"hidden\" name=\"Priv1\" value=\"" + PrivateValue + "\">");
            sb.Append("<input type=\"hidden\" name=\"ChkValue\" value=\"" + ChkValue + "\">");
            sb.Append("<input id=\"PostData\" type=\"submit\" value=\"Post\" style=\"display:none;\" />");
            sb.Append("</form>");
            sb.Append("<script type=\"text/javascript\">document.getElementById(\"PostData\").click();</script>");
        }
        return sb.ToString();
    }

    public string getSign(string MerId, string OrdId, string TransAmt, string CuryId, string TransDate, string TransType)
    {
        NetPayClientClass npc = new NetPayClientClass();
        string path = strUrl + "key\\MerPrK.key";
        npc.setMerKeyFile(path);
        string strChkValue = "";
        strChkValue = npc.sign(MerId, OrdId, TransAmt, CuryId, TransDate, TransType);
        return strChkValue.Trim();
    }
    public string signData(string MerId, string SignMsg)
    {
        NetPayClientClass npc = new NetPayClientClass();
        npc.setMerKeyFile(strUrl + "key\\MerPrK.key");
        string strChkValueData = "";
        strChkValueData = npc.signData(MerId, SignMsg);
        return strChkValueData.Trim();
    }

    public bool getCheck(string MerId, string OrdId, string TransAmt, string CuryId, string TransDate, string TransType, string OrderStatus, string CheckValue)
    {
        NetPayClientClass npc = new NetPayClientClass();
        npc.setPubKeyFile(strUrl + "key\\PgPubk.key");
        string strFlag = "";
        bool bolFlag = false;
        strFlag = npc.check(MerId, OrdId, TransAmt, CuryId, TransDate, TransType, OrderStatus, CheckValue);
        if (strFlag == "0")
        {
            bolFlag = true;
        }
        return bolFlag;
    }

    public bool checkData(string PlainData, string CheckValue)
    {
        NetPayClientClass npc = new NetPayClientClass();
        npc.setPubKeyFile(strUrl + "key\\PgPubk.key");
        string strFlagData = "";
        bool bolFlagData = false;
        strFlagData = npc.checkData(PlainData, CheckValue);
        if (strFlagData == "true")
        {
            bolFlagData = true;
        }
        return bolFlagData;
    }
}

5、添加页面,后台代码如下:

using System;

public partial class Payment_ChinaPayPost
{
    private string OrderId = RequestString("OrderId");//必选
    private decimal Amount = RequestDecimal("Amount");//必选
    private string PrivateValue = RequestString("PrivateValue");//可选参数
    protected void Page_Load(object sender, EventArgs e)
    {
        string postData = Chinapay.getChinaPayForm(OrderId, Amount, PrivateValue);
        ResponseWrite(postData);
    }
}

6、接收返回值:

using System;

/// <summary>
/// ChinaPayModel 的摘要说明
/// </summary>
public class ChinaPayModel1
{
    /// <summary>
    /// 商户号
    /// </summary>
    public string merid { get; set; }
    /// <summary>
    /// 订单号
    /// </summary>
    public string orderno { get; set; }
    /// <summary>
    /// 交易日期
    /// </summary>
    public string transdate { get; set; }
    /// <summary>
    /// 金额
    /// </summary>
    public string amount { get; set; }
    /// <summary>
    /// 币种
    /// </summary>
    public string currencycode { get; set; }
    /// <summary>
    /// 类型
    /// </summary>
    public string transtype { get; set; }
    /// <summary>
    /// 状态
    /// </summary>
    public string status { get; set; }
    /// <summary>
    /// 签名
    /// </summary>
    public string checkvalue { get; set; }
    /// <summary>
    /// 支付网关号
    /// </summary>
    public string GateId { get; set; }
    /// <summary>
    /// 商户私有域
    /// </summary>
    public string Priv1 { get; set; }
}

public class ChinaPayModel2
{
    /// <summary>
    /// 商户号
    /// </summary>
    public string merid { get; set; }
    /// <summary>
    /// 订单号
    /// </summary>
    public string orderno { get; set; }
    /// <summary>
    /// 交易日期
    /// </summary>
    public DateTime transdate { get; set; }
    /// <summary>
    /// 交易金额
    /// </summary>
    public decimal amount { get; set; }
    /// <summary>
    /// 币种,156为人民币
    /// </summary>
    public int currencycode { get; set; }
    /// <summary>
    /// 类型:0001为付款,0002
    /// </summary>
    public string transtype { get; set; }
    /// <summary>
    /// 状态:成功和失败
    /// </summary>
    public bool status { get; set; }
    /// <summary>
    /// 签名是否正确
    /// </summary>
    public bool checkvalue { get; set; }
    /// <summary>
    /// 支付网关号
    /// </summary>
    public string GateId { get; set; }
    /// <summary>
    /// 商户私有域
    /// </summary>
    public string Priv1 { get; set; }
}

public class ChinaPayMode
{
    public string RequestForm { get; set; }
    public string RequestQueryString { get; set; }
    public ChinaPayModel1 Model1 { get; set; }
    public ChinaPayModel2 Model2 { get; set; }
}
   public static ChinaPayModel1 ChinaPayModel1()
    {
        Func<string, string> Request = RequestString;
        string merid = Request("merid");
        string orderno = Request("orderno");
        string transdate = Request("transdate");
        string amount = Request("amount");
        string currencycode = Request("currencycode");
        string transtype = Request("transtype");
        string status = Request("status");
        string checkvalue = Request("checkvalue");
        string GateId = Request("GateId");
        string Priv1 = Request("Priv1");
        return new ChinaPayModel1()
        {
            merid = merid,
            orderno = orderno,
            transdate = transdate,
            amount = amount,
            currencycode = currencycode,
            transtype = transtype,
            status = status,
            checkvalue = checkvalue,
            GateId = GateId,
            Priv1 = Priv1
        };
    }

    public static ChinaPayModel2 ChinaPayModel2()
    {
        Func<string, int> ParseInt = ParseInt;
        Func<string, decimal> ParseDecimal = PageBaseUser.ParseDecimal;
        ChinaPayModel1 model = ChinaPayModel1();
        string orderno = "";
        if (model.orderno.Length == 16)
        {
            orderno = model.orderno.Substring(0, 4) + model.orderno.Substring(9, 7);
        }
        DateTime dt = Convert.ToDateTime("1900-01-01");
        if (model.transdate.Length == 8)
        {
            DateTime.TryParse(model.transdate.Substring(0, 4) + "-" + model.transdate.Substring(4, 2) + "-" + model.transdate.Substring(6, 2), out dt);
        }
        decimal amount = 0;
        if (model.amount.Length == 12)
        {
            amount = ParseDecimal(model.amount) / 100;
        }
        bool checkvalue = new Chinapay().getCheck(model.merid, model.orderno, model.amount, model.currencycode, model.transdate, model.transtype, model.status, model.checkvalue);
        return new ChinaPayModel2()
        {
            merid = model.merid,
            orderno = orderno,
            transdate = dt,
            amount = amount,
            currencycode = ParseInt(model.currencycode),
            transtype = model.transtype,
            status = ParseInt(model.status) == 1001,
            checkvalue = checkvalue,
            GateId = model.GateId,
            Priv1 = model.Priv1
        };
    }

  //以下三个方法是处理请求的
    /// <summary>
    /// 请求转Int型
    /// </summary>
    /// <param name="QueryName"></param>
    /// <param name="DefaultValue"></param>
    /// <returns></returns>
    public static decimal RequestDecimal(string QueryName, decimal DefaultValue)
    {
        decimal value = DefaultValue;
        if (!string.IsNullOrEmpty(HttpContext.Current.Request[QueryName]))
        {
            decimal.TryParse(HttpUtility.HtmlDecode(HttpContext.Current.Request[QueryName].ToString().Trim()), out value);
        }
        return value;
    }

    /// <summary>
    /// 请求转String
    /// </summary>
    /// <param name="QueryName"></param>
    /// <param name="DefaultValue"></param>
    /// <returns></returns>
    public static string RequestString(string QueryName, string DefaultValue)
    {
        string value = DefaultValue;
        if (!string.IsNullOrEmpty(HttpContext.Current.Request[QueryName]))
        {
            value = HttpUtility.HtmlDecode(HttpContext.Current.Request[QueryName].ToString().Trim());
        }
        return value;
    }

    /// <summary>
    /// 请求转Decimal型
    /// </summary>
    /// <param name="QueryName"></param>
    /// <param name="DefaultValue"></param>
    /// <returns></returns>
    public static decimal RequestDecimal(string QueryName, decimal DefaultValue)
    {
        decimal value = DefaultValue;
        if (!string.IsNullOrEmpty(HttpContext.Current.Request[QueryName]))
        {
            decimal.TryParse(HttpUtility.HtmlDecode(HttpContext.Current.Request[QueryName].ToString().Trim()), out value);
        }
        return value;
    }
   protected void Page_Load(object sender, EventArgs e)
    {
     ChinaPayModel1 model1 = CommonHelper.ChinaPayModel1();
        ChinaPayModel2 model2 = CommonHelper.ChinaPayModel2();

        #region 测试时查看接收数据
        string logMsg = JsonConvert.SerializeObject(new ChinaPayMode() { RequestForm = Request.Form.ToString(), RequestQueryString = Request.QueryString.ToString(), Model1 = model1, Model2 = model2 });
        //省略
        #endregion

        if (model2.checkvalue && model2.status)
        {

        }
}

  

时间: 2024-07-29 14:25:38

简单记录:银联在线支付的相关文章

银联在线支付B2C UnionPay.NET

新春即将来临,首先给大家拜个早年,祝攻城狮们新年快乐.万事如意.合家欢乐.团团圆圆.幸福健康.来年更能大展宏图 实现各自的梦想! 同时预祝各大科技公司大佬们事业蒸蒸日上.公司转型突破创新.冲出突围带领员工们早日实现上市梦想! 今天研究了下银联在线支付功能,特地记录下以表码农们还在坚守岗位.此功能主要是一般的.NET实现的,有机会转为标准的MVC模式实现以及应用到asp.net core 中. 首先第一是支付首页代码: PayIndex.aspx: <%@ Page Language="C#

PHP商城网站绑定中国银联在线支付接口

PHP商城网站绑定中国银联在线支付接口用的越来越广泛,我们公司这几年给客户建立过很多的商城网站,今天就分析下怎么为自己的PHP商城网站接入中国银联在线支付端的接口.在使用前我们必须先申请成为中国银联在线支付的商户. 第一步:下载中国银联官方PHP支付接口文件 进入中国银联在线官方网站的商户服务网站,下载PHP的技术资料端口文件(https://online.unionpay.com/mer/pages/merser/index.jsp这是中国银联在线支付商户服务网站),点击右上角的“文档下载”

Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. wap银联支付流程是这样:客户端---> 服务器(构建支付请求)--> 银联支付 ---> 返回到服务端(处理支付结果).所以对于手机网站银联支付没有问题,但是对于ios端app和android端app, 再通过wap支付,发现支付成功后,很难在回到app客户端了. 所以这里就必须借助Pho

银联在线支付----测试商户账号注册

一. 测试账号注册 在中国银联商户服务系统的首页,注册一个账号,供我们测试账号使用. 注册地址:https://merchant.unionpay.com/cas/login  .              注册号后,里面有详细的API和测试介绍. 下面是我注册成功后的测试参数信息.  测试商户号:     777290058112538      测试证书  : 商户私钥证书(签名使用,密码:000000)银联公钥证书(签名使用)  测试入口地址:  前台交易请求地址: https://101

【收藏】银联在线支付商户UPMP接口的使用和说明

[转载]http://www.dodobook.net/php/1110 相关的文档可以参阅.http://202.101.25.178:8080/sim/docs/ 这个接口文档还是比较完备的,相信很多技术人员稍加摸索,就能实现了. 目录结构为 Upmp ----upmp_config.php ----upmp_core.php ----UpmpService.php ----notify_url.php 直接上代码:upmp_config.php <?php /** * 类名:配置类 * 功

银联在线支付---利用测试案例代码模拟测试应用

一.工程搭建 新建一个Web工程,命名为PayOnLine,把你下载好的案例代码拷贝到你的工程下,我的代码目录如下: acp_sdk.properties配置文件需要放在类根路劲下,里面的参数配置信息,下面是案例提供的配置提示: 0. 注意: 1)依赖包和upacp_sdk-1.0.0.jar都需加到buildpath. 2)acp_sdk.properties放到src根目录下.另外如果用的不是eclipse/MyEclipse可能这个文件默认不会被拷贝到classes目录下,导致加载不到这个

中国银联在线支付接口开发——前台支付

银联技术服务官网:https://open.unionpay.com/ajweb/index 在官网"帮助中心"->"下载"中下载:跳转网关支付产品技术开发包1.11.rar.网关支付产品示例代码_java_1.1.rar 如想使用银联测试接口需要在技术服务官网注册 登录后选择页面右上角"我的测试"-> "测试参数",下载并导入证书 根据"测试参数"提供的商户号和证书存放位置等配置示例代码 选择

github student pack中的digital ocean可以使用银联卡支付

申请了 github student pack却因为一直没有visita信用卡,而无法使用digital ocean的 $50,一直到今天,用中国银行借记卡成功支付. 方法是: (1)注册paypal账号,不需要绑定银行卡或信用卡. (2)打开digital ocean的welcome页面,那里会提示需要打入$5,支付方式可选“信用卡/借记卡”或者 “paypal”,选择paypal (3)进入支付页面,登陆paypal账户,输入银联卡(我的是中国银行)的卡号,然后填入后边的一些相关信息.点击“

工商银行在线支付接口,php语言,在ecshop,shopex等的wap版本上完美实现移动支付

php版本各个主要银行在线支付接口开发. 1 中国银行在线支付接口2 工商银行在线支付接口3 建设银行在线支付接口+手机移动支付接口4 交通银行在线支付接口5 农业银行在线支付接口6 银联在线支付接口+手机移动支付接口7 招商银行在线支付接口+手机移动支付接口完美融合ecshop,shopex等php版本的商城系统. 其他银行的在线支付接口均能开发,详情请咨询QQ:804752009 原文:http://www.0475seo.com/tech/2dev/297.html其他接口:http://