支付宝支付当面付代码

#本地
alipay:
  #支付宝网关(固定)
  url: https://openapi-sandbox.dl.alipaydev.com/gateway.do
  #APPID 即创建应用后生成。
  appId: 9021000131623507
  privateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJfH3rSxt2pxnO9+EUHxDmY8qSySbBox651Eig95k+CxCQH97JeaOF6RVnmA4AWER1CuJxkeTLLSDtC/Ji7YVLXpGCwgTvPLznkYpp7fbJM9F2Sdmn9qNkjHTAI88pGK3TWsIU/YqJ5lLzNsprC/ZCpV0oVlnStn3sgj6CH41Z64CULr982UzxamJ9f2jGb5XzD7YNeMhNU9FKX4kzVmad8HHGqopQaeZeXXnM/AE9O0yp3ONcTlDIisBga2gyWXr8MvOO521KVbFJsbNMn6T4Rmzb3HYEtqero//tJwQLV+2ZjSkZqNseIp87NmELeIwMDDJLGH1cAkdmpRsvrmyVAgMBAAECggEBAIdb90wnfR/NSu1cYf2ekT/2MpVCRaM47t9w2gopzO19iXcJsiYwbcb8u8CIyn84zWTEFzStCsPkYYZezEvhvfbQZXku1xnR+CaqBA7+KxkoksOhAXRxoXtfUN/0LqwxRDYFdvWbD4NtFLUIThx0QNCtP1RmDpoct6Q4K75HbDLHbVsY4p3aEIISyD9t4DBJZ+KjpTkTR+0yo/CDu3QzQCwxeqEugNep4JdDu/KG0BqjZhlxbvQ7HXjg8OjNaS4hNgTqNh/w4hxGVUX/RSIONwxBtL8TmZQcVoY2zzUmTF/F2/+0AEud0ayQeSBVHFVm8iVxPeI2bHpez0q5rG+T4oECgYEA+hehSwMlLSesWs4/mOWtHXb5jTEcEU4q6VqwSj+NE4iHDef249bohV5S1Z34vvvJHrfCWU8o13cWzQnLzL0cOCRuO1vvuM7O/mBjKcZPQyumm7DbYU7wJ28yJb6a8umXyidktrgBOIQYDhWZxW7O95Ptlf3uUfWP4UH7tlpbg4kCgYEAzj7t5UigG89l6l3hdPM9jPOQtNiXaXmq6URScmwnWqtAvfqazI762oQlCy4LCPCOzkH5XwO3Axkhp1JCwAWoOTOiyrMrynRcMphvkYp7H6mj1bjUPF3TdqmKN+NkW1X5kEiwaaOCTHa5J4cqbkp5HPHJDG5aHJqAk6B1QSX7Aa0CgYEAn3YPrt+bhbYlLGUToe7YOdBRgBhPGC2qKM5dV4o77rd/vXspLc8qxVcGJBSstUGf1ElAz2cs2G2jiSr02l++LYH1Ez4klMawrvtQXyOGCIM9oUncJ6iIcexxoiVtcPNGiGwjyGl8xcdb+ycEvCFSMAQPWjLmETYs/mjvES996FkCgYAGkiqyK2YufKUamnMcbsN/QiNSH7RzP9UaKXsW+ism0F33r4xPCB8l5x/nA0iGuGNUXvW6+TtTdfGEizJlO8joSaTeIGc8xAhL9F9Zm7fggl8d6A2a/sJF/ZDRxwTjhBG3bxlvxC3akc3EXKIVcXn6Whm1s65bSvDdwzb5JGSi4QKBgEgvHQsKICeOO253RYQ2LBogrwPk2OyWxD9RTALnf5ZB3vN7l+RfR0R/3qAQfxvUSb0TKwV4PFR9Ep8jpaEgTZqx9zF8ADULm5KEE7wCYLk0O9v7nUs0+z5UkBGk7YjxoUBrZzIGXs68AbmgCxHPDgWg3TbEzfqsplPhz2b8V7Vq
  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyXx960sbdqcZzvfhFB8Q5mPKkskmwaMeudRIoPeZPgsQkB/eyXmjhekVZ5gOAFhEdQricZHkyy0g7QvyYu2FS16RgsIE7zy855GKae32yTPRdknZp/ajZIx0wCPPKRit01rCFP2KieZS8zbKawv2QqVdKFZZ0rZ97II+gh+NWeuAlC6/fNlM8WpifX9oxm+V8w+2DXjITVPRSl+JM1ZmnfBxxqqKUGnmXl15zPwBPTtMqdzjXE5QyIrAYGtoMll6/DLzjudtSlWxSbGzTJ+k+EZs29x2BLanq6P/7ScEC1ftmY0pGajbHiKfOzZhC3iMDAwySxh9XAJHZqUbL65slQIDAQAB
  merchantPrivateKey: |
        MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFQbmttxyHBuiR60wI4i3NkX8b1X3joNds/7/7BMMbYJ+yQZw/cKAmv2RK0b31tc2CFUI5ZRtPQDSmiOBogWAHg6ItUD/JwPHv9c8m5Ss0RJVwVgaRALnma3kZOWDHqIgUNvIqhfUO+mUWMFEQPNCv692So9diFBiLbA36hd1Il/xE7ORqlm/aTQ7RQvr+ReorzW5GZUcd1Fe1mCxJvgrFeckNGTxYEOMc4VuuzguT32iSXKw2xFljrKp4XaVfeZUWLTbPBNnI15VcgOEQSJmo+Kodlmy5M0s17Pg9AvRUU+iz7vq/5BTM2mde1yz402W85RveXHW8IBv30HGyK68dAgMBAAECggEAcSGf73ystNiGfGH56sJlyJeg0gLgv7OYuh/4KGxzxfjlvmOYzF24zGBKkgq3KvwJEIlGwQo23n4RdE3efrFstQKO+fQjkX/CgoB1PXaED+ch2hrMi09iTz/mZUweMIR8/zMAMtk/UkbTwSUW6PwoKC1bl+W1+r9R0Gy5m6w43I+ioSTkdTnR93RkQKjeHxgpqeip5bPm9WQsfXofxLedXcjmtd/z9cqUf26hw9uj5Pghv7r2qgHPKUGjCaR9PK/OZBUPU0Q64l2cHASvP62YIYqkPAl7eXR77x/lSThmnReeT7zhTwGK5k6VF3cn7qU9IQoawt3Kje7OdI+0hUSYVQKBgQD/875VRTxOYplQKbPdH9pCJD7NC3RJMzFNiaqBkSGk0S0mHMwWjZLn1KzUrUSatHpbYLYx8UDUSxytwctQXyZ/wzjfXW/XFqDT7ZWpBpH4EnhFzpRhYfE6SlpwXHR50KhWRMYQC3D7kON/twRLjKU1ibOoD4bhNJoyaoEamMKKJwKBgQDFSyvPbs/qoaXWxX3yrm+g9Zg8BK46LVW0AnylTP8kQQPfZLjGJ5DTRKRoefNBlmOOGOpKbOeSBAWyhUAjq0GsmBhlQP8TOpdfDYga+TfzTcGYAVo4mXd+o5wlGTDnvKC9b4M/vwHo0RsDbhDgjVkh3/S8IDvnXXFvq0bRvGMbGwKBgQDrVs+kEeQQYsJ7Hc0evaHufOstl6GViLeFhtY7Chn4NMkhqQrSldwEw90iNCrHYLi8emEr7JriWCoHbhAmV0bL5NHPN1eVWl4IXwTkBIGEql7iOL7gB7FJGoKrm6cRNpUBtXyz1gFNnfxAOyR83tYtMu740UYAnmBFiP4qWVlOswKBgHl4ZMrcMQsG53IqOfdWysfRLh+Vyidrjh68gT3NADG0DcxW2SS3a4WH96mTm9+/1h/A209jadgOvetB+1F6uX6oTizZLbMLGfOeAzSISJh2QUFzY7cBVf8UgKier+udyWGY7Lgsw+IyDG26MI3wuPYQS0AgoIE8mQDl9T5gvKwNAoGAOn7Tu+20PyOvs7CiZASZ4V4PjaKtD6hSdWCN5ax2sRrrcoon/4o2IGeoY1Sjqp2fsdYQwV1fKgos5XT5m0E71BzVAtGHCXTNhLzANM7c+A8XvQ85cKMRUZzIov8k4yAf5PhF8r5AXVttSB965WHZib7n36rt3QEbdJfV6EK9cd0=
  alipayPublicKey: |
        MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApWuuK9T4krVL6jBSoCMqmdBvJedVy7Y/F8789AL28IcR/+tf5S020yGd9gMG4o8VFSla8JJ2xYa+Zmef2oNH4fipx4O2cgxptrlYabQodx8wR9tb0qG/JE+MlTJrgd14V58TRcO+EUwgkSHvt15szX0juzrlJSPDNRvkhDSDAAY5iAgmYgAKiPvI5uW0VGlVRkFA1gb5C9ue8EE58eelYvyljf+fw2NIavM3+1Y20bPgtnKwh2nEB1txcuCfRYCGBe8AmJEOdtbkabVCUX4OtbryGnoIjMjqdxxAlNzBTqbR9GDUgGeP/51jELRuLCF5c4YrpHZB8TMJ4OXEdESZiwIDAQAB
  format: json
  #编码集,支持 GBK/UTF-8。
  charset: UTF-8
  #生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐使用 RSA2。
  signType: RSA2
  notifyUrl: http://vjazuv.natappfree.cc/notify
  returnUrl: http://ng8mqa.natappfree.cc/callback
