首先,必须将支付宝提供的接口jar包引入到项目中,具体文件路径为:
支付宝设有模拟测试环境,开发者能够借助虚构的账户和密码进行功能测试,这一功能相较于微信来说有着显著优势。此外,支付宝的支付接口操作起来也要比微信便捷许多。这完全是个人主观感受,也希望有高手在点评微信支付接口时能给予指导。
支付宝支付前期配置
下面我们到支付宝的支付接口网站
登陆后点击首页可以看到如下
点击左面的加号看到弹出下面
观察可见,存在沙箱应用、沙箱账号以及沙箱工具。接下来的测试操作均将采用沙箱进行,只需点击加号,便可将其添加至个人工具库中。
点击沙箱应用后,需进入新页面进行申请,遵循页面提示逐步操作,完成具体步骤。沙箱应用申请页面填写完毕后,请准确填写所需信息。
只需填写那些必须阅读的部分,若要填写RSA2则无需再填写RSA。所需填写的信息需通过一款工具来完成,这款工具同样由支付宝提供,相关信息可在提供的链接中找到。
使用bat文件打开工具
按照图中的样式选中,然后点击生成密钥,密钥分成公钥和私钥。
此处公钥系于支付宝平台应用配置环节,而密钥则需在我方Java程序支付参数配置中加以设定,二者均需妥善保存。
上面生成的公钥我们复制下来
RSA2()密钥(推荐)
点击查看应用公钥,将用具生成的应用公钥粘贴进去
完成后,页面中的查看支付宝公钥也会自动生成,在后面会使用。
然后就配置完成了。现在我们在点击页面左侧菜单中的沙箱账号,
我们得到了一个商家账户和一个买家账户,接下来所有的交易活动都必须通过这两个账户进行。至此,网站上的相关设置已经全部完成。
java程序中进行开发
将jar包导入到项目中后,我们需要创建一个配置类
packagecom.yssoft公司旗下的fs.supervise.web.test模块; import此行代码表示,该类应被Spring框架识别为组件,并参与依赖注入管理。 import com.alipay.api.AlipayClient; importcom.alipay.api模块下的DefaultAlipayClient类; /** * 支付配置类 * @author cheny * */ @Component public class TestPayConfiguration { /** API调用客户端 */ private static AlipayClient alipayClient; public static AlipayClient success(){ //服务地址测试都使用这个不用改 String serverUrl=该网址为"https://openapi.alipaydev.com/gateway.do",是支付宝开发者平台提供的接口访问路径。; //appId需要申请,在我们上面中有说到申请应用, String appId="2016080700185726"; //企业的密钥 String privateKey="就是我们上面使用工具生成的密钥"; //数据传输方式 String format="json"; //编码形式 String charset="utf-8"; //支付宝公钥 String alipayPulicKey="配置完成公钥后生成的支付宝公钥"; //编码方式 String signType="RSA2"; //初始化方法 if(alipayClient==null){ alipayClient = new创建默认的支付宝客户端实例,指定服务器地址、应用ID、私钥、格式、字符集、支付宝公钥以及签名类型。 } return alipayClient; } }
配置类负责初始化支付宝接口。在支付操作前,我们需先通过调用该类中的相关方法获取一个对象,之后便可以利用这个对象与支付宝进行信息交互。
支付具体操作的流程如下
本类集涵盖了手机版HTML网站支付、电脑版HTML网站支付以及商家向消费者转账支付这三种支付方式,您可以通过调用相应的方法来执行支付操作。
package com.yssoft.fs.supervise.web.test; import java.io.IOException; import javax.annotation.Resource; importServlet异常; import导入 javax.servlet.http.HttpServletRequest 类,用于处理HTTP请求。 import导入 javax.servlet.http.HttpServletResponse 类; import使用Spring框架的@Controller注解标记,以表明该类为一个控制器。 import在Spring框架的web模块中,使用@RequestMapping注解来指定请求的映射路径。 importcom.alipay.api模块中抛出的异常类型; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; importcom.alipay.api.request类下的AlipayFundTransToaccountTransferRequest请求; importcom.alipay.api.request类中的AlipayTradePagePayRequest对象; importcom.alipay.api.request类下的AlipayTradeWapPayRequest对象。 importcom.alipay.api.response类中的AlipayFundTransToaccountTransferResponse对象。 /** * 支付处理控制器 * @author cheny * */ @Controller @RequestMapping("/pay") public class TestController { @Resource private创建一个名为testPayConfiguration的TestPayConfiguration对象; @RequestMapping("/test1") public String test1(){ return "test/testPay"; } /** * pc端付款 * @param httpRequest * @param httpResponse * @throws ServletException * @throws IOException * @throws AlipayApiException */ @RequestMapping("/testPay") public void pcPay对请求进行处理的http请求对象,以及用于响应请求的http响应对象。throws处理过程中出现了Servlet异常、输入输出异常以及支付宝API异常。 创建了一个名为AlipayTradePagePayRequest的支付宝页面支付请求对象,该对象用于处理支付宝页面支付的相关信息。new AlipayTradePagePayRequest();//创建API对应的request alipayRequest.setReturnUrl(此链接"http://chenyidong.tunnel.2bdata.com/return_url.jsp"为禁止修改的专用地址,请勿随意更改。);//成功后跳转的页面 alipayRequest.setNotifyUrl(此网址为"http://chenyidong.tunnel.2bdata.com/notify_url.jsp",系通知链接专用,请勿随意更改。);//在公共参数中设置回跳和通知地址 获取请求参数,确保交易编号字符串:String transactionID = httpRequest.getParameter("WIDout_trade_no"); 获取请求参数,将WIDsubject变量的值设置为httpRequest对象通过getParameter方法取得的值。"WIDsubject"); 获取到的字符串变量WIDbody,是通过调用httpRequest对象的getParameter方法,针对特定参数名称进行的查询结果。"WIDbody"); 获取的参数WIDtotal_amount值存储在字符串变量中,该值通过调用httpRequest对象的getParameter方法取得。"WIDtotal_amount"); //参数可以通过前台页面传递过来然后拼接到字符串中。 alipayRequest.setBizContent("{" + " \"out_trade_no\":\""+wiDout_trade_no+"\"," + " \"产品代码\":\"快速即时交易支付\"," + " \"total_amount\":"+WIDtotal_amount+"," + " \"subject\":\""+WIDsubject+"\"," + " \"body\":\""+WIDbody+"\"," + " \"超时限制\":\"90分钟\", " + " 允许使用的支付渠道包括:余额支付、信用支付、货币基金、信用支付分期付款以及银行支付," + " \"passback_params\": \"商家业务类型为3C,商家业务编号为2016010101111\"," + " \"extend_params\":{" + "该服务的提供商标识码为:2088102170303061" + " }"+ " }");//填充业务参数 String form=""; 获取的表单数据为:TestPayConfiguration成功实例化后,通过执行页面请求操作,进而获取到支付宝请求的响应体内容。//调用SDK生成表单 httpResponse.setContentType("text/html;charset=utf-8"); HTTP响应对象的输出流对象用于输出,随后打印出表单内容。//直接将完整的表单html输出到页面 } /** * 手机端支付 * @param httpRequest * @param httpResponse * @throws ServletException * @throws IOException */ @RequestMapping("/phonePay") public void phonePay(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws捕获Servlet异常,处理输入输出错误。 创建AlipayTradeWapPayRequest对象,命名为alipayRequest,用于发起支付宝手机网页支付请求。new AlipayTradeWapPayRequest();//创建API对应的request alipayRequest.setReturnUrl(请勿访问"http://domain.com/CallBack/return_url.jsp"这一网址。); alipayRequest.setNotifyUrl(该网址为"http://domain.com/CallBack/notify_url.jsp",是专门用于接收通知的页面地址。);//在公共参数中设置回跳和通知地址 String wiDout_trade_no=httpRequest.getParameter("WIDout_trade_no"); String WIDsubject=httpRequest.getParameter("WIDsubject"); String WIDbody=httpRequest.getParameter("WIDbody"); String WIDtotal_amount=httpRequest.getParameter("WIDtotal_amount"); alipayRequest.setBizContent("{" + " 订单编号:20150320010101002," + " \"总金额\":\"八十八点八八\"," + " \"主题\":\"iPhone 6 16GB\"," + "产品代码为:QUICK_WAP_PAY" + " }");//填充业务参数 alipayRequest.setBizContent("{" + " \"out_trade_no\":\""+wiDout_trade_no+"\"," + " \"产品代码\":\"QUICK_WAP_PAYMENT\"," + " \"total_amount\":"+WIDtotal_amount+"," + " \"subject\":\""+WIDsubject+"\"," + " \"body\":\""+WIDbody+"\"," + " \"timeout_express\":\"90m\"," + " \"extend_params\":{" + " \"sys_service_provider_id\":\"2088102170303061\"" + " }"+ " }");//填充业务参数 String form=""; try { TestPayConfiguration成功构建,执行页面操作后,获取到的内容被赋值给form变量。//调用SDK生成表单 } catch (AlipayApiException e) { e.printStackTrace(); } httpResponse.setContentType("text/html;charset=utf-8"); HTTP响应的输出流对象将表单内容输出打印。//直接将完整的表单html输出到页面 } /** * 将钱转入商家账户 * @throws AlipayApiException */ @RequestMapping("/querenshouhuo") public void querenshouhuo() throws AlipayApiException{ 创建了一个名为alipayClient的AlipayClient对象,该对象是通过调用TestPayConfiguration类的success方法成功生成的。 创建了一个名为AlipayFundTransToaccountTransferRequest的请求对象,该对象用于支付宝账户间转账的请求处理。new执行AlipayFundTransToaccountTransferRequest函数调用; request.setBizContent("{" + " \"外部业务编号\":\"31423214231\", " + " \"收款人类型\":\"支付宝登录账号\", " + "收款账户信息:shgtxv6441在sandbox.com的电子邮箱地址," +//收款方账号 " \"amount\":\"10000\"," + " \"payer_show_name\":\"收件人信息确认\"," + " \"收款人真实姓名\":\"沙箱测试环境\", " + //收款方账号名称 " \"remark\":\"转账备注\"," + " }"); alipayClient对request进行处理,生成了AlipayFundTransToaccountTransferResponse类型的response对象。 if(response.isSuccess()){ System.out.println("调用成功"); 输出响应体内容。 } else { System.out.println("调用失败"); } } }
到此支付宝的支付就完成了,如有哪里不好,希望还能大家能补足
demo地址