java对接网银支付案例
=================提交表单jsp,http://www.cnblogs.com/qgc88================================
<%@page contentType="text/html;charset=gb2312" language="java"%>
<!-- import="java.net.URLEncoder" http://www.cnblogs.com/qgc88 -->
<%@page session="true"
import="com.gnete.paymentgateway.PayUtils,java.text.SimpleDateFormat,java.util.Date"
%>
<html>
<table border=1 bordercolor="ccccff" bgcolor="ccddee" align="center">
<%
//定义变量
String MerId, OrderNo, OrderAmount, CurrCode, BankCode,OrderType, nOrderType, CallBackUrl, ResultMode, Reserved01, Reserved02, SourceText, PKey, SignedMsg, EntryMode;
boolean ret;
PKey = "12hi60ohxxxxxxxxxxxxguz";//公司申请的key,http://www.cnblogs.com/qgc88
SignedMsg = "";
MerId="xxx"; //公司申请的商户ID参数,3位数,http://www.cnblogs.com/qgc88
System.out.println("商户ID: " + MerId + "<br>");
Date myDate = new Date();
OrderNo = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); //商户订单号,http://www.cnblogs.com/qgc88
System.out.println("商户订单号不超过20位: " + OrderNo + "<br>");
OrderAmount = "100.01"; //订单金额,格式:元.角分
System.out.println("订单金额: " + OrderAmount.toString() + "<br>");
CurrCode = "CNY"; //货币代码,值为:CNY
System.out.println("货币代码: " + CurrCode + "<br>");
CallBackUrl = "http://localhost:8080/demo1/successPay.action"; //支付结果接收URL
EntryMode = request.getParameter("EntryMode") == null ? "": request.getParameter("EntryMode"); //支付方式
BankCode = request.getParameter("nBankCode") == null ? "" : request.getParameter("nBankCode");
System.out.println("支付结果接收URL: " + CallBackUrl + "<br>");
ResultMode = "0"; //支付结果返回方式(0-成功和失败支付结果均返回;1-仅返回成功支付结果)
Reserved01 = "just"; //保留域1
Reserved02 = "atest"; //保留域2
OrderType = "B2C";
//组合成订单原始数据
SourceText = MerId + OrderNo + OrderAmount + CurrCode + OrderType + CallBackUrl+ ResultMode + BankCode + EntryMode + Reserved01+ Reserved02;
System.out.println("<br>SourceText=" +SourceText);
PayUtils payUtils = new PayUtils();
SignedMsg = payUtils.md5(SourceText + payUtils.md5(PKey));
out.println("<br>" + "加密后的信息: " + SignedMsg + "<br>");
ret = payUtils.checkSign(SourceText,SignedMsg,PKey);
if(ret){
out.println("<br>"+"验证签名成功!");
}else{
out.println("<br>"+"验证签名失败! ");
}
//out.println("<br>"+"验证签名: "+"883ef8a28d9602f8705cafb4d01ca754".equals(SignedMsg) +"<br>");
%>
<!--注意,这个url只能是测试帐号调用,如果是正式的帐号请使用:https://www.gnete.com/bin/scripts/OpenVendor/gnete/V36/GetOvOrder.asp -->
<form method="post" name="SendOrderForm" action="http://test.gnete.com:8888/Bin/Scripts/OpenVendor/Gnete/V36/GetOvOrder.asp">
<input type='hidden' name='MerId' value='<%=MerId%>'>
<input type='hidden' name='OrderNo' value='<%=OrderNo%>'>
<input type='hidden' name='OrderAmount' value='<%=OrderAmount%>'>
<input type='hidden' name='CurrCode' value='<%=CurrCode%>'>
<input type='hidden' name='CallBackUrl' value='<%=CallBackUrl%>'>
<input type='hidden' name='ResultMode' value='<%=ResultMode%>'>
<input type='hidden' name='OrderType' value='<%=OrderType%>'>
<input type='hidden' name='BankCode' value='<%=BankCode%>'>
<input type='hidden' name='EntryMode' value='<%=EntryMode%>'> 0
<input type='hidden' name='Reserved01' value='<%=Reserved01%>'>
<input type='hidden' name='Reserved02' value='<%=Reserved02%>'>
<input type='hidden' name='SignMsg' value='<%=SignedMsg%>'>
<div align="center"><input type="submit" name="Submit" value="提交">
</div>
</form>
<tr>
</tr>
</table>
</html>
===============PayConf.java工具类,http://www.cnblogs.com/qgc88================================
/**,http://www.cnblogs.com/qgc88
* 名称:支付配置类
* 功能:配置类
* 类属性:公共类
* 版本:1.0
* 日期:2012-10-23
* 作者:银联网络互联网团队
* 版权:银联网络
* 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。该代码仅供参考。
* */
public class PayConf {
//编码方式
public final static String charset="GBK";
//加密方式
public final static String signType="MD5";
}
===============PayUtils.java工具类,http://www.cnblogs.com/qgc88================================
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedList;
import java.util.ListIterator;
import org.apache.commons.httpclient.methods.PostMethod;
/**,http://www.cnblogs.com/qgc88
* 名称:支付工具类
* 功能:工具类,可以生成付款表单等
* 类属性:公共类
* 版本:1.0
* 日期:2012-10-23
* 作者:银联网络互联网团队
* 版权:银联网络
* 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。该代码仅供参考。
* */
public class PayUtils {
/**
* 验证签名
* @param sourceText
* @param signature
* @param strPKey
* @return
*/
public boolean checkSign(String SourceMsg, String signature, String strPKey) {
String strKey;
if(SourceMsg == null) return false;
if(signature == null) return false;
if(strPKey == null) return false;
System.out.println("SourceMsg="+SourceMsg);
strKey = md5(strPKey);
strKey = SourceMsg +strKey;
System.out.println("strKey="+strKey);
strKey = md5(strKey);
System.out.println("strKey="+strKey);
System.out.println("signature="+signature);
if(signature.equals(strKey)){
return true;
}else{
return false;
}
}
/**
* get the md5 hash of a string
*
* @param str
* @return
*/
public String md5(String str) {
if (str == null) {
return null;
}
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance(PayConf.signType);
messageDigest.reset();
messageDigest.update(str.getBytes(PayConf.charset));
} catch (NoSuchAlgorithmException e) {
return str;
} catch (UnsupportedEncodingException e) {
return str;
}
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
return md5StrBuff.toString();
}
// Clean up resources
public void destroy() {
}
/**
* 查询方法
* @param strURL
* @param req
* @return
*/
public String doPostQueryCmd(String strURL, String req) {
String result = null;
BufferedInputStream in = null;
BufferedOutputStream out = null;
try {
URL url = new URL(strURL);
URLConnection con = url.openConnection();
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
out = new BufferedOutputStream(con.getOutputStream());
System.out.println("Request:=="+req);
byte outBuf[] = req.getBytes(PayConf.charset);
out.write(outBuf);
out.close();
in = new BufferedInputStream(con.getInputStream());
result = ReadByteStream(in);
} catch (Exception ex) {
System.out.print(ex);
return "";
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
if (result == null)
return "";
else
return result;
}
private static String ReadByteStream(BufferedInputStream in) throws IOException {
LinkedList<Mybuf> bufList = new LinkedList<Mybuf>();
int size = 0;
byte buf[];
do {
buf = new byte[128];
int num = in.read(buf);
if (num == -1)
break;
size += num;
bufList.add(new Mybuf(buf, num));
} while (true);
buf = new byte[size];
int pos = 0;
for (ListIterator<Mybuf> p = bufList.listIterator(); p.hasNext();) {
Mybuf b = p.next();
for (int i = 0; i < b.size;) {
buf[pos] = b.buf[i];
i++;
pos++;
}
}
return new String(buf,PayConf.charset);
}
}
class UTF8PostMethod extends PostMethod{
public UTF8PostMethod(String url){
super(url);
}
@Override
public String getRequestCharSet() {
return "UTF-8";
}
}
class GBKPostMethod extends PostMethod{
public GBKPostMethod(String url){
super(url);
}
@Override
public String getRequestCharSet() {
return "GBK";
}
}
class Mybuf
{
public byte buf[];
public int size;
public Mybuf(byte b[], int s)
{
buf = b;
size = s;
}
}
java对接网银支付案例的更多相关文章
- java对接微信支付
对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层) 此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...
- Android对接微信支付体验
在写正文之前我不得不吐槽一下:微信支付所提供的参考文档以及技术支持真心太烂了. 微信的坑: 1.在生成prepay_id向微信服务器传递参数时<body>不支持中文.需要对其进行转码,否则 ...
- java版微信支付/查询/撤销
最近公司接入微信刷卡支付,网上根本没见到很直接的教程(可能眼拙),一直摸滚打爬,加班加点才走通,忍不了必须写一写 微信 刷卡支付/查询/撤销... 必须要有公众号然后去申请,申请自己去看文档,这里主要 ...
- Java对接拼多多开放平台API(加密上云等全流程)
前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...
- 对接第三方支付接口-获取http中的返回参数
这几天对接第三方支付接口,在回调通知里获取返回参数,有一家返回的json格式,请求参数可以从标准输入流中获取. //1.解析参数 , 读取请求内容 BufferedReader br; String ...
- Java虚拟机类加载机制——案例分析
转载: Java虚拟机类加载机制--案例分析 在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...
- Java学生管理系统项目案例
这是一个不错的Java学生管理系统项目案例,希望能够帮到大家的学习吧. 分代码如下 package com.student.util; import java.sql.Connection; impo ...
- Java 后端微信支付demo
Java 后端微信支付demo 一.导入微信SDK 二.在微信商户平台下载证书放在项目的resources目录下的cert文件夹下(cert文件夹需要自己建) 三.实现微信的WXPayConfig接口 ...
- PHP对接微信支付采坑
第一次做PHP商城项目对接微信支付接口,踩了N次坑,这也不对,那也不对,搞了很久,查了一些资料,终于实现了支付功能,小小总结一下,万一下次遇到就不用到处找资料了. 微信扫码支付 前期准备: 1.微信公 ...
随机推荐
- 修改visual studio setup 安装顺序(解决新版安装包无法自动移除老版本程序的问题)
背景 visual studio setup 支持自动删除之前版本的安装,需要设置RemovePreviousVersions = true, DetectNewerInstalledVersion ...
- minGw64编译Qt时遇到too many sections问题
minGw64编译Qt时遇到too many sections问题: 修改\Src\qtbase\mkspecs\win32-g++\qmake.conf中 QMAKE_CFLAGS ...
- GIMP图像窗口的自定义
具体功能包含:初始缩放比例.空格键按下时触发动作
- 如何用纯 CSS 创作一个蝴蝶标本展示框
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xzgZzQ 可交互视频教 ...
- CVS在update时状态status
cvs update -Ad 时,terminal 会display如下: P xx.v P xx.c ? xx.v ? xx.c A xx.v M xx.v U xx.v C xx.v 第一个字母: ...
- Python contenttypes组件
介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Contenttypes应用的核心是Co ...
- LeetCode(150) Evaluate Reverse Polish Notation
题目 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, ...
- python中os模块讲解
本文主要介绍一些os模块常用的方法: 先看下我的文件目录结构 D:\LearnTool\pycode\part1 在此目录下的文件如下: abcd.py demo1.1.py demo1.2.py z ...
- 算法学习记录-图——最小路径之Floyd算法
floyd算法: 解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过 ...
- charles-修改发送的接口数据测试页面样式
一.痛点: 1. 界面上数据准确性无法比对 2. 界面上几乎没有可测试数据 3. 消息条数超过99时的显示逻辑验证(难道真的要造100条新的未读消息?) 4. 更换界面图片时必须找相关接 ...