package com.chart.web.controller.aliPay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.domain.ExtUserInfo;
import com.alipay.api.domain.InvoiceKeyInfo;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.domain.InvoiceInfo;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.SubMerchant;

import com.alipay.api.FileItem;

import java.util.Base64;
import java.util.ArrayList;
import java.util.List;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.*;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.chart.common.core.domain.AjaxResult;
import com.chart.common.utils.QRCodeUtils;
import com.chart.web.controller.chart.sta.JsonsUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;


@Component
public class AlipayUtil {

    @Value("${alipay.appid}")
    private String appid;
    @Value("${alipay.url}")
    private String url;
    @Value("${alipay.privateKey}")
    private String privateKey;
    @Value("${alipay.publicKey}")
    private String publicKey;

    @Value("${alipay.alipayPublicKey}")
    private String alipayPublicKey;
    @Value("${alipay.merchantPrivateKey}")
    private String merchantPrivateKey;


    @Value("${alipay.charset}")
    private String charset;
    @Value("${alipay.signType}")
    private String signType;

    @Value("${alipay.format}")
    private String format;

    @Value("${alipay.notifyUrl}")
    private String notifyUrl;
    @Value("${alipay.returnUrl}")
    private String returnUrl;


    public void pay(String id, String price, String title, HttpServletResponse response) throws IOException {
        AlipayClient alipayClient = new DefaultAlipayClient(
                url, appid, privateKey, "json", "GBK", alipayPublicKey, "RSA2"
        );
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", price);
        bizContent.put("subject", title);
        bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
        request.setBizContent(bizContent.toString());


        try {
            AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
            if (alipayResponse.isSuccess()) {
                System.out.println("调用成功");

                String qrCodeUrl = alipayResponse.getQrCode();
                System.out.println("二维码路径: " + qrCodeUrl);

                // 设置响应内容类型为图片
                response.setContentType("image/png");

                // 获取输出流并生成二维码
                ServletOutputStream outputStream = response.getOutputStream();
                QRCodeUtils.encode(qrCodeUrl, outputStream);
                outputStream.flush();
            } else {
                System.out.println("调用失败");
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "调用失败");
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "调用异常");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private String convertCentsToYuan(String priceInCents) {
        // 将分转换为元,并保留两位小数
        BigDecimal priceInYuan = new BigDecimal(priceInCents).divide(new BigDecimal(100));
        return priceInYuan.setScale(2, RoundingMode.HALF_UP).toString();
    }


    /**
     * 支付宝当面付支付接口
     *
     * @param id
     * @param priceInCents
     * @param title
     * @return
     * @throws AlipayApiException
     */
    public String aliPayText(String id, String priceInCents, String title) throws AlipayApiException {
        // 转换金额:将分转换为元
        String price = convertCentsToYuan(priceInCents);
        AlipayClient alipayClient = new DefaultAlipayClient(
                url, appid, privateKey, "json", charset, alipayPublicKey, signType
        );
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

        // 设置回调地址
        request.setNotifyUrl(notifyUrl);

        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", price);
        bizContent.put("subject", title);
        bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
        request.setBizContent(bizContent.toString());

        AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
        if (alipayResponse.isSuccess()) {
            System.out.println("调用成功");
            return alipayResponse.getQrCode();
        } else {
            System.out.println("调用失败");
            throw new AlipayApiException("调用失败,错误信息:" + alipayResponse.getSubMsg());
        }
    }

    /**
     * 支付宝自定义支付
     * @param id
     * @param priceInCents
     * @param title
     * @return
     * @throws AlipayApiException
     */

    public String customPayment(String id, String priceInCents, String title) throws AlipayApiException {

        AlipayClient alipayClient = new DefaultAlipayClient(
                url, appid, privateKey, "json", charset, alipayPublicKey, signType
        );
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();

        // 设置回调地址
        request.setNotifyUrl(notifyUrl);

        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", priceInCents);
        bizContent.put("subject", title);
        bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
        request.setBizContent(bizContent.toString());

        AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
        if (alipayResponse.isSuccess()) {
            System.out.println("调用成功");
            return alipayResponse.getQrCode();
        } else {
            System.out.println("调用失败");
            throw new AlipayApiException("调用失败,错误信息:" + alipayResponse.getSubMsg());
        }
    }
    public String aliPay(String id, String priceInCents, String title) throws AlipayApiException {
        // 转换金额:将分转换为元
        String price = convertCentsToYuan(priceInCents);
        AlipayClient alipayClient = new DefaultAlipayClient(
                url, appid, privateKey, "json", "GBK", alipayPublicKey, "RSA2"
        );
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        request.setNotifyUrl(notifyUrl);
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", price);
        bizContent.put("subject", title);
        bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
        request.setBizContent(bizContent.toString());

        AlipayTradePrecreateResponse alipayResponse = alipayClient.execute(request);
        if (alipayResponse.isSuccess()) {
            System.out.println("调用成功");
            return alipayResponse.getQrCode();
        } else {
            System.out.println("调用失败");
            throw new AlipayApiException("调用失败,错误信息:" + alipayResponse.getSubMsg());
        }
    }


    public String pay(String id, String price, String title) {
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "GBK", alipayPublicKey, "RSA2");
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        //        设置支付成功后的回调地址,改地址必须外网可以访问到才行,所以调试该步骤必须要在外网环境,否则会出现支付成功但是却不能回调
//        request.setNotifyUrl("");

        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", price);
        bizContent.put("subject", title);
//        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
        bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
        request.setBizContent(bizContent.toString());

        AlipayTradePrecreateResponse response;
        try {
            response = alipayClient.execute(request);
            if (response.isSuccess()) {
                System.out.println("调用成功");
                String qr_code = response.getQrCode();
                // 需要修改为运行机器上的路径
                String filePath = String.format("d:/qr-%s.png",
                        response.getOutTradeNo());
                System.out.println("filePath:" + filePath);
                return qr_code;
            } else {
                System.out.println("调用失败");
                return "调用失败";
            }
        } catch (AlipayApiException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "调用异常";
        }
    }


