话不多说直接上代码,下面是蚂蚁金服开发测试的代码,注意需要自己通过支付宝去注册蚂蚁金服账号,让后会获得一个注册的应用APPID,

配置沙箱环境
一、如果你是一个新手小白想要在项目中接入支付宝接口,首先你要做的是,进入支付宝官网开放平台。点击“快速开发”下的“开发接入”,跳转到新页面后点击“开发服务”下的“沙箱”。

二、新页面就是支付宝配置沙箱环境的文档以及使用说明,这里告诉我们沙箱环境默认给了我们一个APPID,需要我们自己配置RSA2(SHA256)的应用公钥,需要先下载支付宝生成秘钥的工具,如果是RSA2签名格式的话,记住要生成2048位的!!不要被示例图给迷惑了,当初博主就是这里弄错了!生成之后,进入沙箱应用,上传刚刚生成的应用公钥,上传成功后会生成支付宝公钥,应用私钥以及支付宝公钥会在代码配置中用到。如需要更改秘钥,使用下载的工具重新生成再上传即可!上传应用公钥并获取支付宝公钥,沙箱环境与链接中的示例图略有不同!

导入支付宝电脑支付的demo
一、在沙箱应用的链接中,点击最下面的功能中的电脑网站支付,选择左侧SDK&DEMO的菜单项,下载Java版的demo。

二、解压刚刚下载的demo,导入到eclipse中,目录结构如下图

三、修改AlipayConfig.java文件,记住是商户私钥和支付宝公钥!不要写成应用公钥!应用私钥即商户私钥!

这里的notify_url和return_url改成自己项目要返回页面的地址,由于是沙箱环境,所以支付宝网关也有修改。return_url是指付款成功之后返回给用户查看的界面,如付款成功之后返回到商品详情或者网站首页等等。notify_url则是支付包与服务器交互的页面,用户看不到,支付成功以notify_url返回的参数或者查询订单返回的参数为准。电脑网站支付快速接入。

四、修改配置成功之后,运行项目。
页面如下:
1.

2.

3.使用沙箱应用下面的沙箱账号里的买家账号登录,付款!钱会直接打到卖家账户中!这里面的钱可以自己手动添加,很有满足感 !!!!瞬间变富婆啊!!如果想用二维码支付,则到沙箱应用中扫描二维码下载沙箱版的支付宝,再用沙箱的买家账号登录就可以付款了!目前支持安卓版。

4.由于博主并没有写页面,使用的是支付宝默认的,所以返回的是一串json数据。

5.沙箱调试常见的错误如下图,如果报的错误不在这里面,请自行百度!


到这里如果能够成功付款或者查询订单等等,就可以看出我们的配置是没有问题的!接下来就要与我们的Java web项目整合并且存订单数据到数据库中!

整合接口到Java web项目
一、博主的框架是公司同事搭的SSM框架,但是与我在网上看的也有点不太一样,不过没关系,整合起来就那么几个文件。首先把上面那个demo里的Alipayconfig.java放在项目中(目录随项目而定),然后导入alipay-sdk-javaXXX.jar、commons-logging-1.1.1.jar这两个jar包到WebContent\WEB-INF\lib中,(具体路径随项目不同而改变)。

二、写支付接口。这里面可以对自己项目中的订单表进行操作,先增加一条订单,但是状态为未付款。然后调用支付宝付款接口。


