银联在线Java接口开发_DonelleYang技术博客的博客-程序员ITS203

技术标签: JAVA  java  

chinapay接口整合到网站中要注意的一些细节


这几天在做chinapay的接口整合,银联的文档写得太烂,代码规范也不行,给用户带来不便就不多说,废话少说了,整理一下碰到的一些文档中没有强调的问题或者容易忽视的问题。

一、注册ChinaPay.dll这个文件

如果想调用银联的接口,必须在机器上配置好环境:运行窗口中 regsvr32 ChinaPay.dll的绝对路径。

二、后台响应地址(即要配置的BgRetUrl)需要用外网的地址才能获取到支付成功后返回的数据

由于开发在本地测试,刚开始使用本地localhost的链接,结果接收不到支付成功后返回的数据,困扰了我好久。

三、验证数字签名的方法返回的不是布尔,是字符串的true或false

Com类型信息转换为.NET元数据tlbimp ChinaPay.dll /out: ChinaPay_tsl.dll后,并不是像文档中说的那样返回的布尔值,返回的是字符串。

四、支付版本号问题

808080开头的商户用此版本“20040916”。

五、支付成功后返回的数据要判断状态

对返回的数据除了要进行数字签名验证外,还需要进行状态的判断,如if(Request["status"]==”1001”){}


-------------------------------------------
首先需要三样东西

netpayclinet.jar

根据项目工程的需要放置对应路径下

用于提供数字签名的方法调用

MerPrk.key

可以放置到任意路径下,但是需要调用方法指定文件位置和名称

商户签名私钥

PgPubk.key

可以放置到任意路径下,但是需要调用方法指定文件位置和名称

ChinaPay签名公钥

把jar包放进项目lib里后直接调用方法:

1.创建公/私钥对象buildKey

chinapay.PrivateKey key=new chinapay.PrivateKey(); 
chinapay.SecureLink t;

boolean flag;

//buildKey用于创建私/公钥的对象,用于签名或者验证签名,该方法在类chinapay. PrivateKey

//第一个参数:MerId 商户号,长度为15个字节的数字串,由ChinaPay分配。

//第二个参数:使用私/公钥的方式,固定为 

//第三个参数:/公钥的文件路径(包含文件名称)baseDiskPath, File.separator(不同系统自适应路径)

String baseDiskPath = request.getSession().getServletContext().getRealPath(File.separator);

flag=key.buildKey(MerId,0,baseDiskPath+File.separator+"chinapaykey"+File.separator+"MerPrK.key");

if (flag==false) 

{
   System.out.println("build key error!"); 
}else {
   System.out.println("build key ok!"); 
}

2.订单签名函数signOrder 该方法在类chinapay. SecureLink

String MerId, OrdId, TransAmt, CuryId, TransDate, TransType,ChkValue;

// 对订单的签名,参数说明见页面表单
ChkValue= t.signOrder(MerId, OrdId, TransAmt, CuryId, TransDate, TransType) ;

//将订单数据送往页面提交

 request.setAttribute("ChkValue", ChkValue);
 request.setAttribute("TransAmt", TransAmt);
 request.setAttribute("OrdId", OrdId);
 request.setAttribute("TransDate", TransDate);

3.//页面接收参数并自动提交

//这里action的内容为提交交易数据的URL地址 http://payment-test.chinapay.com/pay/TransGet为测试地址

<form name="form1" action="https://payment.chinapay.com/pay/TransGet" METHOD=POST>

//MerIdChinaPay统一分配给商户的商户号,15位长度,必填
<input type=hidden name="MerId" value=""/> 

//商户提交给ChinaPay的交易订单号,16位长度,必填
<%String OrdId = (String)request.getAttribute("OrdId"); %>
<input type=hidden name="OrdId" value=<%=OrdId %>>

//订单交易金额,单位为分,12位长度,左补0,必填
<%String TransAmt = (String)request.getAttribute("TransAmt"); %>
<input type=hidden name="TransAmt" value=<%=TransAmt %>>

//订单交易币种,3位长度,固定为人民币156, 必填
<input type=hidden name="CuryId" value="156"/>

//订单交易日期,8位长度,必填
<%String TransDate = (String)request.getAttribute("TransDate"); %>
<input type=hidden name="TransDate" value=<%=TransDate %>>

//交易类型,4位长度,必填,取值范围为:"0001""0002", 其中"0001"表示消费交易,"0002"表示退货交易
<input type=hidden name="TransType" value="0001"/>

//支付接入版本号,必填,20040916的版本中,如果商户为二级商户,订单号从第5位到第9位必须和商户号的第11位到第15位相同
<input type=hidden name="Version" value="20040916"/>

//后台交易接收URL,必填,长度不要超过80个字节
<% String basePath = request.getScheme()+"://"+request.getServerName();
String BgRetUrl = basePath+"/返回页面"; %>
<input type=hidden name="BgRetUrl" value=<%=BgRetUrl %>>

