Springboot整合支付宝支付功能

1.需要的Maven依赖

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

2.controller层

/**
 * 统一下单接口
 * @param orderNo 订单号
 * @param request
 * @return
 */
@PostMapping("/unifiedOrder")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public ResultMap unifiedOrder(@RequestParam("orderNo") String orderNo,@RequestParam("payType") Integer payType,
                              HttpServletRequest request){
    try {
        // 1、验证订单是否存在
        // 2、开始微信支付统一下单
        Orders orders = ordersService.FindOrder(orderNo);
        ResultMap resultMap =null;
        if(orders!=null){
           if(payType==1){
               String spbill_create_ip = getIpAddr(request);
               resultMap = wxPayService.unifiedOrder(orders.getOrderNo(),orders.getTotalPrice(),"云App",spbill_create_ip);
               Hotel hotel= hotelMapper.selHotelById(orders.getHId());
               Note note=new Note();
               String s=note.Notefs(hotel.getPhone(),1);
               ordersService.updataorderpaytype(orders.getOrderNo(),payType);
           return resultMap;
           }else if(payType==2){
                // 2、创建支付宝订单
                String orderStr = alipayService.createOrder(orders.getOrderNo(), orders.getTotalPrice(),"App");
               ordersService.updataorderpaytype(orders.getOrderNo(),payType);
                return ResultMap.ok().put("data",orderStr);
           }
        }
      return resultMap;//系统通用的返回结果集
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println(e.getMessage());
        return ResultMap.error("服务器异常,付款失败");
    }

}

//这是支付宝异步回调函数
/**
 * 支付异步通知
 * 接收到异步通知并验签通过后,一定要检查通知内容,
 * 包括通知中的app_id、out_trade_no、total_amount是否与请求中的一致,并根据trade_status进行后续业务处理。
 * https://docs.open.alipay.com/194/103296
 */
@PostMapping("/notify")
@CrossOrigin(origins = "*",maxAge = 3600)//跨域
public String notify(HttpServletRequest request, HttpSession session) {
  // 调用service层rsaCheckV1验证签名
    boolean flag = alipayService.rsaCheckV1(request);
    if (flag) {
         String tradeStatus = request.getParameter("trade_status"); // 交易状态
        String outTradeNo = request.getParameter("out_trade_no"); // 商户订单号
        String tradeNo = request.getParameter("trade_no"); // 支付宝订单号
        /**
         * 还可以从request中获取更多有用的参数,自己尝试
         */
         //调用service层notify函数
        boolean notify = alipayService.notify(tradeStatus, outTradeNo, tradeNo);
        if(notify){
            return "success";
        }
    }
    return "fail";
}

3.service层

private String publicKey="公钥";
    @Override
    public String createOrder(String orderNo, double amount, String body) throws AlipayApiException {
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
    //构造client
        //构造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
    //设置网关地址https://openapi.alipay.com/gateway.do
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
        certAlipayRequest.setAppId("appid");
//设置应用私钥
        certAlipayRequest.setPrivateKey("应用私钥");
        certAlipayRequest.setFormat("json");
//设置字符集
        certAlipayRequest.setCharset("UTF-8");
//设置签名类型
        certAlipayRequest.setSignType("RSA2");
//设置应用公钥证书路径
        certAlipayRequest.setCertPath("证书验证的应用公钥证书路径");
//设置支付宝公钥证书路径
        certAlipayRequest.setAlipayPublicCertPath("证书验证的支付宝公钥证书路径");
//设置支付宝根证书路径
        certAlipayRequest.setRootCertPath("证书验证的支付宝根证书路径");
//构造client
        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setSubject(body);
        model.setOutTradeNo(orderNo);
        model.setTotalAmount(String.valueOf(amount));
        model.setTimeoutExpress("30m");
        /*model.setTotalAmount("0.01");*/
        model.setProductCode("QUICK_MSECURITY_PAY");
       /* model.setPassbackParams("公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数");*/
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
        ali_request.setBizModel(model);
        ali_request.setNotifyUrl("回调地址");// 回调地址
        AlipayTradeAppPayResponse ali_response = alipayClient.sdkExecute(ali_request);
        //就是orderString 可以直接给客户端请求,无需再做处理。
        return ali_response.getBody();
    }
