想熟悉支付宝接口支付,后面可能会用,不如在课设中试试手。好吧听说支付宝不微信支付要简单些,就拿支付宝的先练下手吧。

基本学习流程,百度一下,找篇博客看下。

推荐下面这个篇博客,讲的挺好的,复制过来。

当然在最后我会把我遇到的问题写出来,避免后人在走弯路,并将支付宝的demo整合到我的ssm项目中,同时,会详细讲下如何将demo中的jsp跟据需求改为contral层。

比较可以的操作流程:别人写的很好了,我就不想写了:https://github.com/OUYANGSIHAI/sihai-maven-ssm-alipay

一、支付宝测试环境代码测试

1.下载电脑网站的官方demo:

下载地址:https://docs.open.alipay.com/270/106291/

2.下载解压导入eclipse

readme.txt请好好看一下。

只有一个Java配置类,其余都是JSP。

3.配置AlipayConfig

(1).注册蚂蚁金服开发者账号(免费,不像苹果会收取费用)

注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研)。

(2).设置app_id和gatewayUrl

其中密钥需要自己生成,appID和支付宝网关是已经给好的,网关有dev字样,表明是用于开发测试。

(3).设置密钥

点击“生成方法”,打开界面如下:

下周密钥生成工具,解压打开后,选择2048位生成密钥:

如果没有设置过,此时显示文本是“设置应用公钥”,我这里是已经设置过得。

设置方法,“打开密钥文件路径”:

复制应用公钥2048.txt中的内容到点击“设置应用公钥”的弹出框中,保存:

  • 商户私钥(merchant_private_key)

    复制 应用私钥2048.txt 中的内容到merchant_private_key中。

  • 支付宝公钥(alipay_public_key)

点击如上图链接,复制弹出框里面的内容到alipay_public_key。

如果这个设置不对,结果是:支付成功,但是验签失败。

如果是正式环境,需要上传到对应的应用中:

(4).服务器异步通知页面路径(notify_url)

如果没有改名,修改IP和端口号就可以了,我自己的如下:

http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp

(5).页面跳转同步通知页面路径(return_url)

http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp

4.测试运行

测试用的支付宝买家账户可以在“沙箱账号”这个页面可以找到:

支付成功后,验签结果:

好吧,要是你成功跑起来的那么你很幸运,没有到什么坑,我遇到了如下坑点。记录一下,以供参考:

1.代码中:

要填写公钥,注意这个不是生成器中的公钥,所以不能从那个里面或者从txt中粘贴,而要重网站上那个查看公钥处粘贴:

2. 支付宝网关要改,注意测试环境中是alipaydev:

3. 从官网下载的沙箱版支付宝怎么登入:

登入的账号去沙箱账号中看,注意不是你的支付宝账号,也不需要重新注册!!!!

注意打支付宝很人性话的给了我们许多钱,可以肆意的花费了,最后会从你的买家余额到买家余额中。

好的,基本注意这些,demo是可以跑起来的了。

下面讲下如何加入到ssm框架中,随意控制呢:

你得先对支付宝的流程有一个大致的了解,整体上了有把握,能使你思路清晰,请看图:

这是支付宝提供的图片,大致过程都表达出来了。

其实到这里不禁要问,那个同步和异步是干嘛的呀,我也不知道,百度啊!!!

我找到了,比较新的解释:

      支付宝同步回调和异步回调
当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。
很多新手会拿这个结果 当作支付成功了,那就会被坑死,结果就是支付成功率特别高,伴随着一堆无法解释的坏账率,测试人员尤其要注意测试数据的篡改:金额,同步返回结果,订单号等。

同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用。
一般同步接口仅检查参数是否正确,签名是否无误等。异步接口才告诉你扣款结果。
一般异步接口有5秒以内的延迟。调用不成功会重试。有时候是这边成功了,但支付渠道侧没收到返回,于是会继续调。
当天的支付到第二天还在 被异步调用也都是正常的。这也是开发人员需要特别注意的地方,不要当做重复支付。
测试人员也要对重复回调进行测试,应只有一次有效。这还不是最坑的,一般 支付渠道侧,只有支付成功了才通知你。
要是支付失败了,压根儿都不告诉你。
另一方面,如何老收不到异步结果呢?那就得查查了。同步结果不可靠,异步调用不可靠,那怎么确定支付结果?最终的杀招就是查单了,
反查,一般支付渠道侧都 会提供反查接口,定时获取DB中待支付的订单调用支付渠道侧的反查接口,最终把支付渠道侧扣款成功的订单完成掉。

当然,这个没有将过多细节,更多内容可以参考其他的文档,大致就是说,同步通知可以作为支付成功参考,但是准确得出结论还得靠异步的回复

好吧,由于异步必须在服务器上才能测试,所以这里我暂时是以同步的作为判断依据:

开始整合:

思路大致是这样子:

在一个支付页面   --》》》  点击支付  ----》》》 跳转到处理函数   -----》  在这个函数里面设置你真正要想支付宝请求的一些参数,以及同步异步回调地址!!! ----》  然后他在封装好信息后发送给支付宝

