转载:https://www.cnblogs.com/haorun/p/6728466.html

国内电子商务系统实现的基本流程如下: 
客户在系统内下订单 -> 系统根据订单生成支付宝接口url -> 客户通过url使用支付宝(网上银行)付款 -> 支付宝将客户的付款完成信息发送给电子商务系统 -> 系统收到支付宝信息后确定客户订单已经付款 -> 进行发货等后续流程。

在开始下面的内容之前,你要先有一个支付宝账户,如果要集成支付宝接口,你还必须申请开通服务(关于如何开通,可以直接到支付宝网站上申请).在服务开通后,支付宝会给你2个字符串编号:1个partnerId(合作伙伴ID),还有1个securityCode(安全码).当你拿到这2个码的时候就可以开始下面的内容了.

(1)如何调用支付宝接口?(将客户的订单信息按照既定的规则生成一个url跳转到支付宝网站)

/**
* 根据订单生成支付宝接口URL.
* @param httpRequest
* @param order 订单实例
* @return
* @throws Exception
*/
public static String makeOrderAlipayUrl(HttpServletRequest httpRequest,Order order) throws Exception {
HashMap hm = new HashMap();
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
* @param hm 参数值
* @param securityCode 安全码
* @param charset 编码
* @param payGateway 支付宝gateway
* @return
*/
public static String makeUrl(HashMap hm,String securityCode,String charset,String payGateway) throws Exception{
List keys = new ArrayList(hm.keySet());
Collections.sort(keys);//支付宝要求参数必须按字母排序
StringBuffer content = new StringBuffer();
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;
return content.toString();
}
/**
* 生成md5编码字符串.
* @param str 源字符串
* @param charset 编码方式
* @return
*
*/
public static String 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 new String(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]的一个例子:

<%@ page contentType="text/html;charset=UTF-8"%><%@ page import="com.soft4j.AlipayMgr"%><%
String ret = AlipayMgr.insert(request);
if(ret==null){
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.
*/
package com.soft4j;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
/**
* 支付宝付款通知接口.
*
* @author stephen
* @version 1.0.0
*/
public final class NotifyUrlMgr {
public static String insert(HttpServletRequest httpRequest) {
//定义变量和进行必要的初始化工作
Enumeration parameterNames = null;
String parameterName = null;
String parameterValue = null;
int count = 0;
Vector[] params = null;
Vector vParameterName = new Vector();
Vector vParameterValue = new Vector();
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) {
return e.toString();
} finally {
}
}
}

另外安利一个学习教程:在线支付实战视频(视频+源码)

分享一个好的IT资源平台:点击进入

java如何实现在线支付讲解的更多相关文章

  1. SSH架构实现在线支付功能

    在线支付是指卖方与卖方通过因特网上的电子商务网站进行交易时,银行为其提供网上资金结算服务的一种业务,她为企业和个人提供了一个安全.快捷.方便的电子商务应用环境和网上资金结算工具,在线支付不仅帮助企业实 ...

  2. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  3. Atitit 在线支付系统功能设计原理与解决方案 与目录

    Atitit 在线支付系统功能设计原理与解决方案 与目录 1.1. 支付系统1 1.2. 独立的支付子体系..微服务架构..1 1.3. 参考书籍1 支付战争 [The PayPal Wars:Bat ...

  4. 【drp 1】使用易宝实现在线支付

    导读:在很多网站上,都会涉及到在线支付的功能,总所周知的有:淘宝.天猫.京东等等.我们常见的支付方式有支付宝.微信钱包.银行卡支付等.本篇博客,将介绍一种使用易宝第三方软件进行在线支付的功能. 一.基 ...

  5. Android集成支付宝接口 实现在线支付

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  6. [label][转载][paypal]paypal在线支付接口的WEB语言设置

    http://stephen830.iteye.com/blog/274072 ★★★ 本篇为原创,需要引用转载的朋友请注明:< http://stephen830.iteye.com/blog ...

  7. Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...

  8. php支付宝在线支付接口开发教程【转】

    php支付宝在线支付接口开发教程 这篇文章主要为大家详细介绍了php支付宝在线支付接口开发教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下   1.什么是第三方支付 所谓第三方支付,就是一些和各 ...

  9. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

随机推荐

  1. mapping数据列表

  2. 终端安装opencv

    安装 要想在 notebook 中安装和使用 OpenCV,请打开终端窗口(也被称为 Windows 用户的命令提示符窗口),并使用以下命令通过 conda 安装最新版本 (v3): conda in ...

  3. Python基础:20类的定制

    类中有一些可自定义的特殊方法,它们中的一些有预定义的默认行为,而其它一些则没有,留到需要的时候去实现.这些特殊方法是Python中用来扩充类的强有力的方式.它们可以实现模拟标准类型和重载操作符等.比如 ...

  4. HZOJ 数颜色

    一眼看去树套树啊,我可能是数据结构学傻了…… 是应该去学一下莫队进阶的东西了. 上面那个东西我没有打,所以这里没有代码,而且应该也不难理解吧. 这么多平衡树就算了,不过线段树还是挺好打的. 正解3: ...

  5. [***]HZOJ 奇袭

    C. 奇袭 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原 ...

  6. linux服务器时间更新

    yum install ntpdate ntpdate ntp1.aliyun.com(阿里云服务器时间)

  7. ansible api 通过python 方式调用

    pip3 install ansible Linux下面安装 Windows 安装没成功 from ansible.parsing.dataloader import DataLoader #读取ya ...

  8. TAE words all

    // vol 1   could do with sth   rhinoplasty   angst   the wee small hours   familial   Munich   gladi ...

  9. H3C 总线型以太网拓扑扩展

  10. 全面解读Python Web开发框架Django,利用Django构建web应用及其部署

    全面解读Python Web开发框架Django Django是一个开源的Web应用框架,由Python写成.采用MVC的软件设计模式,主要目标是使得开发复杂的.数据库驱动的网站变得简单.Django ...