Java之支付宝支付(电脑网站支付)沙箱测试版

支付宝支付流程及注意事项(沙箱测试版)
一:支付宝支付接入准备工作:
首先,支付宝支付和微信支付意愿,都是只支持企业用户,个人用户是不能接入支付宝支付的,所以要想接入支付宝支付,首先需要有支付宝的企业账号,有了企业账号才能拿到支付宝支付的所需参数,这些工作都是需要公司层面的人操作的,作为码农,只管拿到这些需要的参数就可以进行看文档,对接支付支付接口了。那支付宝支付都需要哪些参数呢,请看下面:

ALIPAY:
  #应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
  APPID: 2021000117620418
  #商户私钥,您的PKCS8格式RSA2私钥
  PRIVATEKEY: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCTiQ0Y1wCpV/XzGYHCHz13nQ54RDModWPxRuSdftvezUI60zBF+v8ecd4dq49DOfNOatNcCQVUxoC6vuJSOLZTxmLBbG7VuUa9OZI61JCq6wpT6QWAWRyf0ufbeXo/mp1tUDHd+O24AW8Ago9XaGtQlzQLXmCaTFkZVNkkb5qtoZ47+Dn63gxYkNXfsMD1uADU96R2pwmwz8/vwnISziNk+oX5UgFQfeacnpDgvRGdrvmwI5QD+9/TAb1DPM1azpPFQ3iD/PfaB8kPvVssrTB41NhQKzOG6aANGE0fiWw/kObOPlAuskQqvI58tpDQuvwj+HXGvwd0x8jKljCtYffVAgMBAAECggEAaALYC+oP2lNb3r3dv/h8Qiake99A3cYc5o3fQLWd1q6IgaY/wyZX06PdPrejcXaadG9VgO4PJxwmxwEp12OKDveuycRjQyOynlbHI9iWARlhF5URPtIUHwz2TsGOkOa1E8rUzTPgi7ffBNIGsk24UoG2vEkV+9HVgslRqKFRwBQ9vaqw5U/zX8/SLlW/bIu7AiHm+w+iZ8A3O92nS9+kZIQmnP0KJYoI3HWYdj2/deMjy57PJWEsIEqVef+JeXQ6kN3q/n+8d6pThfDBfTvGDns5kBDdrW6Cpf1EPgDIsFFh5PGtNWI+KKimEOjqByON32ydAsn1hpJHILAH8s5XRQKBgQDGsXlUnGyxeDj6JzilEt6MrhlJYrpQjkF0NWJqqkve3YUhNLVrIKb4Hz32HT06wvZy7wtY/9B3lKztDJRy0nHRxs/9aO9KQMJlfMkGd4in4RnKzFMzY6IaZuk7aeVN8ps6fIFyh0brgFGBBULtSrfIWzWt54Kw73dgVsE6hMGtxwKBgQC+FlTFnsy1E2Z4JYi0caaWH36LUkyaglBOr0LOWLT5rZThjm4xbi1/kQF5v0VGaJxnOR2Iyn0JWB6gPQNH0OXsxKRAYHVj7pgtk+q+NC4P5CiPbBUjhmh+pf2LZl6EWCbQIKB1HbN6g8iSOGMHI/+pYxiggK1Z6hAb7dxfH7WdgwKBgQCpMz7QR7jj1C4pEDdTk2MDR8ruzG0+5jVlAYUCsmyTp+6T3W/Uf2TQjMJWEIYwwQ/fxiLSsl3TRz+PShQsR3t3madK9A46HDWu+PmzUR2FYNJ2+VKsw16qvxJEbyQ/IacAwj/1yK8jIw3FIjbhHaytqMZohmqrw/DTkG1SKPVJxwKBgDmjS9EgdbHyT//eYbVVQM4EfrqAGfo/yVoSio9HFpkeqSY7qe4TGniz316rQLY4wjQKfYoc3A0ZSzALUBNWpGFGvwdGOFI05q/rSiKib9UhuarDeyVqfATrEBZU1BQNJre1LPJWLzXW/9pWfrCLmdoi0jTYz7eT4Y6WcVvmoYtBAoGBAKrMom3Lh9ijypXuY9PWEDwZnOXB7AQCB1UQXSkrsYijEfsfFAHE8bc1sEsE0wUZqlFXbdPo8Uo7KthvliRUDmO3MddrC9VrnHDHPTOGJWywbvZo+PmZG8aNhs6b7sLkfYmCsJS8pKPAx8nskvKfNqbT39n84yAE6mo4bruyc8as
  #支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
  PUBLICKEY: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv/7QLp0dO65m+YqIJNGEcxuJlrhf+sFWGh1sPlxBx2Lg5//w4ijojuY+Nayua+O1S050/3nTsHNDJIfszTkTaOjH35L41LoVTB2iZbKOyFtyokEJvrL3XrezzFaGbWiFACwEP9m8ZhU/tDVx4XN8o9GZeggPlTdM/JCkK5IR0/sNdkLyrDaS0sVGtFnBL2kLSxPwsWmgB2JHxDXE7BkAqZh2Any5EImSRVUk/0f/ulu3LbTNclIfr9QmwU8+5L8JpVRTiyBcQQU3oj4FrL0HUQ3FITB6yGb8Pi26qh9afpuQBAAQjpbYB5H1WgKgErEFV/EwIkbKddCz1hZq5pSOjwIDAQAB
  #服务器异步通知页面路径
  NOTIFY_URL: http://localhost:8081/api/alipay/notify
  #页面跳转同步通知页面路径
  RETURNA_URL: http://localhost:8081/api/alipay/return
  #签名方式
  SIGN: RSA2
  #支付宝网关(沙箱测试版)
  GATEWAY_URL: https://openapi.alipaydev.com/gateway.do

