实用的支付宝支付案例

一、描述

支付宝支付主要分为三个步骤:

  • 创建应用
  • 生成私钥及公钥
  • 创建沙箱环境
  • 代码实现

二、创建应用

  1. 在支付宝开发者中心注册支付宝账号(有支付宝账号直接登录)

  2. 进入管理中心

  3. 进入网页&移动应用

在这里插入图片描述
4. 创建应用

在这里插入图片描述

  1. 填入信息

在这里插入图片描述

三、生成私钥及公钥

  1. 返回首页

在这里插入图片描述

  1. 生成公密钥

在这里插入图片描述
3. 下载官网提供给你的软件,用于生成公密钥

在这里插入图片描述

注意:保存生成的公密钥,其实记住公密钥的文件路径就行

  1. 沙箱账号(设置好前面的会自动生成,用于后面的支付宝账号登录用)

在这里插入图片描述

提示:沙箱可以简单的理解为测试环境,并非生产环境

四、代码实现

  1. 创建springboot基础项目

    • pom.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.3.0.RELEASE</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
          <groupId>com.example</groupId>
          <artifactId>alipaydemo</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <name>alipaydemo</name>
          <description>Demo project for Spring Boot</description>
      
          <properties>
              <java.version>1.8</java.version>
          </properties>
      
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <!--支付宝sdk-->
              <dependency>
                  <groupId>com.alipay.sdk</groupId>
                  <artifactId>alipay-sdk-java</artifactId>
                  <version>3.0.0</version>
              </dependency>
      
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
                  <exclusions>
                      <exclusion>
                          <groupId>org.junit.vintage</groupId>
                          <artifactId>junit-vintage-engine</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <configuration>
                          <source>1.8</source>
                          <target>1.8</target>
                          <encoding>UTF-8</encoding>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                  </plugin>
              </plugins>
          </build>
      
      </project>
      
      
    • aplication.yml配置文件

      spring:
        mvc:
          view:
            prefix: /
            suffix: .html
      
      
      
      
    • 创建配置类AppConfig,下面的appid,私钥及公钥填写你自己的。

      package com.example.config;
      
      
      import java.io.FileWriter;
      import java.io.IOException;
      
      /**
       *基础配置类,设置帐户有关信息及返回路径
       *
       * @author Mr.Ma
       */
      
      
      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://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
      
          /**
           * 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,支付成功后需要跳转的页面
           */
      
          public static String return_url = "http://localhost:8080/home";
      
          /**
           * 签名方式
           */
          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();
                      }
                  }
              }
          }
      
      }
      
      
    • 创建关于订单的实体类

      package com.example.entity;
      
      
      import org.springframework.stereotype.Component;
      
      /**
       * 目的是封装前端的必须的请求参数    
       *  官方API(https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay)
       * @author Mr.Ma
       */
      
      @Component
      public class AliPay {
      
      
          //销售产品码
          private String  product_code;
      
      
          //订单编号
          private String out_trade_no;
      
          //订单名称
          private String subject;
      
          //订单金额
          private String total_amount;
      
          //订单描述
          private String body;
      
          public AliPay() {
          }
      
      
          public String getProduct_code() {
              return product_code;
          }
      
          public AliPay(String product_code, String out_trade_no, String subject, String total_amount, String body) {
              this.product_code = product_code;
              this.out_trade_no = out_trade_no;
              this.subject = subject;
              this.total_amount = total_amount;
              this.body = body;
          }
      
          public void setProduct_code(String product_code) {
              this.product_code = product_code;
          }
      
          public String getOut_trade_no() {
              return out_trade_no;
          }
      
          public void setOut_trade_no(String out_trade_no) {
              this.out_trade_no = out_trade_no;
          }
      
          public String getSubject() {
              return subject;
          }
      
          public void setSubject(String subject) {
              this.subject = subject;
          }
      
          public String getTotal_amount() {
              return total_amount;
          }
      
          public void setTotal_amount(String total_amount) {
              this.total_amount = total_amount;
          }
      
          public String getBody() {
              return body;
          }
      
          public void setBody(String body) {
              this.body = body;
          }
      
          @Override
          public String toString() {
              return "AliPay{" +
                      "product_code='" + product_code + '\'' +
                      ", out_trade_no='" + out_trade_no + '\'' +
                      ", subject='" + subject + '\'' +
                      ", total_amount='" + total_amount + '\'' +
                      ", body='" + body + '\'' +
                      '}';
          }
      }
      
      
      • 编写前端展示页面index.html

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
            <title>下单</title>
        </head>
        <body>
        <style type="text/css">
            input{
                max-width: 400px;
            }
            div{
                margin-left: 800px;
        
            }
        
        </style>
        <div>
            <!--支付所需的参数,前面我们已经封装成了实体类-->
            <form action="/pay" method="post">
                <input  type="hidden" name="product_code" value="FAST_INSTANT_TRADE_PAY">
                订单号:<input class="form-control"  type="text" name="out_trade_no" required><br/>
                订单名称:<input class="form-control" type="text" name="subject" required><br/>
                付款金额:<input class="form-control" type="text" name="total_amount" required><br/>
                描述:<input class="form-control" type="text" name="body"><br/>
                <input  class="btn btn-primary" type="submit" value="下单">
                <input  class="btn btn-primary" type="reset" value="重置">
            </form>
        </div>
        </body>
        </html>
        
        

