Spring Boot 完善订单【五】集成接入支付宝沙箱支付

本文介绍了支付宝提供的沙箱支付环境,如何接入支付宝开放平台,以及如何在沙箱环境中进行支付功能的开发、测试,包括模拟各种支付场景和异步通知的处理。开发者可以在此环境中安全地验证和部署支付功能,然后迁移到生产环境。
摘要由CSDN通过智能技术生成

1.1.什么是沙箱支付

支付宝沙箱支付(Alipay Sandbox Payment)是支付宝提供的一个模拟支付环境,用于开发和测试支付宝支付功能的开发者工具。在真实的支付宝环境中进行支付开发和测试可能涉及真实资金和真实用户账户,而沙箱环境则提供了一个安全、隔离的环境,使开发者能够模拟支付过程,测试支付功能,而不会使用真实资金。

使用支付宝沙箱支付环境,开发者可以模拟各种支付场景,包括交易创建、支付请求、支付回调等,以验证支付功能的正确性和稳定性。沙箱环境中的所有交易和数据都是虚拟的,不会产生真实的交易或资金流动。

支付宝沙箱支付提供了开发者工具和接口,使开发者能够在模拟环境下进行支付流程的调试和测试。开发者可以在沙箱环境中创建测试账户、配置模拟的交易金额和状态,使用沙箱环境中的接口进行支付操作,并模拟支付回调接口接收支付结果。

通过使用支付宝沙箱支付,开发者可以更安全、更有效地进行支付功能的开发和测试,避免了对真实环境的影响和风险。一旦支付功能在沙箱环境中验证通过,开发者可以将其部署到真实的支付宝生产环境中,与真实用户进行交互和支付。

步骤:

1.2接入支付宝开放平台

登陆支付宝:支付宝开放平台

登录成功之后,点击控制台跳转到控制台主页面,将浏览器进度条滚动到最下面,选择沙箱,最后点击沙箱选项即可,如下:

下载密钥生成工具:

小程序文档 - 支付宝文档中心

手机上的模拟扫码:

前端代码:

$(".pay").click(function () {
    //地址,手机号,收货人,支付方式,快递方式
    let el = $(".addres").find(".on")
    let person = el.find(".tit .fl").text()
    let address = el.find(".addCon p:first-child").text()
    let telephone = el.find(".addCon p:last-child").text()
    let pay = $(".way .on").attr('value')
    let mail = $(".dis .on").text()
    let ids = $(this).attr('data-ids')
    let order={
        person,telephone,address,pay,mail,ids
    }
    $.post('/order/add',order,resp=>{
        if(resp.code===200){
    //         进入支付
        let f = confirm("是否去结算?")
        if (f){
            console.log(resp.data)
            location.href="/order/pay?oid="+resp.data
        }else {
            location.href="/"
        }
        }
    },"json")
})

后端代码:

package com.lya.lyaspshop.controller;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.yitter.idgen.YitIdHelper;
import com.lya.lyaspshop.config.AlipayConfig;
import com.lya.lyaspshop.pojo.Goods;
import com.lya.lyaspshop.pojo.Order;
import com.lya.lyaspshop.pojo.OrderItem;
import com.lya.lyaspshop.pojo.User;
import com.lya.lyaspshop.resp.JsonResponseBody;
import com.lya.lyaspshop.service.IOrderItemService;
import com.lya.lyaspshop.service.IOrderService;
import com.lya.lyaspshop.service.impl.GoodsServiceImpl;
import com.lya.lyaspshop.service.impl.RedisServiceImpl;
import com.lya.lyaspshop.vo.CartItemVo;
import com.lya.lyaspshop.vo.OrderVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;


