支付寶第三方支付

1.支付寶網頁支付java

String goodsAmount = request.getParameter();

String subject = "童裝";
       
//把請求參數打包
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", "alipay.wap.create.direct.pay.by.user");//手機網頁支付
sParaTemp.put("partner", AlipayConfig.partner);
sParaTemp.put("seller_id", AlipayConfig.seller_id);
sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", AlipayConfig.payment_type);
sParaTemp.put("notify_url", AlipayConfig.notify_url);
sParaTemp.put("return_url", AlipayConfig.return_url);
sParaTemp.put("anti_phishing_key", AlipayConfig.anti_phishing_key);
sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);
sParaTemp.put("show_url", "www.abc.com");
sParaTemp.put("out_trade_no", recharge.getOrderNo());//調用支付寶以前生成的商品訂單號
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", goodsAmount);//金額
//sParaTemp.put("body", body);
/*其餘業務參數根據在線開發文檔,添加參數.文檔地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1
//如sParaTemp.put("參數名","參數值");*/

//創建請求,請求成功支付寶服務器返回一段網頁代碼
String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "確認");

//將這段代碼以網頁形式返回給用戶便可進行支付

配置文件web

package alipay.config;

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

public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓請在這裏配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 合做身份者ID,簽約帳號,以2088開頭由16位純數字組成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    public static String partner = "2088************";

    // 收款支付寶帳號,以2088開頭由16位純數字組成的字符串,通常狀況下收款帳號就是簽約帳號
    public static String seller_id = partner;

    // MD5密鑰,安全檢驗碼,由數字和字母組成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    public static String key = "****h2lh2g847h****kuu6fu8cl0****";

    // 服務器異步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問
    public static String notify_url = "http://abc.def.com/";

    // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網能夠正常訪問
    public static String return_url = "http://abc.def.com/";

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

    // 調試用,建立TXT日誌文件夾路徑,見AlipayCore.java類中的logResult(String sWord)打印方法。
    public static String log_path = "C:\\";

    // 字符編碼格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";

    // 支付類型 ,無需修改
    public static String payment_type = "1";

    // 調用的接口名,無需修改,即時到帳
    public static String service = "create_direct_pay_by_user";


//↑↑↑↑↑↑↑↑↑↑請在這裏配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

//↓↓↓↓↓↓↓↓↓↓ 請在這裏配置防釣魚信息,若是沒開通防釣魚功能,爲空便可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 防釣魚時間戳  若要使用請調用類文件submit中的query_timestamp函數
    public static String anti_phishing_key = "";

    // 客戶端的IP地址 非局域網的外網IP地址,如:221.0.0.1
    public static String exter_invoke_ip = "";

//↑↑↑↑↑↑↑↑↑↑請在這裏配置防釣魚信息,若是沒開通防釣魚功能,爲空便可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

}

notify_url不能帶端口號和參數數組

支付成功後異步回調商家服務器安全

/**
     * 支付寶異步通知網頁版
     */
    @RequestMapping("paymentNotifyCallBack")
    public void paymentNotifyCallBack() {
        PrintWriter out = null;
        try {
            out = response.getWriter();
            //獲取支付寶POST過來反饋信息
            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] + ",";
                }
                params.put(name, valueStr);
            }

            //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(如下僅供參考)//
            //商戶訂單號

            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

            //支付寶交易號

            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

            //交易狀態
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

            //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//

            if (AlipayNotify.verify(params)) {//驗證成功
                if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
                    logger.info("支付寶web回調後臺成功......");
                    Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no);
                    recharge.setUpdateDate(new Date());
                    recharge.setTradeNo(trade_no);//交易號
                    recharge.setPayTime(new Date());//付款時間
                    recharge.setPayStatus(1);
                    recharge.setPayType(1);
                    int flag = rechargeService.update(recharge);
                    if (flag > 0) {
                        logger.info("訂單狀態修改爲功.........");
                    } else {
                        logger.info("訂單狀態修改失敗..........");
                    }
                    AlipayCore.logResult("notify_url success!");
                }

            } else {//驗證失敗
                out.print("fail");
            }
        } catch (Exception e) {
            logger.info("接收支付寶異步通知出錯:" + e);
            e.printStackTrace();
        }
    }

同步通知服務器

 

2.支付寶app支付app

//將參數打包成數組
String[] parameters = {
    "partner=\"" + AlipayConfigApp.partner + "\"",
    "seller_id=\"" + AlipayConfigApp.partner + "\"",
    "out_trade_no=\"" + recharge.getOrderNo() + "\"",
    "subject=\"童裝\"",
    "body=\"童裝\"",
    "total_fee=\"" + String.valueOf(recharge.getRechargeAmount()) + "\"",
    "notify_url=\"http://zhaopincmbs.fangshangqu.com/recruitcmbs/alipay/notifyCallBackApp.htm\"",
    "service=\"mobile.securitypay.pay\"",
    "payment_type=\"1\"",
    "input_charset=\"utf-8\""
};
//調用支付寶接口
    String result = AlipayCoreApp.signAllString(parameters);
//將結果返回給客戶端
    resultMap.put("data1", result);
       
outJson(resultMap);

異步回調異步

//獲取支付寶POST過來反饋信息
        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] + ",";
            }
            //亂碼解決,這段代碼在出現亂碼時使用。若是mysign和sign不相等也可使用這段代碼轉化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }

        //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(如下僅供參考)//

        try {

            //商戶訂單號
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
            //支付寶交易號
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

            //交易狀態
            String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

            //異步通知ID
            String notify_id = request.getParameter("notify_id");

            //sign
            String sign = request.getParameter("sign");
            //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以上僅供參考)//

            if (notify_id != "" && notify_id != null) {////判斷接受的post通知中有無notify_id,若是有則是異步通知。
                if (AlipayNotifyApp.verifyResponse(notify_id).equals("true"))//判斷成功以後使用getResponse方法判斷是不是支付寶發來的異步通知。
                {
                    if (AlipayNotifyApp.getSignVeryfy(params, sign))//使用支付寶公鑰驗籤
                    {
                        if (trade_status.equals("TRADE_SUCCESS")) {
                            logger.info("支付寶成功......");
                            //String ... = ...
                            //商戶能夠從params中獲取通知中的數據
                            //而後進行支付成功後的業務邏輯處理
                            System.out.println("訂單" + out_trade_no + "支付成功");
                            logger.info("支付回調後臺成功......");
                            Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no);

                            recharge.setUpdateDate(new Date());
                            recharge.setTradeNo(trade_no);//交易號
                            recharge.setPayTime(new Date());//付款時間
                            recharge.setPayStatus(1);
                            recharge.setPayType(1);
                            int flag = rechargeService.update(recharge);
                            if (flag > 0) {
                                logger.info("訂單狀態修改爲功.........");
                            } else {
                                logger.info("訂單狀態修改失敗..........");
                            }
                            //調試打印log
                            AlipayCoreApp.logResult("notify_url success!", "notify_url");
                        }
                    } else//驗證簽名失敗
                    {
                        out.print("sign fail");
                    }
                } else//驗證是否來自支付寶的通知失敗
                {
                    out.print("response fail");
                }
            } else {
                out.print("no notify message");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
相關文章
相關標籤/搜索