支付宝支付接口接入

版权声明:个人收集,转载注明,谢谢支持 https://blog.csdn.net/qq_42629110/article/details/84840038

使用第三方接口实现支付工程

支付宝支付

实际开发中常用的支付手段

支付接入

进入支付宝开发者平台—蚂蚁金服
https://open.alipay.com/platform/home.htm
注册支付宝账号,申请成为开发者
登录开发平台->帮助中心->开发文档->电脑网站支付

接入步骤

1.在支付宝开放平台创建一个应用,(获得APPID),用来表示商家的身份

注意:创建应用升级成为服务商,需要企业认证;

2.配置密钥
2.1 常见的加解密:
2.1.1 MD5:本质上是一个摘要算法
特点:

1.任何数据都能转换成一个长度为64位的字符串,原文不一样,任何数据都能转换成一个唯一的字符串(极小的容错性),肯定会存在数据丢失;
2.MD5是不可逆,所以MD5不能算是一个加解密算法,无法解密;

常见应用场景:

密码加密…

2.1.2Base64:编码算法
特点:

1.任何二进制数据都能通过Base64转成String字符串,通过该字符串也能反编码成原来的文件数据;

常规的加解密算法:
对称加密:

1.概述:
对称加密有一个密钥,加密通过该密钥加密,解密也是通过密钥解密
2.代表算法:
DES加密

非对称加密:

1.概述:
加密和解密用的是不同的密钥;在非对称加密中,会同时产生个密钥对,一个称为公钥,一个私钥
2.代表算法:
RSA加密(阿里支付宝使用的配置密钥)
3.作用:
私钥只有自己有,黑客可以窃取数据,但是无法修改数据;

3.搭建环境,调用API进行支付
支付工程

1.引入支付宝依赖

<dependency>
	<groupId>com.alipay.sdk</groupId>
	<artifactId>alipay-sdk-java</artifactId>
	<version>3.4.49.ALL</version>
</dependency>

2.创建核心对象:需要注意一个系统一般只有支付客户端,此处我们将其放在了Controller的构造代码块中,因为Spring的Bean默认是Singlton

{
//实例化客户端
alipayClient = new DefaultAlipayClient(
//1.serverUrl:是访问支付宝的url,此处是沙箱环境dev
"https://openapi.alipaydev.com/gateway.do",
//2.appid,申请应用后会得到APPID,沙箱环境有默认的APPID
"2016092300576703",
//4.私钥,由客户端自定义可以用工具生产RSA2加密
 "privateKey:",
 //5.数据传输格式,目前阿里只支持JSON
 "json",
 //6.编码格式
 "UTF-8",
 //7.阿里会给我们一个公钥
"aliPublicKey",
//8.使用的加解密算法
"RSA2");
//沙箱环境所使用的账号
//[email protected] 买家账号
}

3.调用API进行支付构建tradeRequest请求传递

@RequestMapping("/alipay")
public void aliPay(String orderid, HttpServletResponse response) throws IOException {
//先调用DAO层查询到订单信息,下面需要使用
Orders order = orderService.queryByOrderid(orderid);
//实例化具体API对应的request类
AlipayTradePagePayRequest alipayRequest = 
new AlipayTradePagePayRequest();//创建API对应的request
   //设置同步响应的URL,阿里给我们提供了同步和异步的响应URL,一般我们都是使用异步来保证我们的
   订单状态的修改
   alipayRequest.setReturnUrl("http://www.baidu.com");//设置同步响应URl
   //设置异步响应URl,使用了花生壳的内网穿透技术    
  alipayRequest.setNotifyUrl("http://xuhengliang.imwork.net/pay/checkPayAsyn");
   //填充业务参数
   //比较重要的参数就是out_trade_no:订单号,需要唯一
   alipayRequest.setBizContent("{" +
      "    \"out_trade_no\":\"" + order.getOrderid() + "\"," +
        "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
        "    \"total_amount\":" + order.getOprice() + "," +
        "    \"subject\":\"" + order.getOrderid() + "\"," +
        "    \"body\":\"" + order.getOrderid() + "\"," +
        "    \"passback_params\":\"\"," +
        "    \"extend_params\":{" +
        "    \"sys_service_provider_id\":\"2088511833207846\"" +
        "    }"+
        "  }");
   //准备一个字符串接受SDK生成表单
   String form="";
   //调用成功,则处理业务逻辑
   try {
     form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
   } catch (AlipayApiException e) {
      e.printStackTrace();
   }
   //响应页面
   response.setContentType("text/html;charset=utf-8");
   response.getWriter().write(form);//直接将完整的表单html输出到页面
   response.getWriter().flush();
   response.getWriter().close();
}

4.调用API构建queryRequest请求发送同步校验

@RequestMapping("/checkPay")
public String checkPay(String orderid) throws AlipayApiException {
    //通过订单号判断是否支付成功 - 发送请求给支付宝主动确认
    AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
    request.setBizContent("{" +
            "\"out_trade_no\":\"" + orderid + "\"" +
            "  }");
    //获得相应
    AlipayTradeQueryResponse response = alipayClient.execute(request);
    if(response.isSuccess()){
        //System.out.println("调用成功");
        if(response.getTradeStatus().equals("TRADE_SUCCESS")){
            //支付成功后,修改订单状态
            orderService.updateOrderStatus(orderid, 1);
        }
    } else {
        //System.out.println("调用失败");
    }
    return "redirect:/order/list";
}

5.实现异步暴露接口修改订单状态

   @RequestMapping("/checkPayAsyn")
   public void checkPayAsyn(String out_trade_no, String trade_status ){
       if(trade_status.equals("TRADE_SUCCESS")){
           //修改订单状态
           orderService.updateOrderStatus(out_trade_no, 1);
       }
   }

猜你喜欢

转载自blog.csdn.net/qq_42629110/article/details/84840038