天天看點

支付寶PC支付

必備的Jar支援

<!-- 官網說明位址:https://docs.open.alipay.com/54/103419 -->
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.26.ALL</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>
           

螞蟻金服開放平申請建立應用

申請位址:https://openhome.alipay.com/platform/appManage.htm#/apps           

電腦網站支付快速接入

文檔位址:https://docs.open.alipay.com/270/105899/           

支付寶參數配置(AliPayConfig.class)

package com.pay.alipay;

/**
 * 支付寶支付的配置類
 * RSA1更新到RSA2的方式:https://opensupport.alipay.com/support/knowledge/20069/201602242782#/?_k=xj2m2v
 * @author xxx
 */
public class AliPayConfig {
    
    //支付寶網關(固定)
    public static final String URL = "https://openapi.alipay.com/gateway.do";
    //APPID 即建立應用後生成
    public static final String APP_ID = "";
    //開發者私鑰,由開發者自己生成
    public static final String APP_PRIVATE_KEY = "";
    //參數傳回格式,隻支援json
    public static final String FORMAT = "json";
    //編碼集,支援GBK/UTF-8
    public static final String CHARSET = "UTF-8";
    //支付寶公鑰,由支付寶生成
    public static final String ALIPAY_PUBLIC_KEY = "";
    //商戶生成簽名字元串所使用的簽名算法類型,目前支援RSA2和RSA,推薦使用RSA2
    public static final String SIGN_TYPE = "RSA2";
}           

支付寶下單支付接口

public void doPost(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException {
    //初始化的AlipayClient
    AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, 
            AliPayConfig.APP_ID, AliPayConfig.APP_PRIVATE_KEY,
            AliPayConfig.FORMAT, AliPayConfig.CHARSET, 
            AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
    //建立API對應的request
    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    //支付成功後跳轉的頁面,千萬不要加端口号(同步網頁重定向通知)
    alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp");
    //支付完成設定回調通知位址,千萬不要加端口号(異步伺服器通知)
    alipayRequest.setNotifyUrl("http://domain.com/CallBack/alipayNotifyUrl");
    
    //下單時傳遞的請求參數, 詳情參照(https://docs.open.alipay.com/api_1/alipay.trade.page.pay/)請求參數
    Map<String, Object> bizContentMap = new TreeMap<String, Object>();
    //商戶網站唯一訂單号(必填,類型為String), 最大長度64
    String out_trade_no = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
    bizContentMap.put("out_trade_no", out_trade_no); 
    //商品的标題/交易标題/訂單标題/訂單關鍵字等(必填,類型為String), 最大長度256。
    bizContentMap.put("subject", "Iphone6 16G"); 
    //訂單總金額,機關為元,精确到小數點後兩位(必填,類型為String), 最大長度9。
    bizContentMap.put("total_amount", "0.01"); 
    //銷售産品碼,與支付寶簽約的産品碼名稱(必填,類型為String), 目前僅支援FAST_INSTANT_TRADE_PAY
    bizContentMap.put("product_code", "FAST_INSTANT_TRADE_PAY");  
    //對一筆交易的具體描述資訊。 (非必填,類型為String), 最大長度128。
    bizContentMap.put("body", "新品蘋果手機"); 
    
    //填充業務參數
    alipayRequest.setBizContent(JSONObject.toJSONString(bizContentMap));
    String form="";
    try {
        form = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    httpResponse.setContentType("text/html;charset=" + CHARSET);
    httpResponse.getWriter().write(form);//直接将完整的表單html輸出到頁面
    httpResponse.getWriter().flush();
    httpResponse.getWriter().close();
}           

支付寶下單支付後的回調接口(一定要是否登入都能通路的方法)

/**
 * 支付寶支付完成後異步通知回調函數
 * 送出方式為:Post
 * 注意事項:設定異步通知回調通知的時候,異步通知回調位址不能加端口号!!!
 * AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); 
 * alipayRequest.setNotifyUrl("異步通知回調位址"); 
 * @return 如果通知成功并處理完業務就傳回"success",反之傳回"fail"。
 */
public String alipayNotifyUrl(HttpServletRequest request) {
    try {
        request.setCharacterEncoding("UTF-8");
    } catch (UnsupportedEncodingException e1) {
        e1.printStackTrace();
    }
    //擷取支付寶POST過來回報資訊
    Map<String,String> params = new HashMap<String,String>();
    Map<String,String[]> requestParams = request.getParameterMap();
    for (Iterator<String> 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);
    }
    //調用SDK驗證簽名
    boolean signVerified = false;
    try {
        signVerified = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, 
                AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
    } catch (AlipayApiException e) {
        e.printStackTrace();
    } 
    if(signVerified){
        //交易狀态
        String trade_status = request.getParameter("trade_status");
        if(trade_status.equals("TRADE_FINISHED")){
            //判斷該筆訂單是否在商戶網站中已經做過處理
        }else if (trade_status.equals("TRADE_SUCCESS")){
            //判斷該筆訂單是否在商戶網站中已經做過處理
            System.out.println("訂單号: "+request.getParameter("out_trade_no"));
        }
        return "success";
    }else{
        System.out.println("支付寶回調方法簽名校驗失敗!");
        return "fail";
    }
}