支付寶支付---服務端

第一次作支付寶支付,辛辛苦苦,打了N多日誌java

首先,下載sdkapi

package com.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;

/* *
 *類名:AlipayNotify
 *功能:支付寶通知處理類
 *詳細:處理支付寶各接口通知返回
 *版本:3.3
 *日期:2012-08-17
 *說明:
 *如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼。
 *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考

 *************************注意*************************
 *調試通知返回時,可查看或改寫log日誌的寫入TXT裏的數據,來檢查通知返回是否正常
 */
public class AlipayNotify {
    private static final Logger logger = LoggerFactory.getLogger(AlipayNotify.class);

    /**
     * 支付寶消息驗證地址
     */
    private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";

    /**
     * 驗證消息是不是支付寶發出的合法消息
     * @param params 通知返回來的參數數組
     * @return 驗證結果
     */
    public static boolean verify(Map<String, String> params) {
        

        //判斷responsetTxt是否爲true,isSign是否爲true
        //responsetTxt的結果不是true,與服務器設置問題、合做身份者ID、notify_id一分鐘失效有關
        //isSign不是true,與安全校驗碼、請求時的參數格式(如:帶自定義參數等)、編碼格式有關
        String responseTxt = "true";
        logger.info("--------------------------------------------verity     notify_id:"+params.get("notify_id"));
        if(params.get("notify_id") != null) {
            String notify_id = params.get("notify_id");
            responseTxt = verifyResponse(notify_id);
            logger.info("---------------------------------------------verity   responseTxt:"+responseTxt);
        }
        String sign = "";
        logger.info("--------------------------------------------verity     sign:"+params.get("sign"));
        if(params.get("sign") != null) {sign = params.get("sign");}
        boolean isSign = getSignVeryfy(params, sign);
        logger.info("--------------------------------------------verity     isSign:"+isSign);
        

        //寫日誌記錄(若要調試,請取消下面兩行註釋)
        //String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回來的參數:" + AlipayCore.createLinkString(params);
        //AlipayCore.logResult(sWord);

        if (isSign && responseTxt.equals("true")) {
            return true;
        } else {
            return false;
        }
    }
    

    /**
     * 根據反饋回來的信息,生成簽名結果
     * @param Params 通知返回來的參數數組
     * @param sign 比對的簽名結果
     * @return 生成的簽名結果
     */
    private static boolean getSignVeryfy(Map<String, String> Params, String sign) {
        //過濾空值、sign與sign_type參數
        Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
        logger.info("++++++++++++++++++++++++++++++++++++++sParaNew:"+sParaNew);
        //獲取待簽名字符串
        String preSignStr = AlipayCore.createLinkString(sParaNew);
        logger.info("++++++++++++++++++++++++++++++++++++++ preSignStr:"+preSignStr);
        //得到簽名驗證結果
        boolean isSign = false;
        if(AlipayConfig.sign_type.equals("RSA")){
            isSign = RSA.verify(preSignStr, sign, AlipayConfig.ali_public_key, AlipayConfig.input_charset);
        }
        return isSign;
    }
    

    /**
    * 獲取遠程服務器ATN結果,驗證返回URL
    * @param notify_id 通知校驗ID
    * @return 服務器ATN結果
    * 驗證結果集:
    * invalid命令參數不對 出現這個錯誤,請檢測返回處理中partner和key是否爲空 
    * true 返回正確信息
    * false 請檢查防火牆或者是服務器阻止端口問題以及驗證時間是否超過一分鐘
    */
    private static String verifyResponse(String notify_id) {
        //獲取遠程服務器ATN結果,驗證是不是支付寶服務器發來的請求

        String partner = AlipayConfig.partner;
        String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "&notify_id=" + notify_id;

        return checkUrl(veryfy_url);
    }

    /**
    * 獲取遠程服務器ATN結果
    * @param urlvalue 指定URL路徑地址
    * @return 服務器ATN結果
    * 驗證結果集:
    * invalid命令參數不對 出現這個錯誤,請檢測返回處理中partner和key是否爲空 
    * true 返回正確信息
    * false 請檢查防火牆或者是服務器阻止端口問題以及驗證時間是否超過一分鐘
    */
    private static String checkUrl(String urlvalue) {
        String inputLine = "";

        try {
            URL url = new URL(urlvalue);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection
                .getInputStream()));
            inputLine = in.readLine().toString();
            
        } catch (Exception e) {
            e.printStackTrace();
            inputLine = "";
        }

        return inputLine;
    }
}

配置,數組

package com.util;