编写home.html(支付成功后需要跳转的页面)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>商品列表</h1>
<h2>裤子</h2>
<h2>鞋子</h3>
<h2>袜子</h3>
<h2>...</h3>
</body>
</html>

注:把页面放在static目录下,由于我这里没有导入模板引擎所以放在templates下面需要在WebMvcConfigurer里配置

  • 编写Controller

    package com.example.controller;
    
    
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.request.AlipayTradePagePayRequest;
    import com.example.config.AlipayConfig;
    import com.example.entity.AliPay;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    
    /**
     * @author Mr.Ma
     */
    
    @Controller
    public class AlipayController {
    
    
    
        @RequestMapping("/")
        public String index() {
    
            return "index";
        }
    
    
        @RequestMapping("/home")
        public String home(){
            return "home";
        }
    
    
        @RequestMapping("/pay")
        public void aliPay(AliPay aliPay, HttpServletRequest request, HttpServletResponse response) throws IOException {
    
            //初始化参数对应配置类AlipayConfig属性
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
            //创建API对应的request
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
            alipayRequest.setReturnUrl(AlipayConfig.return_url);
            //在公共参数中设置回跳和通知地址
            alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
    
            //将对象转化为json格式
            ObjectMapper objectMapper = new ObjectMapper();
            String content = objectMapper.writeValueAsString(aliPay);
            //请求参数集合
            alipayRequest.setBizContent(content);
    
    
            //填充业务参数
            String form = "";
            try {
                //调用SDK生成表单
                form = alipayClient.pageExecute(alipayRequest).getBody();
            } catch (AlipayApiException e) {
                e.printStackTrace();
            }
            response.setContentType("text/html;charset=" + AlipayConfig.charset);
    
            //直接将完整的表单html输出到页面
            response.getWriter().write(form);
            response.getWriter().flush();
            response.getWriter().close();
    
    
        }
    }
    

以上部分代码来自官网:https://opendocs.alipay.com/open/270/105899

  1. 启动项目:http://localhost:8080/ ,返回界面如下:

在这里插入图片描述

  1. 下单后跳转页面

    在这里插入图片描述

这里是没法用扫描的,因为我们是在沙箱环境,正式上线需要审核

  1. 登录账户付款(沙箱应用里提供的买家账号和密码登录)

在这里插入图片描述

  1. 登录后跳转页面

    在这里插入图片描述

    1. 支付后短暂跳转页面,几秒后自动跳转到首页(home.html)
      在这里插入图片描述
      --------------------------------------------------------完结-------------------------------------------

最后也可以尝试官方的一站式开发套件,具体操作步骤请移步:https://opendocs.alipay.com/open/11111/canpro