@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RedisServiceImpl redisService;
    @Autowired
    private GoodsServiceImpl goodsService;
    @Autowired
    private IOrderItemService iOrderItemService;
    @Autowired
    private IOrderService iOrderService;

    @RequestMapping("/add")
    public JsonResponseBody<?> toOrder(User user, OrderVo orderVo){
        String ids = orderVo.getIds();
        List<CartItemVo> cartItems = redisService.loadCart(user, ids);
        //所有的购物车中商品的id集合
        List<Long> gds = cartItems.stream().map(CartItemVo::getGid).collect(Collectors.toList());
        //根据集合查询所有对应的商品
        List<Goods> goods = goodsService.listByIds(gds);
        //遍历集合 赋值给对应的对象
        for (Goods g : goods) {
            //找到对应id相同的元素
            CartItemVo vo = cartItems.stream()
                    .filter(v -> Objects.equals(v.getGid(), g.getGid()))
                    .findFirst()
                    .get();
            //将商品g的属性赋值给vo
            BeanUtils.copyProperties(g,vo);
        }
        long oid = YitIdHelper.nextId();
        //增加订单项
        BigDecimal total=new BigDecimal(0);
        List<OrderItem> orderItems=new ArrayList<>();
        for (CartItemVo item : cartItems) {
            //生成订单项
            OrderItem orderItem = new OrderItem();
            //赋值属性
            BeanUtils.copyProperties(item,orderItem);
            orderItem.setQuantity(item.getNum());
            orderItem.setOoid(YitIdHelper.nextId());
            orderItem.setOid(oid);
            //放到一个集合中 批量增加 只会有一次数据库新增
            orderItems.add(orderItem);
            //计算总价 + 当前的小计
            total = total.add(item.cartprice());
        }
        iOrderItemService.saveBatch(orderItems,5);
        //增加订单
        Order order = new Order();
        BeanUtils.copyProperties(orderVo,order);
        order.setOid(oid);
        order.setTotal(total);
        order.setUserId(user.getId());
        order.setStatus(0);
        order.setCreateDate(new Date());
        //订单插入数据库
        iOrderService.save(order);
        //删除缓存元素
//        redisService.removeCart(user,orderVo.getIds());
        return JsonResponseBody.success(oid);
    }
    @RequestMapping("/pay")
    public String pay(User user, String oid){
//        得到结算的订单
        Order order = iOrderService.getById(oid);
//        调用支付页面
//        传来的是表单
        String body = new AlipayConfig().goAlipay(order);
        return body;
    }
//    这里传递来的数据:
    @RequestMapping("/payDone")
    public String payDone(Map<String,String> stringMap){
//        更具成功支付了id来修改状态:
        String oid = stringMap.get("out_trade_no");
        iOrderService.update(new UpdateWrapper<Order>()
                .eq("oid",oid)
                .set("status",1)
                .set("pay_date",new Date()));
//        html语句可以解析,json数据只能响应


        return "<script>\n" +
                "    alert(\"支付成功\")\n" +
                "    location.href=\"/\"\n" +
                "< /script>";
    }

}

这里我们要添加一条代码:(异步通知验签)

//      安全验证:
        Boolean b = Factory.Payment.Common().verifyNotify(stringMap);
        if (!b){
                throw   new BusinessException(JsonResponseStatus.UN_KNOWN);
        }

支付宝接口:(根据自己数据的来)

package com.lya.lyaspshop.config;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.lya.lyaspshop.pojo.Order;
import org.springframework.stereotype.Component;

@Component
public class AlipayConfig {