    public String query(String id) {
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", publicKey, "RSA2");
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        request.setBizContent(bizContent.toString());
        AlipayTradeQueryResponse response = null;
        String body = null;
        try {
            response = alipayClient.execute(request);
            body = response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return body;
    }


    //回调函数
    public String code(String id, String price, String title) {
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", publicKey, "RSA2");
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setNotifyUrl(notifyUrl);
        request.setReturnUrl(returnUrl);
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", price);
        bizContent.put("subject", title);
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");

        request.setBizContent(bizContent.toString());
        AlipayTradePagePayResponse response = null;
        String form = null;
        try {
            response = alipayClient.pageExecute(request);
            form = response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return form;
    }

    /**
     * 支付宝当面付查询订单状态
     *
     * @param tradeNo
     * @return
     * @throws AlipayApiException
     */
    public AjaxResult queryOrder(String outTradeNo) throws AlipayApiException {
        // 初始化SDK
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", alipayPublicKey, "RSA2");

        // 构造请求参数以调用接口
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();

        // 设置订单支付时传入的商户订单号
        model.setOutTradeNo(outTradeNo);

        // 设置支付宝交易号
        //  model.setTradeNo(outTradeNo);

        // 设置查询选项
        List<String> queryOptions = new ArrayList<String>();
        queryOptions.add("trade_settle_info");
        model.setQueryOptions(queryOptions);

        request.setBizModel(model);
        // 第三方代调用模式下请设置app_auth_token
        // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");

        AlipayTradeQueryResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());

        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
            // System.out.println(diagnosisUrl);
        }
        return AjaxResult.success(response);
    }

