前后端分离项目接入支付宝沙箱

本文以SpringBoot+Vue为例演示

后端SpringBoot

1.首先引入依赖

<!-- 支付宝sdk包 -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.1.0</version>
</dependency>

<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.48</version>
</dependency>

2.在pojo下创建AliPay和AliPaySync

@Data
public class AliPay {
    private static final long serialVersionUID = 1L;

    private String out_trade_no;
    
    private String subject;
    
    private String total_amount;
    
    private String body;
    
    private String timeout_express= "10m";
    
    private String product_code= "FAST_INSTANT_TRADE_PAY";
}
@Data
public class AliPaySync {
    private String notify_time;
    private String out_trade_no;
    private String trade_status;
    private String trade_no;
}

3.创建Controller层

@RestController
public class PayController {

    @Resource
    private PayService payService;

    /**
     * 阿里支付
     * @param alipay
     * @return
     * @throws AlipayApiException
     */
    @RequestMapping("/alipay")
    public Result alipay(@RequestBody AliPay alipay) throws AlipayApiException {
        String str = payService.aliPay(alipay);
        return Result.ok("跳转支付页面",str);
        //这里Result是自定义的,用于携带消息返回前端,也可以直接用map
    }
    
    @RequestMapping("/AliPayAsyncHandle")
    @ResponseBody
    public String AliPayAsyncHandle(AliPaySync aliPaySync, HttpServletRequest request) throws AlipayApiException {
        return payService.AliPayAsyncHandle(aliPaySync,request);

    }
}

4.创建service层

@Service
public class PayService {
    @Autowired
    private AlipayConfig alipayConfig;

    public String aliPay(AliPay alipay) throws AlipayApiException {
        // 1、获得初始化的AlipayClient
        String serverUrl = alipayConfig.getGatewayUrl();
        String appId = alipayConfig.getAppId();
        String privateKey = alipayConfig.getPrivateKey();
        String format = "json";
        String charset = alipayConfig.getCharset();
        String alipayPublicKey = alipayConfig.getPublicKey();
        String signType = alipayConfig.getSignType();
        String returnUrl = alipayConfig.getReturnUrl();
        String notifyUrl = alipayConfig.getNotifyUrl();
        //System.out.println(appId);
        AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
        // 2、设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        // 页面跳转同步通知页面路径
        alipayRequest.setReturnUrl(returnUrl);
        // 服务器异步通知页面路径
        alipayRequest.setNotifyUrl(notifyUrl);
        // 封装参数
        alipayRequest.setBizContent(JSON.toJSONString(alipay));
        // 3、请求支付宝进行付款,并获取支付结果
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        // 返回付款信息
        return result;
    }
    
    public String AliPayAsyncHandle(AliPaySync aliPaySync, HttpServletRequest request) throws AlipayApiException {
        Map<String,String> params = new HashMap<String, String>();

        Map<String,String[]> requestMap = request.getParameterMap();

        Set<String> set = requestMap.keySet();

        Iterator<String> it = set.iterator();

        while(it.hasNext()){
            String name = it.next();
            String[] values = requestMap.get(name);
            String str = "";
            for(int i= 0;i<values.length;i++){
                if (i < values.length - 1){
                    str+=values[i]+",";
                }else{
                    str+=values[i];
                }
            }
            params.put(name,str);
        }

        //签名验证
        Boolean signVerified = AlipaySignature.
                rsaCheckV1(params,
                        "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAowVRN4EQqgwawwf9IU6WX4wsRRKQWHSVADCNEqK8NvCAcvPHWW7IJyY+APLCTkapZjBGz2r5gY/SlecpIyG63e9nZP5O/HgpIKojNIVailLc+1r2EBh4p1kfrBsQh5tIRu1xDP/1P2ZOKaIMNuci8OFuZ978El3Gp+JUfcmPi5xD084WM5Z5FP/5wRwApZTEa9/cF5h8Sr3puUVJ9H749x8iUrBAStVmm448c9skReMU8vQwPJv59ESCfHeD8TmZdPCKsCdWdtx65y4Huy9b80LRpLTpVV+VAYp7aMtyf6NWjXcvIyYCwskQ8uVfZALl11+lDWXO4/ZcHwFHrHVLeQIDAQAB",
                        "UTF-8",
                        "RSA2");
        

        if (signVerified){
            //判断支付结果
            if (aliPaySync.getTrade_status().equals("TRADE_SUCCESS") || aliPaySync.getTrade_status().equals("TRADE_FINISH")){
                System.out.println("订单号:"+aliPaySync.getOut_trade_no());
                //修改订单状态 未支付-->已支付
                //TODO
                
            }else{
                return "error";
            }
            return "success";
        }else{
            return "error";
        }
    }
}

前端Vue

1.utils下创建request.js工具

import axios from 'axios'



