吊炸天SpringBoot接入支付宝支付【附关键代码】

1,522 阅读5分钟

下载电脑网站的官方demo:

建议:新手第一次接入支付的还是下载看看,了解下,readme.txt好好看下,包括以后看第三方的此文件最好先浏览下,要不容易踩坑
下面会有专门sdk接入指南

下载:docs.open.alipay.com/270/106291/

阿里源码主要Demo

package com.alipay.config;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {
	
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

	// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
	public static String app_id = "2016102400748331";
	
	// 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "";
	
	// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB\n";

	// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

	// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

	// 签名方式
	public static String sign_type = "RSA2";
	
	// 字符编码格式
	public static String charset = "utf-8";
	
	// 支付宝网关
	public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
	
	// 支付宝网关
	public static String log_path = "C:\\";

}

 

下面正式注册蚂蚁开发者账号

注册地址:open.alipay.com 

选择如下

 设置appid 以及ras密钥

ras在支付宝支付的应用(就是非对称假冒,公钥用来生成支付宝密钥【传输数据】,然后私钥在你程序中用来解密数据)

设置密钥

 

 

然后下载密钥生成工具如下

 

第三方sdk

<dependency>
    <groupId>net.guerlab</groupId>
    <artifactId>sdk-alipay-starter</artifactId>
    <version>2.1.0</version>
</dependency>

然后将生成的公钥到网站上面粘贴,获取支付宝公钥,将支付宝公钥替换程序中的公钥,将你生成的私钥替换代码中的私钥

示例

spring:
  mvc:
    view:
      # 页面默认前缀目录
      prefix: /WEB-INF/jsp/
      # 响应页面默认后缀
      suffix: .jsp
server:
    port: 9999

appid: wx60c1c374fd1329a2
secret: b6e4ebc42a1fa92d1ea7ea440e52d648
redirectUri: http://moran1012.natapp1.cc/callback
### 生成微信授权
authorizedUrl: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
###获取code后,请求以下链接获取access_token
access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
###拉取用户信息(需scope为 snsapi_userinfo)
userinfo: https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
alipay:
  #默认false,为true表示使用沙箱环境
  dev: true
  #签名算法 RSA2 RSA
  sign-type: RSA2
  #应用ID
  app-id: 2012101200736715
  #应用私钥
  private-key: MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDOP2FcM6sWiapQQqSBE4Y3OvXb6r0WVhmuZN9N7LdrQRV516Kxg4OL7goMei7i1gzY3becqhiVYdRG+q0WhZ3K0i8EecpUeTUG7avxMYFsc9CoQNd/IxRXy+qRrg6Y7QAvuwhSakse+k/3+VUVto/i3wIY+Satph//iIzawKqMRZxZbhX7SjvK4Iaajitvqd3NcWhmh179XxkBA3ySQoWXLNO2FFs8sdmpRVV5MweZBJVaGwW2OQpAMs4tkpdrWf2m8iFUanIRW/6GeApt58tlPgkkt3TyP9rAQPLY+fKxScbNaPbvB9E8ZGkKoaA9/TJZPwlKxtSF1x/k1pEAp5m1AgMBAAECgf8t6+7BmL9/RSemty/pjW9U3MvhK2Lulj0hl1QhBZPRTax6dIjE/YNMpLOYE5xc5Uv2/Wbkevr+R8n8A9SGLzny7tmJJZTnOhWUdVbTXTJz81WCIO3aYPUml0CjLx4Q7rQb7Ijt0LzpKNKgfeNz8jIXUZAl/1OdVl/JhZ3XFw7iLDbTACqTKCENTFz9XlJ80JsUCibDUJi2pqC4nZcHJOSxvPLVIOOFn7XdtuqdrwlWtAOk0m/Rbf1XVf6JPbS7dNgJk+n8c1TvRZz2wrid5m7ctuQyyxfdut0vZxBYgzZX10RXrXB1hZDHmyItZAUa0hmxUT/un9ufQ46r3QEd0w0CgYEA/Wp/m8eai6uyr+X7nHNg968EFF4phovTRd9W0XIRYqToylL3os9HIKE5U+/sekGEzX/70aqJxw9SiT/h5ADgejRL4piDWfJxu05tA/O3bboQBg1rPd1vkQOitaoyf9AO/Ge2ugjGGskkwosj9d5z5mz9GSpPS/ZyBpqOgghXN/8CgYEA0FnBm4wPVVwi/dU3VT8Jmj91R3IP4UyBTzcJlkVQ7ccCRbObuf9TOROcs7N7gUNVxksjVRnCF07aRYDYCN6EZkhVnwN+kzSDcO/3H2a6Ij+jfGtkfpMR0uhAz9OgbbJrJEZLlwFp3ilM2BAhADWaET2OxoTc2fUvjf1zksCgYBQuPflG3PzQcItncjEUUx2GV3nTwdTQH8QJtB07yzyiy1MJZmUVwqFLlYgkrB1USGIhFgmtXgl3I+iAKNoCY933ei+SW6t3Di2PYkkVSH85ePsyaF7l2nOe6X80DY92Hytkiv2nozcQ25eOgw+aZnpsJX+yidwPxSbXeg/K4D86QKBgHO+GO7HLNF3oLywENAbd8Mnk4hAFhBLxt3xrjK7iQy+bEW6VD1MWLgxa/DsOSUC+ghxP0yMRaVbGahYviqXKqgDcQUnUhUAyzaMLHiXEON1J3QcfoTuCEU67dsBaY37QiqPF5P0+y8k0cNKI0PaKZzrNjCwdrU4dCu9N5MAVV3nAoGBAKcTefy22LXuduw0HeTxR1JGwn9eg/whPVxSPPfFxNTGxKicoP4eKy4bQYSscI9cgS5GTFXqEHEaLeEKuLEV4/auZ/7b5+o+BfjsQnyaxV8A8fgQNAUv5Q7rU/zrgQM8E4MXP99bQNOJJgAjm7+dpRZ/GJL9SiAHkJL5h2McSNCh
  #支付宝公钥
  alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhWdnts9UIBLSwIin1IToaCXc5xV2vX6BhOFms6K7pbzNVFCQ3tgnqrPbpjyI6ZUTwPTbhu3u+aafbC1hOQAsciBALxTP/pDe+AOPDoUo5Yj9D+Io+Q6d/sEDtsJQuaPpWMET0qM4Nngn1iroJYef4CbenjFMZ4IYzciBZlNgVzSgf6ZOvF9C7tAwpaURFs2r2e8HxoyUrv/T7oVU5Ws/a70FpQB4JuirKIeTLEE4fia9IjMOOmicXcFlpR0ht/m8ggAdr5o+hl+vU1EKcTUJKCogRdlt29DZQ2RLutr0tIaFAJ2kzoocLtQW7AyI8TnHZFDFqJiBap1GsQgltMGWBwIDAQAB