//支付宝签名验证
    @Override
    public boolean rsaCheckV1(HttpServletRequest request){
        try {
            //获取支付宝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.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
            boolean flag = AlipaySignature.rsaCertCheckV1(params, publicKey, alipayConfig.getCharset(),"RSA2");
         /* 千万不要调用错了!!!上面的才是证书验证调用的函数这个是普通验证调用函数  boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, alipayConfig.getCharset(), alipayConfig.getSignType());*/
            System.out.println("flag-----------"+flag);
            return flag;
        }catch (AlipayApiException e) {
            logger.debug("verify sigin error, exception is:{}",e);
            return false;
        }
    }
//notify()支付成功或者失败后一系列操作
@Override
public boolean notify(String tradeStatus, String orderNo, String tradeNo) {
    if ("TRADE_FINISHED".equals(tradeStatus)
            || "TRADE_SUCCESS".equals(tradeStatus)) {
        Orders orders =ordersMapper.FindOrder(orderNo);
        // 支付成功,根据业务逻辑修改相应数据的状态
        int state =ordersMapper.updateOrder(DateUtil.now(),orderNo);
       Hotel hotel= hotelMapper.selHotelById(orders.getHId());
        Note note=new Note();
        String s=note.Notefs(hotel.getPhone(),1);
        // boolean state = orderPaymentService.updatePaymentState(orderNo, tradeNo);
        if (state!=0) {
            return true;
        }else {
         UMember m= memberMapper.selMemByOrderNo(orderNo);
         Boolean b= userMapper.updateVip(m.getOpenId(),2);
        }
    }
    //支付失败查询订单详情得到用户id
    Orders orders=ordersMapper.FindOrder(orderNo);
    //将扣除的积分返还
    if(orderNo!=null){
        //添加用户积分
        ordersMapper.RefundIntegral(orders.getOpenId(),orders.getIntegral());
        /*//添加退回积分记录
        ordersMapper.insIntegralRecord(orders.getOpenId(),orders.getIntegral(),1,2);*/
    }
    return false;
}

哈哈,以上仅为基础版证书验证支付宝支付的源码,有很大的优化空间,需要小伙伴自己去优化了!