上面就是支付宝支付需要的各类参数,在开始写代码之前,需要先把这些参数配置好才能进行下面的工作。
二:下载支付宝的SDK

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

三:支付宝支付的核心代码

package com.lkjy.web.domain;


import java.io.Serializable;

/**
 * @Auther: pppmh
 * @Date: 2021/3/12 15:14
 * @Description: 支付请求参数
 */
public class AlipayVo implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 订单名称
     */
    private String subject;
    /**
     * 商户网站唯一订单号
     */
    private String out_trade_no;
    /**
     * 该笔订单允许的最晚付款时间
     */
    private String timeout_express;
    /**
     * 付款金额
     */
    private String total_amount;
    /**
     * 销售产品码,与支付宝签约的产品码名称
     */
    private String product_code;

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getOut_trade_no() {
        return out_trade_no;
    }

    public void setOut_trade_no(String out_trade_no) {
        this.out_trade_no = out_trade_no;
    }

    public String getTimeout_express() {
        return timeout_express;
    }

    public void setTimeout_express(String timeout_express) {
        this.timeout_express = timeout_express;
    }

    public String getTotal_amount() {
        return total_amount;
    }

    public void setTotal_amount(String total_amount) {
        this.total_amount = total_amount;
    }

    public String getProduct_code() {
        return product_code;
    }

    public void setProduct_code(String product_code) {
        this.product_code = product_code;
    }
}
package com.lkjy.web.controller.api;

import com.lkjy.common.core.controller.BaseController;
import org.springframework.beans.factory.annotation.Value;

/**
 * @Auther: pppmh
 * @Date: 2021/3/12 13:40
 * @Description:
 */
public abstract class PayBaseController extends BaseController {

