支付寶支付-PC電腦網站支付


支付產品全面升級(更新時間:2017/05/05 ),若您使用的是老接口,請移步老版本即時到賬文檔

支持沙盒環境的測試

此項目已開源歡迎Start、PR、發起Issues一起討論交流共同進步
https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay

1、有圖有真相

使用手機掃碼進行支付

i統一收單下單並支付頁面接口alipay.trade.page.pay

手機掃碼進行支付

PC 端登錄賬號進行支付

登錄賬號進行支付

進去支付寶收銀台

輸入交易密碼進行支付

付款完成

正在跳轉到商戶頁面

商戶頁面、這里只是將簽名驗證的結果顯示在頁面上

PC支付兩次扣款記錄

2、如何申請PC電腦網站支付

費率、申請條件、簽約、使用場景 傳送門接入指引

簽約流程

3、如何快速接入PC電腦網站支付

如果你是使用新版本接入就比較方便了,因為官方提供了開放平台服務端SDK

3.1 接口調用流程圖

主要涉及到的接口有:

3.2 支付接口alipay.trade.page.pay封裝

初始化接口

static {
		alipayClient = new DefaultAlipayClient(SERVICE_URL, APP_ID, PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
	}

封裝支付接口並將SDK生成的表單響應給頁面

/**
	 * 電腦網站支付(PC支付)
	 * @param model
	 * @param notifyUrl
	 * @param returnUrl
	 * @return
	 * @throws AlipayApiException
	 * @throws IOException 
	 */
	public static void tradePage(HttpServletResponse httpResponse, AlipayTradePayModel model, String notifyUrl, String returnUrl) throws AlipayApiException, IOException{
		AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
		request.setBizModel(model);
		request.setNotifyUrl(notifyUrl);
		request.setReturnUrl(returnUrl);
		String form  = alipayClient.pageExecute(request).getBody();//調用SDK生成表單
		httpResponse.setContentType("text/html;charset=" + CHARSET);
		httpResponse.getWriter().write(form);//直接將完整的表單html輸出到頁面
	    httpResponse.getWriter().flush();
	    httpResponse.getWriter().close();
	}
3.3 其他支付接口封裝

可以參考 支付寶支付-常用支付API詳解(查詢、退款、提現等)

3.4 封裝測試
/**
	 * PC支付
	 */
	public void pcPay(){
		try {
			String totalAmount = "88.88"; 
			String outTradeNo =StringUtils.getOutTradeNo();
			log.info("pc outTradeNo>"+outTradeNo);
			
			String returnUrl = AliPayApi.NOTIFY_DOMAIN + "/alipay/return_url";
			String notifyUrl = AliPayApi.NOTIFY_DOMAIN + "/alipay/notify_url";
			AlipayTradePayModel model = new AlipayTradePayModel();
			
			model.setOutTradeNo(outTradeNo);
			model.setProductCode("FAST_INSTANT_TRADE_PAY");
			model.setTotalAmount(totalAmount);
			model.setSubject("Javen PC支付測試");
			model.setBody("Javen IJPay PC支付測試");
			
			AliPayApi.tradePage(getResponse(),model , notifyUrl, returnUrl);
		} catch (Exception e) {
			e.printStackTrace();
			
		}
		
	}

異步通知處理

public void notify_url() {
		try {
			// 獲取支付寶POST過來反饋信息
			Map<String, String> params = AliPayApi.toMap(getRequest());

			for (Map.Entry<String, String> entry : params.entrySet()) {
				System.out.println(entry.getKey() + " = " + entry.getValue());
			}

			boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
					AliPayApi.SIGN_TYPE);

			if (verify_result) {// 驗證成功
				// TODO 請在這里加上商戶的業務邏輯程序代碼 異步通知可能出現訂單重復通知 需要做去重處理
				System.out.println("notify_url 驗證成功succcess");
				renderText("success");
				return;
			} else {
				System.out.println("notify_url 驗證失敗");
				// TODO
				renderText("failure");
				return;
			}
		} catch (AlipayApiException e) {
			e.printStackTrace();
			renderText("failure");
		}
	}

同步商戶頁面驗簽,這里只是返回驗簽的狀態

public void return_url() {
		try {
			// 獲取支付寶GET過來反饋信息
			Map<String, String> map = AliPayApi.toMap(getRequest());
			for (Map.Entry<String, String> entry : map.entrySet()) {
				System.out.println(entry.getKey() + " = " + entry.getValue());
			}

			boolean verify_result = AlipaySignature.rsaCheckV1(map, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,
					AliPayApi.SIGN_TYPE);

			if (verify_result) {// 驗證成功
				// TODO 請在這里加上商戶的業務邏輯程序代碼 
				System.out.println("return_url 驗證成功");
				renderText("success");
				return;
			} else {
				System.out.println("return_url 驗證失敗");
				// TODO
				renderText("failure");
				return;
			}
		} catch (AlipayApiException e) {
			e.printStackTrace();
			renderText("failure");
		}
	}

將參數轉化為Map,為驗簽做准備