支付代码

/**
 * @ClassName AliPayController
 * @Description TODO
 * @Author moran
 * @Date 2020/4/21 16:04
 **/
@Slf4j
@RestController
@RequestMapping("/open/api/pay")
public class AliPayController {

    @Autowired
    private AlipayClient client;
    @Autowired
    private AlipayProperties properties;
    private static final String REDIRECT_WFWZS_URL = "http://moran1012.natapp1.cc/return_url.jsp";

    @GetMapping("/submit_pay")
    public void submitPay(HttpServletResponse response
    ) throws AlipayApiException, IOException {
        JSONObject data = new JSONObject();
        String orderNo = System.currentTimeMillis()+ "";
        data.put("out_trade_no",orderNo ); // 商户订单号
        data.put("total_amount", "0.01"); // 订单金额
        data.put("subject", "测试支付宝下单"); // 订单标题
        data.put("product_code", "FAST_INSTANT_TRADE_PAY"); // 产品码, PC支付 FAST_INSTANT_TRADE_PAY,
        AlipayTradePagePayRequest requestAli = new AlipayTradePagePayRequest();
        requestAli.setNotifyUrl("http://moran1012.natapp1.cc/open/api/pay/notify_ali"); // 异步通知地址
        requestAli.setBizContent(data.toJSONString()); // 业务参数
        String returnUrl = REDIRECT_WFWZS_URL + "?orderNo=" + orderNo;
        requestAli.setReturnUrl(returnUrl);
        String from = client.pageExecute(requestAli).getBody();
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write(from);
    }

    /**
     * 异步通知
     *
     */
    @PostMapping("/notify_ali")
    public void notifyAli(HttpServletRequest request, HttpServletResponse response) throws Exception {
        log.info("支付宝异步通知数据:{}", ServletUtil.getParamMap(request));
        if (!AlipayUtils.rsaCheck(properties, request.getParameterMap())) {
            // 这里处理验签失败
            log.error("支付宝异步通知验签失败");
            response.getWriter().write("fail");
            response.getWriter().flush();
            response.getWriter().close();
        } else {
            String out_trade_no = request.getParameter("out_trade_no");// 获取请求参数中的商户订单号
            log.info("支付宝异步通知验签成功,订单号:{}", out_trade_no);
            // 交易状态
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
            if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
                // TRADE_FINISHED 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                // TRADE_SUCCESS 付款完成后,支付宝系统发送该交易状态通知

                // 判断该笔订单是否在商户网站中已经做过处理
                // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                // 如果有做过处理,不执行商户的业务程序
            }
            response.getWriter().write("success");
            response.getWriter().flush();
            response.getWriter().close();
        }
    }


}

前端页面请求支付

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

<body>

<button onclick="ww()">pay</button>
</body>
<script type="text/javascript">
    function pay(){
        $.ajax({
            url: "../open/api/pay/submit_pay",
            type: "get",
            success: function(r) {
            //将支付宝返回的数据渲染 div
                $("body").append(r);
            }
        })
    }
</script>