转载: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如何实现在线支付讲解相关推荐

  1. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

  2. java word编辑_java实现word在线编辑及流转

    [实例简介] java开发web办公系统,调用PageOffice组件实现word在线编辑及流转 [实例截图] [核心代码] worddemo ├── worddemo │   ├── css │   ...

  3. java微信扫码支付_java 微信扫码支付 示例代码

    [实例简介] [实例截图] [核心代码] package main.java; import main.java.Utils.HttpClientUtil; import org.dom4j.Docu ...

  4. java 银联支付_java服务器端移动银联支付的流程

    一,银联支付的整体流程 客户端提供服务器给服务器订单信息----服务器端拿到数据推送给银联指定的地址----银联给服务器端返回一个流水账号----服务器将流水账号返给客户端 ----客户端由于集成了银 ...

  5. java app支付_java实现微信App支付

    废话不多说,直接上代码,微信的小程序,公众号支付都大差不差,自行看文档修改参数即可. maven依赖: com.github.wxpay wxpay-sdk 0.0.3 application.yml ...

  6. java统计在线人数_java统计当前在线数 (转)

    java统计当前在线数 (转)[@more@] package com.hnedu.stat; /** * 计算在线人数,说明: * * 在访问页面放入: * com.hnedu.stat.Onlin ...

  7. java实现网上支付_java编写一个网上支付系统界面

    展开全部 购物与结算 (beta4)/IE9.js"> function pay() { var link = document.getElementById("a1&quo ...

  8. java微信内h5调起支付_java进行微信h5支付开发

    最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...

  9. java怎么实现踢掉在线用户_Java多人在线聊天室(3)— 踢人下线功能

    作为一个聊天室,肯定会有很多人在里面聊天,那么要是有人里面捣乱怎么办?直接踢人不解释. 我们在创建数据库的时候就有这样的考虑,所以我们的账户有两种,一种是管理员,一种是普通用户. 打开的数据库!我们可 ...

最新文章

  1. Android Monkey使用
  2. 算法------最接近的三数之和
  3. 在Eclipse中使用JUnit4进行单元測试(0基础篇)
  4. mysql 默认事务隔离级别_MySQL 事务隔离级别详解
  5. leetcode 264. 丑数 II(堆)
  6. Rust笔记1 rust基本概念
  7. 开课吧:分享一下C语言发展史的点点滴滴
  8. Luogu1390 公约数的和
  9. 【ML】特征归一化、为什么归一化、归一化的方法、归一化方法选择依据
  10. InVest模型的安装及应用说明
  11. linux 进程 清理,Linux僵尸进程清除方法
  12. 老路用得上的商学课-61-80学习(读书)笔记
  13. 教学向|如何快速入门maya制作动画,萌新也能冲
  14. Java 逐行读写 TXT 文件
  15. 如何让 PPT 中的多张图大小一致?
  16. “3D游戏之父”手游考古,网友:求支持智能手机!
  17. 分布式学习(3)etcd@2@HTTP API v2
  18. bootstrap网格布局自适应问题
  19. 软件测试 瀑布模式 v模型
  20. 微型计算机接口技术4732,自考微型计算机及接口技术课程考试说明

热门文章

  1. 基于WebSocket的手机应用和浏览器应用的数据传递
  2. 在AWS控制台里创建key Pair
  3. How Kyma plugin register hook to Activate and deactivate event
  4. Pin code码已被重置
  5. 在TCP客户端连接成功的回调函数里,无法访问到客户端套接字的明细
  6. 在ABAP里取得一个数据库表记录数的两种方法
  7. 升级bigsur_升级 macOS Big Sur 后,程序监听端口报错
  8. 一个大型虚拟项目包含位于不同地点的许多干系人_项目管理与人生
  9. 挖矿为什么要用显卡_Eth2拉开序幕,为何显卡大户却在加码挖矿?
  10. ios 静态库合成_iOS生成静态库方法-iOS集成静态库-iOS合并静态库