SpringBoot整合支付宝APP支付

 更新时间:2019年08月23日 08:30:38   作者:Snow、杨  
这篇文章主要为大家详细介绍了SpringBoot整合支付宝APP支付,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付,老习惯,功能做完之后做个复盘记录,这边主要讲解支付宝APP支付

所需条件

1、创建蚂蚁金服开放平台公司账号

2、选择开发中心---->移动应用

3、选择支付接入

4、创建应用

5、查看应用appId

6、添加功能

两个功能:支付宝授权功能和APP支付功能

7、功能签约

开发流程

引入支付宝支付SDK

<!-- 支付宝支付 SDK -->
<dependency>
 <groupId>com.alipay.sdk</groupId>
 <artifactId>alipay-sdk-java</artifactId>
 <version>3.7.4.ALL</version>
</dependency> 

1、支付宝参数配置类

/**
 * AlipayConfig.java
 * com.prereadweb.order.config
 * Copyright (c) 2019, 北京聚智未来科技有限公司版权所有.
 */
package com.prereadweb.order.config;
 
/**
 * @Description: 支付宝支付配置文件
 * @author: Administrator
 * @date: 2019/6/11 17:01
 */
public class AlipayConfig {
 
 // APPID
 public static String app_id = "你应用的APPID";
 
 // 生成公钥时对应的私钥(填自己的)
 public static String private_key = "你的秘钥";
 
 //异步回调接口:得放到服务器上,且使用域名解析 IP
 public static String notify_url = "回调函数接口";
 
 
 //支付宝网关(注意沙箱alipaydev,正式则为 alipay)不需要修改
 public static String url = "https://openapi.alipay.com/gateway.do";
 
 //编码类型
 public static String charset = "UTF-8";
 
 //数据类型
 public static String format = "json";
 
 // 公钥
 public static String public_key = "你的公钥";
 
 //签名类型
 public static String signtype = "RSA2";
 
}

2、下单接口

controller层

 /**
 * @Function: 去支付
 * @author: YangXueFeng
 * @Date: 2019/6/11 16:10
 */
 @RequestMapping("/gotopay")
 public Object goToPay(@Param("orderId") Long orderId){
 return alipayViewService.setGotoPayInfos(orderId);
 }

service层

/**
 * @Function: 去支付
 * @author: YangXueFeng
 * @Date: 2019/6/11 16:11
 */
 @Override
 public Map<String, Object> setGotoPayInfos(Long orderId) {
 Map<String, Object> map = new HashMap<>();
 if(Util.isEmpty(orderId)){
 map.put("code", UserStatusEnum.EMPTY.intKey());
 map.put("msg", UserStatusEnum.EMPTY.value());
 return map;
 }
 /* 查询订单信息 */
 PayParameterForm payParameter = orderMapper.getPayParameter(orderId);
 AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.url, AlipayConfig.app_id, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.public_key, AlipayConfig.signtype);//支付宝需要的参数serverUrl、appId、private_key、format、charset、public_key、signType
 AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
 model.setBody(payParameter.getTitle());//商品信息
 model.setSubject(payParameter.getTitle());//商品名称
 model.setOutTradeNo(String.valueOf(payParameter.getOrderId()));//订单号
 model.setTimeoutExpress("30m");//支付超时时间
/*
 model.setTotalAmount(String.valueOf(payParameter.getActualPrice()));// 支付金额
*/
 model.setTotalAmount(String.valueOf(0.01));// 支付金额
 request.setBizModel(model);
 // 回调地址(充值订单)
 request.setNotifyUrl(AlipayConfig.notify_url);// 回调地址
 //这里和普通的接口调用不同,使用的是sdkExecute
 AlipayTradeAppPayResponse response = null;
 try {
 response = alipayClient.sdkExecute(request);
 map.put("code", UserStatusEnum.SUCCESS.intKey());
 map.put("msg", UserStatusEnum.SUCCESS.value());
 Map<String, Object> dataMap = new HashMap<>();
 dataMap.put("payPath", response.getBody());
 map.put("data", dataMap);
 return map;
 } catch (AlipayApiException e) {
 e.printStackTrace();
 }
 map.put("code", UserStatusEnum.ERROR.intKey());
 map.put("msg", UserStatusEnum.ERROR.value());
 return map;
 }

3、回调接口

controller层

/**
 * @Function: 支付宝异步通知回调
 * @author: YangXueFeng
 * @Date: 2019/6/11 20:02
 */
 @ResponseBody
 @RequestMapping("/notify")
 public String notify(HttpServletRequest request, HttpServletResponse response) {
 return alipayViewService.notify(request, response);
 }

service层