    /**
     * 支付宝当面付查询订单状态
     *
     * @param tradeNo
     * @return
     * @throws AlipayApiException
     */
    public String queryOrderTwo(String outTradeNo) throws AlipayApiException {
        // 初始化SDK
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", alipayPublicKey, "RSA2");

        // 构造请求参数以调用接口
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();

        // 设置订单支付时传入的商户订单号
        model.setOutTradeNo(outTradeNo);

        // 设置支付宝交易号
        //  model.setTradeNo(outTradeNo);

        // 设置查询选项
        List<String> queryOptions = new ArrayList<String>();
        queryOptions.add("trade_settle_info");
        model.setQueryOptions(queryOptions);

        request.setBizModel(model);
        // 第三方代调用模式下请设置app_auth_token
        // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");

        AlipayTradeQueryResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());

        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
            // System.out.println(diagnosisUrl);
        }

        return response.getBody() ;
    }
    //以上是当面付

    //以下是网站支付

    /**
     * 电脑网站支付
     *
     * @param id
     * @param price
     * @param title
     * @return
     * @throws AlipayApiException
     */
    public String computerWebsite(String id, String price, String title) throws AlipayApiException {
        // 初始化SDK
        AlipayClient alipayClient = new DefaultAlipayClient(url, appid, privateKey, "json", "UTf-8", alipayPublicKey,  "RSA2");

        // 构造请求参数以调用接口
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();

        // 设置回调地址
        request.setNotifyUrl(notifyUrl);

        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", id);
        bizContent.put("total_amount", price);
        bizContent.put("subject", title);
        bizContent.put("product_code", "FACE_TO_FACE_PAYMENT");
        request.setBizContent(bizContent.toString());
        request.setBizContent(bizContent.toString());

        // 如果需要返回GET请求,请使用
        AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "GET");

        String pageRedirectionData = response.getBody();

            return pageRedirectionData;
        }


    }


