java 在线支付_java如何实现在线支付讲解
转载:https://www.cnblogs.com/haorun/p/6728466.html
国内电子商务系统实现的基本流程如下:
客户在系统内下订单 -> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝(网上银行)付款 -> 支付宝将客户的付款完成信息发送给电子商务系统 -> 系统收到支付宝信息后确定客户订单已经付款 -> 进行发货等后续流程。
在开始下面的内容之前,你要先有一个支付宝账户,如果要集成支付宝接口,你还必须申请开通服务(关于如何开通,可以直接到支付宝网站上申请).在服务开通后,支付宝会给你2个字符串编号:1个partnerId(合作伙伴ID),还有1个securityCode(安全码).当你拿到这2个码的时候就可以开始下面的内容了.
(1)如何调用支付宝接口?(将客户的订单信息按照既定的规则生成一个url跳转到支付宝网站)
/*** 根据订单生成支付宝接口URL.
*@paramhttpRequest
*@paramorder 订单实例
*@return*@throwsException*/
public static String makeOrderAlipayUrl(HttpServletRequest httpRequest,Order order) throwsException {
HashMap hm= newHashMap();
hm.put("_input_charset",httpRequest.getCharacterEncoding());//采用相同的编码方式
hm.put("body","您在www.xxx.com上的订单");//填写在跳到支付宝页面上显示的付款内容信息
hm.put("discount","-5");//填写折扣信息 -5表示抵扣5元
hm.put("logistics_fee","10");//物流费用
hm.put("logistics_payment","BUYER_PAY");//物流费用支付人 BUYER_PAY=买家支付物流费用
hm.put("logistics_type","EXPRESS");//物流方式
hm.put("notify_url","http://www.xxx.com/notifyurl.jsp");//客户付款后,支付宝调用的页面
hm.put("out_trade_no",order.getId());//外部交易号,最好具有唯一性,在获取支付宝发来的付款信息时使用.
hm.put("partner",partnerId);//partnerId(合作伙伴ID)
hm.put("agent",partnerId);//partnerId(合作伙伴ID)
hm.put("payment_type","1");//支付类型 1=商品购买,2=服务购买,...
hm.put("price","105.30");//订单金额信息
hm.put("quantity","1");//订单商品数量,一般都是写1,它是按照整个订单包来计算
hm.put("return_url","http://www.xxx.com/ReturnUrl.jsp");//客户付款成功后,显示给客户的页面
hm.put("seller_email","alipay@xxx.com");//你的支付宝账户email
hm.put("service","create_direct_pay_by_user");//create_direct_pay_by_user=直接付款,trade_create_by_buyer 担保付款
hm.put("subject","www.xxx.com的订单");//填写在跳到支付宝页面上显示的付款标题信息
String payGateway = "https://www.alipay.com/cooperate/gateway.do?";//跳转到支付宝的url头
return makeUrl(hm,securityCode,httpRequest.getCharacterEncoding(),payGateway);//securityCode(安全码)
}/*** 根据传入的参数生成alipay的支付URL
*@paramhm 参数值
*@paramsecurityCode 安全码
*@paramcharset 编码
*@parampayGateway 支付宝gateway
*@return
*/
public static String makeUrl(HashMap hm,String securityCode,String charset,String payGateway) throwsException{
List keys= newArrayList(hm.keySet());
Collections.sort(keys);//支付宝要求参数必须按字母排序
StringBuffer content = newStringBuffer();for (int i = 0; i < keys.size(); i++) {
content.append((String) keys.get(i));
content.append("=");
content.append((String) hm.get((String) keys.get(i)));if (i != keys.size() - 1) {
content.append("&");
}
}
content.append(securityCode);
String sign=md5(content.toString(),charset);
content.delete(0,content.length());
content.append(payGateway);for (int i = 0; i < keys.size(); i++) {
content.append(keys.get(i));
content.append("=");
content.append(URLEncoder.encode((String) hm.get(keys.get(i)), charset));
content.append("&");
}
content.append("&sign_type=MD5");
keys.clear();
keys= null;returncontent.toString();
}/*** 生成md5编码字符串.
*@paramstr 源字符串
*@paramcharset 编码方式
*@return**/
public staticString md5(String str,String charset) {if (str == null)return null;char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f'};
MessageDigest md5MessageDigest= null;byte[] md5Bytes = null;char md5Chars[] = null;byte[] strBytes = null;try{
strBytes=str.getBytes(charset);
md5MessageDigest= MessageDigest.getInstance("MD5");
md5MessageDigest.update(strBytes);
md5Bytes=md5MessageDigest.digest();int j =md5Bytes.length;
md5Chars= new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte md5Byte =md5Bytes;
md5Chars[k++] = hexDigits[md5Byte >>> 4 & 0xf];
md5Chars[k++] = hexDigits[md5Byte & 0xf];
}return newString(md5Chars);
}catch(NoSuchAlgorithmException e) {//Log.output(e.toString(), Log.STD_ERR);
return null;
}catch(UnsupportedEncodingException e) {//Log.output(e.toString(), Log.STD_ERR);
return null;
}finally{
md5MessageDigest= null;
strBytes= null;
md5Bytes= null;
}
}
当客户通过接口url付款后,支付宝会自动的去调用前面提供的[notify_url]参数中的url.
(2)支付宝将付款信息返回给系统
当客户付款后,支付宝就会自动调用上面表单提供的[notify_url],下面是一个[notifyurl.jsp]的一个例子:
out.print("success");//成功接收支付宝发来的付款信息
}else{
out.print("fail");//出错
}%>
如果确认收到支付宝发来的客户付款信息,则返回"success",这样子支付宝就知道系统已经收到信息了;否则返回"fail",这样支付宝会过一段时间后再次发来。其实,只有当支付宝收到"success"的返回信息后才会停止发送付款信息,否则会自动的每隔一段时间就调用上面
的[notify_url]通信接口。
(3)系统处理支付宝发来的付款信息
/** Created on 2005-6-12
* Author stephen
* Email zhoujianqiang AT gmail DOT com
* CopyRight(C)2005-2008 , All rights reserved.*/
packagecom.soft4j;importjava.sql.Connection;importjava.sql.SQLException;importjava.util.Enumeration;importjava.util.Vector;importjavax.servlet.http.HttpServletRequest;/*** 支付宝付款通知接口.
*
*@authorstephen
*@version1.0.0*/
public final classNotifyUrlMgr {public staticString insert(HttpServletRequest httpRequest) {//定义变量和进行必要的初始化工作
Enumeration parameterNames = null;
String parameterName= null;
String parameterValue= null;int count = 0;
Vector[] params= null;
Vector vParameterName= newVector();
Vector vParameterValue= newVector();try{
String orderId= httpRequest.getParameter("out_trade_no");//订单号
if(orderId==null||"".equals(orderId)) orderId="-1";
parameterNames=httpRequest.getParameterNames();boolean isPrint = false;while (parameterNames.hasMoreElements()) {//循环收取支付宝发来的所有参数信息
parameterName =(String) parameterNames.nextElement();
parameterValue=httpRequest.getParameter(parameterName);if(parameterValue==null) parameterValue="";
vParameterName.add(parameterName);
vParameterValue.add(parameterValue);
count++;
}//这里添加对收到信息的处理:一般是将这些信息存入数据库,然后对客户的订单进行处理.
return null;
}catch(Exception e) {returne.toString();
}finally{
}
}
}
分享一个好的IT资源平台:点击进入
java 在线支付_java如何实现在线支付讲解相关推荐
- java微信网页支付_java实现微信H5支付
原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...
- java word编辑_java实现word在线编辑及流转
[实例简介] java开发web办公系统,调用PageOffice组件实现word在线编辑及流转 [实例截图] [核心代码] worddemo ├── worddemo │ ├── css │ ...
- java微信扫码支付_java 微信扫码支付 示例代码
[实例简介] [实例截图] [核心代码] package main.java; import main.java.Utils.HttpClientUtil; import org.dom4j.Docu ...
- java 银联支付_java服务器端移动银联支付的流程
一,银联支付的整体流程 客户端提供服务器给服务器订单信息----服务器端拿到数据推送给银联指定的地址----银联给服务器端返回一个流水账号----服务器将流水账号返给客户端 ----客户端由于集成了银 ...
- java app支付_java实现微信App支付
废话不多说,直接上代码,微信的小程序,公众号支付都大差不差,自行看文档修改参数即可. maven依赖: com.github.wxpay wxpay-sdk 0.0.3 application.yml ...
- java统计在线人数_java统计当前在线数 (转)
java统计当前在线数 (转)[@more@] package com.hnedu.stat; /** * 计算在线人数,说明: * * 在访问页面放入: * com.hnedu.stat.Onlin ...
- java实现网上支付_java编写一个网上支付系统界面
展开全部 购物与结算 (beta4)/IE9.js"> function pay() { var link = document.getElementById("a1&quo ...
- java微信内h5调起支付_java进行微信h5支付开发
最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...
- java怎么实现踢掉在线用户_Java多人在线聊天室(3)— 踢人下线功能
作为一个聊天室,肯定会有很多人在里面聊天,那么要是有人里面捣乱怎么办?直接踢人不解释. 我们在创建数据库的时候就有这样的考虑,所以我们的账户有两种,一种是管理员,一种是普通用户. 打开的数据库!我们可 ...
最新文章
- Android Monkey使用
- 算法------最接近的三数之和
- 在Eclipse中使用JUnit4进行单元測试(0基础篇)
- mysql 默认事务隔离级别_MySQL 事务隔离级别详解
- leetcode 264. 丑数 II(堆)
- Rust笔记1 rust基本概念
- 开课吧:分享一下C语言发展史的点点滴滴
- Luogu1390 公约数的和
- 【ML】特征归一化、为什么归一化、归一化的方法、归一化方法选择依据
- InVest模型的安装及应用说明
- linux 进程 清理,Linux僵尸进程清除方法
- 老路用得上的商学课-61-80学习(读书)笔记
- 教学向|如何快速入门maya制作动画,萌新也能冲
- Java 逐行读写 TXT 文件
- 如何让 PPT 中的多张图大小一致?
- “3D游戏之父”手游考古,网友:求支持智能手机!
- 分布式学习(3)etcd@2@HTTP API v2
- bootstrap网格布局自适应问题
- 软件测试 瀑布模式 v模型
- 微型计算机接口技术4732,自考微型计算机及接口技术课程考试说明
热门文章
- 基于WebSocket的手机应用和浏览器应用的数据传递
- 在AWS控制台里创建key Pair
- How Kyma plugin register hook to Activate and deactivate event
- Pin code码已被重置
- 在TCP客户端连接成功的回调函数里,无法访问到客户端套接字的明细
- 在ABAP里取得一个数据库表记录数的两种方法
- 升级bigsur_升级 macOS Big Sur 后,程序监听端口报错
- 一个大型虚拟项目包含位于不同地点的许多干系人_项目管理与人生
- 挖矿为什么要用显卡_Eth2拉开序幕,为何显卡大户却在加码挖矿?
- ios 静态库合成_iOS生成静态库方法-iOS集成静态库-iOS合并静态库