    private Config aliconfig() {
        Config config = new Config();
        //沙箱支付宝地址
        config.gatewayHost = "openapi-sandbox.dl.alipaydev.com";
        //协议https
        config.protocol = "https";
        //应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        config.appId = "9021000132623583";
        //支付宝公钥
        config.alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmexyLYPEgC4GHxHtCYEhThPEIOjOoMpr8w+bmOtAPpmLg3wrYt4xMFbTP4Wg8wBSWiLHgXtBl32BekY5PD0pOPRZ5VW8rL84uDt+wnCdS9PjXscFmDdzGvp4c1o4vgjQovylrfEf1AlLINYUsXaTp1Nk5IZGRxERLOoTKVI/COY/qyIvhSueS+gIadpgSXNn1R0K73zorJaKVhJS4WKtHfr1246sslQRptinaFiU5PAvQXzt5iaBLdqc3C0UGz1jTHgemaJOIW/SlhsR3CkKif0MX25IoCrwgpzYbv0JDoGG74pzAIOf2LuNaZbQRwQldYokTLVXIlWis1H0UqiYzQIDAQAB";
        //签名方式
        config.signType = "RSA2";
        //商户私钥(应用私钥),您的PKCS8格式RSA2私钥
        config.merchantPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+y08ssgZZsO0y1Xr4dTTD3/Vh9rfpCJ79B5YLJlWhWDZ/+yfGBdyoMtMnPjvuqZNvyloNrxJFAlOc17A6JLEypnJw7G1W7BYIRur0cQx7bVjqqN/lCO9V1dsyOOKhFd+10lbkIgr1DY0FwY4z9bZuniPCRERvKu6M/485Iq68C8vQnBzlXPYSP9STmzLoNtkSDhC/4t5EQus5FEcpNkmXuDM9fGw1J2d4e3SKMZIj4h2+1qByhktEsc5HhKF4RCZK+MR0fhBStF8rRVd2hvDhjcgg3TVoYjvn0fLN2wMX03/lLsIA7+G4ORVxO9RS5PmhCLQab5lqa9YPFpqyoCB7AgMBAAECggEAAUE3CRU2o3pdZPswbtfee/dKFtXXicnLueBF5VbgM0pwOVE+hrfdJqIG73giTsSAurh69SIUna2RPTPR7d/15l5f3ExBv9OXpYBJ5UelDF7AufJYXpo7cLYSVfc3zlVlfj2e4qsypT/skIAgXkkcZQfXNlzaklyW6wh3Oan3ujbau1IQVE/jQBvTdUbAWapFcGJ5RH07MvuBJhz4rG2eAMANxT6JIp8+3rU1Pi//enhb5qTWa5xg+HFtqeNs5T+E0JPzR8ezWYkbCDiXL5iYE1jvoTeyaBfz7iKxRuN1bpgClg/DNB5j3JXo3Ke4SRtLf80WnCQFwV5paeWXUbdsuQKBgQDs7DiGoa1YD3yhXdkXJQONDp2EZb2679d3rC5m5qJsAZi+W+qWe4V7vqqmfJrFjAUe+eNWSaoaUXO9Z5Ps3dcNpFXBnOW0ODpBGcYnT8bu5qqWjRbYFMOAAznh895v/2uNtljWvYTHUrnYEP2ZNkiEzCg9IYgH1L5GWJ8hoPC+jQKBgQDOKDkHfSwELOOIFidOAJqV3qpeo4AzPW5X3GsNKg1fcnN9nRTgUqZhW+woGetXTbbCxuM24uQpVZqpVhZA+TcCBc+kj7yDwkyjhFtO7UQQRSBiyQm0w6qZY+1aKIwf1Z578Nsbcf07FEJjpfxV8YAuF6Vq9PcS1lI4N1rVi5m9JwKBgE6zYUuHpVddPZ8014pSp01SD40NZusUBNUiAv/3mPibxytkyRZXzc1/VpybQ6ZfjsvtYlElgzXe3L2MDJ1gS7GiZ0I7ZippiyBY+XPRklmFkiEUmQQKUa7SY4XlRnyZshaO/g/HQLYditJ1QmiEma5TSwKTguZnCxW/Fo1LMu15AoGBALEc/WHhuB8eMZyI69unySdY1SXZchqTfGkfhRkaN8L4oSAaBAV0/FxIjOsm2Xl32rwcArj01PBuCyHQQ+4uLYQfWfUXR+4qz4zr+UYlsYQI33n/HcefEsIVh6UdkMUI0c/JbXR2yggnr6HMyK1NfcIbrpHlQx974cdKR0+PT9WhAoGBANC3h8Y4FBaKOLcxwHCVDSUrCszCyE+NGvDJI2I5Q7Pjxb5hfHkYR0/cVG5aUJPElWWizaf+7wNCL9XtVCfoUYWZ3DffNs526DL3btN9zby2Tcq7q3NhvRc3ZezSd/XZkGpr7LhWK0wppi5TuvNlhl1VyoGtbMiNUPOrSNWepror";
        return config;
    }

