支付宝PC端二维码支付(沙箱环境)

一,准备工作

jar
在这里插入图片描述

获取以下内容:

1,APPID
2,支付宝网关
3,公钥
4,私钥
5,支付宝钱包账号密码

支付宝开放平台:

https://openhome.alipay.com/platform/developerIndex.htm

支付宝PC端二维码支付(沙箱环境)_第1张图片

在这里根据规则设置私钥和公钥
支付宝PC端二维码支付(沙箱环境)_第2张图片

下面有一个钱包下载二维码,下载沙箱钱包后,查看账号密码并登录买家账号

支付宝PC端二维码支付(沙箱环境)_第3张图片

支付宝PC端二维码支付(沙箱环境)_第4张图片

二,配置文件

将以上信息填写在下面配置

package com.ticket.config;

import java.io.FileWriter;
import java.io.IOException;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {
	
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

	// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
	public static String app_id = "";
	
	// 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "";
	
	// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "";

	// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	//这里地址为,支付成功之后跳转的地址,异步地址
	//public static String notify_url = "";

	// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	//这里地址为,支付成功之后跳转的地址,同步
	public static String return_url = "http://localhost:8080/ticketsystem/alipayReturnNoticebill";

	// 签名方式
	public static String sign_type = "RSA2";
	
	// 字符编码格式
	public static String charset = "utf-8";
	
	// 支付宝网关
	public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
	
	// 支付宝网关
	public static String log_path = "C:\\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /** 
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


三,提交订单后,支付

前端提交ajax提交

 @RequestMapping(value = "/applybill", produces = "text/html; charset=UTF-8",method=RequestMethod.POST)
		@ResponseBody
		public String goAlipay(Bill bill, HttpServletRequest request, HttpServletRequest response) throws Exception {
	    	HttpSession session = request.getSession();
	    	Admin user = (Admin) session.getAttribute("user");
	    	Gson gson = new Gson();
	    	
	    	//订单保存
	    	//省略业务代码

	    	//商户订单号,商户网站订单系统中唯一订单号,必填
	    	String out_trade_no =CommonUtil.ordernum();  
	    	
			//获得初始化的AlipayClient
			AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

			//设置请求参数
			AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
			//这里设置支付后跳转的地址
			alipayRequest.setReturnUrl(AlipayConfig.return_url);
			//alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

			
			//付款金额,必填
			String total_amount = String.valueOf(bill.getTicketnum()*bill.getPrice());
			//订单名称,必填
			String subject ="用户"+user.getAccount()+"影票订单";
			//商品描述,可空
			String body = "用户订购商品个数:" + bill.getTicketnum();

			// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
	    	String timeout_express = "5m";

			alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
					+ "\"total_amount\":\""+ total_amount +"\","
					+ "\"subject\":\""+ subject +"\","
					+ "\"body\":\""+ body +"\","
					+ "\"timeout_express\":\""+ timeout_express +"\","
					+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

			//请求
			String result = alipayClient.pageExecute(alipayRequest).getBody();

			return result;
		}

上面ajax请求之后,会返回result,我打印发现时一段html代码,我不处理它不跳转,不知道为啥,我的处理方式:
支付宝PC端二维码支付(沙箱环境)_第5张图片

请求之后,会进入支付页面
支付宝PC端二维码支付(沙箱环境)_第6张图片

使用沙箱钱包付款,
付款成功后,会进入你配置的异步或者同步方法。

支付宝PC端二维码支付(沙箱环境)_第7张图片

支付宝PC端二维码支付(沙箱环境)_第8张图片

示例:异步方法

/**
		 *
		 * @Title: AlipayController.java
		 * @Package com.sihai.controller
		 * @Description: 支付宝异步 通知页面
		 * Copyright: Copyright (c) 2017
		 * Company:FURUIBOKE.SCIENCE.AND.TECHNOLOGY
		 *
		 * @author sihai
		 * @date 2018年11月23日 下午8:51:13
		 * @version V1.0
		 */
		/*@RequestMapping(value = "/alipayNotifyNotice")
		@ResponseBody
		public String alipayNotifyNotice(HttpServletRequest request, HttpServletRequest response) throws Exception {

			System.out.println("支付成功11111111111");

			//获取支付宝POST过来反馈信息
			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] + ",";
				}
				//乱码解决,这段代码在出现乱码时使用
//				valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
				params.put(name, valueStr);
			}

			boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

			//——请在这里编写您的程序(以下代码仅作参考)——
			
			 实际验证过程建议商户务必添加以下校验:
			1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
			2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
			3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
			4、验证app_id是否为该商户本身。
			
			if(signVerified) {//验证成功
				//商户订单号
				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");

				//付款金额
				String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");

				if(trade_status.equals("TRADE_FINISHED")){
					//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
					//如果有做过处理,不执行商户的业务程序

					//注意: 尚自习的订单没有退款功能, 这个条件判断是进不来的, 所以此处不必写代码
					//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
				}else if (trade_status.equals("TRADE_SUCCESS")){
					//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
					//如果有做过处理,不执行商户的业务程序

					//注意:
					//付款完成后,支付宝系统发送该交易状态通知

					// 修改叮当状态,改为 支付成功,已付款; 同时新增支付流水
					
				}
				System.out.println("111支付成功");

			}else {//验证失败
				
			}

			return "success";
		}*/

你可能感兴趣的:(java)