springboot+vue整合支付宝沙箱支付功能

 1、外环境配置

首页 - 开放平台 (alipay.com)

1.1 进入控制台

1.2 进入沙箱

1.3 启用公钥(spring boot配置环境用)

这里可以使用系统密钥也可以使用自定义密钥,系统密钥启用后可直接查看,自定义密钥需要自己用工具生成应用公钥。

密钥工具下载 - 支付宝文档中心 (alipay.com)

下载支付宝自带密钥工具使用RSA2生成密钥。

应用公钥放到支付宝,私钥自己存着需配置到spring boot项目中。

1.4进入natapp官网配置隧道

NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

购买免费隧道。

进入我的隧道进行配置。

将本地端口改为自己项目的端口,点击修改复制authtoken。

在保存的natapp.exe文件目录下新建文件start.bat使用记事本打开编辑内容natapp.exe -authtoken=你的authtoken,保存后退出,双击start.bat文件,弹出黑框则配置成功。

2、内环境配置
2.1导入支付宝api的依赖
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.21</version>
        </dependency>
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.22.110.ALL</version>
        </dependency>
2.2配置application.properties
alipay.app-id= APPID
alipay.app-private-key= 应用私钥
alipay.alipay-public-key= 支付宝公钥
alipay.notify-url= 你的start.bat运行生成的Forwarding/alipay/notify
alipay.returnUrl= 任意url

支付宝公钥在这里,直接复制粘贴即可

3 后端代码
3.1 引入alipay的java配置AplipayConfig.java 
package com.hopeharbor.backend.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 支付宝配置类,读取配置文件中以 "alipay" 为前缀的属性。
 */
@Component
@ConfigurationProperties(prefix = "alipay")
public class AliPayConfig {
    // 支付宝应用ID
    private String appId;

    // 应用私钥
    private String appPrivateKey;

    // 支付宝公钥
    private String alipayPublicKey;

    // 异步通知回调地址(可选)
    private String notifyUrl;

    /**
     * 获取应用ID
     * @return 应用ID
     */
    public String getAppId() {
        return appId;
    }

    /**
     * 设置应用ID
     * @param appId 应用ID
     */
    public void setAppId(String appId) {
        this.appId = appId;
    }

    /**
     * 获取应用私钥
     * @return 应用私钥
     */
    public String getAppPrivateKey() {
        return appPrivateKey;
    }

    /**
     * 设置应用私钥
     * @param appPrivateKey 应用私钥
     */
    public void setAppPrivateKey(String appPrivateKey) {
        this.appPrivateKey = appPrivateKey;
    }

    /**
     * 获取支付宝公钥
     * @return 支付宝公钥
     */
    public String getAlipayPublicKey() {
        return alipayPublicKey;
    }

    /**
     * 设置支付宝公钥
     * @param alipayPublicKey 支付宝公钥
     */
    public void setAlipayPublicKey(String alipayPublicKey) {
        this.alipayPublicKey = alipayPublicKey;
    }

    /**
     * 获取异步通知回调地址
     * @return 异步通知回调地址
     */
    public String getNotifyUrl() {
        return notifyUrl;
    }

    /**
     * 设置异步通知回调地址
     * @param notifyUrl 异步通知回调地址
     */
    public void setNotifyUrl(String notifyUrl) {
        this.notifyUrl = notifyUrl;
    }
}
3.2 编写AliPay.java  接收前端传来的参数
package com.hopeharbor.backend.pojo;

import lombok.Data;

@Data
public class AliPay {
    private String traceNo; //订单编号
    private double totalAmount; //订单的总金额
    private String subject; //支付的名称
    private String alipayTraceNo;
}
3.3 新建AliPayController.java,定义了支付接口支付回调接口
package com.hopeharbor.backend.controller.Alipay;

import cn.hutool.json.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hopeharbor.backend.config.AliPayConfig;
import com.hopeharbor.backend.mapper.ProjectMapper;
import com.hopeharbor.backend.mapper.TransactionMapper;
import com.hopeharbor.backend.pojo.Project;
import com.hopeharbor.backend.pojo.Transaction;
import com.hopeharbor.backend.service.impl.manage.ProjectServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/alipay")
public class AliPayController {

    // 支付宝沙箱网关地址
    private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do";

    private static final String FORMAT ="JSON";

    private static final String CHARSET ="UTF-8";

    // 签名方式
    private static final String SIGN_TYPE = "RSA2";

    @Autowired
    private AliPayConfig aliPayConfig;



    @Resource
    private TransactionMapper transactionMapper;

    @Autowired
    private ProjectMapper projectMapper;

