天天看點

Spring boot 支付寶網站支付

做好準備 直接上代碼

支付前準備

我選用的是證書 也可以用秘鑰 自己把證書轉換成秘鑰就可以了

jar

<dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>4.10.97.ALL</version>
    </dependency>
           

配置類

package com.tm.forum.common.config.alipay;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

/**
 * @author fei
 */
@Configuration
public class AlipayConfig {

    /**
     * 請求*****的位址   
     */
    @Value("${b2b3.b2b3_url}")
    public String B2B3_URL;
    /**
     * 應用公鑰證書路徑
     */
    @Value("${zfb.app_cert_path}")
    public String APP_CERT_PATH;
    /**
     * 支付寶公鑰證書路徑
     */
    @Value("${zfb.alipay_cert_path}")
    public String ALIPAY_CERT_PATH;
    /**
     * 支付寶根證書路徑
     */
    @Value("${zfb.alipay_root_cert_path}")
    public String ALIPAY_ROOT_CERT_PATH;

    /**
     * 應用ID,您的APPID,收款賬号既是您的APPID對應支付寶賬号,開發時使用沙箱提供的APPID,生産環境改成自己的APPID  正式 2021003157678066  沙箱 2021000121679063
     */
    public String app_id = "2021003157678066";

    /**
     * 私鑰,您的PKCS8格式RSA2私鑰(應用私鑰)  正式
     */
      public String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDnb750aXOpnYmfHKm187xPrMtsiItqZrayCWRkshepCDHdd8V/WAnIXYrdrP8s4mrIZac8QxyhFymEEJfSPK0s2od7Idgl4A7h/uYAAT95px2Y857xN7gGvnRLKZKBb2ZNJ5jefGrFhm9Br2bxcLaWuvhF4LSHQ1IDufH7lM9tAkUYUPPUQb5Zacj7hjog1hQgy4hYqnyMAoRMY6nHj7WHb3Hv7HIDqDCFMFJYAQgvCBU+Q414sXx8ko3ZAIAnT1Cgogpq5DYG/K78pJxH/Id1km5PoI545+icG4FrHDQIPFIwMi68zxJYs0wmx76Gx/GWFGeXi20focM5dTNjPetRAgMBAAECggEAEw8Tuxh4Cu7LR4wfubkxt8n+EpkICiIdR3oYh2ZXJndjS96yJ/ODEroJVooJlZOrwYcFh6PrNqTmqVaIeiq/BCOW5p/54dyavSe1nyh7JrSJbnAZlbnF8OA8SXhJ9VjMLuxk3WWXkV6pyNn9+0IR90W8bly74Su9FEt6zwIJNuvB11ZRAizU8upJN7bzpz6evqsL8HWdRfPdRv9/eB51AiVnjQNGzjgu7A7rVIibS+kFb7jv3TvSh8P1MsPEBZqnI8C7zGBS+RELX2JA8C8doFQbB/HpmTcQqBpAF1N8C8I83zKXs7FCRW9ePlEbbyzvNmbzOzjWeVGSTOonUM7wxQKBgQD1wcZt/Qkudu9rL5kIqXzTA6arJr071EC9dIVFJS7o9ckYRyBgZVUY6yXgWCbSeljkuK0Q6d0r1hlgYfIzMT6o6WrkpI1RY1S8gluJiFsKgfoEtTQLJQ1rRdaJmEKTLrkUavtc2KyfjY7dPTvBlNfMIwqWQ5efkFmAV9YnnsXK8wKBgQDxFSt/IRU3z+uVoEeJfnNkDxDpvbATcGj4Rpb7rnorjNbjq/u/lPsMZVlzlzds2MQvriBA+RiJNfwYs8XU+9HplPlo+7JUL1j/H0cc+TZ8jQ5pIGEmioNcIBq+Kg2xZHrpFJiiEHyrTTkI5bAk9zuwmqNIhVPe6bx99fLl3qP5qwKBgGK2VtHPFWUIeNqA3+NO0MihaszMXq4tb2Op7e38JX+FWiTaTPLrQOclbK1UOyPH6PTWCQ4GIcR91uuT7AkL+rM2Lq1wOyM51stxQPtZPdhWpOpHLoRbeaxg/O9/rR4ZYlYFMrn0fkIIRh4vflUfSB7C5Hm+5KQ/AvQ+U9LOP3xpAoGBAK/+d2F4Ykf7Ro1Vk8PBBzX9dahdbMPUJR1SUvhq+A8A4wMT01WZyefTuQiUVMbmO9pe8HbeIdZRDbduzbZdG3G86pKEZDvm0L52M/Dn0an9Q47lL2b2aU0AtuUqSBK/Oqca/Q4aoRhg6IkhPITP48haK2dOxdqOoacGvIqpDOW/AoGAdQO+wMKg0tv9aRScEzwIKyAoQTAk5tcKAl8vcXHxAd2eq/240NRVNP6WexiRULlrTFHywWqCMEZn+T0l/xnpu8AlC1HPE5BEYPCXcmgMyB1ColMRDtFVIjD6QChemIkoPgqz00jBp4EbYRnX+feBnqxEkCh1icYESU4pkTk7RFE=";
   //   public String merchant_private_key = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQChqhAJoPs8Ulrl0hCvzSC1NRwv9jnlSR6bqDRHoalqPLHapT4+zH2Xsm7fo1J1Qbcmy+cronoPIzrkm8qHarMqcPWczNzL3CAoXR8CwXmVJfhXvDIkbKAyfLbiyGFjJGJjGjYeCFJX381Loi9m3Fv15+xgFyjlve4w3kS31aNCRR0PRQmbScVBb16pj/v8kgg0DxncNR4wQddTZyqyjlksbjb7sOSrIBuTxwWW+mk3qHyjbIKh/Gki0urWq3thPbj02OsxSkFC8ChUky9sYAO8Y/11AwHwQQc6+Ba8dEu8JNcdxL8JoxjFtHeYsMUQauAwtuN0DQLHP42piE4JnCHXAgMBAAECggEAfpO6BN//dgaBVyo3mH5Cmr7fuAnQ4N50UanMbT19eUnWc3woFWFlAI5b00x8NoTik0TZVkfby9hoty/nzklTyOoy1LduNUu//fqTWkQEHyxgmskmdXB7qawOQdhksAx/4FpYfwFC/7yicBKnjKECe7JAWCgqBF/GjIqrQUjLkAluTE5GGklqlA6fsS8jTBU5rZjXIcM0B8sTqoODPcI9cNYjsIJvmEy8XUpflr0ze6APVL90YDW159HKWGTJNziSeTad1MCCArrH1iAactk3osXJRNhfQpGGCqz9gBY3TF6slX42rBUUwo3WxwzIMcA2IKwjR350n6Lxn8ikAeoymQKBgQDlbRfvMhdfwXPnzy9648PxVCYeVveQSWn9FsELFysvA+0pW9rPNPiocbaEX2/stS5juL8a7L3R29TVDbpfi/tq+S1Px9V406qyAQQIRtlJ28TNZY2wAi3mA8ub9AEB8u4izjZfdjY0SE/pUcCluoamAyb+kjYXrWbIwLhen7qYrQKBgQC0Y7TJYw7M+/Ka5kGwnGWhjzh36vv1yZeaHEjSE6UA3S1uHj8kNdbiXMlDOSS61oYTfBKSOxayyfhP4DRv5Hn6cER+kuDJKCjJpJsJ77EXFO8rxtSTBEHA+NDzZDU/i7CKaZMhy7ZdvTGpU/TZypT6TzyHPuU9vPV8CBjM6XahEwKBgQDGXio4pi3xnFm0D7702WR9EA4ZY4aQGfnrW7Yz+adb8mAnx4UMbbemJRPzpnUmzI08qeuKwzFo91Mxl7oSjP0oxCP6fEVGQHWxjRFIesG7i6rBEVKN4YSAAb4VrMcGQV7Hd1cp+RLq5684hHg2k22Csu0PZaohlMtvPrrrDd6PzQKBgQCs5xjlIzaPkjsS7/ss7muXtLCaeLiy+Vx/kfbWrY+tyVJ/RyycZ6Kla+xZq88h6veue3FNiqeSDXceELgSO/wS6UMt01j0VrLpvAYDOyUSC7XHzxf4Js9jyNp3QKitVRaNRO6LKTiOlwaf1+JMUxoC5qoMtGOEjrb6AMTMvEZB0wKBgQDOIW/ibztg+LMX4g+ft0gbUDtUq/Ekm/X2kp/uyVGrGaSGeMrN2qP+j1tkwE7WU5jPB1SH+K4I3PfyMTxtwe6wBTAyplczE0t6kbswWrd/TK4+BEWkblMJ8l/u69UAxybVtPQdVQzdXrHeh2lUPOAqs9M/+9fYiP49e71sHBueqw==";