//页面交易接收URL,长度不要超过80个字节,必填
<input type=hidden name="PageRetUrl" value=<%=basePath %>>

//支付网关号,可选
<input type=hidden name="GateId" value="">

//商户私有域,长度不要超过60个字节,可选
<%String Priv1 = (String)request.getAttribute("Priv1"); %>
<input type=hidden name="Priv1" value=<%=Priv1 %>>

//256字节长的ASCII,为此次交易提交关键数据的数字签名,必填
<%String ChkValue = (String)request.getAttribute("ChkValue"); %>
<input type=hidden name="ChkValue" value=<%=ChkValue %>>
</form>

<script language="JavaScript" type="text/JavaScript">
 form1.submit();
</script>

4.验证交易应答函数verifyTransResponse 该方法在类chinapay. SecureLink

//后台返回页验证

chinapay.PrivateKey key=new chinapay.PrivateKey();
chinapay.SecureLink t;
boolean flag;
boolean flag1;
String MerId, OrdId, TransAmt, CuryId, TransDate, TransType,ChkValue,OrderStatus,Priv1;
String plainData, ChkValue2;
MerId = request.getParameter("merid");
OrdId = request.getParameter("orderno");
TransAmt = request.getParameter("amount");
CuryId = request.getParameter("currencycode");
TransDate = request.getParameter("transdate");
TransType = request.getParameter("transtype");
OrderStatus = request.getParameter("status");
ChkValue = request.getParameter("checkvalue");
Priv1 = request.getParameter("Priv1");
String baseDiskPath = request.getSession().getServletContext().getRealPath(File.separator);

flag=key.buildKey("999999999999999",0,baseDiskPath+File.separator+"chinapaykey"+File.separator+"PgPubk.key");
if (flag==false)

 //System.out.println("build key error!");
}else {
 //System.out.println("build key ok!");
}
t=new chinapay.SecureLink (key);
flag1=t.verifyTransResponse(MerId,OrdId, TransAmt, CuryId, TransDate, TransType, OrderStatus, ChkValue); 

 


------------

demo

<form id="form1" runat="server">

    <div>
        <table cellpadding="0" cellspacing="0" border="1" style="border-collapse:collapse" bordercolor="#cccccc">
            <tr>
                <td>订单号</td>
                <td>
                    <asp:TextBox ID="txtOrderNo" runat="server">0700004350100289</asp:TextBox></td>
            </tr>
            <tr>
                <td>订单数量</td>
                <td><asp:TextBox ID="txtOrderQty" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                <td>金额</td>
                <td><asp:TextBox ID="txtAmount" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                <td colspan="2">
                <form name="frm1" action="http://payment.chinapay.com:8081/pay/TransGet" METHOD="POST" > 
                    <input type=hidden name="MerId" value="808080010500435" > 
                    <input type=hidden name="OrdId" value="0700004350100289" >
                    <input type=hidden name="TransAmt" value="000000106000" > 
                    <input type=hidden name="CuryId" value="156" >
                    <input type=hidden name="TransDate" value="20070703" > 
                    <input type=hidden name="TransType" value="0001" > 
                    <input type=hidden name="Version" value="20040916"> 
                    <input type=hidden name="BgRetUrl" value="accept.aspx"> 
                    <input type=hidden name="PageRetUrl" value="chinapayback.aspx"> 
                    <input type=hidden name="Priv1" value="Memo"> 
                    <input type=hidden name="ChkValue" value=<%= keyValue %> > 
                    
                    <input id="Button1" type="submit" class="button" value="进入银联支付平台" /></form>
                    </td>
            </tr>
        </table>
    </div>
    </form>


get方式:

http://payment-test.chinapay.com/pay/TransGet?MerId=001320554110008&OrdId=0001320554110008&TransAmt=000000001234&CuryId=156&TransDate=20130410&TransType=0001&Version=20040916&BgRetUrl=http://www.baidu.com&PageRetUrl=http://www.baidu.com&ChkValue=

00132055411000800132055411000800132055411000800

13205541100080013205541100080013205541100081000800

13205541100081000800132055411000810008001320554110008

18018018011801801801180180013205541100080013205541100

08001320554110008001320554110008001320554110008000080

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010741376/article/details/51656510

智能推荐

Linux安装detectron2出现nvcc fatal : Unsupported gpu architecture compute_75_kelly1250230225的博客-程序员ITS203