到此这篇关于Springboot整合支付宝支付功能的文章就介绍到这了,更多相关Springboot支付宝支付内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot整合支付宝APP支付

    前言 现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付,老习惯,功能做完之后做个复盘记录,这边主要讲解支付宝APP支付 所需条件 1.创建蚂蚁金服开放平台公司账号 2.选择开发中心---->移动应用 3.选择支付接入 4.创建应用 5.查看应用appId 6.添加功能 两个功能:支付宝授权功能和APP支付功能 7.功能签约 开发流程 引入支付宝支付SDK <!-- 支付宝支付 SDK --> <dependency&g

  • springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)

    1. 什么是支付宝接口(沙箱环境)? 记录时间:2020年10月15日3:55 现如今,手机支付已相当普遍,而作为开发人员应该对手机支付操作有所了解.而支付宝接口是支付宝提供的一个接口,用来对接软件应用程序在进行金钱交易使用.然后对于编程爱好者而言,想学习这一点就有点难,因为要想使用支付宝接口,必须前提是使用软件应用程序,软件应用程序需要向支付宝申请,提交一系列资料,这一点是实现不了的.这就对开发者增加了一定的难度,因为产品没有上线,然后需要对接支付宝接口就是很大的问题,所以出现了沙箱环境,具有

  • SpringBoot实现简易支付宝网页支付功能

    该文章描述了一个基于SpringBoot程序的支付宝支付demo,由于是个人开发者而非企业,因此设计到的技术较为简单,功能也有局限,适合初学者入门学习[我自己就是哈哈哈] 准备工作 流程简介 该图截取于支付宝开放平台官网,描述了消费者和商户[开发者]服务器和支付宝服务间的请求流程,可以看到用户是通过商户的服务器进行发送支付请求,再由消费者输入相关用户登录信息和支付信息[该流程商户服务器无法干预和监听],用户和支付宝方的结果会由支付宝服务器通知回商户服务器,商户服务器可以编写对应的逻辑去处理. 获

  • Springboot集成第三方jar快速实现微信、支付宝等支付场景

    前言 最近有个小型的活动外包项目,要集成一下支付功能,因为项目较小,按照微信官方文档的配置开发又极容易出错,加上个人又比较懒. 于是在gitee上找到一个封装好的各种支付场景业务,只需要自己将支付参数修改一下就能成功调起支付业务,实现真正的快速开发. 一.项目地址 官方网站:https://javen205.gitee.io/ijpay/ Gitee仓库: https://gitee.com/javen205/IJPay 官方示例程序源码:https://gitee.com/javen205/I

  • Vue+SpringBoot实现支付宝沙箱支付的示例代码

    首先去下载支付宝沙箱的一系列东西,具体的配置什么的我就不说了,有很多博客都讲了,还有蚂蚁金服官方也说的很详细,我就直接说怎么样把后端的支付页面显示到Vue前端来: 在你配置好AlipayConfig这个文件后,就可以写前端的逻辑了,前端是采用支付宝的页面如下: 下面展示一些 内联代码片. /* 以下是支付确认html */ <div style="text=#000000 bgColor=#ffffff leftMargin=0 topMargin=4"> <head

  • Springboot整合支付宝支付功能

    1.需要的Maven依赖 // 支付宝 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.8.73.ALL</version> </dependency> 2.controller层 /** * 统一下单接口 * @param orderNo 订单号 * @para

  • ThinkPHP框架下整合支付宝支付功能图文教程

    本文实例讲述了ThinkPHP框架下整合支付宝支付功能.分享给大家供大家参考,具体如下: 背景 近期项目需要接入支付宝支付功能,其中开发使用了ThinkPHP3.2.3框架,通过参考开发平台文档可以知道,网站开发有两种场景,一种是手机网站支付,直接唤醒支付宝app进入支付操作:另一种多是 PC 端显示支付二维码的形式,然后使用手机的支付宝app扫描. 此处主要介绍手机网站支付的实现,后期补充扫码支付. 一.接入配置 1).接入步骤 根据"快速接入"中的流程,两者大同小异,都是进行: 第

  • UniApp + SpringBoot 实现支付宝支付和退款功能

    目录 开发准备 支付宝支付开发 后端部分 前端部分 支付宝退款开发 后端部分 上篇介绍了UniApp + SpringBoot 实现微信支付和退款功能,喜欢的朋友可以点击查看. 开发准备 一台用于支付的测试机 用于编写的后端框架接口的 IDE (IDEA 或者 Eclipse 都可以) HBuilder X 用来编辑 UniApp 项目的编辑器和编译器 基本的 SpringBoot 的脚手架,可以去 https://start.spring.io/或者 IDEA 自带的快速生成脚手架插件. Jd

  • SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码

    本博客详细介绍了如何使用ssm框架实现支付宝支付功能.本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将支付宝支付整合到ssm框架」,详细的代码和图文解释,自己实践的时候一定仔细阅读相关文档. 教程源代码:https://github.com/OUYANGSIHAI/sihai-maven-ssm-alipay 一.支付宝测试环境代码测试: 1.下载电脑网站的官方demo以及查看参考相关文档: 地址:https://docs.open.alipay.com/270/106291/ 2.下

  • PHP 实现手机端APP支付宝支付功能

    最近应业务需求,做了支付宝支付和微信支付,今天分享一下手机端app支付宝支付对接流程,实际开发过程是前后端分离,前端调用后端API接口,实现功能返回数据,我所用的跨挤啊为TP5,大致可以分为四步: 1.在蚂蚁金服开放平台创建应用,签约商户,生成应用公钥和私钥: 2.配置统一下单支付参数: 3.整合支付宝demo类文件: 4.创建Alipay支付类,类内创建两个方法(alipay_app:统一下单方法和alipay_notify:支付成功异步回调方法); 第一步主要是在蚂蚁金服开放平台登录你的支付

  • springboot对接支付宝支付接口(详细开发步骤总结)

    最近需要对接支付宝的支付接口,官方文档写得内容有点分散,整理了一下发布出来,用作记录,同时也希望对不了解情况的人有所帮助,这里以电脑端的网页支付为例. 开发主要分为三个步骤:一.生成私钥公钥.二.建立应用.三.沙箱环境.四.接口开发 一.生成私钥公钥 生成密钥的官网文档:官网文档 官方文档讲得已经很详细,按照步骤来即可,记得保存好公钥与私钥,下面需要用到 二.建立应用 1.首先进入蚂蚁金服开放平台的首页,通过支付宝账户登录,登录的时候要选择一个身份,这个选自研开发者吧,反正后面可以拓展 2.在蚂

  • SpringBoot接入支付宝支付的方法步骤

    支付宝今年推出了新的转账接口alipay.fund.trans.uni.transfer(升级后安全性更高,功能更加强大) ,老转账接口alipay.fund.trans.toaccount.transfer将不再维护,新老接口的一个区别就是新接口采用的证书验签方式.使用新接口要将sdk版本升级到最新版本,博主升级时最新版本是4.10.97.接下来看集成步骤 1.将支付宝开放平台里下载的3个证书放在resources下面 2.写支付宝支付的配置文件 alipay.properties alipa

  • Springboot整合微信支付(订单过期取消及商户主动查单)

    目录 一:问题引入 二:处理流程 三:代码实现 一:问题引入 前面讲到用户支付完成之后微信支付服务器会发送回调通知给商户,商户要能够正常处理这个回调通知并返回正确的状态码给微信支付后台服务器,不然微信支付后台服务器就会在一段时间之内重复发送回调通知给商户.具体流程见下图: 那么这时候问题就来了,微信后台发送回调通知次数也是有限制的,而且,微信支付开发文档中这样说到:对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成

  • Thinkphp整合微信支付功能

    先上效果图:我要告诉你我这一篇文章写的是微信支付之中的(普通商户而非服务商商户的统一下单JSPI)微信支付: 其实自己整合SDK失败了,用了一个博客博主整合的代码,在这里写一下笔记: 前面准备: 1.微信公众号: 独特的appid.appscrect.接口权限之中设置可以获取用户ID信息权限的域名(每个用户对于不同公众都会有一个特有ID,通过这个ID获取用户微信账号基本信息.详情看微信开发者文档).在微信支付按钮出设置微信支付授权目录(写到发起请求的控制器那一层).设置开发者微信账号为测试白名单

  • Vue的H5页面唤起支付宝支付功能

    目前项目中比较常用的第三方支付无非就是支付宝支付和微信支付.下面介绍一下Vue中H5页面如何使用支付宝支付.其实很简单的,只不过是调自己后台的一个接口而已(后台根据支付宝文档,写好支付接口). 触发支付宝支付调用后台接口,后台会返回支付宝提供的form表单,我们只要在vue里面创建新节点,将返回的form表单append进去,并提交就可以唤起支付宝支付.另在此说一下这个 returnUrl , 它是支付后支付宝回调的页面.具体可以根据自身业务,后台写死或者由前端控制. methods () {

随机推荐