/**
	 * 
	 * @param request
	 * @return
	 */
	public static Map<String, String> toMap(HttpServletRequest request) {
		System.out.println(">>>>" + request.getQueryString());
		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] + ",";
			}
			// 亂碼解決,這段代碼在出現亂碼時使用。
			// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
			params.put(name, valueStr);
		}
		return params;
	}

4、測試數據

異步通知的參數

gmt_create = 2017-05-14 13:26:58
charset = UTF-8
notify_time = 2017-05-14 13:28:04
gmt_payment = 2017-05-14 13:28:03
subject = Javen PC支付測試
sign = ZYQO+lzxAMDj8Al25KoJzSXegrx1rriBMGLOAEyiNHEac0OMe5e49ZW6m0waDSmTBDX8bwEHUjAk8rdCXTXPzNQSVP0p+46V+8k9AHiEiom6OzV3ZTLzGXGw8A8lnrGPYeCDmKSa3pogJKP0Ob7PyBRgz4HWydWC4P+G1yYEjvVX8kK2XbM6bMauW23a0AklvZbve6WUwUpkioMNLCOHAQzPBDW/LaoDUGx6GN6f3sFDsomBJ03w9rJgqZCs1zw29HHIW4kNFrLcQFleaC+2NnNPLhVanH1iXcK8800dsOXagRPuoy9Gr2EYGV+hSOiVE+XszBKIWTlAbZpE5QgJ6g==
buyer_id = 2088102169474200
body = Javen IJPay PC支付測試
invoice_amount = 88.88
version = 1.0
notify_id = 43749ffb4d02c02f4bfc5ee4fe5761ehjm
fund_bill_list = [{"amount":"88.88","fundChannel":"ALIPAYACCOUNT"}]
notify_type = trade_status_sync
out_trade_no = 051413260514947
total_amount = 88.88
trade_status = TRADE_SUCCESS
trade_no = 2017051421001004200200241311
auth_app_id = 2016102000727659
receipt_amount = 88.88
point_amount = 0.00
sign_type = RSA2
buyer_pay_amount = 88.88
app_id = 2016102000727659
seller_id = 2088102180432465
notify_url 驗證成功succcess

商戶頁面同步的參數

>>>>total_amount=88.88&timestamp=2017-05-14+13%3A28%3A11&sign=KRn%2FEi%2B8lOpPdmSBg8ZsB9dUsV8la2bMWaFGFs5R2hhQOP283m%2BolOwFamfC%2B1thxfIsEi92w99lH24K044yj6aLAN8mJq3umQTRI6j2SvZgn1Ufgpd5KdjfmpEAR5omFOJJP%2FDXIb2zEFs6VvA60RmpwYT5mHbujSWDUvj7X0LX1SGd5l90DbyUDtfMe%2FRSqBFd0iIDLloa78a3dPqHcId3mUKP4RrzZBGWNbAYxrZiEslmZiU%2BnT9K0zL9t%2BVm%2B24pHWsgVOR7hb4UicT%2FfHk6VnDPTnOlfVfJD3vOE2FP6N0jgj0QEKNIynOp6t74zmE8Xkca3pGQnkYyrUEQyg%3D%3D&trade_no=2017051421001004200200241311&sign_type=RSA2&auth_app_id=2016102000727659&charset=UTF-8&seller_id=2088102180432465&method=alipay.trade.page.pay.return&app_id=2016102000727659&out_trade_no=051413260514947&version=1.0
charset = UTF-8
out_trade_no = 051413260514947
method = alipay.trade.page.pay.return
total_amount = 88.88
sign = KRn/Ei+8lOpPdmSBg8ZsB9dUsV8la2bMWaFGFs5R2hhQOP283m+olOwFamfC+1thxfIsEi92w99lH24K044yj6aLAN8mJq3umQTRI6j2SvZgn1Ufgpd5KdjfmpEAR5omFOJJP/DXIb2zEFs6VvA60RmpwYT5mHbujSWDUvj7X0LX1SGd5l90DbyUDtfMe/RSqBFd0iIDLloa78a3dPqHcId3mUKP4RrzZBGWNbAYxrZiEslmZiU+nT9K0zL9t+Vm+24pHWsgVOR7hb4UicT/fHk6VnDPTnOlfVfJD3vOE2FP6N0jgj0QEKNIynOp6t74zmE8Xkca3pGQnkYyrUEQyg==
trade_no = 2017051421001004200200241311
auth_app_id = 2016102000727659
version = 1.0
sign_type = RSA2
app_id = 2016102000727659
seller_id = 2088102180432465
timestamp = 2017-05-14 13:28:11
return_url 驗證成功

推薦閱讀:
微信、支付寶App支付-JPay0.0.2發布
支付寶支付-提現到個人支付寶
支付寶支付-刷卡支付(條碼支付)
支付寶支付-掃碼支付一張二維碼集成微信、支付寶支付
支付寶Wap支付你了解多少?
Android版-支付寶APP支付
支付寶支付-常用支付API詳解(查詢、退款、提現等)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM