下面就拿我项目中的部分代码来实践一下.

支付请求

首先,是提交表单

fund.jsp(这里我表单只需要用户填交易金额,其他的订单号之类的全部后台生成)

<form id="deposit"  name= "alipaysubmit" method="post" target="_blank">
<input type="hidden" name="user.id" value= "<shiro:principal property="id"/>" />
<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><label class="radio inline"> <input type="radio"
name="amount" id="optionsRadios7" value="option7">自定义<input
class="compliment_count" name="amount" placeholder="充值金额">元
</label></td>
</tr>
<tr>
<td></td>
<td class="warm_prompt">温馨提示:<br />1.采用支付宝充值,1元可以充值1积善值。<br />2.若出现已充值成功的提示,但积善值未到账,可能是网络或者系统繁忙导致,我们会在2个工作日内核对后为您充值<br />3在充值过程中如出现网页错误或打开缓慢时,请先查询支付宝的交易记录,检查扣款是否成功;然后查看积善之家账户是否成功充值。若没有确认,请不要反复刷新页面,以防止重复购买。
</td>
</tr>
<tr>
<td></td>
<td><button class="affirm-donate" id="rechange">立即充值</button></td>
</tr>
</table>
</form>
 

fund.js

$('#rechange').click(function(e) {
//$this = $("#deposit");
e.preventDefault();
var postData = $.toJSON(form2js('deposit', '.', true));
console.log(postData);
$.ajax({
url : $CONFIG.base_url+ "/api/fund_detail/web/deposit",
type : "POST",
data : postData,
contentType : "application/json",
success : function(data) { data.total_fee = data.total_fee/100;//测试成功后请删除
console.log(data);
console.log(data.sHtmlText);
$("#deposit").append(data.sHtmlText);//后台会返回一个新的交易表单,并自动提交。所以随便放一个地方就OK
},
error : function() {
}
});
});
 

下面就是后台代码:

AlipayController.java(里面的User FundDetail都是我自己定义的实体类,与支付本身没有关系)部分配置在AlipayConfig中,

@RequestMapping(value = "/web/deposit", method = RequestMethod.POST)
public ResponseEntity<HttpEntity> deposit(@RequestBody FundDetail newfundDetail,Model model) {
Date date = new Date();
User user = new User();
FundDetail fundDetail = new FundDetail();
Map<String, String> sParaTemp = new HashMap<String, String>();
// 支付类型
// 必填,不能修改
String payment_type = "1";
// 服务器异步通知页面路径
// 需http://格式的完整路径,不能加?id=123这类自定义参数
String notify_url = "http://jishanjia.lanbaoo.com/api/alipay/async";
// 页面跳转同步通知页面路径
// 需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/
String return_url = "http://jishanjia.lanbaoo.com/alipay/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 = ""; user = userService.getUser(newfundDetail.getUser().getId());
fundDetail.setUser(user);
fundDetail.setActionType(3);
fundDetail.setTradeNo(date.getTime()+user.getId().toString());
fundDetail.setAmount(newfundDetail.getAmount());
fundDetailService.addFundDetail(fundDetail); Double total_fee = (double) (fundDetail.getAmount()/100d);//测试结束后删除
sParaTemp.put("total_fee", total_fee.toString());
sParaTemp.put("service", "create_direct_pay_by_user");
sParaTemp.put("partner", AlipayConfig.partner);
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_id", AlipayConfig.seller_id);
sParaTemp.put("out_trade_no", date.getTime()+user.getId().toString());
sParaTemp.put("subject", subject);
sParaTemp.put("anti_phishing_key", anti_phishing_key);
sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
sParaTemp.put("key", AlipayConfig.key); String sHtmlText = AlipaySubmit.buildRequest(sParaTemp,"get","确认"); model.addAttribute("sHtmlText", sHtmlText);
model.addAttribute("fundDetail", fundDetail); return new ResponseEntity(model, HttpStatus.OK);
}
 

到此一次交易就成功了

异步通知和跳转:

AlipayNotifyController.java(对应上面的notify_url)

@RequestMapping(value = "/async",method = RequestMethod.GET)
@ResponseBody
public String async(HttpServletRequest request){
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
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")) {
FundDetail fundDetail = new FundDetail();
fundDetail = fundDetailService.getFundDetail(tradeNo);
fundDetail.setActionType(1);
fundDetailService.updateFundDetail(fundDetail);
User user = new User();
user = userService.getUser(fundDetail.getUser().getId());
user.setFund(user.getFund() + fundDetail.getAmount());
userService.updateUser(user);
System.out.println(">>>>>充值成功" + tradeNo);
}
return "success";
}else{//验证失败
return "fail";
}
}