/*** 获取订单数据接口* @param request* @param response* @throws AlipayApiException * @throws IOException */@RequestMapping("viewOrder")public void viewOrder(HttpServletRequest req, Model mod, HttpServletResponse rep,@RequestParam(value = "goodId", required = true)Integer goodId) throws AlipayApiException, IOException{CommonResponse cr = new CommonResponse();   User cu = ViewSessionManager.getUserSession();if(cu == null){   //需要登录才能买东西cr.setMessage("未登录");cr.setData(null);cr.setCode(3109);}//系统下单OrderInfo  param = new OrderInfo();param.setGoodId(goodId);payService.alipayOrder(cu, param);   //生成订单信息,根据自己项目改动//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = param.getTradeCode();//付款金额,必填String total_amount = param.getMoney().toString();//订单名称,必填String subject = param.getSubject();//商品描述,可空String body = param.getRemark();alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String result = alipayClient.pageExecute(alipayRequest).getBody();rep.setContentType("text/html;charset=" + AlipayConfig.charset);rep.getWriter().write(result);//直接将完整的表单html输出到页面rep.getWriter().flush();rep.getWriter().close();}

三、写同步通知return_url接口。这里面可以更改订单状态,但是不以这个为准(若网速太卡或者用户付完款关掉页面,则不会跳到这个接口,所以订单状态可能就不会更改)

/*** 回调路径return_url* @param request* @param response* @throws AlipayApiException * @throws UnsupportedEncodingException */@RequestMapping("return_url.view")public String returnUrl(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, UnsupportedEncodingException{//获取支付宝POST过来反馈信息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] + ",";}//乱码解决,这段代码在出现乱码时使用。//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset,AlipayConfig.sign_type);if(signVerified) {//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");//付款金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");request.setAttribute("out_trade_no", out_trade_no);request.setAttribute("trade_no", trade_no);request.setAttribute("total_amount", total_amount);log.info("订单处理:系统订单号" + out_trade_no + "支付宝交易号:" + trade_no);//系统处理根据支付宝回调更改订单状态或者其他关联表的数据OrderInfo order = payService.findOneByTradeCode(out_trade_no);if(order == null){signVerified = false;request.setAttribute("signVerified", signVerified); request.setAttribute("reason", "商户订单号不存在");log.error("系统订单:"+ out_trade_no + "不存在。");}else{if(!order.getMoney().toString().equals(total_amount)){signVerified = false;request.setAttribute("signVerified", signVerified); request.setAttribute("reason", "付款金额不对");return "notify_url";}if(order.getTradeStatus() == 1){//判断当前订单是否已处理,避免重复处理log.info("系统订单:"+ out_trade_no + "无需重复处理。");}else{order.setTradeStatus(1);//修改订单状态为已支付Date payedAt = new Date();order.setTransactionId(trade_no);order.setPayedAt(payedAt);payService.payOrder(order);log.info("系统订单:"+ out_trade_no + "成功支付。");}}}else{request.setAttribute("reason", "验签失败");}request.setAttribute("signVerified", signVerified);return "return_url";}```四、异步通知notify_url接口,与上面return_url的几乎相同,只是最后输出:response.setContentType("text/html;charset=" + AlipayConfig.charset);response.getWriter().write("success");//直接将完整的表单html输出到页面response.getWriter().flush();response.getWriter().close();方法为void,还有一点需要注意的是:必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等
电脑网站支付结果异步通知
数据库中订单状态的更新以这个接口中的为准!五、查询订单接口。这里的返回类型CommonResponse 是我们公司自己的,你们改成自己的返回类型就好.我们这个是ajax调用接口,然后将orderString的数据返回,实际上是json数据。/*** 支付宝交易查询接口* @param request* @param response* @throws UnsupportedEncodingException * @throws AlipayApiException */@RequestMapping("queryOrder")@ResponseBodypublic CommonResponse queryOrder(HttpServletRequest req, Model mod, HttpServletResponse rep,@RequestParam(value = "tradeCode", required = true)String tradeCode,@RequestParam(value = "tradeNo", required = true)String tradeNo) throws UnsupportedEncodingException, AlipayApiException{CommonResponse cr = new CommonResponse();AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //获得初始化的AlipayClientAlipayTradeQueryRequest request = new AlipayTradeQueryRequest();//创建API对应的request类request.setBizContent("{" +"   \"out_trade_no\":\""+tradeCode+"\"," +"   \"trade_no\":\""+tradeNo+"\"" +"  }");//设置业务参数//根据response中的结果继续业务逻辑处理String orderString = null;  try {//调用查询方法AlipayTradeQueryResponse response = alipayClient.execute(request);//通过alipayClient调用API,获得对应的response类orderString = response.getBody();//就是orderString 可以直接给客户端请求,无需再做处理。} catch (AlipayApiException e) {e.printStackTrace();}cr.setData(orderString);    //返回orderStringreturn cr;}

服务器端添加APP支付接口
与电脑支付接口类似,可以直接使用同一个jar包,不过在付款接口的入参里需要添加token。下面是部分代码。我相信你们足够聪明能够改成自己的!

CommonResponse cr = new CommonResponse();   Cache<String, User> apiAccessTokenCache = cacheManager.getCache("apiAccessTokenCache");User cu = apiAccessTokenCache.get(token);//登录时候产生的token,通过token获得Userif(cu == null){cr.setMessage("token值不对或已失效");cr.setData(null);cr.setCode(3109);return cr;}//系统下单OrderInfo  param = new OrderInfo();param.setGoodId(goodId);payService.order(cu, param);   //生成订单信息//实例化客户端AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.payAlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();String time = Long.toString(System.currentTimeMillis()/1000);model.setBody(param.getRemark());model.setSubject(param.getSubject());model.setOutTradeNo(param.getTradeCode());model.setTimeoutExpress(time);model.setTotalAmount(param.getMoney()+"");model.setProductCode("QUICK_MSECURITY_PAY");request.setBizModel(model);request.setReturnUrl(AlipayConfig.return_url);request.setNotifyUrl(AlipayConfig.notify_url);String orderString = null;  try {//这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);orderString = response.getBody();//就是orderString 可以直接给客户端请求,无需再做处理。} catch (AlipayApiException e) {e.printStackTrace();}cr.setData(orderString);    //返回orderStringreturn cr;

转换成正式环境
需要修改配置文件中的APPID,支付宝公钥,应用私钥,以及支付宝网关!有时改了网关之后跳转的还是沙箱环境的网关,需要clean一下服务器(我的是Tomcat)

java集成(支付宝)蚂蚁金服相关推荐

  1. java内存shell_2019蚂蚁金服Java后端三面,详述程序员必须掌握的架构底层原理

    前面的话 告别了2018 ,也早已正式进入2019 面试一直都是大家关注的热门话题,俗话说"金三银四",如今已经是三月份了,如果你打算在年后跳槽,那么是时候该着手准备了 很多Jav ...

  2. 支付宝蚂蚁金服是怎么把前端性能监控做到极致的?

    本文来自蚂蚁金服前端技术专家杨森在 ArchSummit 北京 2018 的分享,他将分享如何通过 Performance 相关的 API 准确的采集用户性能数据,并如何通过大数据计算加工最终产出用户 ...

  3. 支付宝-蚂蚁金服一面

    2019.5.20中午 一通电话,小哥哥电话打来 记录下问题把 1自我介绍 2介绍下你的项目的闪光点把,我说了中心账户系统,他问我做这个的目的是为了什么? 其实做这个没什么目的,因为要对接ssp,ss ...

  4. 支付宝(蚂蚁金服开放平台)-支付结果异步通知-验签

    问题描述: 按文档https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.rIlDQO&treeId=204&ar ...

  5. 蚂蚁金服开源服务注册中心 SOFARegistry

    SOFAStack(Scalable Open Financial Architecture Stack )是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景 ...

  6. 大数据开发方向分享:春招获蚂蚁金服、拼多多、华为(终端)、远景能源、华泰证券等offer

    大数据开发方向分享:春招获蚂蚁金服.拼多多.华为(终端).远景能源.华泰证券等offe 一.背景 2020届985硕士,投的基本是上海岗位,非科班转行大数据开发方向和Java后端开发. 参加了2020 ...

  7. 蚂蚁金服服务注册中心数据一致性方案分析 | SOFARegistry 解析

    SOFAStack (Scalable Open Financial Architecture Stack) 是蚂蚁金服自主研发的金融级云原生架构,包含了构建金融级云原生架构所需的各个组件,是在金融场 ...

  8. 蚂蚁金服服务注册中心 SOFARegistry 解析

    SOFAStack (Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景 ...

  9. 蚂蚁金服服务注册中心 SOFARegistry 解析 | 服务发现优化之路

    SOFAStack Scalable Open Financial  Architecture Stack 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景 ...

  10. 从大专生到蚂蚁金服CTO,他写下“支付宝”第一行代码:逆风的方向,更适合飞翔!...

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨Mr.K   整理丨Emma 来源丨技术领导力 ...

最新文章

  1. Android Studio中新建和引用assets文件
  2. 【AWSL】之Linux管理(RPM)程序
  3. 百兆光纤收发器和千兆光纤收发器的区别
  4. windows 2008r2文件服务器部分用户访问不了_苹果设备如何访问 Windows 文件共享?...
  5. 今天,你用智能音箱了吗?
  6. C#设计模式(13)——代理模式(Proxy Pattern)
  7. Java集合(Collection)综述
  8. vue-countTo---简单好用的一个数字滚动插件
  9. 转:Python网页解析:BeautifulSoup vs lxml.html
  10. VIIRS-NPP夜间灯光遥感数据下载和预处理
  11. 多媒体处理常用软件:图像、文本、音频、视频、动画、微课
  12. 微信公众号数据2019_微信公众号精准数据对比 让公众号运营更顺利
  13. 学python要有多少英语词汇量_学习英语到底多少词汇量够用,1年能学习到1000的词汇量吗?...
  14. What’s difference between 1’s Complement and 2’s Complement?
  15. uni-app获取设备序列号SERIAL
  16. google、bing ,baidu 等搜索引擎 查询参数
  17. Power bi 4.3 子弹图
  18. win10 引导系统损坏 和 bios设置
  19. 社区发现算法python视频_社区发现FN算法Python实现
  20. 【R】随机模拟计算定积分

热门文章

  1. 使用 tftp 无法向服务器上传文件问题解决
  2. extjs4.0视频教程
  3. 计算机网络课设之TCP通讯录
  4. 计算机语言入门vfp,VFP基础教程第二章VFP语言基础3
  5. 科普:为什么DOTA2和LOL没有全图挂
  6. CAD常用字体库大全
  7. 【Unity3D面试题】Unity面试题
  8. 论文翻译 SLAM综述
  9. java 快逸报表_报表展现输出 | 快逸报表工具 java报表软件
  10. 学习c语言的编程游戏,扫雷游戏-C语言编程学习