1. 程式人生 > >支付寶支付接入h5

支付寶支付接入h5

1.支付引數配置

public class AlipayConfig {
    // 商戶appid
public static String APPID = "";
// 私鑰 pkcs8格式的
public static String RSA_PRIVATE_KEY = "";
// 伺服器非同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
public static String notify_url = "";
// 頁面跳轉同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問 商戶可以自定義同步跳轉地址
public static String return_url = ""; // 請求閘道器地址 public static String URL = "https://openapi.alipay.com/gateway.do"; // 編碼 public static String CHARSET = "UTF-8"; // 返回格式 public static String FORMAT = "json"; // 支付寶公鑰 public static String ALIPAY_PUBLIC_KEY = "";// RSA2 public static String SIGNTYPE = "RSA2"; }

2.呼叫支付寶

@RequestMapping("/toPay")
public ModelAndView toPay(HttpServletRequest request, HttpServletResponse response, ModelAndView mav) {
    if (request.getParameter("WIDout_trade_no") != null) {
        // 商戶訂單號,商戶網站訂單系統中唯一訂單號,必填
String out_trade_no = null;
String body = null;
String subject = null;
String total_amount
= null; out_trade_no = request.getParameter("WIDout_trade_no"); // 訂單名稱,必填 subject = request.getParameter("WIDsubject");// 付款金額,必填 total_amount = request.getParameter("WIDtotal_amount"); // 商品描述,可空 body = request.getParameter("WIDbody"); // 超時時間 可空 String timeout_express = "2m"; // 銷售產品碼 必填 String product_code = "QUICK_WAP_WAY"; /**********************/ // SDK 公共請求類,包含公共請求引數,以及封裝了簽名與驗籤,開發者無需關注簽名與驗籤 //呼叫RSA簽名方式 AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE); AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest(); // 封裝請求支付資訊 AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); model.setOutTradeNo(out_trade_no); model.setSubject(subject); model.setTotalAmount(total_amount); model.setBody(body); model.setTimeoutExpress(timeout_express); model.setProductCode(product_code); alipay_request.setBizModel(model); // 設定非同步通知地址 alipay_request.setNotifyUrl(AlipayConfig.notify_url); // 設定同步地址 alipay_request.setReturnUrl(AlipayConfig.return_url); // form表單生產 String form = ""; try { // 呼叫SDK生成表單 form = client.pageExecute(alipay_request).getBody(); response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); response.getWriter().write(form);//直接將完整的表單html輸出到頁面 response.getWriter().flush(); response.getWriter().close(); } catch (AlipayApiException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } mav.setViewName("alipay/pay"); return mav; }

3.支付寶notifyUrl(Post請求)

@ResponseBody
@RequestMapping("/notifyUrl")
public String notifyUrl(HttpServletRequest request, ModelAndView mav) {
    //獲取支付寶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);
}
    //獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以下僅供參考)//
    //商戶訂單號
    //交易狀態
String trade_status = null;
    boolean verify_result=false;
String out_trade_no="";
    try {
    //訂單號
        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");trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");//獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以上僅供參考)//
        //計算得出通知驗證結果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
} catch (UnsupportedEncodingException | AlipayApiException e) {
        e.printStackTrace();
}

    if(verify_result){//驗證成功        //請在這裡加上商戶的業務邏輯程式程式碼if(trade_status.equals("TRADE_FINISHED")){
      //支付流程完成(包括退款)
            //判斷該筆訂單是否在商戶網站中已經做過處理
            //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程式
            //請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id為一致的
            //如果有做過處理,不執行商戶的業務程式
            //注意:
            //如果簽約的是可退款協議,退款日期超過可退款期限後(如三個月可退款),支付寶系統傳送該交易狀態通知
            //如果沒有簽約可退款協議,那麼付款完成後,支付寶系統傳送該交易狀態通知。
} else if (trade_status.equals("TRADE_SUCCESS")){
        //支付完成
//判斷該筆訂單是否在商戶網站中已經做過處理
            //如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程式
            //請務必判斷請求時的total_fee、seller_id與通知時獲取的total_fee、seller_id為一致的
            //如果有做過處理,不執行商戶的業務程式            //注意:
            //如果簽約的是可退款協議,那麼付款完成後,支付寶系統傳送該交易狀態通知。
}return "success";}else{//驗證失敗return "fail";
}
}

4.支付寶returnUrl(支付返回頁面)

@RequestMapping("/returnUrl")
public ModelAndView returnUrl(HttpServletRequest request, ModelAndView mav) {
    //獲取支付寶GET過來反饋資訊
Map<String, String> params = new HashMap<>();
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不相等也可以使用這段程式碼轉化
try {
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
            e.printStackTrace();
}
        params.put(name, valueStr);
}
    String totalAmount=request.getParameter("total_amount");//獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以下僅供參考)//boolean verify_result = false;    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");
//獲取支付寶的通知返回引數,可參考技術文件中頁面跳轉同步通知引數列表(以上僅供參考)//
        //計算得出通知驗證結果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
} catch (UnsupportedEncodingException | AlipayApiException e) {
        e.printStackTrace();
}
    if (verify_result) {//驗證成功
    //支付成功返回頁面
mav.addObject("totalAmount",totalAmount);
mav.setViewName("redirect:../page/orderPay");        //請在這裡加上商戶的業務邏輯程式程式碼
        //該頁面可做頁面美工編輯} else {
        //該頁面可做頁面美工編輯
    //支付失敗返回頁面
    // mav.setViewName("redirect:../page/cardList");
}    return mav;
}