JAVA 支付宝支付_史诗级简单教程(SpringBoot)

注册沙箱的教程就省略了

这里直接贴代码,让你们的代码跑起来快步如飞;

没有公网也能测试,就是接收不到支付宝的回调;

这里我是用的内网转发工具

沙箱里面把私匙和公匙填好;

 

这是我的项目目录

JAVA 支付宝支付_史诗级简单教程(SpringBoot)_第1张图片

这里贴一下我的配置代码(单独的配置类,没有放到配置文件里)

JAVA 支付宝支付_史诗级简单教程(SpringBoot)_第2张图片

支付宝回调代码

@Controller
public class AlipayResponseController {

	@RequestMapping("/notify_url")
	public String notify_url(HttpServletRequest request, HttpServletResponse response)
			throws IOException, AlipayApiException {

		Map 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不相等也可以使用这段代码转化
			// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
			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");

		// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
		// 计算得出通知验证结果
		// boolean AlipaySignature.rsaCheckV1(Map params, String
		// publicKey, String charset, String sign_type)
		boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
				"RSA2");
		PrintWriter pw = response.getWriter();
		if (verify_result) {// 验证成功
			//////////////////////////////////////////////////////////////////////////////////////////

			// ——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

			if (trade_status.equals("TRADE_FINISHED")) {
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
				// 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
				// 如果有做过处理,不执行商户的业务程序
				System.out.println("交易完成");
				// 注意:
				// 如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
				// 如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
			} else if (trade_status.equals("TRADE_SUCCESS")) {
				System.out.println("交易成功");
				// 判断该笔订单是否在商户网站中已经做过处理
				// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
				// 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
				// 如果有做过处理,不执行商户的业务程序

				// 注意:
				// 如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。
			}

			else if (trade_status.equals("WAIT_BUYER_PAY")) {

				System.out.println("交易创建,等待付款");

			}
			// ——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

			pw.println("success");

		} else {// 验证失败
			pw.println("fail");
		}

		return null;
	}

	@RequestMapping("/return_url")
	public String return_url(HttpServletRequest request, HttpServletResponse response) {

		return "return";
	}
}

 

 

这个是一个写的一个工具类

	/**
	 * 统一收单交易支付接口 @备注:
	 * 
	 * @param model
	 * @return
	 * @throws AlipayApiException
	 */
	public static String AlipaPay(AlipayTradeWapPayModel model) throws AlipayApiException {
		AlipayTradePayRequest request = new AlipayTradePayRequest();
		request.setBizModel(model);
		request.setNotifyUrl(AlipayConfig.notify_url);
		request.setReturnUrl(AlipayConfig.return_url);
		AlipayTradePayResponse response = alipayClient.execute(request);
		if (response.isSuccess()) {
			return response.getBody();
		} else {
			return null;
		}
	}

下面这个是直接访问就能发起支付了(用手机测试哦)

第一个方法

               手机网页支付

第二个方法

            支付宝App支付

@Controller
public class MobileAlipayController {

	@RequestMapping("/MobileAlipay")
	public String MobileAlipay(HttpServletRequest request, HttpServletResponse response) {
		// 超时时间 可空
		String timeout_express = "2m";
		// 销售产品码 必填
		String product_code = "QUICK_WAP_WAY";
		AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
		model.setOutTradeNo(new ToolAll().PlyId);
		model.setBody("");
		model.setSubject("移动支付");
		model.setTotalAmount("1.01");
		model.setTimeoutExpress(timeout_express);
		model.setProductCode(product_code);

		JSONObject content = new JSONObject();
		content.put("trans_in_type", "userId");
		content.put("trans_in", "2088102176185663");
		content.put("amount", "1.01");
		String[] SettleDetailInfo = new String[] { content.toString() };

		JSONObject settle_detail_infos = new JSONObject();
		settle_detail_infos.put("settle_detail_infos", SettleDetailInfo);

		JSONObject settle_info = new JSONObject();
		settle_info.put("settle_info", settle_detail_infos);

		try {
			String form = AlipayUtil.MobileWebAlipay(model);
			if (form != null) {

				response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
				try {
					response.getWriter().write(form);
					response.getWriter().flush();
					response.getWriter().close();
				} catch (IOException e) {
					System.out.println("表单输出错误");
					e.printStackTrace();
				}

			}
		} catch (AlipayApiException e) {
			System.out.println("支付出错");
			e.printStackTrace();
		}

		return null;
	}

	@RequestMapping("/AppAlipay")
	@ResponseBody
	public String AppAlipay(HttpServletRequest request, HttpServletResponse response) {
		// 超时时间 可空
		String timeout_express = "2m";
		// 销售产品码 必填
		String product_code = "QUICK_MSECURITY_PAY";
		AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
		model.setOutTradeNo(new ToolAll().PlyId);
		model.setBody("在线支付有你有我!");
		model.setSubject("移动支付");
		model.setTotalAmount("1.01");
		model.setTimeoutExpress(timeout_express);
		model.setProductCode(product_code);

		JSONObject content = new JSONObject();
		content.put("trans_in_type", "userId");
		content.put("trans_in", "2088102176185663");
		content.put("amount", "1.01");
		String[] SettleDetailInfo = new String[] { content.toString() };

		JSONObject settle_detail_infos = new JSONObject();
		settle_detail_infos.put("settle_detail_infos", SettleDetailInfo);

		JSONObject settle_info = new JSONObject();
		settle_info.put("settle_info", settle_detail_infos);

		try {
			String form = AlipayUtil.MobileWebAlipay(model);
			return form;

		} catch (AlipayApiException e) {
			System.out.println("支付出错");
			e.printStackTrace();
		}

		return null;
	}
}

代码就到这里;文中代码有不够严谨的地方大神勿喷;如果有什么不明白的地方可以留言;

后面会出C#支付宝支付以及微信支付

觉得帮助此文章帮助到你的话可以打赏个咖啡钱,谢谢

JAVA 支付宝支付_史诗级简单教程(SpringBoot)_第3张图片

JAVA 支付宝支付_史诗级简单教程(SpringBoot)_第4张图片

你可能感兴趣的:(支付宝,JAVA)