    // 支付宝支付参数配置 //
    @Value("${ALIPAY.APPID}")
    protected String app_id;//应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    @Value("${ALIPAY.PRIVATEKEY}")
    protected String merchant_private_key;//商户私钥,您的PKCS8格式RSA2私钥
    @Value("${ALIPAY.PUBLICKEY}")
    protected String alipay_public_key;//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    @Value("${ALIPAY.NOTIFY_URL}")
    protected String notify_url;//服务器异步通知页面路径
    @Value("${ALIPAY.RETURNA_URL}")
    protected String return_url;//页面跳转同步通知页面路径
    @Value("${ALIPAY.SIGN}")
    protected String sign_type = "RSA2";//签名方式
    protected String charset = "UTF-8";//字符编码格式
    @Value("${ALIPAY.GATEWAY_URL}")
    protected String gateway_url;//支付宝网关

}
package com.lkjy.web.controller.api;

import com.alibaba.fastjson.JSONObject;
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.google.gson.Gson;
import com.lkjy.web.domain.AlipayVo;
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.RestController;

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

/**
 * @Auther: pppmh
 * @Date: 2021/3/12 15:11
 * @Description: 支付宝后台接口
 */
@RestController
@RequestMapping("/api/alipay")
public class AlipayController extends PayBaseController {

    /**
     * 支付网站扫码支付接口-统一下单支付接口
     *
     * @return
     * @throws AlipayApiException
     */
    @GetMapping("/pay")
    private String alipayPay() throws AlipayApiException {
        //这个应该是从前端端传过来的,这里为了测试就从后台写死了
        AlipayVo vo = new AlipayVo();
        vo.setOut_trade_no(UUID.randomUUID().toString().replace("-", ""));
        vo.setTotal_amount("0.01");
        vo.setSubject("nelson-test-title");
        vo.setProduct_code("FAST_INSTANT_TRADE_PAY"); //这个是固定的
        String json = new Gson().toJson(vo);
        logger.info("json: {}", json);

        AlipayClient alipayClient = new DefaultAlipayClient(gateway_url, app_id, merchant_private_key, "json", charset, alipay_public_key, sign_type);
        // 设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(return_url);
        alipayRequest.setNotifyUrl(notify_url);
        alipayRequest.setBizContent(json);
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        logger.info("result: {}", result);
        return result; //这里生成一个表单,会自动提交
    }

    /**
     * 支付宝服务器异步通知页面
     *
     * @param request
     * @param out_trade_no 商户订单号
     * @param trade_no     支付宝交易凭证号
     * @param trade_status 交易状态
     * @return
     * @throws AlipayApiException
     */
    @PostMapping("/notify")
    public String alipayNotify(HttpServletRequest request, String out_trade_no, String trade_no, String trade_status) throws AlipayApiException {
        Map<String, String> params = getParamsMap(request);
        logger.info("notify params: {}", JSONObject.toJSON(params));
        // 验证签名
        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);
        logger.info("notify signVerified: {}", signVerified);
        if (signVerified) {
            //处理你的业务逻辑,更细订单状态等
            return ("success");
        } else {
            logger.info("验证失败,不去更新状态");
            return ("fail");
        }
    }

    /**
     * 支付宝服务器同步通知页面
     *
     * @param request
     * @param out_trade_no 商户订单号
     * @param trade_no     支付宝交易凭证号
     * @param total_amount 交易状态
     * @return
     * @throws AlipayApiException
     */
    @GetMapping("/return")
    public String alipayReturn(HttpServletRequest request, String out_trade_no, String trade_no, String total_amount) throws AlipayApiException {
        Map<String, String> params = getParamsMap(request);
        logger.info("return params: {}", JSONObject.toJSON(params));

        // 验证签名
        boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);
        logger.info("return signVerified: {}", signVerified);

        if (signVerified) {
            return ("success");
        } else {
            logger.info("验证失败,不去更新状态");
            return ("fail");
        }
    }

    private Map<String, String> getParamsMap(HttpServletRequest request) {
        Map<String, String> 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            try {
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
                params.put(name, valueStr);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return params;
    }

}

四:运行支付宝支付URL:http://localhost:8081/api/alipay/pay,返回如下支付二维码页面:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值