/**
 * @Function: 支付宝异步回调接口
 * @author: YangXueFeng
 * @Date: 2019/6/11 20:03
 */
 @Override
 public String notify(HttpServletRequest request, HttpServletResponse response) {
 Map<String, String> params = new HashMap<String, String>();
 //从支付宝回调的request域中取值
 Map<String, String[]> requestParams = request.getParameterMap();
 
 for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
 String name = iter.next();
 String[] values = 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 out_trade_no = request.getParameter("out_trade_no"); // 商户订单号
 // 当前交易状态
 String tradeStatus = request.getParameter("trade_status"); //交易状态
 // 支付金额
 String totalAmount = request.getParameter("total_amount"); //交易状态
 // 支付时间
 String payDate = request.getParameter("gmt_payment"); //交易状态
 //3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
 boolean signVerified = false;
 try {
 //3.1调用SDK验证签名
 signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.public_key, AlipayConfig.charset, AlipayConfig.signtype);
 } catch (AlipayApiException e) {
 e.printStackTrace();
 }
 //返回状态存入redis中
 //对验签进行处理
 if (signVerified) {
 //验签通过
 if(tradeStatus.equals("TRADE_SUCCESS")) {
 //支付成功后的业务处理
 OrderEntity order = orderMapper.getOrderInfo(Long.valueOf(out_trade_no));
 if(!Util.isEmpty(order)){
  order.setStatus(CalculatStaticConstant.CHECK_ONE);
  order.setCompleteTime(DateUtil.currentDate());
  orderMapper.updateOrder(order);
 }
 /* 添加支付信息 */
 OrderPayEntity orderPay = new OrderPayEntity();
 orderPay.setId(Long.valueOf(IdUtils.getPrimaryKey()));
 orderPay.setOrderId(order.getId());
 orderPay.setUserId(order.getUserId());
 orderPay.setPayPrice(Double.valueOf(totalAmount));
 orderPay.setPayType(PayTypeEnum.ALI_PAY.intKey());
 orderPay.setStatus(CalculatStaticConstant.CHECK_ONE);
 orderPay.setPayTime(payDate);
 orderMapper.saveOrderPay(orderPay);
 RedisUtil.set("ali"+out_trade_no, tradeStatus,300);
 return "success";
 }
 } else { //验签不通过
 System.err.println("验签失败");
 return "failure";
 }
 return "failure";
 }

此处回调函数接口要有返回值,成功后返回success(success是小写,别大写),此处如果没有返回值的话,支付宝会一直进行回调通知

至此,支付宝APP支付OK

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 你肯定能看懂的Java IO相关知识总结

    你肯定能看懂的Java IO相关知识总结

    群里有大佬说想让我写一篇NIO,一直也没写,但是和同事聊天也说对Java的IO不是很清晰,因此今天就写下Java的io,先打个基础,下次写NIO,需要的朋友可以参考下
    2021-05-05
  • SpringDataJPA原生sql查询方式的封装操作

    SpringDataJPA原生sql查询方式的封装操作

    这篇文章主要介绍了SpringDataJPA原生sql查询方式的封装操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • String.replaceAll方法详析(正则妙用)

    String.replaceAll方法详析(正则妙用)

    这篇文章主要给大家介绍了关于String.replaceAll方法,正则妙用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • java算法之Math.random()随机概率玩法实例演示

    java算法之Math.random()随机概率玩法实例演示

    最近打算整理排序算法,发现很有必要准备一下生成随机数的工具类,下面这篇文章主要给大家介绍了关于java算法之Math.random()随机概率玩法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • java多线程Future和Callable类示例分享

    java多线程Future和Callable类示例分享

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callable的实现方法
    2016-01-01
  • Spring Cloud 中自定义外部化扩展机制原理及实战记录

    Spring Cloud 中自定义外部化扩展机制原理及实战记录

    这篇文章主要介绍了Spring Cloud 中自定义外部化扩展机制原理及实战,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Java中的ThreadLocalMap源码解读

    Java中的ThreadLocalMap源码解读

    这篇文章主要介绍了Java中的ThreadLocalMap源码解读,ThreadLocalMap是ThreadLocal的内部类,是一个key-value数据形式结构,也是ThreadLocal的核心,需要的朋友可以参考下
    2023-09-09
  • Java web访问http://localhost:8080/xx/xx.jsp报404错误问题的解决方法

    Java web访问http://localhost:8080/xx/xx.jsp报404错误问题的解决方法

    这篇文章主要给大家介绍了关于Java web访问http://localhost:8080/xx/xx.jsp报404错误问题的解决方法,很多小伙伴在刚开始用Springboot整合jsp开发时都会遇到这个问题, 按照别人的教程一步一步搭建,但就是会报404,文中介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 在Action中以Struts2的方式输出JSON数据的实例

    在Action中以Struts2的方式输出JSON数据的实例

    下面小编就为大家带来一篇在Action中以Struts2的方式输出JSON数据的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 深入理解Java 线程池

    深入理解Java 线程池

    这篇文章主要介绍了Java 线程池的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论