天天看點

java 支付寶 H5支付使用須知:

目錄

使用須知:

1:maven:

2:編寫工具類  AlipayUtil 

3:調用代碼:

使用須知:

    支付寶的支付較為成熟,開發較為簡單,

    需先在支付寶中開通支付寶H5支付,開通細節暫不描述。。

1:maven:

<dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.alipay</groupId>
            <artifactId>sdk-java</artifactId>
            <version>20170615110434</version>
        </dependency>
           
sdk-java的jar需先下載下傳本地後,再用maven的方式導入
           

手動将本地jar導入到maven庫:https://blog.csdn.net/best_luxi/article/details/82349768

jar 下載下傳位址:https://download.csdn.net/download/qq_41712834/11693619

2:編寫工具類  AlipayUtil 

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;

import java.util.Random;

public class AlipayUtil {
    // 商戶appid
    private static String APPID = "201903156355555";
    // 私鑰 pkcs8格式的
    private static String RSA_PRIVATE_KEY = "MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQDBPf7T9rypQoY9ce7CJmr5B4ATWNPXIySjSRp6WJAh6gr5ZhGj3Vu0FB3IbYMosL6bM7lMe/rHP9GYYU66kRRG6omT2ZjQFH66BAB9w0XqW5g0zL41JjsPup38I4kYoFJqADmVJplOx0InW6ex1D/rpQzycjxQDZYcNstnH1EVOn3OdO/vGMLox/Ta5Ge/TvybShot1xXSWeVbDlrXDaXnEIRaTDs+eBQzN4VnpIQ0Nz89zAqTSQ+aGK5V9YU8XmaIPqI51mv43p4jkPzdpG7L9fwgWw9SmrTuVDb1cPHuWzWCs/uK4PIwYJaIGdHCOe7rRMAkuuueXFIzWW8TWn8rAgMBAAECggEAFiWbygEyOBfWuL4RBhFPG0FfzVfV14dAkLI1JaZ2xlxDa7fl96jL9MSFcU4TxRsUjUcNSpW+9Qz8YYFte3ZbI5GHuPksSVS//WOuBrvVjHl45Tw95GuAQ1o49we/k6H0MA/ciZqF4YB2tXoMqxXPSZt9819iSC52cL9a6nOtYEhDqxmzZu2jcMcdId0wPTWHSNo6+orgwhOLBytmhEuiN9p4iKgU9KwdOrWLFnmFwezObEgqQOOTAEZsQfTrgrIeAeGoJXw3dH4bICGxqxk8pnc7raoeHke+LzIi0JP8s4ymLl3u6+C8+k0f8TrV78rrXuTNMm1AJNyBVUDLtWeG6QKBgQDy0+pyFFHEPr3+nkdAd54ZBGdiLH+Iwn0J2TDAsPexmUKYC8IDZihD1NkdTsgPWv4/8AxieAZaAvQnLrTXxm+vxQP3k/hH7ehiBGGWG+MPJxzJm/8Gn5H4acL7GFUE8yo9kdnQKK5QBYxRfzRoAlZCNOL4Z5n3tGTZv7c+5/u9VQKBgQDLuX9USRqN+HIfphdFQoSqhVlnGWAp8vvepxqn9oAShO2BUJkXeWMkfgo6SdoqOY6aT87FfAdxMLUxjp8SkKHmcfxlNx5bGOq6Sk6Gu+4q7VkBRSRQq3jsRUw29yfPr3I2leE/vN7/c7reiLdcXhM3IZovYOJJxByu0qdNTclKfwKBgQCLVJUdSBNyqx2RT3hKwVfxutknN6kl65KbaAfVSLWXLf1MCNMV6DQKV8MMUfvw86EXRsGUbpIWa8N0CBS0CqRjEoSoNjsr6pKAS0tDOlUaiLK36851GnJDO0wpj1iZMn12Po3gJrd+KvDMglSrqUudSYNCTQ/HVbbYSmz2p12G0QJ/CYyoa0sB86Wxs8oVTSnRDi0yA6Ms3sqFA+rRVQ448qVIfMdKZc9K1msSD6lmkJQiGxmil584uhWOaMRGsJgW/rZZHmV3Bs4kMpdJFwe4Ikr94RFcomtnP6v/5pOvSgzvTZ+470PrMA48tDG0ZqACRpNMpuvjr5GBxrAZJ4Z96QKBgC4S24/NT7t5hCiEhjBc5k9/GxowV0edhcFZ0bX77At409478+i9igqXXfCcNYF2hHt/u4IMTEq4mzK+PqRixT8xvUISih5viWd+za4x9wsQ9UZ3S0Oru5MA0wJHN5nuI6HeSro7vwFw5w2MQtOuTj2LHU1KohgJsNxnzzSJg3pf";
    // 應用公鑰
    public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwT3+0/a8qUKGPXHuwiZq+QeAE1jT1yMko0kaeliQIeoK+WYRo91btBQdyG2DKLC+mzO5THv6xz/RmGFOupEURuqJk9mY0BR+ugQAfcNF6luYNMy+NSY7D7qd/COJGKBSagA5lSaZTsdCJ1unsdQ/66UM8nI8UA2WHDbLZx9RFTp9znTv7xjC6Mf02uRnv078m0oaLdcV0lnlWw5a1w2l5xCEWkw7PngUMzeFZ6SENDc/PcwKk0kPmhiuVfWFPF5miD6iOdZr+N6eI5D83aRuy/X8IFsPUpq07lQ29XDx7ls1grP7iuDyMGCWiBnRwjnu60TAJLrrnlxSM1lvE1p/KwIDAQAB";
    // 支付寶公鑰
    public static String ALIPAY_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlwRHYOJc8Oa55FfpgJmxmdfuuNrf0pnauJm6mG9AS2rujOlwciQqvSnsYrtXe0Mcq9zhAjRUTNzjKEQja457khUzPnhkXwTkbSX7jDvJMKpTzt2Ah8cR/YR9txD4QlG8OLZc9qLjTQLuw4Pfyuh7fx0GfVQWPfWMMQCmZjkLJITqmRyYeVpa3soFGP/+QEdRvItsgaOXLNKr6e3+cwECxu4xMB8VGBY2F7pFWynzGZRYkqdLrjikKv6CVtMvhIHA3VHhrS5+nm9hLg6inktsX0edps3hABkgH+S4in6Xi1i2M4BfM2VUpDWdrM+JSgmL6QhjhyzKyXjERe95Fcan1wIDAQAB";
    // 簽名方式:RSA2
    public static String SIGNTYPE = "RSA2";
    // 請求網關位址
    private static String URL = "https://openapi.alipay.com/gateway.do";
    // 編碼
    public static String CHARSET = "UTF-8";
    // 傳回格式
    private static String FORMAT = "json";
    // 伺服器異步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常通路
    // 注意:異步通知位址必須是外網能通路的
    private static String notify_url = "http://cs:8088/cs/cs/OrderNotifyWeb.active";
    // 頁面跳轉同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義參數, 商戶可以自定義同步跳轉位址
    private static String return_url = "http://cs:8088/cs/cs/OrderReturnWeb.active";