    @GetMapping("/pay")
    public void pay(String orderNo, String pathUrl, HttpServletResponse httpResponse) throws Exception {
        // 查询订单信息
        LambdaQueryWrapper<Transaction> ulqw = new LambdaQueryWrapper<>();
        ulqw.eq(Transaction::getTransactionId,Integer.parseInt(orderNo));
        Transaction transaction = transactionMapper.selectOne(ulqw);
        if(transaction == null ){
            return;
        }

        // 创建client
        DefaultAlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, aliPayConfig.getAppId(), aliPayConfig.getAppPrivateKey(),
                FORMAT, CHARSET, aliPayConfig.getAlipayPublicKey(), SIGN_TYPE);
        //2.创建 Request并设置Request参数
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setNotifyUrl(aliPayConfig.getNotifyUrl());
        JSONObject bizContent = new JSONObject();
        bizContent.set("out_trade_no", transaction.getTransactionId()); // 我们自己生成的订单编号
        bizContent.set("total_amount", transaction.getTransactionAmount());// 订单的总金额
        bizContent.set("subject", transaction.getProjectId());// 支付的名称
        bizContent.set("product_code","FAST_INSTANT_TRADE_PAY"); // 固定配置
        request.setBizContent(bizContent.toString());
        request.setReturnUrl("http://localhost:8080/project/"+pathUrl);// 执行请求,拿到响应的结果,返回给浏览器
        String form = "";
        try {
            form = alipayClient.pageExecute(request).getBody();
        } catch (AlipayApiException e){
            e.printStackTrace();
        }
        httpResponse.setContentType("text/html;charset="+CHARSET);
        httpResponse.getWriter().write(form);
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();

    }

    @PostMapping("/notify")
    public void payNotify(HttpServletRequest request) throws Exception {
        if(request.getParameter( "trade_status").equals("TRADE_SUCCESS")){
            System.out.println("===========支付宝回调============");
            Map<String, String> params = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
            }

            String sign = params.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(params);

            boolean checkSignature = AlipaySignature.rsa256CheckContent(content,sign,aliPayConfig.getAlipayPublicKey(),"UTF-8"); // 验证签名
            // 支付宝验签
            if (checkSignature) {
                // 验签通过
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));


               //在此处编写其他操作代码例如:修改订单状态、更新菜品销量、清空购物车等等。
            }
        }
    }
}

在“/pay”的方法中,需要链接自己项目的订单表,获取表中数据。

3.4  在过滤器和拦截器中忽略掉alipay的系列端口

4.前端代码

调用后端接口并拼接get请求的参数。

console.log(afterSlash)
console.log(data)
window.open("http://84pr3f.natappfree.cc/alipay/pay?orderNo="+data.transactionId+"&pathUrl= "+afterSlash)
5.注意事项
1.需要正确配置自己的应用私钥,应用公钥,支付宝公钥,以及支付宝网关地址。

2.每次启动需要修改natapp生成的地址替换为新的。

3.进行测试

进行支付的为沙箱账号,两次密码都为支付密码。

确认付款后会有两种结果:1.付款成功界面 2.付款成功后跳转到你指定的页面(在前面的application.yml的配置中设置) 如果没有配置就会展示成功界面,配置了就会在几秒后跳转到你配置的界面中去!

至此,祝大家学习快乐!

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Spring Boot和Vue.js应用程序中的支付宝沙箱支付代码示例: 在Spring Boot项目中: 1. 添加以下依赖: ``` <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.3.0.ALL</version> </dependency> ``` 2. 创建一个包含支付宝配置信息的类,例如: ``` @Configuration public class AlipayConfig { private String appId; private String privateKey; private String publicKey; private String notifyUrl; private String returnUrl; private String gatewayUrl; // getters and setters } ``` 3. 创建一个返回AlipayClient的方法: ``` @Bean public AlipayClient getAlipayClient() { return new DefaultAlipayClient( alipayConfig.getGatewayUrl(), alipayConfig.getAppId(), alipayConfig.getPrivateKey(), "json", "UTF-8", alipayConfig.getPublicKey(), "RSA2" ); } ``` 4. 在控制器中创建支付接口,例如: ``` @Autowired private AlipayClient alipayClient; @Autowired private AlipayConfig alipayConfig; @PostMapping("/pay") public String pay(@RequestParam String orderNo, @RequestParam String amount) throws AlipayApiException { AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); alipayRequest.setReturnUrl(alipayConfig.getReturnUrl()); alipayRequest.setNotifyUrl(alipayConfig.getNotifyUrl()); alipayRequest.setBizContent("{\"out_trade_no\":\"" + orderNo + "\"," + "\"total_amount\":\"" + amount + "\"," + "\"subject\":\"" + "测试订单" + "\"," + "\"body\":\"" + "测试订单" + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); String form = alipayClient.pageExecute(alipayRequest).getBody(); return form; } ``` 在Vue.js中: 1. 创建一个按钮来启动支付流程: ``` <template> <div> <button @click="pay">Pay Now</button> </div> </template> ``` 2. 在脚本部分中创建一个调用支付接口的方法: ``` <script> export default { methods: { pay() { axios.post('/api/pay', { orderNo: '123456', amount: '0.01' }) .then(response => { let form = response.data; document.write(form); // 打开支付页面 }) .catch(error => { console.log(error); }); } } } </script> ``` 请注意,以上示例只适用于测试环境,如果您想在生产环境中使用支付宝支付,您需要进行更多的测试和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值