栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

支付宝支付 第十集:支付回调

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

支付宝支付 第十集:支付回调

支付宝支付 第十集:支付回调

一、注意

这里的支付回调最好是自己有一个服务器(阿里云服务器一年70多也不是很贵),博主自己尝试了一下,本机和使用虚拟机模拟服务器的话,支付宝的授权回调信息是传不过来的,无法进行支付回调!!! 怎样使用阿里云服务器运行Java项目? 为什么接收不到回调信息? 一定要注意在沙盒设置中的授权回调地址,一般自己的服务器都是http不是https!!!写错了的话是接收不到回调信息的!!!

为什么接收到了支付宝回调信息,写不到数据库中? 检查自己传给支付宝的参数的名称,与传回来的解析名称是否一致,我传过去的时候是ID,接受回调信息进行解析的时候,写的是Id,导致一直无法识别回调信息。。。。



二、代码

目录结构

更新AlipayController.java
package com.dzy.alipay.web;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.internal.util.StringUtils;
import com.dzy.alipay.service.AlipayService;
import com.dzy.alipay.service.pay.PayCommonService;
import com.dzy.alipay.vo.PayVo;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Controller
@Log4j2
public class AlipayController {
    private final AlipayService alipayService;

    private final PayCommonService payCommonService;

    public AlipayController(AlipayService alipayService, PayCommonService payCommonService) {
        this.alipayService = alipayService;
        this.payCommonService = payCommonService;
    }

    @GetMapping("/alipay/pay")
    @ResponseBody
    public byte[] alipay(String courseID) {
        PayVo payVo = new PayVo();
        payVo.setCourseid(courseID);
        payVo.setUserId("1");
        return alipayService.alipay(payVo);
    }

    
    @ResponseBody
    @RequestMapping("/aliPayNotifyUr")
    public String notify_url(HttpServletRequest request) throws Exception {
        boolean result = alipayCallback(request);
        if (result) {
            System.out.println("success");
            return "success"; // 请不要修改或删除
        } else {
            // 验证失败
            System.out.println("fail");
            return "fail";
        }
    }

    
    private boolean alipayCallback(HttpServletRequest request) throws Exception {
        // 获取支付宝GET过来反馈信息
        Map params = new HashMap();
        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] + ",";
            }
            params.put(name, new String(valueStr.getBytes("ISO-8859-1"), "UTF-8"));
        }

        // 计算得出通知验证结果
        log.info("1:---->获取支付宝回传的参数---------------------------------->" + params);
        // 支付宝返回的请求参数body
        String extparamString = request.getParameter("extra_common_param");


        log.info("2---->:支付宝交易返回的参数:{}", extparamString);
        String tradeno = params.get("trade_no");;
        //交易完成
        String body = params.get("body");
        if (StringUtils.isEmpty(tradeno)) {
            tradeno = params.get("trade_no");
        }


        log.info("3---->:【支付宝】交易的参数信息是:{},流水号是:{}", body, tradeno);
        try {
            JSONObject bodyJson = JSONObject.parseObject(body);
            String userId = bodyJson.getString("userId");
            String ptype = bodyJson.getString("ptype");
            String orderNumber = bodyJson.getString("orderNumber");
            log.info("4---->:【支付宝】交易的参数信息是:ptype:{},orderNumber是:{}",  ptype,orderNumber);
            // 课程支付成功,保存的订单交易明细
            if (ptype != null && ptype.equalsIgnoreCase("productcourse")) {
                payCommonService.payproductcourse(bodyJson, userId, orderNumber, tradeno, "1");
            }
        } catch (Exception ex) {
            log.info("支付宝支付出现了异常.....");
            ex.printStackTrace();
            return false;
        }
        return true;
    }



}
更新PayCommonService.java
package com.dzy.alipay.service.pay;
import com.alibaba.fastjson.JSONObject;

import com.dzy.alipay.entity.OrderDetail;
import com.dzy.alipay.entity.ProductCourse;
import com.dzy.alipay.mapper.OrderDetailMapper;
import com.dzy.alipay.mapper.ProductCourseMapper;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

@Component
@Log4j2
public class PayCommonService {
    private final OrderDetailMapper orderDetailMapper;
    private final ProductCourseMapper productCourseMapper;

    public PayCommonService(OrderDetailMapper orderDetailMapper, ProductCourseMapper productCourseMapper) {
        this.orderDetailMapper = orderDetailMapper;
        this.productCourseMapper = productCourseMapper;
    }

    
    public void payproductcourse(JSONObject jsonObject, String userId, String orderNumber, String transaction_id, String paymethod) {
        String courseId = jsonObject.getString("courseID");
        String money = jsonObject.getString("money");
        ProductCourse productCourse = productCourseMapper.selectById(courseId);
        if (productCourse == null) {
            log.info("【" + (paymethod.equals("2") ? "微信" : "支付宝") + "】你支付的课程被删除了:{}", courseId);
            return;
        }
        OrderDetail orderDetail = new OrderDetail();
        orderDetail.setUserid(userId);
        orderDetail.setCourseid(courseId);
        orderDetail.setUsername("飞哥");
        orderDetail.setPaymethod(paymethod);
        orderDetail.setCoursetitle(productCourse.getTitle());
        orderDetail.setCourseimg(productCourse.getImg());
        orderDetail.setOrdernumber(orderNumber);
        orderDetail.setTradeno(transaction_id);
        orderDetail.setPrice(money == null ? "0.01" : money);
        orderDetailMapper.insert(orderDetail);
    }
}
更新AlipayServiceImpl.java
package com.dzy.alipay.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.dzy.alipay.config.AlipayConfig;
import com.dzy.alipay.entity.ProductCourse;
import com.dzy.alipay.qrcode.QRCodeUtil;
import com.dzy.alipay.qrcode.QrCodeResponse;
import com.dzy.alipay.qrcode.QrResponse;
import com.dzy.alipay.service.course.ProductCourseService;
import com.dzy.alipay.util.GenerateNum;
import com.dzy.alipay.vo.PayVo;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.ResourceUtils;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;