    // 公共請求參數,SDK 公共請求類,包含公共請求參數,以及封裝了簽名與驗簽,開發者無需關注簽名與驗簽
    private static AlipayClient client = new DefaultAlipayClient(URL, APPID, RSA_PRIVATE_KEY, FORMAT, CHARSET,
            ALIPAY_PUBLIC_KEY, SIGNTYPE);

    /**
     * alipay.trade.query(統一收單線下交易查詢)
     * 詳見支付寶支付API:https://docs.open.alipay.com/api_1/alipay.trade.query
     *
     * @param out_trade_no 訂單号
     * @return json字元串
     */
    public static String OrderQuery(String out_trade_no) {
        // 建立API對應的request類
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel bizModel = new AlipayTradeQueryModel();
        bizModel.setOutTradeNo(out_trade_no);
        request.setBizModel(bizModel);
        try {
            // 通過alipayClient調用API,獲得對應的response類
            AlipayTradeQueryResponse response = client.execute(request);
            return response.getBody();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * alipay.trade.refund(統一收單交易退款接口)
     * 詳見支付寶支付API:https://docs.open.alipay.com/api_1/alipay.trade.refund
     *
     * @param out_trade_no  訂單号
     * @param refund_amount 退款金額(小于等于訂單總金額)
     * @return json字元串
     */
    public static String OrderRefund(String out_trade_no, String refund_amount) {
        // 建立API對應的request類
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        AlipayTradeRefundModel bizModel = new AlipayTradeRefundModel();
        bizModel.setOutTradeNo(out_trade_no);
        bizModel.setRefundAmount(refund_amount);
        request.setBizModel(bizModel);
        try {
            // 通過alipayClient調用API,獲得對應的response類
            AlipayTradeRefundResponse response = client.execute(request);
            return response.getBody();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * alipay.trade.pay(統一收單交易支付接口)
     * 詳見支付寶支付API:https://docs.open.alipay.com/api_1/alipay.trade.pay
     *
     * @param out_trade_no 商戶訂單号
     * @param total_amount 支付總金額
     * @param subject      商品名稱
     * @param body         商品描述
     * @return json字元串
     */
    public static String OrderPay(String out_trade_no, String total_amount, String subject, String body) {
        // 商品描述,可空,最大長度128
        if (body.length() > 128) {
            body = body.substring(0, 128);
        }

        // 建立API對應的request類
        AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
        // 封裝請求支付資訊
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
        // 商戶訂單号,商戶網站訂單系統中唯一訂單号,必填
        model.setOutTradeNo(out_trade_no);
        // 訂單名稱,必填
        model.setSubject(subject);
        // 付款金額,必填
        model.setTotalAmount(total_amount);
        // 對交易或商品的描述,最大長度128
        model.setBody(body);
        // 逾時時間 可空
        model.setTimeoutExpress("2m");
        // 銷售産品碼 必填
        model.setProductCode("QUICK_WAP_PAY");
        request.setBizModel(model);

        // 設定異步通知位址
        request.setNotifyUrl(notify_url);
        // 設定同步位址
        request.setReturnUrl(return_url);
        try {
            // 通過alipayClient調用API,獲得對應的response類
            AlipayTradeWapPayResponse response = client.pageExecute(request);
            return response.getBody();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * alipay.trade.fastpay.refund.query(統一收單交易退款查詢)
     * 詳見支付寶支付API:https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query
     *
     * @param out_trade_no 訂單号
     * @return json字元串
     */
    public static String RefundQuery(String out_trade_no) {
        // 建立API對應的request類
        AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
        AlipayTradeFastpayRefundQueryModel bizModel = new AlipayTradeFastpayRefundQueryModel();
        bizModel.setOutTradeNo(out_trade_no);
        bizModel.setOutRequestNo(out_trade_no);
        request.setBizModel(bizModel);
        try {
            // 通過alipayClient調用API,獲得對應的response類
            AlipayTradeFastpayRefundQueryResponse response = client.execute(request);
            return response.getBody();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * alipay.fund.trans.toaccount.transfer(單筆轉賬到支付寶賬戶接口)
     * 詳見支付寶支付API:https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer
     *
     * @param alipayAcco
     *            收款方賬戶
     * @param money
     *            轉賬金額
     * @return json字元串
     */
//	public static String TransAccount(String alipayAcco, String money) {
//		AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();
//		// 注意:除了用支付寶接口提供的模型以外還可以用json字元串的方式設定接口參數,以下就是使用的json字元串設定參數的方式
//		// AlipayFundTransToaccountTransferModel bizModel=new
//		// AlipayFundTransToaccountTransferModel();
//		Map<String, Object> parMap = new HashMap<String, Object>();
//		// 商戶轉賬唯一訂單号。發起轉賬來源方定義的轉賬單據ID,用于将轉賬回執通知給來源方。
//		parMap.put("out_biz_no", OrderId());
//		// 收款方賬戶類型。可取值:
//		// 1、ALIPAY_USERID:支付寶賬号對應的支付寶唯一使用者号。以2088開頭的16位純數字組成。
//		// 2、ALIPAY_LOGONID:支付寶登入号,支援郵箱和手機号格式。
//		parMap.put("payee_type", "ALIPAY_LOGONID");
//		// 收款方賬戶。與payee_type配合使用。付款方和收款方不能是同一個賬戶。
//		parMap.put("payee_account", alipayAcco);
//		// 轉賬金額,機關:元。 隻支援2位小數,小數點前最大支援13位,金額必須大于等于0.1元。
//		parMap.put("amount", money);
//		// 付款方姓名(最長支援100個英文/50個漢字)。顯示在收款方的賬單詳情頁。如果該字段不傳,則預設顯示付款方的支付寶認證姓名或機關名稱。
//		// parMap.put("payer_show_name", "付款方姓名");
//		// 收款方真實姓名(最長支援100個英文/50個漢字)。 如果本參數不為空,則會校驗該賬戶在支付寶登記的實名是否與收款方真實姓名一緻。
//		// parMap.put("payee_real_name", "收款方真實姓名");
//		// 轉賬備注(支援200個英文/100個漢字)。
//		// 當付款方為企業賬戶,且轉賬金額達到(大于等于)50000元,remark不能為空。收款方可見,會展示在收款使用者的收支詳情中。
//		// parMap.put("remark", "轉賬備注");
//		// 将參數轉成JSON字元串設定到請求參數的集合中去
//		request.setBizContent(JSON.toJSONString(parMap));
//		try {
//			// 執行方法
//			AlipayFundTransToaccountTransferResponse response = client.execute(request);
//			return response.getBody();
//		} catch (Exception e) {
//			e.printStackTrace();
//			return null;
//		}
//	}

    /**
     * 生成訂單号(日期加6位随機數)
     *
     * @return
     */
    public static String OrderId() {
        Random rand = new Random();
        return (System.currentTimeMillis()) + "" + (rand.nextInt(900000) + 100000);
    }

}
           

已上代碼隻需要更換 :

商戶appid:申請支付寶h5支付成功後擷取

java 支付寶 H5支付使用須知:

私鑰 :

java 支付寶 H5支付使用須知:

應用公鑰

java 支付寶 H5支付使用須知:

支付寶公鑰

java 支付寶 H5支付使用須知:

異步通知位址:外網可以通路的連結

java 支付寶 H5支付使用須知:

同步通知頁面:外網可以通路的連結

java 支付寶 H5支付使用須知:

3:調用代碼:

package com.vrv.Govern.controller;

import com.alipay.api.internal.util.AlipaySignature;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.vrv.Govern.util.DateUtils;
import com.vrv.Govern.util.PrintWriterUtils;
import com.vrv.Govern.util.ResultEntitylayui;
import com.vrv.Govern.util.gj.AlipayUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


/**
 * @Description: ckx
 * @Author: Mr.chenkexu
 * @Date: 2019.5.27
 */

@Controller
@RequestMapping("/csail")
public class csailcontroller extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @RequestMapping("/index")
    public String index() {
        return "cssail/index";
    }

    @RequestMapping("/pay_result")
    public String pay_result() {
        return "cs/pay_result";
    }

    @RequestMapping(value = "payment", produces = "application/json;charset=utf-8")
    @ResponseBody
    public void listBase_Dataitemdetail(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Gson gson = new GsonBuilder().serializeNulls().setDateFormat(DateUtils.DateFormat4).create();
        ResultEntitylayui mResultEntity = new ResultEntitylayui();
        req.setCharacterEncoding(AlipayUtil.CHARSET);
        String body = req.getParameter("body");
        String subject = req.getParameter("subject");
        String money = req.getParameter("money");

        subject = new String(subject.getBytes("ISO-8859-1"), AlipayUtil.CHARSET);
        String orderPay = AlipayUtil.OrderPay(AlipayUtil.OrderId(), money, subject, body);
        //直接将支付寶傳回的完整的表單html輸出到頁面
        resp.setContentType("text/html;charset=" + AlipayUtil.CHARSET);
        mResultEntity.setData(orderPay);
        PrintWriterUtils.printWriter(resp, gson.toJson(mResultEntity));
    }


    @RequestMapping(value = "OrderNotifyWeb", produces = "application/json;charset=utf-8")
    @ResponseBody
    public void OrderNotifyWeb(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("支付寶付款異步通知===================================");
        PrintWriter pw = null;
        try {
            pw = resp.getWriter();
            //擷取支付寶POST過來回報資訊
            Map<String, String> params = new HashMap<String, String>();
            Map<String, String[]> requestParams = req.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] + ",";
                }
                //亂碼解決,這段代碼在出現亂碼時使用
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), AlipayUtil.CHARSET);
                params.put(name, valueStr);
            }
            //擷取支付寶的通知傳回參數,可參考技術文檔中頁面跳轉同步通知參數清單(以下僅供參考)

            //交易狀态
            String trade_status = new String(req.getParameter("trade_status").getBytes("ISO-8859-1"), AlipayUtil.CHARSET);

            //擷取支付寶的通知傳回參數,可參考技術文檔中頁面跳轉同步通知參數清單(以上僅供參考)//
            //計算得出通知驗證結果
            //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
            //支付驗證
            boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayUtil.ALIPAY_KEY, AlipayUtil.CHARSET, AlipayUtil.SIGNTYPE);
            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為一緻的
                    //如果有做過處理,不執行商戶的業務程式

                    //注意:
                    //如果簽約的是可退款協定,那麼付款完成後,支付寶系統發送該交易狀态通知。
                }

                //——請根據您的業務邏輯來編寫程式(以上代碼僅作參考)——
                System.out.println("驗證成功!");
                pw.flush();
                pw.println("success");
            } else {//驗證失敗
                System.out.println("驗證失敗!");
                pw.flush();
                pw.println("fail");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("【pw=" + pw + "】驗證失敗,出現異常:" + e.getMessage());
            try {
                pw = resp.getWriter();
                if (pw != null) {
                    pw.flush();
                    pw.println("fail");
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }
    }

    @RequestMapping(value = "OrderReturnWeb", produces = "application/json;charset=utf-8")
    @ResponseBody
    public void OrderReturnWeb(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("支付寶付款同步通知===================================");
        try {
            //擷取支付寶的通知傳回參數,可參考技術文檔中頁面跳轉同步通知參數清單(以下僅供參考)
            //擷取支付寶GET過來回報資訊
            Map<String, String> params = new HashMap<String, String>();
            Map<String, String[]> requestParams = req.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"), AlipayUtil.CHARSET);
                params.put(name, valueStr);
            }
            //計算得出通知驗證結果
            //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
            boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayUtil.ALIPAY_KEY, AlipayUtil.CHARSET, AlipayUtil.SIGNTYPE);
            //設定編碼格式
            resp.setCharacterEncoding(AlipayUtil.CHARSET);
            if (verify_result) {//驗證成功
                //請在這裡加上商戶的業務邏輯程式代碼
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
                String string = dateFormat.format(new Date());

                //該頁面可做頁面美工編輯

                resp.sendRedirect("../App_home/index.active#/freeRecode?result=1&ID_number="+params.get("out_trade_no")+"&Lunar_month="+string+"&Money="+params.get("total_amount")+"&CreateDate="+params.get("timestamp"));
                //——請根據您的業務邏輯來編寫程式(以上代碼僅作參考)——
            } else {
                //該頁面可做頁面美工編輯
                resp.sendRedirect("../App_home/index.active#/freeRecode?result=0");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
           

特别說明:

java 支付寶 H5支付使用須知:

這兩個工具類是調用及傳回json資料的工具類,在使用時可換為自己使用的方式調用

java 支付寶 H5支付使用須知:

此工具類為實體類,用于封裝資料,使用時也可換為自己使用的方式,内容示例,

java 支付寶 H5支付使用須知:

其他的jar包找不到,評論,提供maven(額.主要是懶得的一個一個的找了....)

java 支付寶 H5支付使用須知:

到這支付寶的java代碼完結;

編寫一個頁面,

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" href="../common/js/layui/css/layui.css" target="_blank" rel="external nofollow" >
</head>
<body>
<div class="formbox">
    <div class="layui-form">
        <div class="layui-formzi-item ">
            <label class="layui-form-label">
                商品名稱<span class="start">*</span>
            </label>
            <div class="layui-input-block">
                <input type="text" name="subject" lay-verify="required" autocomplete="off" class="layui-input"
                       value="cs">
            </div>
        </div>
        <div class="layui-formzi-item ">
            <label class="layui-form-label">
                商品說明<span class="start">*</span>
            </label>
            <div class="layui-input-block">
                <input type="text" name="body" lay-verify="required" autocomplete="off" class="layui-input" value="cs">
            </div>
        </div>
        <div class="layui-formzi-item ">
            <label class="layui-form-label">
                支付金額<span class="start">*</span>
            </label>
            <div class="layui-input-block">
                <input type="number" name="money" lay-verify="required" autocomplete="off" class="layui-input"
                       value="0.01">
            </div>
        </div>
        <div class="btns">
            <button class="layui-btn layui-btn-primary" onclick="addandupd()">立即送出</button>
        </div>
    </div>
</div>
<div id="ail">

</div>
</body>
<script src="../common/js/jquery-3.3.1.min.js"></script>
<script src="../common/js/layui/layui.all.js"></script>
<script>
    function addandupd() {
        var subject = $("input[name='subject']").val()
        var body = $("input[name='body']").val()
        var money = $("input[name='money']").val()

        $.ajax({
            url: '../csail/payment.active',
            data: {subject: subject, body: body, money: money},
            dataType: 'json',
            type: 'post',
            success: function (data) {
                console.log(data.data);
                $("#ail").html(data.data)
            }
        })

    }
</script>
</html>
           

這個用layui寫jsp頁面,隻是一個form表單的送出,使用自行替換

通路這個頁面:

java 支付寶 H5支付使用須知:

點選立即送出:

java 支付寶 H5支付使用須知:

點選繼續支付,或等待繼續跳轉,

然後一步一步 ,手機号 >> 輸密碼等等   

java 支付寶 H5支付使用須知:

最後會有支付成功頁面 ,過幾秒會跳轉到之前綁定的支付成功的跳轉頁面

ps:不清楚的可私聊哦,

繼續閱讀