//实现java支付宝很简单,只要从支付宝官方下载
http://help.alipay.com/support/index_sh.htm下载程序,配置一下参数就OK了;
1.先到http://help.alipay.com/support/index_sh.htm下接口程序,右下角有个“接口资料下载”点击下载进入下载页面http://club.alipay.com/read.php?tid=9976972选择你要下载支付宝的接口类型;我是选择“支付宝即时到账收款接口”
2.解压以后,可以看到很多种版本语言的支付宝例子,选择你要的语言类型;这里我是选择的是“alipaydirect\alipaydirect\支付宝即时到帐接口\java\create_direct_pay_by_user_jsp_utf8”是UTR-8的程序;
3.将项目导入到你的开发平台上,也就是myeclipse平台上,就可以看到项目的结构了。然后配置支付宝,作为测试的话这里只要修改一个文件就可以了,其他文件都不需要修改的,这个文件就是“AlipayConfig.java”里面的//
↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 合作身份者ID,以2088开头由16位纯数字组成的字符串
public static String partner = "";
// 交易安全检验码,由数字和字母组成的32位字符串
public static String key = "";
// 签约支付宝账号或卖家收款支付宝帐户
public static String seller_email = "";
// 支付宝服务器通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
// 必须保证其地址能够在互联网中访问的到
public static String notify_url = "http://www.xxx.cn/create_direct_pay_by_user_jsp_utf8/notify_url.jsp";
// 当前页面跳转后的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
// 域名不能写成http://localhost/create_direct_pay_by_user_jsp_utf8/return_url.jsp ,否则会导致return_url执行无效
public static String return_url = "http://127.0.0.1:8080/create_direct_pay_by_user_jsp_utf8/return_url.jsp";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
4.然后开启服务器,运行index.jsp页面就可以看到效果了;
5.若需要了解具体得信息,在下载的文件里面有一个帮助文档PDF文件“支付宝即时到账接口集成教程.pdf”和“即时到账交易接口(create_direct_pay_by_user).pdf”;
在这个“alipaydirect\alipaydirect\支付宝即时到帐接口\java\create_direct_pay_by_user_jsp_utf8\”还有一个“readme.txt”帮助文件;仔细看一下帮助文档就可以明白的!
接下来用一点实例更加详细的解释一下:
1:拥有自己的支付宝企业账号。去产品商店选择适合自己的方案。并签约合同。
2:选择合适的商家收款产品并去签约。填写相应的信息
3:在商家服务会有PID和KEY是关键的东西。
4:选择自己签约的产品类型,下载对应的接口api与测试代码
即时到账收款 --alipaydirect
网银支付 --alipaydirect_bankpay_single
担保交易收款 --alipaytescow
双功能收款 --alipaydualfun
快捷支付(无线) --WS_SECURE_PAY_SDK
手机网站支付 --WS_WAP_PAYWAP
扫码即时到账 --alipaymobileqrcode
扫码担保交易 --alipaymobileqrcode
批量付款到支付宝账户 --alipaytranspay
快捷登录 --alipayfastlogin
5:alipaydirect_bankpay_single 测试
在核心代码alipayconfig需要更改自己的partner和key
6:网银银行简码
网银银行简码 | |
BOCB2C | 中国银行 |
ICBCB2C | 中国工商银行 |
ICBCBTB | 中国工商银行(B2B) |
CMB | 招商银行 |
CCB | 中国建设银行 |
CCBBTB | 中国建设银行(B2B) |
ABC | 中国农业银行 |
ABCBTB | 中国农业银行(B2B) |
SPDB | 上海浦东发展银行 |
SPDBB2B | 上海浦东发展银行(B2B) |
CIB | 兴业银行 |
GDB | 广东发展银行 |
SDB | 深圳发展银行 |
CMBC | 中国民生银行 |
COMM | 交通银行 |
CITIC | 中信银行 |
CEBBANK | 光大银行 |
NBBANK | 宁波银行 |
HZCBB2C | 杭州银行 |
SHBANK | 上海银行 |
SPABANK | 平安银行 |
BJRCB | 北京农村商业银行 |
fdb101 | 富滇银行 |
PSBC-DEBIT | 中国邮政储蓄银行 |
BJBANK | 北京银行 |
7:错误代码错误说明
误代码 | 说明 |
EXPARTNER_INFO_UNCORRECT | 传入外部商户接口信息不正确 |
TRADE_BUYER_NOT_MATCH | 买家账户与交易中不一致 |
TRADE_SELLER_NOT_MATCH | 卖家账户与交易中不一致 |
TRADE_DATA_NOT_MATCH | 请求数据与交易中不一致 |
SELLER_NOT_IN_SPECIFIED_SELLERS | 卖家不在指定的商户限制卖家中 |
ILLEGAL_SIGN | 签名验证出错 |
ILLEGAL_ARGUMENT | 输入参数有错误 |
HASH_NO_PRIVILEGE | 没有权限访问该服务 |
ILLEGAL_SERVICE | service参数不正确 |
ILLEGAL_PARTNER | 合作身份者ID不正确 |
HAS_NO_PUBLICKEY | 没有上传公钥 |
USER_NOT_EXIST | 会员不存在 |
OUT_TRADE_NO_EXIST | 外部交易号已经存在 |
TRADE_NOT_EXIST | 交易不存在 |
ILLEGAL_PAYMENT_TYPE | 无效支付类型 |
BUYER_NOT_EXIST | 买家不存在 |
SELLER_NOT_EXIST | 卖家不存在 |
BUYER_SELLER_EQUAL | 买家、卖家是同一帐户 |
ILLEGAL_SIGN_TYPE | 签名类型不正确 |
COMMISION_ID_NOT_EXIST | 佣金收取帐户不存在 |
COMMISION_SELLER_DUPLICATE | 收取佣金帐户和卖家是同一帐户 |
出现的错误代码为ILLEGAL_PARTNER_EXTERFACE
1、没有签约这个接口的合同。
2、签约了相应的接口合同,但没有生效。
3、签约了相应的接口合同,但由于违规违法等原因被审核部门强制关闭。
8:页面需要修改的东西alipayapi.jsp
9:跳转页面第6步有截图。卖家账号收款的账号。不是付款的账号哦。
如果调试登录了收款的支付宝账号。会出错的哦。错误截图如下
错误代码:BUYER_SELLER_EQUAL
如果调试登录了收款的支付宝账号。而且页面填写的卖家账号非卖家账号(收款账号)会出现如下错误
错误代码:SELLER_NOT_IN_SPECIFIED_SELLERS
如果没有错误。则会直接跳转付款页面。输入买家账号即可。
10:成功付款的页面。付款页面需要输入购买用户的支付宝账号和支付密码
11:使用springMVC封装写符合自己网站需求的代码。以下代码仅参考
这个是ALIPAYAPI代码要获取数据的
Date date = new Date(); //支付类型 必填 不必修改 String payment_type = "1"; //服务器异步通知页面路径 //需http://格式的完整路径,不能加?id=123这类自定义参数 String notify_url = "http://localhost:8080/alipay/async"; //页面跳转同步通知页面路径 //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/ String return_url = "http://192.168.0.222:8080/alipay/return_url"; //订单名称 //必填 // String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8"); String subject = new String("测试商品".getBytes("ISO-8859-1"),"UTF-8"); //付款金额 //必填 // String total_fee = new String(request.getParameter("WIDtotal_fee").getBytes("ISO-8859-1"),"UTF-8"); String total_fee = "0.01"; Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", "create_direct_pay_by_user");//接口服务----即时到账 sParaTemp.put("partner", AlipayConfig.partner);//支付宝PID sParaTemp.put("_input_charset", AlipayConfig.input_charset);//统一编码 sParaTemp.put("payment_type", payment_type);//支付类型 sParaTemp.put("notify_url", notify_url);//异步通知页面 sParaTemp.put("return_url", return_url);//页面跳转同步通知页面 sParaTemp.put("seller_email", Constants.SELLER_EMAIL);//卖家支付宝账号 sParaTemp.put("out_trade_no", date.getTime()+payment_type);//商品订单编号 sParaTemp.put("subject", subject);//商品名称 sParaTemp.put("total_fee", total_fee);//价格 //建立请求 String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "立即付款"); request.setAttribute("sHtmlText", sHtmlText); return null;
付款是否成功的代码
Map<String , String> params = new HashMap<String, String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1 )? valueStr + values[i]:valueStr+values[i]+","; } params.put(name, valueStr); } String tradeNo = request.getParameter("out_trade_no"); String tradeStatus = request.getParameter("trade_status"); if(AlipayNotify.verify(params)){ if(tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")){ System.out.println("ok!>>>>>>>>" + tradeNo); } return "success"; }else{ return "fail"; } }
12:使用springMVC封装写符合自己网站需求的代码。以下代码仅参考 全部都写在一个Controller里面
/** * 支付宝Controller * @author 宗潇帅 * @修改日期 2014-9-25下午1:29:53 */ @Controller @RequestMapping(value="/aliapi") public class AlipayApiController { private static Log log = LogFactory.getLog(AlipayApiController.class); @RequestMapping(value="/index") public String index(HttpServletRequest request, HttpServletResponse response){ return "web/pay/fund";//付款的页面。本页面是为了测试而使用的 } @RequestMapping(value = "/deposit", method = RequestMethod.POST,produces = "application/json") public String deposit(HttpServletRequest request,HttpServletResponse response,Model model) throws Exception { // PrintWriter out = response.getWriter(); String result = ""; Date date = new Date(); // 支付类型 // 必填,不能修改 String payment_type = "1"; // 服务器异步通知页面路径 // 需http://格式的完整路径,不能加?id=123这类自定义参数 String notify_url = "http://192.168.0.222:8080/live/aliapi/async"; // 页面跳转同步通知页面路径 // 需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/ String return_url = "http://192.168.0.222:8080/live/aliapi/return_url"; // 商户订单号. // 商户网站订单系统中唯一订单号,必填 //String out_trade_no = date.getTime() + ""; // 订单名称 // 必填 String subject = "充值测试"; // 防钓鱼时间戳 // 若要使用请调用类文件submit中的query_timestamp函数 String anti_phishing_key = ""; // 客户端的IP地址 // 非局域网的外网IP地址,如:221.0.0.1 String exter_invoke_ip = ""; String total_fee = ServletRequestUtils.getStringParameter(request, "amount",""); String body = ServletRequestUtils.getStringParameter(request, "body","test"); //商品展示地址 String show_url = ServletRequestUtils.getStringParameter(request, "show_url","http://www.elve.cn"); //需以http://开头的完整路径,例如:http://www.xxx.com/myorder.html Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", "create_direct_pay_by_user");//接口服务----即时到账 sParaTemp.put("partner", AlipayConfig.partner);//支付宝PID sParaTemp.put("_input_charset", AlipayConfig.input_charset);//统一编码 sParaTemp.put("payment_type", payment_type);//支付类型 sParaTemp.put("notify_url", notify_url);//异步通知页面 sParaTemp.put("return_url", return_url);//页面跳转同步通知页面 sParaTemp.put("seller_email", Constants.SELLER_EMAIL);//卖家支付宝账号 sParaTemp.put("out_trade_no", date.getTime()+payment_type);//商品订单编号 sParaTemp.put("subject", subject);//商品名称 sParaTemp.put("total_fee", total_fee);//价格 sParaTemp.put("body", body); sParaTemp.put("show_url", show_url); sParaTemp.put("anti_phishing_key", anti_phishing_key); sParaTemp.put("exter_invoke_ip", exter_invoke_ip); //建立请求 try { String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"post","确认"); Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); String s = gson.toJson(sHtmlText); model.addAttribute("sHtmlText", s); request.setAttribute("sHtmlText", s); result = "{\"success\":true,\"msg\":\"跳转成功\"}"; StringUtil.writeToWeb(sHtmlText, "html", response); return null; } catch (Exception e) { if(log.isErrorEnabled()){ log.error("ddddddddddddddddddddd"); } result = "{\"success\":false,\"msg\":\"跳转失败,请稍候再试!\"}"; StringUtil.writeToWeb(result, "html", response); return null; } } /** * 同步通知的页面的Controller * @param request * @param response * @return * @author 宗潇帅 */ @RequestMapping(value="/return_url") public String Return_url(HttpServletRequest request,HttpServletResponse response){ return "web/pay/success"; } /** * 异步通知付款状态的Controller * @param request * @param response * @return * @author 宗潇帅 */ @SuppressWarnings("rawtypes") @RequestMapping(value="/async",method = RequestMethod.GET) public String async(HttpServletRequest request, HttpServletResponse response){ Map<String,String> params = new HashMap<String,String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ","; } params.put(name, valueStr); } String tradeNo = request.getParameter("out_trade_no"); String tradeStatus = request.getParameter("trade_status"); //String notifyId = request.getParameter("notify_id"); if(AlipayNotify.verify(params)){//验证成功 if(tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")) { //要写的逻辑。自己按自己的要求写 log.error("ok......."); System.out.println(">>>>>充值成功" + tradeNo); } return "web/pay/success"; }else{//验证失败 return "web/pay/fail"; } } }
13:JSP付款页面表单提交数据并弹出付款页面
<%@ page contentType="text/html;charset=UTF-8" %><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><%@ include file="/common/webMeta.jsp"%><title>www.elve.cntitle><meta content="www.elve.cn" name="keywords" /><meta content="www.elve.cn" name="description" />head><script type="text/javascript"> $(function(){ $("#amount").focus(); $("#doSubmit").click(function(){ form1.submit(); });});script><body> <form id="form1" action= "${ctx }/aliapi/deposit" method="post" target="_blank"> <table cellpadding="10"> <tr> <td>充值测试td> <td class="balance" id="userBalance">td> tr> <tr> <td><i class="zfb">i>td> <td style="padding-bottom: 0px;">亲爱的<span class="suppliment_user" id="suppliment_user">span>,您可以使用支付宝充值积善分,请填写以下信息 td> tr> <tr> <td>td> <td> 金额<input type="text" name="amount" id="amount"> td> tr> <tr> <td>td> <td><a href="javascript:void(0);" id="doSubmit" class="blank_btn">确认a>td> tr> table> form> body>html>