java支付宝网页支付

用于自己试验与记录,只可用与参考,建议自己读取阿里支付文档。

POM依赖

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

支付宝配置类

package com.iot.donation.config;

/**
 * @Author 张满
 * @Description   支付宝配置类
 * @Date 2019/9/7 21:19
 * @vsersion 1.0.0
 **/
public class AliPayConfig {


    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    public static String app_id = "2016101100664445";

    // 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "*************************";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "*******************************";

    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "*************************";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String return_url = "**************************";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";





}

实际使用

package com.iot.donation.controller;

import cn.hutool.core.util.IdUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.iot.donation.config.AliPayConfig;
import com.iot.donation.constant.DonationMessageStatusConstants;
import com.iot.donation.constant.OrderStatusConstants;
import com.iot.donation.constant.PayTypeConstants;
import com.iot.donation.entity.MoneyDonation;
import com.iot.donation.entity.Project;
import com.iot.donation.entity.User;
import com.iot.donation.service.MoneyDonationService;
import com.iot.donation.service.ProjectService;
import com.iot.donation.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @Author 张满
 * @Description 支付宝支付controller
 * @Date 2019/9/7 21:05
 * @vsersion 1.0.0
 **/
@Controller
@RequestMapping("/AliPay")
public class AliPayController {

    private static final Logger log = LoggerFactory.getLogger(AliPayController.class);

    @Autowired
    private ProjectService projectService;

    @Autowired
    private MoneyDonationService moneyDonationService;