/* *
 *類名:AlipayConfig
 *功能:基礎配置類
 *詳細:設置賬戶有關信息及返回路徑
 *版本:3.3
 *日期:2012-08-10
 *說明:
 *如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼。
 *該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。

 *提示:如何獲取安全校驗碼和合做身份者ID
 *1.用您的簽約支付寶帳號登陸支付寶網站(www.alipay.com)
 *2.點擊「商家服務」(https://b.alipay.com/order/myOrder.htm)
 *3.點擊「查詢合做者身份(PID)」、「查詢安全校驗碼(Key)」

 *安全校驗碼查看時,輸入支付密碼後,頁面呈灰色的現象,怎麼辦?
 *解決方法:
 *一、檢查瀏覽器配置,不讓瀏覽器作彈框屏蔽設置
 *二、更換瀏覽器或電腦,從新登陸查詢。
 */

public class AlipayConfig {

    // 合做身份者ID,以2088開頭由16位純數字組成的字符串
    public static String partner = "2088xxxxxxxxxxxx";
    // 商戶的私鑰
    public static String private_key = "";
    // 支付寶的公鑰(固定)
  public static String ali_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB";
    
    // 支付寶的公鑰(頁面)
//    public static String ali_public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB";
    //支付寶網關
    public static String alipay_url = "https://openapi.alipay.com/gateway.do";
    // 支付寶分配給開發者的應用ID
    public static String app_id = "100000000000000";
    
    public static String content_type = "JSON";
    
    
    // 調試用,建立TXT日誌文件夾路徑
    public static String log_path = "D:\\";
    // 字符編碼格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";
    // 簽名方式 不需修改
    public static String sign_type = "RSA";

}

 

 

其次,瀏覽器

 /**
     * @Title: alipayNotify
     * @Description: 支付寶錢包支付回調
     * @param @param request 設定文件
     * @return void 返回類型
     * @throws
     */
    @RequestMapping("/alipayNotify")
    public void alipayNotify(HttpServletRequest request,HttpServletResponse response) {// 獲取支付寶POST過來反饋信息
        logger.info("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa進入了回調函數!");
        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] + ",";
            }
            // 亂碼解決,這段代碼在出現亂碼時使用。若是mysign和sign不相等也可使用這段代碼轉化
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
       // 獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(如下僅供參考)//
        // 交易建立時間
        String gmtCreate = request.getParameter("gmt_create");
//        log.info("支付寶交易建立時間戳:"+gmtCreate);
        // 交易付款時間
        String gmtPayment = request.getParameter("gmt_payment");
//        log.info("支付寶交易付款時間:"+gmtPayment);
        // 支付寶交易號 String trade_no = new
        // String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

        // 交易狀態
        String trade_status = null;
        // 商戶訂單號
        String out_trade_no = null;
        //交易編號
        String trade_no = null;
        try {
            trade_status = new String(request.getParameter("trade_status")
                    .getBytes("ISO-8859-1"), "UTF-8");//            log.info("支付寶交易狀態:"+trade_status);
            out_trade_no = new String(request.getParameter("out_trade_no")
                    .getBytes("ISO-8859-1"), "UTF-8");
            logger.info("trade_status:"+trade_status+"     ccccccccccccccccccccccccc    " +"out_trade_no:"+out_trade_no);
//            log.info("支付寶交易單號:"+out_trade_no);
            trade_no = new String(request.getParameter("trade_no")
                    .getBytes("ISO-8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//
        logger.info("ccccccccccccccccccccccccc           notify_id:"+params.get("notify_id"));
        logger.info("ccccccccccccccccccccccccc           sign:"+params.get("sign"));
        if (AlipayNotify.verify(params)) {// 驗證成功
            logger.info("dddddddddddddddddddddddddddddddddd 驗證經過");
            // ////////////////////////////////////////////////////////////////////////////////////////
            // 請在這裏加上商戶的業務邏輯程序代碼

            // ——請根據您的業務邏輯來編寫程序(如下代碼僅做參考)——

            if (trade_status.equals("TRADE_FINISHED")) {
                // 判斷該筆訂單是否在商戶網站中已經作過處理
                // 若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
                // 若是有作過處理,不執行商戶的業務程序

                // 注意:
                // 退款日期超過可退款期限後(如三個月可退款),支付寶系統發送該交易狀態通知
                // 請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id爲一致的
            } else if (trade_status.equals("TRADE_SUCCESS")) {
                logger.info("進入TRADE_SUCCESS狀態");
                // 判斷該筆訂單是否在商戶網站中已經作過處理
                // 若是沒有作過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程序
                // 若是有作過處理,不執行商戶的業務程序

                // 注意:
                // 付款完成後,支付寶系統發送該交易狀態通知
                // 請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id爲一致的
               
                
                }
            }

            // ——請根據您的業務邏輯來編寫程序(以上代碼僅做參考)——
            try {
                response.getOutputStream().write("success".getBytes());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  //請不要修改或刪除
        } else {// 驗證失敗
            try {
                response.getOutputStream().write("fail".getBytes());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  //請不要修改或刪除
        }
    }
相關文章
相關標籤/搜索