    /**
     * 支付寶公鑰  正式
     */
    public String ZFB_pubile_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm3UA9QGg1aS0f9KKettHMuB8NSHCD/NWQ75wdENvL8WuKeUAdyHj7oGRmli3lCK1SW6jfYvipdhKvuC4ZaYwxToXHf1h0dNaPbUamAM6DBJdd4bKYbe5pQK1urmp8G2pNFSMj8b5nLMwvZ7S3ea89uBaTC669nwLUujXMcgWHjRUc3RcLFiCap3+WJkORjnbp3A7Z3uHPqZil+s696eev1mk2UqWNFWRb0lD5y5EpsIIv9e41Zh+x0duKKg8Md004b/Kj+dbYP2kBui0oW3Sdcx1K3tR60INvUZxrRNUqV1PRIfNQZI4lDnmccRtQf+wfHuZ29x+hPLsuWkRm20p7QIDAQAB";


    /**
     * 伺服器異步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常通路(可以使用natapp内容穿透完成外網設定)
     */
    @Value("${zfb.notify_url}")
    public String notify_url;

    /**
     * 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常通路
     */
    @Value("${zfb.return_url}")
    public String return_url;

    /**
     * 簽名方式  固定
     */
    public String sign_type = "RSA2";

    /**
     * 字元編碼格式  固定
     */
    public String charset = "utf-8";