return_url跟notify_url差不多。在return_url控制交易成功后的跳转页面就可以了.

至此,一次支付宝即时到账交易就完成了

实战 Spring MVC接入支付宝即时到账 (部分代码)的更多相关文章

  1. PHP 接入支付宝即时到账功能

    首先请到支付宝那边申请一个及时到账的接口账户,需要提交相关材料申请.然后根据即时到账的API文档进行接入.API文档提供了各种语言版本的demo,我这里是下的php版demo,然后再进行相关修改操作. ...

  2. 支付宝即时到账DEMO配置与使用

    支付宝网页即时到账功能,可让用户在线向开发者的支付宝账号支付资金,交易资金即时到账,帮助开发者快速回笼资金. 当用户进行支付操作时候可以直接跳转到支付宝支付页面进行支付 1. 准备 关于支付宝签约即时 ...

  3. PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)

    PHP九大接口视频教程(  支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程(  支付宝,QQ,短信接口 ...

  4. ***CodeIgniter框架集成支付宝即时到账支付SDK

    本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...

  5. PHP实现支付宝即时到账功能

    本文实例为大家分享了PHP支付宝即时到账功能的实现代码,供大家参考,具体内容如下 首先需要下载即时到账交易接口,传送门https://doc.open.alipay.com/doc2/detail?t ...

  6. *CodeIgniter框架集成支付宝即时到账SDK

    客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...

  7. ThinkPHP 3.2 支付宝即时到账接口开发

    前言: 一.支付流程 构造请求参数 向支付宝网关发送请求 生成支付宝页面 支付宝交易结果 二.构建支付类 1.官方即时到账文档地址: https://doc.open.alipay.com/doc2/ ...

  8. 支付宝即时到账接口开发 - DEMO讲解

    支付宝即时到帐接口 环境要求 PHP5.0以上,且需要开启curl.openssl. 文档地址: https://doc.open.alipay.com/doc2/detail?treeId=62&a ...

  9. thinkphp框架对接支付宝即时到账接口回调的代码

    关于支付宝即时收款接口的对接过程,很简单,也有很多人发过,我这里就不在啰嗦了,对接完成后,在线支付成功后的回调,相对来说,是个难点,,我重点分享下我的经验. 我在开发二代旅游CMS(http://ww ...

随机推荐

  1. 怎么判断PC端浏览器内核

    browser = {             /**              * @property {boolean} ie 检测当前浏览器是否为IE              */       ...

  2. C++中cin输入类型不匹配解决方法

    #include <iostream> #include <set> using namespace std; int main() { int a; cin>>a ...

  3. AfxOleInit()和::CoInitialize(NULL)区别

    From: http://blog.csdn.net/zhoubl668/archive/2009/04/30/4139933.aspx OLE是建立在COM之上的技术,层次比COM要高.AfxOle ...

  4. CentoS7装机

    按delete进入BIOS 选择UEFI 网上关于CentOS 7 的安装教程挺多的,但在前期的引导配置上很多都没有写清楚,让人很郁闷,以致于昨天安装的时候总是到不了安装界面.经过一番胡乱倒腾,终于找 ...

  5. jquery select三级联动

    需求:对地区进行选择,选择相应的省,就会出现相应范围的市,然后出现相应的范围的县区:如果县不存在,就不现实,自我要求是自己写个简单的插件,方便以后调用: 逻辑:1.通过div的类名来获取,其下的sel ...

  6. freemarker 的replace功能

    替换字符串 replace ${s?replace(‘ba’, ‘XY’ )} ${s?replace(‘ba’, ‘XY’ , ‘规则参数’)}将s里的所有的ba替换成xy 规则参数包含: i r ...

  7. ext4 grid edit 添加删除行

    extjs--grid动态添加一行和删除一行: (1)选择rowEditing时,添加一行后的编辑方式为----startEdit(record,columnHeader) (2)选择cellEdit ...

  8. java 编码转换

    在网络中爬取到的数据,编码可能与当前编译器的编码不相同,而导致可能产生显示乱码的问题.那么如何将网络的编码,转换为当前编译器认可的编码(一般为UTF-8),就是个问题了. 主要使用了两个方法: Str ...

  9. [C入门 - 游戏编程系列] 序言篇

    记得学习C语言的时候,看着别人能写各种各样的小游戏和小软件,甚是羡慕.而自己,虽然说语法都会,但是真正上手写个几百行的代码,就显得力不从心.曾经一度很是郁闷,看过一些书,大都处于教语法的层面,有些涉及 ...

  10. 转载 50种方法优化SQL Server数据库查询

    原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...