1. 程式人生 > >Java Web整合支付寶沙箱支付

Java Web整合支付寶沙箱支付

前言

支付寶推出一個沙箱環境,能夠很好的模擬支付寶支付,並且還提供了demo,但demo是一個普通web專案,怎麼整合到Java Web專案呢,其實很簡單

簡單配置請參照支付寶沙箱支付開發文件

一、支付部分

AlipayConfig配置:博主使用的是頁面跳轉同步通知,返回路徑return_url為公網訪問地址,且不能攜帶引數,APPID、商戶私鑰、支付寶公鑰和支付寶閘道器換為自己的。

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

    // 商戶私鑰,您的PKCS8格式RSA2私鑰
    public static String merchant_private_key = "商戶私鑰";
    // 支付寶公鑰,檢視地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
    public static String alipay_public_key = "支付寶公鑰";
    // 伺服器非同步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
    public static String notify_url = "http://工程公網訪問地址";

    // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
    public static String return_url = "http://工程公網訪問地址";

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

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

    // 支付寶閘道器
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

    // 支付寶閘道器
    public static String log_path = "C:\\";


//↑↑↑↑↑↑↑↑↑↑請在這裡配置您的基本資訊↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 寫日誌,方便測試(看網站需求,也可以改成把記錄存入資料庫)
     * @param sWord 要寫入日誌裡的文字內容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 ServiceImpl層:

@Override
public void save(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException{
        //設定編碼
        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        //設定請求引數
        AlipayTradePagePayRequest aliPayRequest = new AlipayTradePagePayRequest();
        aliPayRequest.setReturnUrl(AlipayConfig.return_url);
        aliPayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商戶訂單號,必填
        String order_number = new String(訂單號);
        //付款金額,必填
        String total_amount = new String(付款金額);
        //訂單名稱,必填
        String subject = new String("支付寶沙箱支付(名稱隨便起)");
        aliPayRequest.setBizContent("{\"out_trade_no\":\"" + order_number + "\","
                + "\"total_amount\":\"" + total_amount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //請求
        String result = alipayClient.pageExecute(aliPayRequest).getBody();
        //輸出
        out.println(result);//以下寫自己的訂單程式碼
}

其中:

PrintWriter out = response.getWriter();
out.println(result);

是將支付寶請求輸出在頁面上。

二、退款

 ServiceImpl層:

//退款
@Override
public void refund(HttpServletResponse response,HttpSession session) throws IOException, AlipayApiException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    //獲得初始化的AlipayClient
    AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
    //設定請求引數
    AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
    //商戶訂單號,必填
    String out_trade_no = new String(訂單號);
    //需要退款的金額,該金額不能大於訂單金額,必填
    String refund_amount = new String(退款金額);
    //標識一次退款請求,同一筆交易多次退款需要保證唯一,如需部分退款,則此引數必傳
    String out_request_no = new String(UUID.randomUUID().toString());

    alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
            + "\"refund_amount\":\""+ refund_amount +"\","
            + "\"out_request_no\":\""+ out_request_no +"\"}");
    //請求
    String result = alipayClient.execute(alipayRequest).getBody();
    //輸出
    out.println(result);以下寫自己的訂單退款程式碼
}


退款可按照訂單號或者支付寶訂單號進行退款,博主採用的是按訂單號退款。

結語 

以上是沙箱接入的簡要步驟,希望能幫到其他人。