支付宝alipay移动支付
通过支付宝提供的API实现移动支付功能
一:下载相关的依赖和工具
蚂蚁金服 https://open.alipay.com/platform/home.htm
移动支付开发文档 https://docs.open.alipay.com/203/105285/
sdk-jar文件下载 https://docs.open.alipay.com/54/103419/
支付宝接口参数说明 https://docs.open.alipay.com/api_1/alipay.trade.wap.pay
在线支付实例下载 https://docs.open.alipay.com/54/106682/
生成支付宝公钥和私钥 https://gw.alipayobjects.com/os/rmsportal/PpisHyUkzJnZltrPyfuD.zip
二:搭建开发环境
(1):直接下载好sdk依赖包导入lib目录alipay-sdk-java-3.4.49.ALL.jar
(2):通过Maven依赖下载jar
- <dependency>
- <groupId>com.alipay.sdk</groupId>
- <artifactId>alipay-sdk-java</artifactId>
- <version>3.4.49.ALL</version>
- </dependency>
三:移动支付-全局配置类
- package com.svse.util;
- /**
- * 移动支付-全局配置类
- * @author lenovo
- *
- */
- public class AlipayConfig {
- // 商户appid
- public static final String APPID="";
- // 请求网关地址
- public static final String URL="https://openapi.alipay.com/gateway.do";
- // 返回格式
- public static final String FORMAT="json";
- // 编码
- public static final String CHARSET="UTF-8";
- // RSA2
- public static final String SIGNTYPE="RSA2";
- // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
- public static final String notify_url="http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/notify_url.jsp";
- // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
- public static final String return_url="http://商户网关地址/alipay.trade.wap.pay-JAVA-UTF-8/return_url.jsp";
- // 过RSA签名验签工具生成支付宝公钥
- public static final String ALIPAY_PUBLIC_KEY="";
- // 通过RSA签名验签工具生成,PKCS8格式私钥
- public static final String RSA_PRIVATE_KEY="";
- }
四:编写相关业务接口代码
1:支付宝在线支付接口
- @RequestMapping("payment")
- public void payment(HttpServletRequest request,HttpServletResponse response) throws IOException{
- if(request.getParameter("WIDout_trade_no")!=null||request.getParameter("WIDtrade_no")!=null){
- //商户订单号
- String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
- // 订单名称,必填
- String subject = new String(request.getParameter("WIDsubject").getBytes("ISO-8859-1"),"UTF-8");
- System.out.println(subject);
- // 付款金额,必填
- String total_amount=new String(request.getParameter("WIDtotal_amount").getBytes("ISO-8859-1"),"UTF-8");
- // 商品描述,可空
- String body = new String(request.getParameter("WIDbody").getBytes("ISO-8859-1"),"UTF-8");
- // 超时时间 可空
- String timeout_express="2m";
- // 销售产品码 必填
- String product_code="QUICK_WAP_WAY";
- /**********************/
- // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
- //调用RSA签名方式
- AlipayClient client =this.getAlipayClient();
- AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
- // 封装请求支付信息
- AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
- model.setOutTradeNo(out_trade_no);
- model.setSubject(subject);
- model.setTotalAmount(total_amount);
- model.setBody(body);
- model.setTimeoutExpress(timeout_express);
- model.setProductCode(product_code);
- alipay_request.setBizModel(model);
- // 设置异步通知地址
- alipay_request.setNotifyUrl(AlipayConfig.notify_url);
- // 设置同步地址
- alipay_request.setReturnUrl(AlipayConfig.return_url);
- // form表单生产
- String form = "";
- try {
- // 调用SDK生成表单
- form = client.pageExecute(alipay_request).getBody();
- response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
- response.getWriter().write(form);//直接将完整的表单html输出到页面
- response.getWriter().flush();
- response.getWriter().close();
- } catch (AlipayApiException e) {
- e.printStackTrace();
- }
- }else{
- System.out.println("订单出现问题,支付失败");
- }
- }
2:支付宝在线生成订单接口
- @RequestMapping("generateOrder")
- public void generateOrder(HttpServletRequest request11,HttpServletResponse response11) throws UnsupportedEncodingException{
- if(request11.getParameter("WIDout_trade_no")!=null||request11.getParameter("WIDtrade_no")!=null){
- //商户订单号
- String out_trade_no = new String(request11.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
- //实例化客户端
- AlipayClient client =this.getAlipayClient();
- //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
- AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
- //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
- AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
- model.setBody("我是测试数据");
- model.setSubject("App支付测试Java");
- model.setOutTradeNo(out_trade_no);
- model.setTimeoutExpress("30m");
- model.setTotalAmount("0.01");
- model.setProductCode("QUICK_MSECURITY_PAY");
- request.setBizModel(model);
- request.setNotifyUrl("商户外网可以访问的异步地址");
- try {
- //这里和普通的接口调用不同,使用的是sdkExecute
- AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
- System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
- } catch (AlipayApiException e) {
- e.printStackTrace();
- }
- }
- }
3:支付宝在线订单查询接口
- @RequestMapping("searchOrder")
- public void searchOrder(HttpServletRequest request,HttpServletResponse response){
- if(request.getParameter("WIDout_trade_no")!=null||request.getParameter("WIDtrade_no")!=null){
- try {
- //商户订单号,商户网站订单系统中唯一订单号,必填
- String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
- //支付宝交易号
- String trade_no = new String(request.getParameter("WIDtrade_no").getBytes("ISO-8859-1"),"UTF-8");
- /**********************/
- // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
- AlipayClient client =this.getAlipayClient();
- AlipayTradeQueryRequest alipay_request = new AlipayTradeQueryRequest();
- AlipayTradeQueryModel model=new AlipayTradeQueryModel();
- model.setOutTradeNo(out_trade_no);
- model.setTradeNo(trade_no);
- alipay_request.setBizModel(model);
- AlipayTradeQueryResponse alipay_response;
- try {
- alipay_response = client.execute(alipay_request);
- System.out.println(alipay_response.getBody());
- } catch (AlipayApiException e) {
- e.printStackTrace();
- }
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- }
4:支付宝在线订单退款接口
- @RequestMapping("orderRefund")
- public void orderRefund(HttpServletRequest request,HttpServletResponse response){
- if(request.getParameter("WIDout_trade_no")!=null||request.getParameter("WIDtrade_no")!=null){
- //商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
- //商户订单号,和支付宝交易号二选一
- String out_trade_no;
- try {
- out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
- //支付宝交易号,和商户订单号二选一
- String trade_no = new String(request.getParameter("WIDtrade_no").getBytes("ISO-8859-1"),"UTF-8");
- //退款金额,不能大于订单总金额
- String refund_amount=new String(request.getParameter("WIDrefund_amount").getBytes("ISO-8859-1"),"UTF-8");
- //退款的原因说明
- String refund_reason=new String(request.getParameter("WIDrefund_reason").getBytes("ISO-8859-1"),"UTF-8");
- //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
- String out_request_no=new String(request.getParameter("WIDout_request_no").getBytes("ISO-8859-1"),"UTF-8");
- /**********************/
- // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
- AlipayClient client =this.getAlipayClient();
- AlipayTradeRefundRequest alipay_request = new AlipayTradeRefundRequest();
- AlipayTradeRefundModel model=new AlipayTradeRefundModel();
- model.setOutTradeNo(out_trade_no);
- model.setTradeNo(trade_no);
- model.setRefundAmount(refund_amount);
- model.setRefundReason(refund_reason);
- model.setOutRequestNo(out_request_no);
- alipay_request.setBizModel(model);
- AlipayTradeRefundResponse alipay_response;
- try {
- alipay_response = client.execute(alipay_request);
- System.out.println(alipay_response.getBody());
- } catch (AlipayApiException e) {
- e.printStackTrace();
- }
- } catch (UnsupportedEncodingException e1) {
- e1.printStackTrace();
- }
- }
- }
5:订单退款查询接口
- @RequestMapping("searchOrderRefund")
- public void searchOrderRefund(HttpServletRequest request,HttpServletResponse response){
- if(request.getParameter("WIDout_trade_no")!=null||request.getParameter("WIDtrade_no")!=null && request.getParameter("WIDout_request_no")!=null){
- try {
- //商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
- //商户订单号,和支付宝交易号二选一
- String out_trade_no = new String(request.getParameter("WIDout_trade_no").getBytes("ISO-8859-1"),"UTF-8");
- //支付宝交易号,和商户订单号二选一
- String trade_no = new String(request.getParameter("WIDtrade_no").getBytes("ISO-8859-1"),"UTF-8");
- //请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号
- String out_request_no = new String(request.getParameter("WIDout_request_no").getBytes("ISO-8859-1"),"UTF-8");
- /**********************/
- // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
- AlipayClient client =this.getAlipayClient();
- AlipayTradeFastpayRefundQueryRequest alipay_request = new AlipayTradeFastpayRefundQueryRequest();
- AlipayTradeFastpayRefundQueryModel model=new AlipayTradeFastpayRefundQueryModel();
- model.setOutTradeNo(out_trade_no);
- model.setTradeNo(trade_no);
- model.setOutRequestNo(out_request_no);
- alipay_request.setBizModel(model);
- AlipayTradeFastpayRefundQueryResponse alipay_response=client.execute(alipay_request);
- System.out.println(alipay_response.getBody());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
6:账单下载接口
- @RequestMapping("downloadBill")
- public void downloadBill(HttpServletRequest request,HttpServletResponse response){
- if(request.getParameter("WIDbill_type")!=null&&request.getParameter("WIDbill_date")!=null){
- try {
- // 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;
- // trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单;
- String bill_type = new String(request.getParameter("WIDbill_type").getBytes("ISO-8859-1"),"UTF-8");
- // 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。
- String bill_date = new String(request.getParameter("WIDbill_date").getBytes("ISO-8859-1"),"UTF-8");
- /**********************/
- // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
- AlipayClient client =this.getAlipayClient();
- AlipayDataDataserviceBillDownloadurlQueryRequest alipay_request = new AlipayDataDataserviceBillDownloadurlQueryRequest();
- AlipayDataDataserviceBillDownloadurlQueryModel model =new AlipayDataDataserviceBillDownloadurlQueryModel();
- model.setBillType(bill_type);
- model.setBillDate(bill_date);
- alipay_request.setBizModel(model);
- AlipayDataDataserviceBillDownloadurlQueryResponse alipay_response = client.execute(alipay_request);
- System.out.println(alipay_response.getBillDownloadUrl());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
7:异步通知消息接口
- @RequestMapping("notifyUrl")
- @ResponseBody
- public String notify(HttpServletRequest request){
- int im=0;
- im++;
- //测试请求次数
- System.out.println("次数:"+im);
- //获取支付宝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);
- }
- //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
- //商户订单号
- String out_trade_no = request.getParameter("out_trade_no");
- //支付宝交易号
- String trade_no = request.getParameter("trade_no");
- //交易状态
- String trade_status = request.getParameter("trade_status");
- System.out.println(trade_status);
- try {
- boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, "utf-8", "RSA2");
- if(verify_result){
- //验证成功
- //请在这里加上商户的业务逻辑程序代码
- System.out.println("returnUrl_params:验证成功");
- //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
- boolean flag = false;
- if(trade_status.equals("TRADE_FINISHED")){
- System.out.println("returnUrl_params:交易结束");
- //交易结束,不可退款
- //注意:
- //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
- }else if (trade_status.equals("TRADE_SUCCESS")){
- //交易支付成功
- //注意:
- //付款完成后,支付宝系统发送该交易状态通知
- //根据订单号将订单状态和支付宝记录表中状态都改为已支付
- System.out.println("returnUrl_params:交易支付成功");
- flag = true;
- //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
- if(flag){
- return "success";
- }else{
- return "fail";
- }
- }
- }else{
- //验证失败
- System.out.println("交易失败");
- return "fail";
- }
- } catch (Exception e) {
- e.printStackTrace();
- return "500";
- }
- return null;
- }
8:同步通知消息接口
- @RequestMapping("/returnUrl")
- public ModelAndView result(HttpServletRequest request) {
- System.out.println("进来");
- //用ModelAndView 进行数据渲染
- ModelAndView mv = new ModelAndView("alipay/return_url");
- //获取支付宝GET过来反馈信息
- Map<String,String> params = new HashMap<String,String>();
- Map<String, String[]> requestParams = request.getParameterMap();
- for(String str:requestParams.keySet()){
- String[] values=requestParams.get(str);
- 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(str, valueStr);
- }
- //交易订单编号
- String out_trade_no = request.getParameter("out_trade_no");
- //交易金额
- String total_amount = request.getParameter("total_amount");
- //支付宝交易账号
- //String trade_no = request.getParameter("trade_no");
- //订单创建时间
- String timestamp = request.getParameter("timestamp");
- mv.addObject("out_trade_no", out_trade_no);
- mv.addObject("total_amount", total_amount);
- mv.addObject("timestamp", timestamp);
- //打印所有响应数据
- System.out.println("returnUrl_params:"+params);
- try {
- //切记AlipayConfig.ALIPAY_PUBLIC_KEY是支付宝的公钥,请去open.alipay.com对应应用下查看。
- boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, "utf-8", "RSA2");
- if(verify_result){
- //验证成功 这里写的是假代码
- //系统处理根据支付宝回调更改订单状态或者其他关联表的数据 (走业务流程, 根据订单编号获取订单数据
- //Order order =orderService.queryOrderByNumber(out_trade_no);
- /* if(order !=null){
- //order不为null
- mv.addObject("verify_result", verify_result);
- mv.addObject("msg", "商户订单号不存在");
- } */
- return mv;
- }else{
- //验证失败 跳失败页面
- System.out.println("验证失败");
- return null;
- }
- } catch (Exception e) {
- e.printStackTrace();
- //出现异常 跳失败页面
- return null;
- }
- }
支付宝alipay移动支付的更多相关文章
- laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)
首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Larave ...
- 自己动手搞定支付宝手机网站支付接口 FOR ECShop
支付宝WAP网站版本的支付接口网上整合的比较少,看到很多网站在卖,顿觉无语. 主要是得自己查看支付宝官方提供的SDK中的开发文档. 支付宝sdk下载地址:https://doc.open.alipay ...
- 支付宝手机网站支付流程(Node实现)
前言 公司M站要接入支付宝,借机研究了一下支付宝的支付流程.毕竟,只有公司才能拿到支付接口权限. 主要参考文档: https://doc.open.alipay.com/doc2/detail?tre ...
- 简聊iOS支付集成(支付宝和微信支付)
一.支付集成是什么 1.现在大部分app都有快捷支付功能,支付集成将第三方支付平台集成到自己的项目中,能够完成自己项目中的支付功能, 二.支付集成的使用 <1>.支付宝: 下载SDK和De ...
- 支付sdk —— 该组件为封装了 微信,支付宝,银联支付
[精品] 支付组件 简要说明该组件为封装了 微信,支付宝,银联支付, 一键快速集成,几行代码即可集成 微信,支付宝,银联支付. ## 示例: # 测试账号:1.银联支付:提供测试使用卡号.手机号信息 ...
- ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付接口及同步跳转及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET ...
- ***CodeIgniter框架集成支付宝即时到账支付SDK
本文为CI集成支付宝即时到账支付接口 1.下载支付宝官方demo ;即时到账交易接口(create_direct_pay_by_user)(DEMO下载) 原文地址:https://doc.open. ...
- 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
转自:http://www.cnblogs.com/essenroc/p/8627775.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付 ...
- php支付宝手机网页支付类实例
<?php $alipayConfig = array( 'key' => 'xxxxx', //买卖安全校验码,用于签名的32位密钥 'transport' => 'https', ...
随机推荐
- bigdata-01-应用
1, 基本概念 在互联网技术发展到现今阶段,大量日常.工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经无法胜任,需求催生技术,一套用来处理海量数 ...
- Java并发编程笔记之SimpleDateFormat源码分析
SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个 SimpleDateFormat 实例对日期进行 ...
- Jenkins入门之界面概览
安装完Jenkins后,打开浏览器,在浏览器地址栏内输入http://localhost:8080/ 便可以打开jenkins 基于web的管理界面(如果你在安装过程中修改了Jenkins默认端口,则 ...
- [Vijos 1676] 陶陶吃苹果
Description curimit知道陶陶很喜欢吃苹果.于是curimit准备在陶陶生日的时候送给他一棵苹果树. curimit准备了一棵这样的苹果树作为生日礼物:这棵苹果树有n个节点,每个节点上 ...
- 分布式版本控制系统GIT的使用
一.什么是Git Git是一个分布式版本控制系统,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异(如CVS.Subver ...
- MSSQL存储过程应用
1.原始表inoutinfo 2.现在想输入时间范围和操作类型输出对应的结果 2.1创建存储过程 create proc selecttype@type nvarchar(10),@starttime ...
- SQL SERVER 如何声明一个变量
DECLARE @i AS INT; ; GO 或者 ; GO 表表达式形式 ); SET @empname = (SELECT firstname + N' ' + lastname FROM HR ...
- 【RabbitMQ】5、RabbitMQ任务分发机制
当有Consumer需要大量的运算时,RabbitMQ Server需要一定的分发机制来balance每个Consumer的load.接下来我们分布讲解. 应用场景就是RabbitMQ Server会 ...
- 【Spring】20、使用TransactionSynchronizationManager在spring事务提交之后进行一些操作。
本文内容 如何在spring事务提交之后进行一些操作,这些操作必须得在该事务成功提交后才执行,回滚则不执行. 要点 如何在spring事务提交之后操作 如何在spring事务回滚之后操作 实现方案 使 ...
- Excel与minitab的不同
minitab是专业数据分析软件,可以直接通过导入数据源出结果,出图表, EXCEL的长处就是单元格可编辑,可视化强,也能做较多的分析,导入一些加载宏后功能更强大,但就分析能力而言,还 是比minit ...