------》》》 页面会弹出一个支付宝二维码,你扫码付钱完  -------》》》 支付宝会向你给的同步异步回调地址发送请求(也就是你要写个接收请求的函数咯,在里面可以写一些你要的逻辑了) ------》》》

根据回调结果,挑战页面给出回调结果  ------ 》》》 finish ! ! !!!!

具体的:

1. 支付请求给个post的地址:也就是你处理支付的函数:

2.在contral里面写对应 的处理函数里咯:

函数里面其实就是把支付宝demo的jsp处理粘过来了:

@ResponseBody@RequestMapping(value = "/goods/alipay2")public String alipay(HttpServletRequest request) throws AlipayApiException, IOException {System.out.println("-------------------/goods/alipay2-----------------------");//获得初始化的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 = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");//付款金额,必填String total_amount = new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");//订单名称,必填String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");//商品描述,可空String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"total_amount\":\""+ total_amount +"\"," + "\"subject\":\""+ subject +"\"," + "\"body\":\""+ body +"\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," //       + "\"total_amount\":\""+ total_amount +"\"," //      + "\"subject\":\""+ subject +"\"," //        + "\"body\":\""+ body +"\"," //      + "\"timeout_express\":\"10m\"," //      + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节//请求String result = alipayClient.pageExecute(alipayRequest).getBody();//输出System.out.print("trade.page:----" + result);return result;}

  

2.处理回调地址:

就是一个请求的处理函数,不清楚他们为什么要在请求后面加一个.action, 反正我没加。。。

3.写处理函数咯:也是把支付宝的jsp中对应的一个粘过来,

/* ** 功能:支付宝服务器同步通知页面* 日期:2017-03-30* 说明:* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*************************页面功能说明************************** 该页面仅做页面展示,业务逻辑处理请勿在该页面执行*/@RequestMapping(value = "/goods/alipayReturnNotice")public ModelAndView alipayReturnNotice(HttpServletRequest request,HttpServletRequest response) throws Exception { System.out.println("-------------------alipayReturnNotice--------------------------");//获取支付宝GET过来反馈信息//获取支付宝GET过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> 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);}boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名ModelAndView mv = new ModelAndView("/goods/alipaySuccess");//——请在这里编写您的程序(以下代码仅作参考)——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");mv.addObject("out_trade_no", out_trade_no);mv.addObject("trade_no", trade_no);mv.addObject("total_amount", total_amount);mv.addObject("productName", "name");System.out.println("验签成功");System.out.println("trade_no:"+trade_no+"  out_trade_no:"+out_trade_no+"  total_amount:"+total_amount);//         out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);}else {//          out.println("验签失败");System.out.println("验签失败");}//——请在这里编写您的程序(以上代码仅作参考)——return mv;}

  

4.

/**** @Title: AlipayController.java* @Package com.sihai.controller* @Description: 支付宝异步 通知页面* Copyright: Copyright (c) 2017* Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY** @author sihai* @date 2017年8月23日 下午8:51:13* @version V1.0*/@RequestMapping(value = "/goods/alipayNotifyNotice")@ResponseBodypublic String alipayNotifyNotice(HttpServletRequest request,HttpServletRequest response) throws Exception {/*************************页面功能说明************************** 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。* 如果没有收到该页面返回的 success * 建议该页面只做支付成功的业务逻辑处理,退款的处理请以调用退款查询接口的结果为准。*/System.out.println("-----------------alipayNotifyNotice--------------------------");//获取支付宝POST过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> 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);}boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名//——请在这里编写您的程序(以下代码仅作参考)——/* 实际验证过程建议商户务必添加以下校验:1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/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 trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");if(trade_status.equals("TRADE_FINISHED")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知}else if (trade_status.equals("TRADE_SUCCESS")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知}System.out.println("success");}else {//验证失败System.out.println("fail");//调试用,写文本函数记录程序运行情况是否正常//String sWord = AlipaySignature.getSignCheckContentV1(params);//AlipayConfig.logResult(sWord);}//——请在这里编写您的程序(以上代码仅作参考)——return "success";}

  

5.可以了给测试的jsp,和从成功的jsp吧:

alipay.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name=alipayment action= "${pwd }/goods/alipay2"  method=posttarget="_blank"><div id="body1" class="show" name="divcontent"><dl class="content"><dt>商户订单号 :</dt><dd><input id="WIDout_trade_no" name="WIDout_trade_no" /></dd><hr class="one_line"><dt>订单名称 :</dt><dd><input id="WIDsubject" name="WIDsubject" /></dd><hr class="one_line"><dt>付款金额 :</dt><dd><input id="WIDtotal_amount" name="WIDtotal_amount" /></dd><hr class="one_line"><dt>商品描述:</dt><dd><input id="WIDbody" name="WIDbody" /></dd><hr class="one_line"><dt></dt><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit"style="text-align: center;">付 款</button></span> <span class="note-help">如果您点击“付款”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form>
</body>
</html>

  

alipaySuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>  <html><head><title>支付成功!</title></head><body><h1 style="color: green;">购买成功</h1><table><tr><td>订单编号: ${out_trade_no }</td></tr><td>支付宝交易号: ${trade_no }</td><tr></tr><td>实付金额: ${total_amount }</td><tr></tr><td>购买产品:${productName }</td></tr></table> </body></html>

 

当然你可以你要写一个跳转,到达支付页面:

好了可以吧:看下框图吧:

好,感觉已经将清楚了,注意复制jsp页面时看清楚导入的包,不出意外,可以成功的。

25-javaweb接入支付宝支付接口相关推荐

  1. tp5.1接入支付宝支付接口

    第一步,下载dome 一些基础的东西就不多叙述了,比如申请开发者账号,然后密钥,公钥什么的,官方有说明,这边教程主要是干货. 下载完dome后,将它重命名为alipay,放在tp的vendor目录下, ...

  2. PHP 支付PC端扫码支付、APP接口调起支付宝支付、微信公众号接入支付宝支付

    第一:第三方支付原理 第二:支付接口申请流程 地址:https://docs.open.alipay.com/270/105899/ : 参考地址:https://blog.csdn.net/nove ...

  3. 2021-02-11-JavaWeb网站接入支付宝支付

    JavaWeb网站接入支付宝支付 前言 前序步骤 接入 pom.xml 在沙箱环境获取测试账号,以及付钱的账号 公钥私钥的生成可以下面这个工具 Controller层 模拟付款 前言 今天给大家分享一 ...

  4. java 调用支付宝支付接口

    最近公司在做支付模块,在接入过程中遇到了很多坑,费了不少事,现在分享一下接入方法,也记录一下,以后可能还用的到.用的是支付宝的即时到帐支付功能和微信的扫码支付功能,相比起来,个人感觉支付宝的文档和接入 ...

  5. Android 接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  6. Android接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  7. 腾腾流氓,云云更流氓(问微信怎样接入支付宝支付),手贱的赶紧点,你会感谢我的...

    草原上的两匹马! 打从当年微信开始布局公众号之初时,估计就已经想到了与支付宝正面冲突的场面,所以微信先来个瞒天过海,在春晚搞了个微信红包,那叫一个火呀,此时的云云隐隐感觉到些许不安. 早期的微信开发者 ...

  8. 后端---最全最简单细致的Java接入微信支付接口(Native接入)

    首先,我简单总结一下这几天搞微信支付和支付宝支付接口的体会,通过这几天的动手实操,加强了自己对SSM框架的认识,以及对业务逻辑的思路,明白了许多以前不懂的许多空白. 做支付宝接口的接入完全可以按照支付 ...

  9. java后台实现支付宝支付接口、支付宝订单查询接口 前端为APP

    最近项目APP需要接入微信.支付宝支付功能,在分配开发任务时,听说微信支付接口比支付宝支付接口要难实现,由于我开发经验不是那么丰富(现工作经验1年半)且未接触过支付接口开发,组里刚好又有支付接口的老司 ...

最新文章

  1. SharePoint 检测页面编辑模式
  2. IoC~MVC3+EF+Autofac实现松耦合的系统架构 [转载]
  3. windows环境下redis.conf配置文件
  4. SAP Spartacus Sample Data Extension
  5. jsf集成spring_JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目
  6. linux 修改网卡报错xe,centos修改端口出现Failed to start OpenSSH server daemon 启动报错和-xe报错的解决方法...
  7. 清新BLOG-CMS博客主题源码
  8. 设计灵感|App中的页面空状态应该如何表现?
  9. python读取行、分割、存储_Pytables / Pandas:组合(读取?)按行分割的多个HDF5存储...
  10. php revel,试用revel-一个基于golang的web框架
  11. Mac控制中心使用方法
  12. java类库中的设计模式
  13. springboot 整合 谷歌 Captcha验证码
  14. DDA算法画直线+源代码
  15. 子组件无法更新父组件请求的数据
  16. 关于计算机信息管理专业教学改革的相关文章,计算机信息管理专业论文范文
  17. 个人信息提取(字符串)
  18. mysql查询地理位置_利用curl和ip138的数据库来查询IP地址地理位置
  19. 层板等分衣柜(C++)
  20. 杀猪盘、仙人跳…手法过于大开眼界!“反欺诈AI大赛来了

热门文章

  1. 一元二次方程求根计算机的代码,一元二次方程求根Java源程序代码.doc
  2. 人生就像四季,繁华过后终归平淡,不可能一直繁华似锦,不可能一路花香四溢。...
  3. java 微信 jar_weixin-java-tools
  4. java设置cpu亲和性_cpu亲和性绑定
  5. 网站统计中访客标识码有什么作用
  6. Dynamics CRM IFD部署之后遇到的登录问题
  7. python找不到指定模块sklearn怎么办_python中sklearn找不到指定模块怎么办
  8. 无人驾驶真体验!老百姓都能打得到的“共享无人车”来了
  9. 数据库事务Transaction)那点事
  10. Deep Knowledge Tracing