SpringBoot整合支付宝支付

支付宝支付

1.首先在工程导入相关的maven依赖

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.11.33.ALL</version>
</dependency>

2.下载支付宝密钥生成器或者在web端生成密钥

3.在沙箱应用中点击把自己生成的应用公钥 复制到设置/查看生成支付宝公钥

4.下载支付宝支付demo,把里面的AlipayConfig(这里我已经给你们拿到了,你们自己复制到工程里面就可以了)

package com.alipay.config;

import java.io.FileWriter;
import java.io.IOException;

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

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

	// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
	public static String app_id = "";
	
	// 商户私钥,您的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://工程公网访问地址/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:\\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /** 
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
这里把你的app_id填成你沙箱应用的app_id

这里的商户私钥merchant_private_key复制之前下载的密钥生成器里面的密钥

这里的支付宝公钥alipay_public_key复制之前生成的公钥

注意把下面的那个支付宝网关改成你沙箱应用的网关

这时候启动项目可能会出现编码集错误的问题:问题就是AlipayConfig类你可能不是UTF-8格式的更改一下即可(如果是UTF-8建议再次更改一下)

5.现在开始编码直接在controller里面编写接口

package com.star.controller;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.star.config.AlipayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author pengxin
 * @version 1.0
 * @date 2021/1/26 10:09
 */
@RestController
@Slf4j
public class AlipayController {

    /**
     * 统一收单下单并支付页面接口
     */
    @RequestMapping("/alipay")
    public void pay(String price, String name,HttpServletResponse response) throws Exception {
        DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,AlipayConfig.sign_type);
        AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
        alipayTradePagePayRequest.setReturnUrl(AlipayConfig.return_url);//跳页面
        alipayTradePagePayRequest.setNotifyUrl(AlipayConfig.notify_url);//跳方法
        //模拟参数
        Map<String,Object> map = new HashMap<>();
        map.put("out_trade_no",System.currentTimeMillis());//订单号
        map.put("product_code","FAST_INSTANT_TRADE_PAY");//PC端支付方式
        map.put("total_amount",price+".00");//交易金额
        map.put("subject",name);//商品名称
        String string = JSONObject.toJSONString(map);
        log.info("模拟数据"+string);
        alipayTradePagePayRequest.setBizContent(string);
        String body = alipayClient.pageExecute(alipayTradePagePayRequest).getBody();
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(body);
        response.getWriter().flush();
        response.getWriter().close();

    }

    /**
     * 统一收单交易退款接口
     */
    @RequestMapping("/refund")
    public void refund(HttpServletResponse response) throws Exception {
        DefaultAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl,AlipayConfig.app_id,AlipayConfig.merchant_private_key,"json",AlipayConfig.charset,AlipayConfig.alipay_public_key,AlipayConfig.sign_type);
        AlipayTradeRefundRequest alipayTradeRefundRequest = new AlipayTradeRefundRequest();
        alipayTradeRefundRequest .setReturnUrl(AlipayConfig.return_url);//跳页面
        alipayTradeRefundRequest .setNotifyUrl(AlipayConfig.notify_url);//跳方法
        Map<String,Object> map = new HashMap<>();
        //map.put("trade_no",);//支付宝交易号
        map.put("out_trade_no",123456789);//订单号
        map.put("refund_amount",88.88);//退款金额
        String string = JSONObject.toJSONString(map);
        log.info("退款数据"+string);
        alipayTradeRefundRequest.setBizContent(string);
        String body = alipayClient.pageExecute(alipayTradeRefundRequest).getBody();
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(body);
        response.getWriter().flush();
        response.getWriter().close();
    }

}
这里面的有些参数是必须要填写的,详情请见支付宝官网的API(以下是我列举的例子)这些必选的必须要填写

6.最后启动项目就可以了这里的账户名就是你的沙箱账号和密码

posted @ 2021-03-23 18:09  star-xin  阅读(194)  评论(0编辑  收藏  举报