export function request(config) {

  // 创建axios的实例

  const instance = axios.create({


​    timeout: 100000`

  })

  // axios.interceptors  全局拦截

  //请求拦截

  instance.interceptors.request.use(config => { //拦截请求

​    return config //若拦截到需要原封不动的返回

  }, err => { })

  //响应拦截`

  instance.interceptors.response.use(res => {

​    return res.data

  }, err => {

​    console.log(err);

  })

  // 3.发送真正的网络请求

  return instance(config)



}

2.然后在src的api下创建alipay.js用于发送alipay请求

import { request } from "../utils/request";



export function alipay(params){

  return request({

​    method:"post",

​    url:"alipay",

​    data:params

  })

}

3.创建AliPay.vue

<template>
    <div class='' v-html="payHtml">


    </div>

</template>

<script>
export default {
    data () {
        return {
            payHtml:''
        };
    },
    components: {


    },
    created() {
        console.log(this.$route.query.data)
    },
    mounted() {
        this.payHtml = this.$route.query.data
        this.$nextTick(()=> {
            document.forms[0].submit()
        })
    },
    methods: {
        
    },

};
</script>

<style lang='less' scoped>
</style>

4.创建vue完成后到index.js中注册

const routes=[

  {

​    path:'/alipay',

​    component:Alipay

  }

]

5.最后在订单结算界面下添加如下内容

import {alipay} from '../api/alipay'

export default {

  data () {

​    return {

​     out_trade_no: '',

​     subject: '',

​     total_amount: '',

​     body: ''

​    };

  }

}

四个参数:out_trade_no,subject,total_amount,body

通过alipay请求发送到后端,除body可为空外,其他三个参数必填

以下模拟数据,实际场景请换成实际需要的数据

methods: {

   toAliPay(params){

​      var time = new Date()

​      this.out_trade_no = time.getTime().toString();

​      this.subject = "123"

​      this.total_amount = "1000"

​      this.body = ""

​      this.pay({

​       "out_trade_no":this.out_trade_no,

​       "subject":this.subject,

​       "total_amount":this.total_amount,

​       "body":this.body

​      })

   },

   pay(params){

​    alipay(params).then(res=>{

​      this.$router.push({

​      path: '../alipay',

​      query: {

​       data: res.data

​       }

​       });

       

​     })

   }

  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
支付宝沙箱环境是用于模拟支付宝正式环境的测试环境,可以进行支付宝支付的测试。本文将介绍如何使用Spring Boot实现支付宝沙箱支付前后端案例。 1. 创建Spring Boot项目 使用IDEA或Eclipse创建一个新的Spring Boot项目,并添加以下依赖: ``` <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.9.5.ALL</version> </dependency> ``` 2. 配置支付宝沙箱环境 在支付宝开放平台注册并创建应用后,进入沙箱环境,获取沙箱环境的AppID、RSA私钥和公钥,并将其配置到项目中。 ``` #支付宝沙箱环境配置 alipay.gateway=https://openapi.alipaydev.com/gateway.do alipay.app-id=应用ID alipay.private-key=应用私钥 alipay.public-key=支付宝公钥 ``` 3. 创建支付宝支付接口 创建一个支付宝支付接口,用于生成支付宝支付的请求参数。 ``` @RestController public class AlipayController { @Autowired private AlipayProperties alipayProperties; @GetMapping("/alipay") public String alipay(HttpServletRequest request, HttpServletResponse response) throws Exception { //实例化客户端 AlipayClient alipayClient = new DefaultAlipayClient(alipayProperties.getGateway(), alipayProperties.getAppId(), alipayProperties.getPrivateKey(), "json", "utf-8", alipayProperties.getPublicKey(), "RSA2"); //创建API对应的request AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); //在公共参数中设置回跳和通知地址 alipayRequest.setReturnUrl(alipayProperties.getReturnUrl()); alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl()); //填充业务参数 alipayRequest.setBizContent("{\"out_trade_no\":\"" + 1 + "\"," + "\"total_amount\":\"" + 0.01 + "\"," + "\"subject\":\"" + "测试商品" + "\"," + "\"body\":\"" + "测试商品详情" + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); //调用SDK生成表单 String form = alipayClient.pageExecute(alipayRequest).getBody(); //直接将完整的表单html输出到页面 response.setContentType("text/html;charset=utf-8"); response.getWriter().write(form); response.getWriter().flush(); response.getWriter().close(); return null; } } ``` 4. 创建支付宝回调接口 创建一个支付宝回调接口,用于接收支付宝支付的异步通知。 ``` @RestController public class AlipayNotifyController { @PostMapping("/notify") public String notify(HttpServletRequest request) throws Exception { //获取支付宝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 = iter.next(); String[] values = requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } //乱码解决,这段代码在出现乱码时使用 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //调用SDK验证签名 boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayProperties.getPublicKey(), "utf-8", "RSA2"); if (signVerified) { //验证成功,处理业务逻辑 return "success"; } else { //验证失败 return "fail"; } } } ``` 5. 创建支付宝前端页面 创建一个支付宝前端页面,用于调用支付宝支付的接口。 ``` <html> <head> <meta charset="UTF-8"> <title>支付宝沙箱支付</title> </head> <body> <div> <button onclick="alipay()">支付宝支付</button> </div> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script> function alipay() { $.get("/alipay", function (data) { $("body").html(data); }) } </script> </body> </html> ``` 6. 测试支付宝沙箱支付 启动Spring Boot项目,访问支付宝前端页面,点击“支付宝支付”按钮,跳转到支付宝支付页面,输入支付宝账号和密码进行支付支付成功后,会触发支付宝回调接口中的逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值