    /**
     * 支付寶網關   開發環境   正式 https://openapi.alipay.com/gateway.do  沙箱 https://openapi.alipaydev.com/gateway.do
     */
    public String gatewayUrl = "https://openapi.alipay.com/gateway.do";

}
           

網頁支付寶支付

package com.tm.forum.system.service.payment;

import com.alipay.api.AlipayApiException;
import com.tm.forum.system.domain.order.Order;

import javax.servlet.http.HttpServletRequest;
import java.io.FileNotFoundException;
import java.rmi.ServerException;
import java.util.Map;

/**
 * @program: translation-api
 * @description 支付寶支付
 * @author: fei
 * @create: 2022-10-22 23:07
 **/
public interface AliPayService {
    /**
     * 獲得支付頁面
     *
     * @param order @return
     * @param request
     * @return
     */
    String aliPayLine(Order order, HttpServletRequest request) throws Exception;

    /**
     * 擷取異步傳回的參數
     *
     * @param requestParams
     * @return
     */
    Map<String, String> getAliParams(Map requestParams);

//    /**
//     * 異步通知
//     * @param request
//     * @param response
//     * @return
//     */
//    Object notify(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException;

    /**
     * 檢視訂單
     *
     * @return
     */
    String query(String orderNo) throws AlipayApiException, ServerException, FileNotFoundException;

    /**
     * 獲得支付頁面-手機端
     *
     * @param order @return
     * @param request
     * @return
     */
    String mAliPayLine(Order order, HttpServletRequest request) throws Exception;
}

