支付宝——PC端支付

支付宝——PC端支付

  1. 首先登陆蚂蚁金服开放平台,入驻选择自由研发的这些就不说了,注册下信息就能够了。
  2. 在开发者中心,开放者接入进行建立应用,添加功能等操做
    在这里插入图片描述
    建立完对应的应用后,去应用列表添加电脑网站支付的功能
    在这里插入图片描述
    签约是须要额外的一些信息的,填写一下就能够了
  3. 这时候,咱们点击电脑网站支付,能够直接来到 开发文档的页面,咱们能够按照这个文档一步步的照作。
    直接来到快速接入的里面,先进行配置密钥的操做。
    在这里插入图片描述
    直接进入到这个网址配密钥:生成RSA密钥,下载对应系统的密钥工具,解压以后按照开发文档里面的操做点击生成密钥便可,生成的密钥会保存RSA工具的目录下
    在这里插入图片描述
    ps:每次点击生成密钥都会覆盖原先的密钥,一公钥对应一私钥,必定要保存好。忘记的话就从新设置公钥吧。
    如今咱们将密钥所有配置完毕,来到开放平台密钥页面,这里还有你的APPID。
    在这里插入图片描述
    点击设置应用公钥,验证手机号后,将咱们生成的公钥复制进去,这时候密钥已经配置成功了。
    若是还想验证公钥的话,下载官方的工具,将应用私钥输入到工具里面,在将工具返回的字符串输入到弹出网页那里,成功则一切正常了。
    在这里插入图片描述
    在这里插入图片描述
    支付宝公钥在配置完应用公钥后就能够查看了
    在这里插入图片描述
    ps:对于公钥,私钥,appid等信息,咱们能够先使用蚂蚁提供的 电脑支付DEMO配合沙箱进行配置测试,看一看是否配置成功了
    在这里插入图片描述
    沙箱:开放平台—沙箱环境
  4. 开发环境就不说了,jdk之类的
  5. 关键参数:下面这些是必要的了
    在这里插入图片描述
    在这里插入图片描述
  6. 代码中的体现:
    阿里提供的三方jar包是不能忘记的:三方jar包
    基础配置类:
public class AlipayConfig {

    // 支付宝网关(固定)
    // "https://openapi.alipaydev.com/gateway.do";//沙箱网关
    public static final String GATEWAYURL = "https://openapi.alipay.com/gateway.do";

    // APPID 即建立应用后生成
    // public static final String APPID = "2016092100564910";//沙箱

    // 开发者私钥,由开发者本身生成
    public static final String APP_PRIVATE_KEY = "xxx";

    // 参数返回格式,只支持json
    public static final String FORMAT = "json";

    // 参数返回格式,只支持json
    public static final String CHARSET = "UTF-8";

    // 支付宝公钥,由支付宝生成
    public static final String ALIPAY_PUBLIC_KEY = "xxx";

    // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
    public static final String SIGN_TYPE = "RSA2";

    // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外	网能够正常访问
    public static final String NOTIFY_URL = "http://公网地址";

    // 同步返回地址,HTTP/HTTPS开头字符串,非必填
    public static final String RETURN_URL = "http://公网地址";

    public static final String TimeoutExpress = "1m";// 交易的过时时间,要与redis的二维码同步的
}

AlipayManger工具类:前端

/**
 * @Description:电脑网站支付
 * @author
 */
public class AlipayManger {

    /**
     * alipayClient只须要初始化一次,后续调用不一样的API均可以使用同一个alipayClient对象。
     */
    private static volatile AlipayManger instance;
    private static volatile AlipayClient alipayClient;

