沙箱支付(已解决CONTEXT_INCONSISTENT)

        沙箱技术是一种重要的计算机安全机制,主要用于隔离程序运行环境,以防止恶意代码或应用程序对系统和数据造成破坏。通过限制代码的访问权限和行为,沙箱为程序提供了一个受控且隔离的执行环境。

核心特点
  1. 隔离性沙箱运行的程序被限制在一个受控的环境中,无法直接访问主机系统的其他资源(如文件系统、网络、硬件等)。
  2. 限制权限沙箱会对程序的行为进行权限约束,例如限制文件读写、网络访问和系统调用。
  3. 可控性开发者或系统管理员可以自定义沙箱的环境设置,例如允许或禁止某些操作。
  4. 安全性沙箱能有效阻止恶意软件利用系统漏洞扩展攻击范围,即使代码有漏洞或恶意行为,其影响也局限于沙箱内。
应用场景
  1. Web 浏览器浏览器使用沙箱隔离网页内容和插件,防止恶意网站攻击用户的系统。例如,Google Chrome 为每个标签页和扩展运行一个独立的沙箱进程。
  2. 移动操作系统
    1. AndroidAndroid 使用应用沙箱(App Sandbox)隔离每个应用,限制它们对系统资源和其他应用数据的访问。
    2. iOSiOS 通过类似机制保护用户隐私和系统完整性。
  3. 虚拟化和容器化技术虚拟机(VM)和容器(如 Docker)使用沙箱技术隔离不同的工作负载,确保安全性和独立性。
  4. 安全测试在沙箱环境中运行未知或潜在危险的程序,用于恶意软件分析和漏洞挖掘。
  5. 在线服务云服务使用沙箱隔离用户进程,防止越权或资源滥用。
具体实现

@Data
@Component
@ConfigurationProperties("alipay")
public class ZhiFuBao {
    private String appId;
    private String appPrivateKey;
    private String alipayPublicKey;
    private String notifyUrl;
    private String returnUrl;
    private String signType;
    private String charset;
    private String gatewayUrl;
    private String timeOut = "1m";
}

alipay:
  # 应用ID,标识你的应用
  appId: 应用id
  # 应用私钥,用于签名请求
  appPrivateKey: 私钥
  # 应用公钥,用于验证支付宝的响应
  alipayPublicKey: 公钥
  notifyUrl: http:/127.0.0.1//pay/notify
  # 页面跳转地址,支付完成后跳转到此URL
  returnUrl: https://b.alipay.com/page/home
  # 签名类型,通常为RSA2
  signType: RSA2
  # 字符编码,通常为utf-8
  charset: utf-8
  # 支付宝网关地址,用于发送请求
  gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do

@Data
@Component
public class AlipayTemplate {
    @Autowired
    private ZhiFuBao zhiFuBao;

    public String pay(Orders order) throws AlipayApiException {

        AlipayClient alipayClient = new DefaultAlipayClient(
                zhiFuBao.getGatewayUrl(),
                zhiFuBao.getAppId(),
                zhiFuBao.getAppPrivateKey(),
                "json",
                zhiFuBao.getCharset(),
                zhiFuBao.getAlipayPublicKey(),
                zhiFuBao.getSignType());

        //2、创建一个支付请求,并设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(zhiFuBao.getReturnUrl());// 设置支付成功后的返回地址
        alipayRequest.setNotifyUrl(zhiFuBao.getNotifyUrl());// 设置支付结果通知地址

        String number = UUID.randomUUID().toString();                            // 获取订单ID
        Long interfaceInfoId = order.getId();  // 获取接口信息ID
        BigDecimal money = order.getIndentMoney();                    // 获取支付金额
        Integer payType = order.getPayType();    // 获取支付方式

        // 设置业务内容,包含必要的支付参数
        alipayRequest.setBizContent(
                "{" +
                        "\"out_trade_no\":\"" + number + "\"," +
                        "\"total_amount\":\"" + money + "\"," +
                        "\"subject\":\"" + interfaceInfoId + "\"," +
                        "\"body\":\"" + payType + "\"," +
                        "\"timeout_express\":\"" + zhiFuBao.getTimeOut() + "\"," +
                        "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" +
                        "}"
        );
        // 执行支付请求并获取支付宝的响应
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        //会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
        System.out.println("支付宝的响应:" + result);
        //返回支付宝响应的结果
        return result;
    }

}

@RestController
@RequestMapping("pay")
public class PayController {
    @Resource
    private AlipayTemplate alipayTemplate;
    @Autowired
    private OrdersService ordersService;

    /**
     * 获取支付订单
     * @param id
     * @return
     * @throws AlipayApiException
     */
    @GetMapping(value = "/{id}",produces = "text/html")
    public String pay(@PathVariable("id") Long id) throws AlipayApiException {
        Orders byId = ordersService.getById(id);
        return alipayTemplate.pay(byId);
    }

    /**
     * 确认是否支付成功
     * @param request
     * @return
     * @throws Exception
     */
    @PostMapping("/notify")
    public String notify(HttpServletRequest request) throws Exception {
        if (!"TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
            return "false";
        }
        Map<String, String> map = new HashMap<>();
        request.getParameterMap().keySet().forEach(key -> {
            map.put(key, request.getParameter(key));
        });
        String outTradeNo = map.get("out_trade_no");
        String gmtPayment = map.get("gmt_payment");
        String tradeNo = map.get("trade_no");
        //验证签名
        if (Factory.Payment.Common().verifyNotify(map)){
            LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(Orders::getId, outTradeNo);
            queryWrapper.eq(Orders::getStatus, 5);
            ordersService.update(queryWrapper);
        }
        return "true";
    }
}

这样就成功了

如果出现报错如:

控制台可以打印出来但是页面进不去

因为沙箱不是支付宝正式环境所以会出现这种问题

 1.新建pay.html文件

2.把控制台打印出了的html代码粘到html里

3.然后在进行操作就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值