    /**
     * @Author 张满
     * @Description 生成捐赠订单,调用支付接口生成支付界面
     * @Date 2019/9/8  15:48
     * @Param [money, projectId, payType, word, userPayType, response, session]
     * @return void
     **/
    @RequestMapping("/toAliPay")
    public  void toAliPay(@RequestParam(value = "money",required = true) Double money,
                          @RequestParam(value = "projectId",required = true)Integer projectId,
                          @RequestParam(value = "payType",required = true)Integer payType,
                          @RequestParam(value = "word",required = false)String word,
                          @RequestParam(value = "userPayType",required = true)Integer userPayType,
                          HttpServletResponse response,
                          HttpSession session
                            ){
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");

        //--------------------------------------------------------生成本地订单--------------------------------------------------------

        User user = (User) session.getAttribute("user");

        MoneyDonation moneyDonation=new MoneyDonation();
        if(user!=null){
            //如果用户已经登录(实名捐赠)
            moneyDonation.setUserid(user.getId());
        }
        //设置捐献项目
        moneyDonation.setProjectid(projectId);
        //设置捐赠金额(元)
        moneyDonation.setSum(new BigDecimal(money).setScale(2,BigDecimal.ROUND_HALF_UP));
        //设置支付方式为支付宝支付
        if(payType.equals(PayTypeConstants.ZHI_FU_BAO)){
            moneyDonation.setType(PayTypeConstants.ZHI_FU_BAO);
        }
        //捐赠时间
        moneyDonation.setCreatetime(new Date());
        //生成订单id-----类似 b17f24ff026d40949c85a24f4f375d42
        String orderId = IdUtil.simpleUUID();
        moneyDonation.setOrderId(orderId);
        //设置订单状态
        moneyDonation.setOrderStatus(OrderStatusConstants.PAYING);
        //捐赠寄语,默认设置寄语状态为启用寄语
        if(StringUtils.isNotEmpty(word)){
            moneyDonation.setMessage(word);
            moneyDonation.setStatus(DonationMessageStatusConstants.ENABLE);
        }

        //得到项目名
        Project project = projectService.queryProjectById(projectId);
        String projectName = project.getName();

        //生成订单
        int count = moneyDonationService.generateMoneyDonation(moneyDonation);

        log.info("生成本地支付宝支付捐赠订单:"+moneyDonation.toString());
        //如果生成订单不成功
        if(count!=1){
            log.error("生成捐赠订单失败!");
            return;
        }

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.gatewayUrl, AliPayConfig.app_id, AliPayConfig.merchant_private_key, "json", AliPayConfig.charset, AliPayConfig.alipay_public_key, AliPayConfig.sign_type);
        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AliPayConfig.return_url);
        alipayRequest.setNotifyUrl(AliPayConfig.notify_url);
        //---------------------------------------------------------向阿里请求支付页面---------------------------------------------------------------------------------------------
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ orderId +"\","
                + "\"total_amount\":\""+ money.toString() +"\","
                + "\"subject\":\""+ projectName+"捐赠" +"\","
                + "\"body\":\""+ "向"+projectName+"项目捐赠" +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //请求
        String result = null;
        PrintWriter writer = null;
        try {
            result = alipayClient.pageExecute(alipayRequest).getBody();
            //输出
            writer = response.getWriter();
            writer.println(result);
            log.info("-----------生成支付页面成功---------");
        } catch (AlipayApiException e) {
            log.info("------------向支付宝请求支付页面失败--------------");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }




    }




    /**
     * @Author 张满
     * @Description 支付成功后返回支付成功页面===========支付宝服务器同步请求,有可能出现阿里调用此接口失败,导致业务逻辑未能全部实现的情况
     * @Date 2019/9/9  11:22
     * @Param [request]
     * @return java.lang.String
     **/
    @GetMapping("/return_url")
    public String toPaySuccess(HttpServletRequest request){

        log.info("----------------进入return_url--------");

        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            try {
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            params.put(name, valueStr);

        }
        log.info("得到支付宝返回参数:"+params.toString());
        boolean signVerified = false; //调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.alipay_public_key, AliPayConfig.charset, AliPayConfig.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        if(signVerified) {
            log.info("检验签名成功!");
            //商户订单号
            String out_trade_no = null;
            String trade_no = null;
            String total_amount = null;
            try {
                //商户订单号
                out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
                //支付宝交易号
                trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
                //付款金额
                total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
                log.info("trade_no:"+trade_no+"------out_trade_no:"+out_trade_no+"-----total_amount:"+total_amount);


                //返回支付成功页面
                return "protal/pay/paySuccess";
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }else {
            log.error("验签失败");
        }
        //返回页面丢失页面
        return "protal/404";
    }


    /**
     * @Author 张满
     * @Description 支付宝异步通知接口,用于支付成功后的业务逻辑处理
     * @Date 2019/9/8  16:35
     * @Param [request, response]
     * @return void
     **/
    @PostMapping("/notify_url")
    public void notify_url(HttpServletRequest request,HttpServletResponse response){


        log.info("----------------进入notify_url--------");


        PrintWriter out = null;
        try {
            out = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();

        for (Iterator<String> 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
//            try {
//               valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
//            } catch (UnsupportedEncodingException e) {
//                e.printStackTrace();
//            }
            params.put(name, valueStr);
        }
        log.info("支付宝返回参数:"+params.toString());
        boolean signVerified = false; //调用SDK验证签名
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.alipay_public_key, AliPayConfig.charset, AliPayConfig.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        if(signVerified) {//验证成功
            log.info("签名校验成功!");
            String trade_status = null;
            String out_trade_no="";
            String trade_no="";
            try {
                //商户订单号
                out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
                //支付宝交易号
                trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
                //交易状态
                trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

                log.info("trade_no:"+trade_no+"-----out_trade_no:"+out_trade_no+"-----trade_status:"+trade_status);

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            if(trade_status.equals("TRADE_SUCCESS")){
                log.info("订单号为:"+out_trade_no+"的订单已经支付成功");
                //判断该笔订单是否在商户网站中已经做过处理
                MoneyDonation moneyDonation = moneyDonationService.findMoneyDonationByOrderId(out_trade_no);
                if(moneyDonation!=null){
                    //订单号已改变
                    if(moneyDonation.getOrderStatus().equals(OrderStatusConstants.PAYED)){
                        log.info("改订单已经处理过!");
                        out.println("success");
                    }else {
                        //改变订单状态
                        boolean flag = moneyDonationService.finishOrderByAliPay(moneyDonation);
                        if(flag){
                            out.println("success");
                            log.info("完成订单交易成功!");
                        }else {
                            out.println("fail");
                            log.error("完成订单交易失败!");
                        }
                    }

                }else{
                    log.error("订单号在数据库已不存在!");
                }
            }

        }else {
            //验证失败
            out.println("fail");
            log.error("验证失败!");
        }
        out.println("fail");
    }


















}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值