    private AlipayManger() {
        alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APPID,
                AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
                AlipayConfig.SIGN_TYPE);
    }

    public static AlipayManger getInstance() {
        if (instance == null) {
            synchronized (AlipayManger.class) {
                if (instance == null) {
                    instance = new AlipayManger();
                }
            }
        }
        return instance;
    }

    /**
     * 支付页面:支付操做
     *
     * @param out_trade_no 订单号
     * @param total_amount 支付总金额
     * @param subject 商品名称
     * @return
     * @throws AlipayApiException
     */
    public AlipayTradePagePayResponse TradePagePay(String out_trade_no, Double total_amount, String subject) {
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();//用来封装参数的一个类
        model.setOutTradeNo(out_trade_no);
        model.setTotalAmount(String.valueOf(total_amount));
        model.setSubject(subject);
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        model.setTimeoutExpress(AlipayConfig.TimeoutExpress);
        request.setBizModel(model);
        request.setNotifyUrl(AlipayConfig.NOTIFY_URL);//设置-异步通知页面
        request.setReturnUrl(AlipayConfig.RETURN_URL);//设置-支付成功后同步跳转到哪一个页面
        AlipayTradePagePayResponse response = null;
        try {
            response = alipayClient.pageExecute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 统一订单查询接口
     *
     * @param out_trade_no 订单号
     * @return
     * @throws AlipayApiException
     */
    public AlipayTradeQueryResponse TradePayQuery(String out_trade_no) {
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        model.setOutTradeNo(out_trade_no);
        request.setBizModel(model);
        AlipayTradeQueryResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 基本退款接口
     *
     * @param out_trade_no 订单号
     * @param refundAmount 退款金额
     * @param refundReason 退款理由
     * @return
     */
    public AlipayTradeRefundResponse TradeRefund(String out_trade_no, String refundAmount, String refundReason) {
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        AlipayTradeRefundModel model = new AlipayTradeRefundModel();
        model.setOutTradeNo(out_trade_no);
        model.setRefundAmount(refundAmount);
        model.setRefundReason(refundReason);
        request.setBizModel(model);
        AlipayTradeRefundResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;
    }

    /**
     * 商户的退款查询接口
     *
     * @param out_trade_no 订单号
     * @param out_request_no 部分退款传参
     * @return
     */
    public AlipayTradeFastpayRefundQueryResponse TradeFastpayRefundQuery(String out_trade_no, String out_request_no) {
        AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
        AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
        model.setOutTradeNo(out_trade_no);
        boolean flag = StringUtils.isEmpty(out_request_no);
        model.setOutRequestNo(flag ? out_trade_no : out_request_no);
        request.setBizModel(model);
        AlipayTradeFastpayRefundQueryResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return response;

    }

    /**
     * 支付宝服务器异步通知
     * 此处要当成一个接口能够经过url进行访问,而且只有放到公网上,
     * 在支付里面配置了request.setNotifyUrl(AlipayConfig.NOTIFY_URL
     * 程序支付成功后才会异步处理,失败和订单超时不会进行异步的
     *
     * @param request
     * @throws UnsupportedEncodingException
     */
    public void NotifyUrl(HttpServletRequest request) throws UnsupportedEncodingException {
        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] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用
            try {
                valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            params.put(name, valueStr);
        }
        boolean signVerified = false;
        try {
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
                    AlipayConfig.SIGN_TYPE);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        } // 调用SDK验证签名
        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");
            if (trade_status.equals("TRADE_SUCCESS")) {
                /**
                 * 返回的状态是success,接下来能够:更改订单支付成功状态,设置支付信息,等等业务处理……
                 */
                System.out.println("success");
            } else {
                /**
                 *  fail 的业务处理:……
                 */
                System.out.println("fail");
            }
        }
    }

    /**
     *  对于支付宝同步跳转页面(return_url),里面的代码和异步的是同样的
     *  咱们能够在同步页面中拿到支付宝给你返回的订单信息,而后写个接口,将数据返给前端,让前端进行展现
     */
}

ServiceImpl层的使用:java

@Service
public class OrderPayServiceImpl implements OrderPayService {
	static AlipayManger instance = AlipayManger.getInstance();//获取咱们封装的 支付实例

	/**
	 * ali电脑支付,前端调用这个接口,将body展现到页面上,就能够跳到支付宝三方到页面上了
	 */
	@Override
	public String aliPayTradePay(String name, String orderNo, Double price) {
		AlipayTradePagePayResponse response = instance.TradePagePay(orderNo, price, name);
		// payCacheImpl.setQrCodeExp(response.getBody(), orderNo,
		// AlipayConfig.TimeoutExpress, 1);
		System.out.println(response.getBody());
		orderOverTime(orderNo, price, AlipayConfig.TimeoutExpress);// 订单超时未付款处理
		return response.getBody();//是form表单,咱们最终须要的二维码数据
	}
}

以上的这些功能能够完成基础的支付宝电脑支付的功能了,具体的代码仍是要看业务的流程的,若还须要其余的功能,去蚂蚁提供的开发平台查看吧 电脑网站支付文档 这里面还有API,DEMO,错误处理等等……,剩下的只能看你们的了,写的很差还请见谅 ^ - ^web