package com.tm.forum.system.service.payment;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.tm.forum.common.config.alipay.AlipayConfig;
import com.tm.forum.common.core.redis.RedisCache;
import com.tm.forum.common.utils.QRCodeUtil;
import com.tm.forum.common.utils.StringUtils;
import com.tm.forum.common.utils.ip.IpUtils;
import com.tm.forum.system.domain.AlipayBean;
import com.tm.forum.system.domain.order.Order;
import com.tm.forum.system.mapper.order.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ClassUtils;
import org.springframework.util.ResourceUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.math.BigDecimal;
import java.rmi.ServerException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @program: translation-api
 * @description 網頁支付寶支付
 * @author: ddz
 * @create: 2021-05-12 23:07
 **/
@Slf4j
@Service
public class AliPayServiceImpl implements AliPayService {
    @Resource
    private OrderMapper payOrderMapper;
    @Resource
    private RedisCache redisUtil;
    @Resource
    private AlipayConfig alipayConfig;


    /**
     * 證書模式   擷取檔案路徑
     *
     * @return
     * @throws FileNotFoundException
     * @throws ServerException
     */
    public String queryPath() throws FileNotFoundException, ServerException {
        String basePath = ResourceUtils.getURL("classpath:").getPath();
        basePath = this.initCart(basePath);
        return basePath;
    }

    /**
     * 證書模式 初始化證書檔案
     *
     * @param basePath
     * @return
     * @throws ServerException
     */
    private String initCart(String basePath) throws ServerException {
        if (basePath.contains("jar!")) {
            if (basePath.startsWith("file:")) {
                basePath = basePath.replace("file:", "");
            }
            String appCertPath = alipayConfig.APP_CERT_PATH;
            this.checkAndcopyCart(basePath, appCertPath);
            String alipayCertPath = alipayConfig.ALIPAY_CERT_PATH;
            this.checkAndcopyCart(basePath, alipayCertPath);
            String alipayRootCertPath = alipayConfig.ALIPAY_ROOT_CERT_PATH;
            this.checkAndcopyCart(basePath, alipayRootCertPath);
        }
        return basePath;
    }

    /**
     * 證書模式下需要
     *
     * @param basePath
     * @param path
     * @throws ServerException
     * @description 查找在該檔案路徑下是否已經存在這個檔案,如果不存在,則拷貝檔案
     */
    private void checkAndcopyCart(String basePath, String path) throws ServerException {
        InputStream cartInputStream = null;
        OutputStream cartOutputStream = null;
        String cartPath = basePath + path;
        File cartFile = new File(cartPath);
        File parentFile = cartFile.getParentFile();
        parentFile.mkdirs();
        try {
            if (!cartFile.exists()) {
                cartInputStream = ClassUtils.getDefaultClassLoader().getResourceAsStream(path);
                cartOutputStream = new FileOutputStream(cartFile);
                byte[] buf = new byte[1024];
                int bytesRead;
                while ((bytesRead = cartInputStream.read(buf)) != -1) {
                    cartOutputStream.write(buf, 0, bytesRead);
                }
                cartInputStream.close();
                cartOutputStream.close();
            }
        } catch (IOException e) {
            throw new ServerException(e.getMessage());
        }
    }

    /**
     * 建構client
     *
     * @return
     * @throws AlipayApiException
     * @throws ServerException
     * @throws FileNotFoundException
     */
    public AlipayClient initAlipayClient() throws AlipayApiException, ServerException, FileNotFoundException {
//        String basePath = this.queryPath();
        // 構造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        // 設定網關位址
        certAlipayRequest.setServerUrl(alipayConfig.gatewayUrl);
        // 設定應用Id
        certAlipayRequest.setAppId(alipayConfig.app_id);
        // 設定應用私鑰
        certAlipayRequest.setPrivateKey(alipayConfig.merchant_private_key);
        // 設定請求格式,固定值json
        certAlipayRequest.setFormat("json");
        // 設定字元集
        certAlipayRequest.setCharset(alipayConfig.charset);
        // 設定簽名類型
        certAlipayRequest.setSignType(alipayConfig.sign_type);
        // 設定應用公鑰證書路徑
        certAlipayRequest.setCertPath(alipayConfig.APP_CERT_PATH);
        // 設定支付寶公鑰證書路徑
        certAlipayRequest.setAlipayPublicCertPath(alipayConfig.ALIPAY_CERT_PATH);
        // 設定支付寶根證書路徑
        certAlipayRequest.setRootCertPath(alipayConfig.ALIPAY_ROOT_CERT_PATH);
        // 構造client
        AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
        return alipayClient;
    }

    /**
     * 獲得支付頁面
     *
     * @param order   @return
     * @param request
     * @return
     */
    @Override
    public String aliPayLine(Order order, HttpServletRequest request) throws Exception {
        AlipayClient alipayClient = this.initAlipayClient();
        // 根據訂單交易号查詢訂單
        order = payOrderMapper.findOutTradeNoOrder(order.getOutTradeNo());
        if (null == order) {
            return "沒有該訂單";
        }
        String out_trade_no = order.getOutTradeNo();
        String total_amount = String.valueOf(order.getRmbPrice());
        String subject = "使用者" + order.getUsername() + "支付訂單";
        String body = subject;

        // 設定請求參數
        AlipayTradePagePayRequest aliRequest = new AlipayTradePagePayRequest();
        // 設定回調位址
        //alipayConfig.return_url
        aliRequest.setReturnUrl(alipayConfig.return_url);
        // alipayConfig.notify_url
        aliRequest.setNotifyUrl(alipayConfig.notify_url);
        // 封裝參數,以及自己需要的參數 如果請求時傳遞了該參數,則傳回給商戶時會回傳該參數。支付寶會在異步通知時将該參數原樣傳回
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo(out_trade_no);

        // 擷取本地Ip  判斷是否是測試ip
        String ip = IpUtils.getHostIp();
        if (StringUtils.isNotBlank(ip)) {
            // ip.contains("192.168.1")||ip.contains("192.168.3.") || ip.contains("127.0.0.1") ||  order.getUserId() == 223695
            if (ip.contains("192.168.1")||ip.contains("192.168.3.") || ip.contains("127.0.0.1")) {
                model.setTotalAmount("0.01");
            } else {
                model.setTotalAmount(total_amount);
            }
        } else {
            model.setTotalAmount(total_amount);
        }
        model.setSubject(subject);
        model.setBody(body);
        model.setTimeoutExpress("5m");
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        String json = JSONObject.toJSONString(order);
        // 附加參數
        model.setPassbackParams(json);
        aliRequest.setBizModel(model);
        //請求,傳回的資料由前端進行解析
        String result = alipayClient.pageExecute(aliRequest).getBody();
        return result;
    }


    /**
     * 擷取阿裡支付回調的資料拼裝 驗簽,該方法在同步回調,異步回調時,必須要用到的
     */
    @Override
    public Map<String, String> getAliParams(Map requestParams) {
        Map<String, String> params = new HashMap<String, String>();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            params.put(name, valueStr);
        }
        return params;
    }


    /**
     * 檢視訂單
     *
     * @param orderNo
     * @return
     */
    @Override
    public String query(String orderNo) throws AlipayApiException, ServerException, FileNotFoundException {
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = this.initAlipayClient();

        AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
        /**請求接口*/
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();
        model.setOutTradeNo(orderNo);
        alipayRequest.setBizModel(model);
        /**轉換格式*/
        String result = alipayClient.certificateExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
        log.info(result);
        JSONObject jsonObject = JSONObject.parseObject(result, JSONObject.class);
        JSONObject resp = (JSONObject) jsonObject.get("alipay_trade_query_response");
        String code = (String) resp.get("code");
        String status = "1";
        if ("40004".equals(code)) {
            status = "3";
        }
        String trade_status = (String) resp.get("trade_status");
        //支付成功||交易結束,不可退款
        if ("TRADE_SUCCESS".equals(trade_status) || "TRADE_FINISHED".equals(trade_status)) {
            status = "2";
            //交易建立,等待買家付款
        } else if ("WAIT_BUYER_PAY".equals(trade_status)) {
            status = "1";
            //未付款交易逾時關閉,或支付完成後全額退款
        } else if ("TRADE_CLOSED".equals(trade_status)) {
            status = "3";
        }
        return status;
    }

    /**
     * 手機端吊起支付
     *
     * @param order    @return
     * @param request1
     * @return
     * @throws Exception
     */
    @Override
    public String mAliPayLine(Order order, HttpServletRequest request1) throws Exception {
        AlipayClient alipayClient = this.initAlipayClient();
        // 根據訂單交易号查詢訂單
        order = payOrderMapper.findOutTradeNoOrder(order.getOutTradeNo());
        if (null == order) {
            return "沒有該訂單";
        }
        String out_trade_no = order.getOutTradeNo();
        String total_amount = String.valueOf(order.getRmbPrice());
        String subject = "使用者" + order.getUsername() + "支付訂單";
        AlipayTradeWapPayRequest aliRequest = new AlipayTradeWapPayRequest();
        // 設定回調位址
        //alipayConfig.return_url
        aliRequest.setReturnUrl(alipayConfig.return_url);
        // alipayConfig.notify_url
        aliRequest.setNotifyUrl(alipayConfig.notify_url);
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", out_trade_no);
        bizContent.put("subject", order.getName());
        // 擷取本地Ip  判斷是否是測試ip
        String ip = IpUtils.getHostIp();
        if (StringUtils.isNotBlank(ip)) {
            // ip.contains("192.168.1")||ip.contains("192.168.3.") || ip.contains("127.0.0.1") ||   order.getUserId() == 223695
            if (ip.contains("192.168.1")||ip.contains("192.168.3.") || ip.contains("127.0.0.1")) {
                bizContent.put("total_amount", "0.01");
            } else {
                bizContent.put("total_amount", total_amount);
            }
        } else {
            bizContent.put("total_amount", total_amount);
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        bizContent.put("product_code", "QUICK_WAP_WAY");
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE, 5);
        bizContent.put("time_expire", sdf.format(nowTime.getTime()));

 商品明細資訊,按需傳入
//JSONArray goodsDetail = new JSONArray();
//JSONObject goods1 = new JSONObject();
//goods1.put("goods_id", "goodsNo1");
//goods1.put("goods_name", "子商品1");
//goods1.put("quantity", 1);
//goods1.put("price", 0.01);
//goodsDetail.add(goods1);
//bizContent.put("goods_detail", goodsDetail);

 擴充資訊,按需傳入
//JSONObject extendParams = new JSONObject();
//extendParams.put("sys_service_provider_id", "2088511833207846");
//bizContent.put("extend_params", extendParams);

        aliRequest.setBizContent(bizContent.toString());
        AlipayTradeWapPayResponse response = alipayClient.pageExecute(aliRequest);
        if (response.isSuccess()) {
            System.out.println("調用成功");
        } else {
            System.out.println("調用失敗");
        }
        String result = response.getBody();
        return result;
    }

}


**回調:**
    /**
     * 異步通知支付結果
     *
     * @param request
     * @return String
     * @throws AlipayApiException
     * @throws ParseException
     */
    @Transactional
    @PostMapping("/asynch")
    public String alipayNotify(HttpServletRequest request) throws Exception {
        logger.info("支付寶異步回調:" + request.getParameterMap().toString());
        // 擷取支付寶的請求資訊
        Map<String, String> map = new HashMap<>();
        Map<String, String[]> requestParams = request.getParameterMap();
        if (requestParams.isEmpty()) {
            return "failure";
        }
        // 将 Map<String,String[]> 轉為 Map<String,String>
        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] + ",";
            }
            map.put(name, valueStr);
        }
        // 驗簽
        boolean signVerified = AlipaySignature.rsaCheckV1(map, alipayConfig.ZFB_pubile_key, alipayConfig.charset,
                alipayConfig.sign_type);
        // 驗簽通過
        if (signVerified) {
            //支付成功後進行操作
            String outTradeNo = map.get("out_trade_no");
            if (StringUtils.isNotBlank(outTradeNo)) {
                Order order = payOrderService.findOutTradeNoOrder(outTradeNo);
                if (null != order && 1 == order.getStatus()) {
                         // 業務代碼
                    }
                }
            }
        }
        return "failure";
    }


           

繼續閱讀