    public String goAlipay(Order order) {
        try {
            // 1. 设置参数(全局只需设置一次)
            Factory.setOptions(aliconfig());
            // 2. 发起API调用(subject商品标题、outTradeNo订单编号、totalAmount总金额、returnUrl异步通知地址)
            AlipayTradePagePayResponse response = Factory.Payment.Page()
                    .pay("商城项目收款",
                            order.getOid().toString(),
                            order.getTotal().toString(),
                            //支付成功之后的异步通知(跳出到自己系统的哪个位置)
                            "http://localhost:8080/order/payDone");
//            支付宝支付页面
            return response.body;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}

注意:

这里的支付宝公钥,应用私钥要填好:失败了多生成几次:

接入成功:

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在SpringBoot接入支付宝沙箱支付,您需要完成以下步骤: 1. 注册一个支付宝沙箱账号并登录到开发者平台(https://openhome.alipay.com/platform/appDaily.htm)。 2. 创建一个应用程序并获取应用程序ID和商户私钥。 3. 在SpringBoot应用程序中添加alipay-sdk依赖项。您可以通过Gradle或Maven添加此依赖项。 4. 创建一个支付工具类,并实现沙箱环境的初始化和支付宝支付API的调用。 5. 在SpringBoot应用程序中创建一个控制器,并定义处理支付请求的端点。 6. 在控制器中使用支付工具类处理支付请求,并返回支付结果。 下面是一个示例支付工具类: ```java import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConstants; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.response.AlipayTradePagePayResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class AlipayUtil { @Value("${alipay.app-id}") private String appId; @Value("${alipay.private-key}") private String privateKey; @Value("${alipay.public-key}") private String publicKey; @Value("${alipay.gateway-url}") private String gatewayUrl; @Value("${alipay.notify-url}") private String notifyUrl; public String pay(String outTradeNo, String subject, String totalAmount) throws Exception { AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, publicKey, AlipayConstants.SIGN_TYPE_RSA2); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.setReturnUrl(notifyUrl); request.setNotifyUrl(notifyUrl); request.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); AlipayTradePagePayResponse response = alipayClient.pageExecute(request); return response.getBody(); } } ``` 在这个示例中,我们使用AlipayClient类创建了一个Alipay客户端,并使用AlipayTradePagePayRequest类设置了支付请求参数。我们还使用AlipayTradePagePayResponse类处理Alipay的支付响应。 下面是一个示例控制器: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class PaymentController { @Autowired private AlipayUtil alipayUtil; @PostMapping("/pay") public String pay(@RequestBody Payment payment) throws Exception { return alipayUtil.pay(payment.getOutTradeNo(), payment.getSubject(), payment.getTotalAmount()); } } ``` 在这个示例中,我们使用@Autowired注释注入了AlipayUtil类,并在/pay端点上定义了处理支付请求的方法。 现在您可以使用Postman或其他HTTP客户端向/pay端点发送JSON请求,以进行支付。以下是一个示例请求: ``` POST /pay HTTP/1.1 Host: localhost:8080 Content-Type: application/json Cache-Control: no-cache { "outTradeNo": "123456789", "subject": "Test Payment", "totalAmount": "100.00" } ``` 在这个示例中,我们向/pay端点发送一个包含outTradeNo,subject和totalAmount的JSON请求。在支付工具类中,我们使用这些参数调用了支付宝API,并返回了支付响应。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值