package com.chart.web.controller.aliPay;

import cn.hutool.core.util.XmlUtil;
import com.alipay.api.AlipayApiException;
import com.chart.common.core.domain.AjaxResult;
import com.chart.common.utils.QRCodeUtils;
import com.chart.web.controller.chart.sta.JsonsUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

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


@RestController
@RequestMapping
public class AlipayController {

    private AlipayUtil alipayUtil;

    @Autowired
    public void setAlipayUtil(AlipayUtil alipayUtil) {
        this.alipayUtil = alipayUtil;
    }

    /**
     * 支付宝当面付支付接口
     *
     * @param response
     * @param orderNum
     * @return
     */
    @GetMapping(value = "/order/alipay/text")
    @ApiOperation("付费套餐:支付宝支付主接口")
    public AjaxResult createAlipayQRCode(HttpServletResponse response, String orderNum) {
        OutputStream sos = null;
        try {
            if (orderNum == null || orderNum.isEmpty()) {
                return AjaxResult.error("订单号不能为空");
            }

            // 模拟订单信息
            String orderDetails = "商品描述"; // 商品描述
            Integer totalPrice = 1;        // 总金额
            String price = totalPrice.toString(); // 转换为字符串类型

            // 调用支付宝支付接口获取二维码URL
            String qrCodeUrl = alipayUtil.aliPayText(orderNum, price, orderDetails);
            if (qrCodeUrl == null) {
                return AjaxResult.error("获取二维码URL失败!");
            }

            // 设置响应内容类型为图片
            response.setContentType("image/png");

            // 获取输出流并生成二维码
            sos = response.getOutputStream();
            //生成二维码
            QRCodeUtils.encode(qrCodeUrl, sos);
            sos.flush();

            // 返回成功,二维码已经写入响应
            return AjaxResult.success();
        } catch (IOException e) {
            e.printStackTrace();
            return AjaxResult.error("二维码生成失败!");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("调用支付宝接口异常!");
        } finally {
            if (sos != null) {
                try {
                    sos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    @GetMapping("/return")
    public String returnNotice(String out_trade_no, Model model) {
        String query = alipayUtil.query(out_trade_no);
        model.addAttribute("query", query);
        return "query";
    }

    /**
     * 支付宝当面付回调接口
     *
     * @param trade_no
     * @param total_amount
     * @param trade_status
     */
    @PostMapping("/notify")
    public void notifyUrl(String trade_no, String total_amount, String trade_status){
        System.err.println("支付宝订单编号:" + trade_no + ", 订单金额: " + total_amount + ",订单状态:" + trade_status);
        System.out.println("支付宝订单编号:" + trade_no + ", 订单金额: " + total_amount + ",订单状态:" + trade_status);
    }


    /**
     * 支付宝当面付查询支付状态接口
     *
     * @param trade_no
     * @return
     * @throws AlipayApiException
     */
    @GetMapping("queryOrder")
    public AjaxResult queryOrder(String orderNum) throws AlipayApiException {
        AjaxResult queryOrder = alipayUtil.queryOrder(orderNum);

        return AjaxResult.success(queryOrder);
    }


    /**
     * 支付宝当面付查询支付状态接口
     *
     * @param trade_no
     * @return
     * @throws AlipayApiException
     */
    @GetMapping("queryOrderTwo")
    public  HashMap<Object, Object> queryOrderTwo(String orderNum) throws AlipayApiException, JsonProcessingException {
      String queryOrder = alipayUtil.queryOrderTwo(orderNum);
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode = objectMapper.readTree(queryOrder);
        HashMap<Object, Object> map = new HashMap<>();
        map.put("code",200);
        map.put("msg","操作成功");
        map.put("data",jsonNode);
        return map;
    }











    //以上是当面付

    //以下是网站支付


    /**
     * 电脑网站支付
     *
     * @param response
     * @param orderNum
     * @return
     */
    @GetMapping(value = "/order/computerWebsite")
    @ApiOperation("付费套餐:支付宝支付主接口")
    public AjaxResult computerWebsite(HttpServletResponse response, String orderNum) throws AlipayApiException {
        if (orderNum == null || orderNum.isEmpty()) {
            return AjaxResult.error("订单号不能为空");
        }
        // 模拟订单信息
        String orderDetails = "商品描述"; // 商品描述
        Integer totalPrice = 1;        // 总金额
        String price = totalPrice.toString(); // 转换为字符串类型

        // 调用支付宝支付接口获取二维码URL
        String pageRedirectionData = alipayUtil.computerWebsite(orderNum, price, orderDetails);

        return AjaxResult.success(pageRedirectionData);
    }

}
    /**
     * 支付宝自定义付款
     *
     * @param response
     * @param orderNum
     * @return
     */
    @GetMapping(value = "/alipay/customPayment")
    @ApiOperation("付费套餐:支付宝支付主接口")
    public AjaxResult customPayment(HttpServletResponse response, String orderNum, String price, String orderDetails) {
        OutputStream sos = null;
        try {
            if (orderNum == null || orderNum.isEmpty()) {
                return AjaxResult.error("订单号不能为空");
            }
            // 调用支付宝支付接口获取二维码URL
            String qrCodeUrl = alipayUtil.customPayment(orderNum, price, orderDetails);
            if (qrCodeUrl == null) {
                return AjaxResult.error("获取二维码URL失败!");
            }
            // 设置响应内容类型为图片
            response.setContentType("image/png");
            // 获取输出流并生成二维码
            sos = response.getOutputStream();
            //生成二维码
            QRCodeUtils.encode(qrCodeUrl, sos);
            sos.flush();
            // 返回成功,二维码已经写入响应
            return AjaxResult.success();
        } catch (IOException e) {
            e.printStackTrace();
            return AjaxResult.error("二维码生成失败!");
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("调用支付宝接口异常!");
        } finally {
            if (sos != null) {
                try {
                    sos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
package com.chart.common.utils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.util.Hashtable;
import java.util.Random;

/**
 * 生成主题颜色
 *
 * @author chart
 */
public class QRCodeUtils
{
    private static final String CHARSET = "utf-8";
    private static final String FORMAT_NAME = "JPG";
    // 二维码尺寸
    private static final int QRCODE_SIZE = 300;
    // LOGO宽度
    private static final int WIDTH = 60;
    // LOGO高度
    private static final int HEIGHT = 60;

    private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        if (imgPath == null || "".equals(imgPath)) {
            return image;
        }
        // 插入图片
        insertImage(image, imgPath, needCompress);
        return image;
    }

    /**
     * 插入LOGO
     *
     * @param source
     *            二维码图片
     * @param imgPath
     *            LOGO图片地址
     * @param needCompress
     *            是否压缩
     * @throws Exception
     */
    private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
        File file = new File(imgPath);
        if (!file.exists()) {
            System.err.println("" + imgPath + "   该文件不存在!");
            return;
        }
        Image src = ImageIO.read(new File(imgPath));
        int width = src.getWidth(null);
        int height = src.getHeight(null);
        if (needCompress) { // 压缩LOGO
            if (width > WIDTH) {
                width = WIDTH;
            }
            if (height > HEIGHT) {
                height = HEIGHT;
            }
            Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            src = image;
        }
        // 插入LOGO
        Graphics2D graph = source.createGraphics();
        int x = (QRCODE_SIZE - width) / 2;
        int y = (QRCODE_SIZE - height) / 2;
        graph.drawImage(src, x, y, width, height, null);
        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
        graph.setStroke(new BasicStroke(3f));
        graph.draw(shape);
        graph.dispose();
    }

    /**
     * 生成二维码(内嵌LOGO)
     *
     * @param content
     *            内容
     * @param imgPath
     *            LOGO地址
     * @param destPath
     *            存放目录
     * @param needCompress
     *            是否压缩LOGO
     * @throws Exception
     */
    public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
        BufferedImage image = createImage(content, imgPath, needCompress);
        mkdirs(destPath);
        String file = new Random().nextInt(99999999) + ".jpg";
        ImageIO.write(image, FORMAT_NAME, new File(destPath + "/" + file));
    }

    /**
     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
     *
     * @author lanyuan Email: mmm333zzz520@163.com
     * @date 2013-12-11 上午10:16:36
     * @param destPath
     *            存放目录
     */
    public static void mkdirs(String destPath) {
        File file = new File(destPath);
        // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
        if (!file.exists() && !file.isDirectory()) {
            file.mkdirs();
        }
    }

    /**
     * 生成二维码(内嵌LOGO)
     *
     * @param content
     *            内容
     * @param imgPath
     *            LOGO地址
     * @param destPath
     *            存储地址
     * @throws Exception
     */
    public static void encode(String content, String imgPath, String destPath) throws Exception {
        encode(content, imgPath, destPath, false);
    }

    /**
     * 生成二维码
     *
     * @param content
     *            内容
     * @param destPath
     *            存储地址
     * @param needCompress
     *            是否压缩LOGO
     * @throws Exception
     */
    public static void encode(String content, String destPath, boolean needCompress) throws Exception {
        encode(content, null, destPath, needCompress);
    }

    /**
     * 生成二维码
     *
     * @param content
     *            内容
     * @param destPath
     *            存储地址
     * @throws Exception
     */
    public static void encode(String content, String destPath) throws Exception {
        encode(content, null, destPath, false);
    }

    /**
     * 生成二维码(内嵌LOGO)
     *
     * @param content
     *            内容
     * @param imgPath
     *            LOGO地址
     * @param output
     *            输出流
     * @param needCompress
     *            是否压缩LOGO
     * @throws Exception
     */
    public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
            throws Exception {
        BufferedImage image = createImage(content, imgPath, needCompress);
        ImageIO.write(image, FORMAT_NAME, output);
    }

    /**
     * 生成二维码
     *
     * @param content
     *            内容
     * @param output
     *            输出流
     * @throws Exception
     */
    public static void encode(String content, OutputStream output) throws Exception {
        encode(content, null, output, false);
//        encode(content, null, "C:\\Users\\Vivi\\Desktop\\1.png", false);
    }




//    public static void main(String[] args) throws Exception {
//        String text = "weixin://wxpay/bizpayurl?pr=o1RjkBTz3";
        encode(text, "/Users/noahshen/Downloads/6BFAADD4-256D-447B-B742-1E1DFF11094F_meitu_1.png",
                "/Users/noahshen/Downloads", true);
//         encode(text, null, "C:\\Users\\Vivi\\Desktop\\1.png");
//    }
}

在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值