天天看點

Sprinboot支付寶h5支付(java版)

1、準備工作

支付寶開發api(手機網站支付):https://docs.open.alipay.com/api_1/alipay.trade.wap.pay

1.1、登入螞蟻金服開放平台

https://open.alipay.com/platform/manageHome.htm

1.2、選擇控制台 -》網站&移動應用

Sprinboot支付寶h5支付(java版)

1.3建立應用

Sprinboot支付寶h5支付(java版)

1.4添加能力

Sprinboot支付寶h5支付(java版)

1.5下載下傳簽名工具,位址:https://docs.open.alipay.com/291/105971/ ,下載下傳windows,點選:RSA簽名驗簽工具

1.6點選生成秘鑰,生成商戶私鑰和應用秘鑰,并且會以文本(txt)的方式儲存起來

生成秘鑰過程具體看支付寶文檔

1.7 拿到APPID 應用公鑰私鑰支付寶公鑰 回到商家中心 綁定APPID 送出稽核 稽核通過應用處于已上線才能進行測試對接

Sprinboot支付寶h5支付(java版)

2、代碼開發

2.1 引入java sdk包

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.26.ALL</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>           

2.2 開發配置類

不使用應用公鑰

public class PayConfig {
    // 應用ID
    public static String APP_ID = "2021003124687304";
    // 應用私鑰
    public static String MERCHANT_PRIVATE_KEY = "MIIEvQIBADA****";
    // 應用公鑰
    public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9***";
    //    支付寶公鑰
    public static String ZFB_PUBLIC_ID = "MIIBIjANBgkqhkiG9*****";
    //	異步通知   【稍後會進行解釋】
    public static String notify_url = "http://**.**.**/api/pay/aliCallback";

    // 支付成功後出現幾秒的回調頁面
    public static String return_url = "****";

    // 簽名方式
    public static String SIGN_TYPE = "RSA2";

    // 字元編碼格式
    public static String CHARSET = "utf-8";

    //資料類型
    public static String format = "json";

    //銷售産品碼,商家和支付寶簽約的産品碼,預設值為:QUICK_WAP_WAY
    public static String productCode = "QUICK_WAP_WAY";

    // 支付寶網關  alipaydev 為沙箱網關
    public static String GATEWAYURL = "https://openapi.alipay.com/gateway.do";

  
}           

2.3拉起支付代碼

/**
     * 支付寶支付
     *
     * @return
     */
    private String aliPay(NftOrder nftOrder) throws AlipayApiException {
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(PayConfig.GATEWAYURL, PayConfig.APP_ID,
                PayConfig.MERCHANT_PRIVATE_KEY, "json", PayConfig.CHARSET, PayConfig.ZFB_PUBLIC_ID,
                PayConfig.SIGN_TYPE);
        //該筆訂單允許的最晚付款時間
        String timeout = "30m";
        //設定請求參數
        String content = "{\"out_trade_no\":\"" + "系統訂單号"+ "\","
                + "\"total_amount\":\"" + "0.01" + "\","
                + "\"subject\":\"" + "商品名稱") + "\","
                + "\"timeout_express\":\"" + timeout + "\","
                + "\"body\":\"" + "商品描述" + "\","
                + "\"product_code\":\"" + PayConfig.productCode + "\"}";
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        alipayRequest.setReturnUrl(PayConfig.return_url);
        alipayRequest.setNotifyUrl(PayConfig.notify_url);
        alipayRequest.setBizContent(content);
        //請求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return result;
    }           

2.4這時候就會在網頁讓你打開支付寶 進行支付

效果圖

Sprinboot支付寶h5支付(java版)

2.5支付成功回調接口 接口必須對外開放能在公網通路到 這是阿裡雲調用你的接口

@ApiOperation(value = "H5支付支付寶回調", notes = "H5支付支付寶回調")
    @PostMapping(value = "/aliCallback")
    @UnAuthentication
    public JsonResult aliCallback(HttpServletRequest request) throws AlipayApiException {
        System.out.println("/aliCallback進入支付寶PC異步回調");
        Map<String, String> params = new HashMap<String, String>();
        //從支付寶回調的request域中取值
        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] + ",";
            }
            // 亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        System.out.println(request.toString());
        System.out.println(params.toString());
        //商品訂單号
        String out_trade_no = request.getParameter("out_trade_no"); // 商戶訂單号
        String trade_no = request.getParameter("trade_no"); // 流水号
        System.out.println(out_trade_no);
        // 目前交易狀态
        String tradeStatus = request.getParameter("trade_status"); //交易狀态
        // 支付金額
        String totalAmount = request.getParameter("total_amount"); //交易狀态
        // 支付時間
        String payDate = request.getParameter("gmt_payment"); //交易狀态
        //3.簽名驗證(對支付寶傳回的資料驗證,确定是支付寶傳回的)
        boolean signVerified = AlipaySignature.rsaCheckV1(params, PayConfig.ZFB_PUBLIC_ID, PayConfig.CHARSET,
                PayConfig.SIGN_TYPE);
        if (signVerified) {
            System.out.println("驗簽通過");
            //驗簽通過
            if (tradeStatus.equals("TRADE_SUCCESS")) {
                //支付成功後的業務處理
                System.out.println("TRADE_SUCCESS");
                return payService.notifyPcOrder(out_trade_no, trade_no);
            }
        } else { //驗簽不通過
            System.out.println("驗證失敗");
            return new JsonResult().setSuccess(false).setMsg("驗證失敗");
        }
        System.out.println("支付失敗");
        return new JsonResult().setSuccess(false).setMsg("支付失敗");
    }           

 2.6退款接口

3.uniapp支付

uni.request({
    url: '後端支付下單接口位址',
    method: 'POST',
    success: (res)=>{
        // 将接口傳回的form表單顯示到頁面
   		document.querySelector('body').innerHTML = res.data;
   		// 調用submit方法
   		document.forms[0].submit()
    }
});2