支付宝支付(APP支付 java后台代码)

1.支付宝支付的原理流程图解

支付宝支付(APP支付 java后台代码)_第1张图片

支付宝支付流程说明:
图中虚线标识商户链路,实线标识支付宝链路。
第4步:调用支付接口:此消息就是本接口所描述的支付宝客户端SDK提供的支付对象PayTask,将商户签名后的订单信息传进payv2方法唤起支付宝收银台,交易数据格式具体参见请求参数说明。
第5步:支付请求:支付宝客户端SDK将会按照商户客户端提供的请求参数发送支付请求。
第8步:接口返回支付结果:商户客户端在第4步中调用的支付接口,会返回最终的支付结果(即同步通知),参见客户端同步返回。
第13步:用户在支付宝APP或H5收银台完成支付后,会根据商户在手机网站支付API中传入的前台回跳地址return_url自动跳转回商户页面,同时在URL请求中附带上支付结果参数。同时,支付宝还会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统,详情见支付结果异步通知。
除了正向支付流程外,支付宝也提供交易查询、关闭、退款、退款查询以及对账等配套API。

2.支付宝的开发过程
3.支付宝的后台java代码开发

package com.qipa.location.paymode;

import org.apache.log4j.Logger;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;

public class AliPay extends BasePayMode {

	private static final Logger logger = Logger.getLogger(AliPay.class);

	/**
	 * 为了解决老版本和新版本的兼容问题,其中这个才是关键
	 */
	@Override
	public String getPayConfig() {
		if (request.getVersion() < 2000000) {
			//老版本的支付宝支付
			return oldPay();
		} else {
			//新版本的微信支付
			return newPay();
		}
	}

	/**
	 * 老版本的支付宝支付方式
	 * @return
	 */
	private String oldPay() {
//		CenterMallPayMode mode = CenterMallPayModeCache.getPayMode(String.valueOf(request.getPayMode()));
//		Map map = new HashMap();
//		map.put("app_id", "2016101002075520");
//		String bizContentTmp = "{\"timeout_express\":\"30m\",\"seller_id\":\"\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\"%s\",\"subject\":\"%s\",\"body\":\"%s\",\"out_trade_no\":\"%s\"}";
//		map.put("biz_content", String.format(bizContentTmp, commodity.getFormatFee(), commodity.getTitle(),
//				commodity.getRemark(), orderId));
//		map.put("charset", "utf-8");
//		map.put("format", "json");
//		map.put("method", "alipay.trade.app.pay");
//		map.put("notify_url", mode.getCallBackUrl());
//		map.put("sign_type", "RSA");
//		map.put("timestamp", DateFormatUtil.formatDateTime());
//		map.put("version", "1.0");
//		String sign = null;
//		try {
//			sign = AlipaySignature.rsaSign(map, mode.getPrivateKey(), Constants.DEFAULT_ENCODING);
//		} catch (AlipayApiException e) {
//			e.printStackTrace();
//			this.setCode(SC_S_BILL_POINT_NOT_FOUND_ERROR);
//			return null;
//		}
//		StringBuffer orderStr = new StringBuffer();
//		Set set = map.keySet();
//		for (String key : set) {
//			orderStr.append(key).append("=").append(StringUtil.urlEncode(map.get(key))).append("&");
//		}
//		orderStr.append("sign=").append(sign);
//		// System.out.println(orderStr);
//		CenterMallCommodityBillingPoint point = new CenterMallCommodityBillingPoint();
//		point.setBillingPointInfo(orderStr.toString());
		return "ok";
	}

	/**
	 * 新版本的支付方式
	 * @return
	 */
	private String newPay() {
		String APP_ID = "********";
		String APP_PRIVATE_KEY = "*********";
		String CHARSET = "UTF-8";
		String ALIPAY_PUBLIC_KEY = "*********";
		// 实例化客户端
		AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",APP_ID,APP_PRIVATE_KEY,"json",CHARSET,ALIPAY_PUBLIC_KEY, "RSA2");
		// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
		AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
		// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
		AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
		model.setBody(this.getFeePoint().getTitle());
		model.setSubject(this.getFeePoint().getTitle());
		model.setOutTradeNo(orderId);
		model.setTimeoutExpress("30m");
//		model.setTotalAmount("" + this.getFeePoint().getPrice());
		model.setTotalAmount("" + 0.1);
		model.setProductCode("QUICK_MSECURITY_PAY");
		request.setBizModel(model);
		//支付宝的回调地址
		String notifyUrl = this.getPayModeConfig().getCallbackUrl();
		request.setNotifyUrl(notifyUrl);
		try {
			// 这里和普通的接口调用不同,使用的是sdkExecute
			AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
			logger.info(String.format("[PM_AliPay-%s]  reqInfo[%s]  respInfo[%s]", orderId, request, response));
			return response.getBody();// 就是orderString, 可以直接给客户端请求,无需再做处理
		} catch (AlipayApiException e) {
			e.printStackTrace();
		}
		//将生产的订单的信息返回到前端中
		return "";
	}
}

4.总结

你可能感兴趣的:(java)