@Service
@Log4j2
public class AlipayServiceImpl implements AlipayService {

    private final ProductCourseService productCourseService;

    private final AlipayConfig alipayConfig;

    public AlipayServiceImpl(AlipayConfig alipayConfig, ProductCourseService productCourseService) {
        this.alipayConfig = alipayConfig;
        this.productCourseService = productCourseService;
    }

    
    @Override
    public byte[] alipay(PayVo payVo) {
        try {
            ProductCourse productCourse = productCourseService.getById(payVo.getCourseid());
            if(productCourse==null){
                return null;
            }
            // 1:支付的用户
            String userId = payVo.getUserId();
            // 2: 支付金额
            String money = productCourse.getPrice().toString();
            // 3: 支付的产品
            String title = productCourse.getTitle();
            // 4: 支付的订单编号
            String orderNumber = GenerateNum.generateOrder();
            // 5:支付宝携带的参数在回调中可以通过request获取
            JSONObject json = new JSONObject();
            json.put("userId", userId);
            json.put("orderNumber", orderNumber);
            json.put("money", money);
            json.put("ptype","productcourse");
            json.put("courseID",payVo.getCourseid());
            String params = json.toString();
            // 6:设置支付相关的信息
            AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
            model.setOutTradeNo(orderNumber); // 自定义订单号
            model.setTotalAmount(money);// 支付金额
            model.setSubject(title);// 支付的产品名称
            model.setBody(params);// 支付的请求体参数
            model.setTimeoutExpress("30m");// 支付的超时时间
            model.setStoreId(userId + "");// 支付的库存id
            QrCodeResponse qrCodeResponse = qrcodePay(model);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            String logoPath ="";
            try {
                logoPath = ResourceUtils.getFile("classpath:favicon.png").getAbsolutePath();
            }catch (Exception ex){
                logoPath = new File("/www/wwwroot/aliPay/favicon.png").getAbsolutePath();
            }
            BufferedImage buffImg = QRCodeUtil.encode(qrCodeResponse.getQr_code(), logoPath, false);//获取二维码
            ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
            ImageIO.write(buffImg, "JPEG", imageOut);
            imageOut.close();
            ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
            return FileCopyUtils.copyToByteArray(input);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    
    public QrCodeResponse qrcodePay(AlipayTradePrecreateModel model) {
        // 1: 获取阿里请求客户端
        AlipayClient alipayClient = getAlipayClient();
        // 2: 获取阿里请求对象
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        // 3:设置请求参数的集合,最大长度不限
        request.setBizModel(model);
        // 设置异步回调地址
        request.setNotifyUrl(alipayConfig.getNotify_url());
        // 设置同步回调地址
        request.setReturnUrl(alipayConfig.getReturn_url());
        AlipayTradePrecreateResponse alipayTradePrecreateResponse = null;
        try {
            alipayTradePrecreateResponse = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        assert alipayTradePrecreateResponse != null;
        QrResponse qrResponse = JSON.parseObject(alipayTradePrecreateResponse.getBody(), QrResponse.class);
        return qrResponse.getAlipay_trade_precreate_response();
    }

    
    private AlipayClient getAlipayClient() {
        return new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getApp_id(), alipayConfig.getMerchant_private_key(), "JSON", alipayConfig.getCharset(), alipayConfig.getAlipay_public_key(), alipayConfig.getSign_type());
    }
}
更新OrderDetail.java
package com.dzy.alipay.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.Date;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@TableName("kss_order_detail")
public class OrderDetail {
    // 主键
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;
    // 支付课程id
    private String courseid;
    // 支付课程标题
    private String coursetitle;
    // 支付课程封面
    private String courseimg;
    // 支付价格
    private String price;
    // 支付用户
    private String userid;
    // 支付用户昵称
    private String username;
    // 支付流水订单号
    private String ordernumber;
    // 支付交易号
    private String tradeno;
    // 1 alipay 2 weixin
    private String paymethod;
    // 课程创建时间
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    // 课程更新时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}
更新OrderDetailMapper.java
package com.dzy.alipay.mapper;
import com.baomidou.mybatisplus.core.mapper.baseMapper;

import com.dzy.alipay.entity.OrderDetail;
import org.springframework.stereotype.Repository;

@Repository
public interface OrderDetailMapper extends baseMapper {
}
更新OrderDetailServiceImpl.java
package com.dzy.alipay.service.order;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.dzy.alipay.entity.OrderDetail;
import com.dzy.alipay.mapper.OrderDetailMapper;
import org.springframework.stereotype.Service;

@Service
public class OrderDetailServiceImpl extends ServiceImpl implements OrderDetailService {
}
然后将Java项目打jar包,上传至服务器中,以下是Linux操作命令
nohup java -jar aliPay.jar >>1.txt &
tail -f 1.txt
netstat -anp | grep 8989
sudo lsof -i:8989
sudo kill -9 9851
扫描二维码进行支付

三、成功截图

服务器成功收到支付宝传回的支付回调信息

成功将订单信息保存至数据库中

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/740584.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号