config部分内容: /*************************************************************/ /*** 设置支付宝接口 (接口信息需到支付宝后商家服务里申请) ***/ /*************************************************************/ $alipayzk = "0.8"; // 设置支付宝付款折扣(如:0.8 即为8折,设为1不打折); $alipaytype = "1"; // 支付收款接口类型(1为即时到帐,2为担保交易,3为双功能); $aliapy_config['partner'] = '2088665852135892'; // 合作身份者id,以2088开头的16位纯数字 $aliapy_config['key'] = 'cdhiduyd36knmv5hbnvtme28n1axskgt'; // 安全检验码,以数字和字母组成的32位字符 $aliapy_config['seller_email'] = 'abc@qq.com'; // 签约支付宝账号或卖家支付宝帐户 【所有文件介绍:】 order 的目录 2013/08/28 20:12 <DIR> . 2013/08/28 20:12 <DIR> .. 2012/10/20 18:05 <DIR> alipay_1 2012/10/20 18:05 <DIR> alipay_2 2012/10/20 18:05 <DIR> alipay_3 2012/10/20 18:03 76,845 class.phpmailer.php 2012/10/20 18:03 25,613 class.smtp.php 2012/10/20 18:03 531 code.php 2013/01/21 23:47 1,687 config.php 2012/10/20 18:05 <DIR> images 2013/08/28 20:12 0 list.txt 2012/10/20 18:03 3,980 order.php 2012/10/20 18:03 6,607 order_01.html 2012/10/20 18:03 5,721 order_02.html 2012/10/20 18:04 5,505 order_03.html 2012/10/20 18:04 5,049 order_04.html 2012/10/20 18:04 4,540 order_05.html 2012/10/20 18:04 4,387 order_06.html 2012/10/20 18:04 3,859 order_07.html 2012/10/20 18:04 3,754 order_08.html 2012/10/20 18:04 2,837 order_09.html 2012/10/20 18:04 3,502 order_10.html 2012/10/20 18:04 51,470 phptz.php 17 个文件 205,887 字节 order\alipay_1 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:01 1,662 alipay.config.php 2012/10/20 18:02 3,983 alipayto.php 2012/10/20 18:05 <DIR> images 2012/10/20 18:05 <DIR> lib 2012/10/20 18:02 0 log.txt 2012/10/20 18:02 3,105 notify_url.php 2012/10/20 18:02 6,768 readme.txt 2012/10/20 18:02 3,753 return_url.php 6 个文件 19,271 字节 order\alipay_1\images 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:01 1,511 alipay.gif 2012/10/20 18:01 5,902 new-btn-fixed.png 2 个文件 7,413 字节 order\alipay_1\lib 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:01 5,975 alipay_core.function.php 2012/10/20 18:01 4,326 alipay_notify.class.php 2012/10/20 18:01 2,563 alipay_service.class.php 2012/10/20 18:01 3,431 alipay_submit.class.php 4 个文件 16,295 字节 order\alipay_2 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:02 1,662 alipay.config.php 2012/10/20 18:02 4,009 alipayto.php 2012/10/20 18:05 <DIR> images 2012/10/20 18:05 <DIR> lib 2012/10/20 18:02 0 log.txt 2012/10/20 18:02 4,527 notify_url.php 2012/10/20 18:02 6,774 readme.txt 2012/10/20 18:02 3,694 return_url.php 6 个文件 20,666 字节 order\alipay_2\images 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:02 1,511 alipay.gif 2012/10/20 18:02 5,902 new-btn-fixed.png 2 个文件 7,413 字节 order\alipay_2\lib 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:02 5,975 alipay_core.function.php 2012/10/20 18:02 4,330 alipay_notify.class.php 2012/10/20 18:02 2,567 alipay_service.class.php 2012/10/20 18:02 3,431 alipay_submit.class.php 4 个文件 16,303 字节 order\alipay_3 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:02 1,662 alipay.config.php 2012/10/20 18:02 3,928 alipayto.php 2012/10/20 18:05 <DIR> images 2012/10/20 18:05 <DIR> lib 2012/10/20 18:02 0 log.txt 2012/10/20 18:02 5,261 notify_url.php 2012/10/20 18:02 6,756 readme.txt 2012/10/20 18:02 4,793 return_url.php 6 个文件 22,400 字节 order\alipay_3\images 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:02 1,511 alipay.gif 2012/10/20 18:02 5,902 new-btn-fixed.png 2 个文件 7,413 字节 order\alipay_3\lib 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/20 18:02 5,975 alipay_core.function.php 2012/10/20 18:02 4,324 alipay_notify.class.php 2012/10/20 18:02 2,557 alipay_service.class.php 2012/10/20 18:02 3,431 alipay_submit.class.php 4 个文件 16,287 字节 order\images 的目录 2012/10/20 18:05 <DIR> . 2012/10/20 18:05 <DIR> .. 2012/10/21 10:23 3,666 fahuo_01.js 2012/10/21 10:23 3,491 fahuo_02.js 2012/10/20 18:03 1,190 ok.png 2012/10/21 10:23 19,597 PCASClass.js 2012/10/20 18:03 7,173 putbg.jpg 2012/10/20 18:03 3,850 style_01.css 2012/10/20 18:03 3,876 style_02.css 2012/10/20 18:03 3,850 style_03.css 2012/10/20 18:03 3,661 style_04.css 2012/10/20 18:03 3,039 style_05.css 2012/10/20 18:03 3,405 style_06.css 2012/10/20 18:03 3,405 style_07.css 2012/10/20 18:03 3,419 style_08.css 2012/10/20 18:03 3,230 style_09.css 2012/10/20 18:03 2,342 style_1.css 2012/10/20 18:03 3,033 style_10.css 2012/10/20 18:03 2,129 style_2.css 2012/10/20 18:03 2,021 style_3.css 2012/10/20 18:03 2,021 style_4.css 2012/10/20 18:03 2,021 style_5.css 2012/10/20 18:03 1,911 style_6.css 2012/10/20 18:03 1,865 style_7.css 2012/10/20 18:03 2,041 style_8.css 2012/10/20 18:03 2,342 style_9.css 2012/10/21 10:23 3,366 sub1.js 2012/10/21 10:23 3,133 sub2.js 2012/10/20 18:03 13,179 tubiao.gif 2012/10/20 18:03 17,534 tubiao.jpg 2012/10/20 18:03 194 wfsub.gif 29 个文件 125,984 字节 所列文件总数: 82 个文件 465,332 字节 32 个目录 6,446,665,728 可用字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值