我的电脑python3.6.9,pytorch1.4,opencv4.2,具体安装方式可以自行百度参考链接基本配置及版本要求1.OS: Linux 或 macOX2.Python&gt;=3.63.PyTorch&gt;=1.44.opencv(python 版)(可选),用于demo运行和可视化5.安装pycocotools查看pytorch是否能调用GPUimport torch, torchvisionprint(torch.__version__, torch.cuda.is_a

计算机图形学(八)-纹理映射、计算重心坐标、UV插值、双线性插值、MipMap_点燃火柴的博客-程序员ITS203_图形学uv

如上图球的表面贴上一张绘制了地图的二维图片,就变成了地球仪,这张二维的图片就是纹理,把这个图贴到球表面伴随着这纹理的放大缩小以及将纹理中的某个点和球上的某个点对应起来,这个过程就是纹理映射纹理映射的过程通常是这样的,建模人员给开发人员的模型中通常会有与顶点一一对应的uv坐标,同时提供一张纹理贴图,比如说要对模型的某个顶点着色,这时获取到这个顶点对应的uv坐标,拿着这个坐标从纹理贴图中取色,取到后把值赋给存储顶点颜色的变量。

如何计算IP地址及CIDR_weixin_34005042的博客-程序员ITS203

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

基于深度学习的医学图像分割学习笔记(一)_Demon果的博客-程序员ITS203

基于深度学习的医学图像分割学习笔记(一)文章目录基于深度学习的医学图像分割学习笔记(一)一、医学图像的突出特征二、分割目标一、医学图像的突出特征医学图像相比于自然图像主要有四点区别:1.医学图像的模态更加多样化,不同模态反应的信息不一样。如X-ray观察骨骼更清晰,CT反应出血和组织,MRI观察软组织。2.医学图像的像素值范围与自然图像(0~255)有很大差别3.自然图像的光成像,由于散射的存在,频谱比较宽,所以近似认为自然图像的噪声分布是均匀的,建模为高斯分布;而医学图像的成像中,为尽量消除散

ArcGIS Server 10.6(Windows)离线许可授权操作_啄慕鸟kevinzeng的博客-程序员ITS203_arcgis server10.6

说明适用于ArcGIS Server 10.1至10.6版本,操作过程中所截图都是在Windows下完成。如果你部署的是Linux版本,同时系统安装了桌面,那么操作过程类似,参考即可使用。操作过程双击ArcGIS Server许可文件,在弹出窗口中点击【下一步】: 如果安装ArcGIS Server的机器不能访问互联网,那么选择第二个选项,如下图: 备注:如果本机可以联网,...

HDU 6222 Heron and His Triangle 找规律打表 大数减法 大数乘法_DonoToT的博客-程序员ITS203

HDU 6222 Heron and His TriangleA triangle is a Heron’s triangle if it satisfies that the side lengths of it are consecutive integers t−1, t, t+ 1 and thatits area is an integer. Now, for given n you ...

随便推点

EON SoftWare Vue 4 Professional v4.51 1CD_weixin_34221775的博客-程序员ITS203

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

Android中使用AbstractProcessor在编译时生成代码_bjxiaxueliang的博客-程序员ITS203

Android中使用AbstractProcessor在编译时生成代码发现这边不错的文章,忍不住转了过来,转自: http://blog.csdn.net/industriously/article/details/53932425根据这片文档的简单小demo: https://github.com/AndroidHighQualityCodeStudy/Android_Abstrac...

2006年_qq_42042882的博客-程序员ITS203

Text 1In spite of “endless talk of difference,” American society is an amazing machine for homogenizing people. There is “the democratizing uniformity of dress and discourse, and the casualness and absence of deference” characteristic of popular culture.

【转】在Unity中创建可用Inspector预编辑的Dictionary类型(转载/狗屁不通机翻)_taoming9sui的博客-程序员ITS203

懂的就直接看原贴吧~https://forum.unity.com/threads/finally-a-serializable-dictionary-for-unity-extracted-from-system-collections-generic.335797/总的来说你需要创建一个字典模板类:public class SerializableDictionary&lt;TK...

Mac软件打开时闪退怎么办?苹果电脑软件崩溃解决办法_茶茶π的博客-程序员ITS203_mac打开艾肯机架就闪退

Mac软件打开时闪退怎么办?苹果电脑软件崩溃解决办法苹果在升级系统后导致部分软件签名失效,很多软件用不了。比如像这个iMazing软件打开后提示意外退出,还有的软件会提示崩溃。今天笔者来和大家探讨如何解决这个问题。先说说事件起因据美国科技媒体Engadget报道,视频会议软件开发商Zoom此前发布紧急补丁,修复Mac摄像头漏洞。而苹果也在升级macOS,剔除隐藏的网络服务器。此前Zoom被曝出漏洞。当用户安装Zoom视频会议应用时,隐藏服务器会悄悄植入用户的Mac设备,让摄像头有被黑客劫持的风险。Zoo

一个程序员的多年珍藏(1月23日最新更新)_zhangshufa的博客-程序员ITS203_m5311-软件开发和各种指令集合

Python相关的资料还可以看:http://jythoner.javaeye.com/blog/569987新书区Python源码剖析:下載文件 Python源码剖析.chm (670.21 KB)Python黑客:下載文件 Gray Hat Python Python Programming for Hackers and Reverse

推荐文章

热门文章

相关标签