Java實現PC端支付寶網頁支付

最近項目中要使用支付寶網頁支付功能,做個記錄,以後在用到的時候方便自己查看,同事也希望能幫助到你。

先附上支付寶電腦網站支付的官方文檔介紹 https://docs.open.alipay.com/270/105898/

我們這裏調用的是統一收單下單並支付頁面接口,該接口會返回一段html代碼,這個是支付寶自己的網頁支付頁面,前端負責展示,如下圖所示。

進入正題

一 引入依賴

這裏有兩種方式,可以在官方下載jar包導入項目中,也可以在pom文件中引入依賴,我用的是後者

        <!-- 支付寶支付依賴 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>3.7.110.ALL</version>
        </dependency>

二 統一配置類

我這裏使用的是沙箱環境,appid,公鑰,私鑰都是沙箱環境的,登錄下支付寶開放平臺,自己跟着官方說明配置下就可以了。

public class AlipayConfig {

    // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
    public static String app_id = "";

    // 私鑰
    public static String merchant_private_key = "";

    // 支付寶公鑰
    public static String alipay_public_key = "";

    // 支付寶支付後,異步通知路徑
    public static String notify_url ="http://xxxxx/aliPayCallBack";

    // 服務器同步通知頁面路徑,也就是用戶支付成功後跳轉的頁面地址,先用百度代替
    public static String return_url = "https://www.baidu.com";

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

    // 字符編碼格式
    public static String charset = "utf-8";

    // 支付寶網關
    //這個是正式環境網關
    //public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
    //這個是測試環境網關
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";


}

二 調用接口

支付寶調用接口很方便,比微信方便的不是一點半點。我自己封裝了一個server類,便於調用。參數的話可以自己封裝下,我這裏爲了方便就沒封裝,直接拼寫的json格式,其他參數可以自行查看官方api說明

public class AliPayServer {

    public String pay(String orderNo, BigDecimal money) throws AlipayApiException {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl(AlipayConfig.return_url);
        request.setNotifyUrl(AlipayConfig.notify_url);
        //out_trade_no 指的是商戶訂單號,唯一標識
        //product_code 固定的
        //total_amount 支付金額,單位元。
        //subject      主題 可填可不填
        //body         商品詳情,可填可不填
        //timeout_express 二維碼有效期
        request.setBizContent("{" +
                "\"out_trade_no\":\"" + orderNo + "\"," +
                "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
                "\"total_amount\":" + money + "," +
                "\"subject\":\"購買航母\"," +
                "\"body\":\"攻打利器\"," +
                "\"timeout_express\":\"15m\"" +
                "  }");

        AlipayTradePagePayResponse response = alipayClient.pageExecute(request);

        if (response.isSuccess()) {
            System.out.println("調用成功");
        } else {
            System.out.println("調用失敗");
        }
        return response.getBody();
    }
}

支付功能就搞定了,是不是很簡單。下面就差支付寶異步通知回調接口了。

三 回調接口

controller層就不寫了,直接寫實現類的回調方法

    @Override
    public void aliPayCallBack(HttpServletRequest request, HttpServletResponse response) {

        //獲取支付寶POST過來反饋信息
        Map<String, String> params = this.getAliPayResultMap(request);
        //驗證簽名
        boolean flag = false;
        try {
            flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, "RSA2");
        } catch (AlipayApiException e) {
            e.printStackTrace();
            System.out.println("校驗簽名出現異常");
            return;
        }
        // 獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//
        String orderNo = request.getParameter("out_trade_no"); // 獲取訂單編號
        String trade_status = request.getParameter("trade_status"); // 交易狀態
        // 獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
        if (flag) {// 驗證成功
            try {
                if (trade_status.equals("TRADE_SUCCESS")) {
                    System.out.println("支付寶訂單支付成功!");
                }

                //這裏通知支付寶回調成功,不然一直回調
                response.getWriter().write("success");

            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("簽名驗證不通過");
            try {
                response.getWriter().write("failure");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


    /**
     * 獲取支付寶支付異步通知結果
     *
     * @param request
     * @return
     */
    private Map<String, String> getAliPayResultMap(HttpServletRequest request) {
        Map<String, String> params = new HashMap<String, String>();
        Map requestParams = request.getParameterMap();
        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] + ",";
            }
            //亂碼解決,這段代碼在出現亂碼時使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        return params;
    }

到這裏整個流程就結束了,哪裏有錯誤還請及時告知。

如果這篇文章幫您節省了不少時間,並且解決了問題,求賞賜呀!一塊錢也是愛!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章