springboot 前后端分离 电商项目调用支付宝沙箱接口的从头到尾详细流程

使用沙箱版支付宝过程

一、公钥私钥的填写

1、打开支付宝开发平台官网—》登录—》进入管理中心(沙箱环境会进行不定期的维护,我连续等了几天也打不开,最后我换了一个浏览器就可以了)
在这里插入图片描述
在这里插入图片描述
2、现在就需要去下载解决密钥的问题
2.1 进入在支付宝开发平台首页—》开发服务中的沙箱
在这里插入图片描述
3、然后跟着步骤下载一个密钥生成工具
在这里插入图片描述
5、打开这个工具
在这里插入图片描述
然后复制应用公钥,把复制的应用公钥粘贴到刚才打开的沙箱应用中
在这里插入图片描述
密钥到这里就相当于解决了

二、引入config配置

1.引入依赖(这里可以自行去maven仓库下载沙箱依赖)

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

2.项目目录

在这里插入图片描述
该类也可以直接从官方文档里将该类复制过来。官方文档下载地址为:https://docs.open.alipay.com/270/106291

package com.lzh.zfbpaydemo.paycommon;
import java.io.FileWriter;
import java.io.IOException;
 
/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */
 
public class AlipayConfig {
   
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
   // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
   public static String app_id = "对应沙箱中的APPID";
   
   // 商户私钥,您的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这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
   public static String notify_url = " http://49.269.31.237:8081 /pay/synnotify";
 
   // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,假设这里的公网IP和端口为:49.269.31.237:8081
  public static String return_url = "http://localhost:8080/pay/pay_success";
 
   // 签名方式
   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();
                }
            }
        }
    }
}

注意点(我先用同步的方法测试,后面在改):

  • merchant_private_key:填的是刚才按照的工具里面生成的应用私钥(一定要保证复制粘贴得正确

  • gatewayUrl:我们这里是测试环境,所以使用的是:https://openapi.alipaydev.com/gateway.do
    正式环境下我们使用:https://openapi.alipay.com/gateway.do

  • public static Strin return_url = “http://localhost:8080/pay/pay_success”;这里的pay/pay_success相当于一个请求业务

三、开始写业务

1.先写一个测试的html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>测试支付</title>
</head>
<body>

<div>
    <form th:action="@{/pay}" method="post">
        订单id<input type="text" name="oid">
        订单名称<input type="text" name="oname">
        付款金额<input type="text" name="money">
        描述<input type="text" name="desc">
        <input type="submit" value="提交">
    </form>
</div>
</body>
</html>

2.写PayController

@Controller
public class PayController {

	//先进入test页面,填写订单名称和订单金额填写好
    @RequestMapping("/test")
    public String pay(){
        return "pay/test";
    }

    //这里可以选择不用传递订单号oid,下面我注释了随机生成的订单号,但也可以自己传递咯
    @RequestMapping("/pay")
    public  String  oderConfirm(String oid,String oname, String money, String desc, Model model) {
//        //生成订单号
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
//        String orderSn = simpleDateFormat.format(Calendar.getInstance().getTime());
        //像支付宝发送请求

        //初始化AlipClient
        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 out_trade_no = oid;
        //付款金额,必填
        String total_amount = money;
        //订单名称,必填
        String subject = oname;
        //商品描述,可空
        String body = desc;
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\""
                + total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
        //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
        //        + "\"total_amount\":\""+ total_amount +"\","
        //        + "\"subject\":\""+ subject +"\","
        //        + "\"body\":\""+ body +"\","
        //        + "\"timeout_express\":\"10m\","
        //        + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

        AlipayTradePagePayResponse result= null;
        try {
            result=alipayClient.pageExecute(alipayRequest);

        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        model.addAttribute("result", result);
        return "pay/pay";
    }
  }

3.写让支付宝自动跳转的页面()

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>跳转的中转页面</title>
</head>
<body>
<div th:utext="${result}"></div>


</body>
</html>

这里说明一下(这里是我把坑解决了以后获取的值哦,到此为止,如果你们跟着我这个步骤写是得不出结果的):
如果使用:

,获取的页面就是一堆请求
在这里插入图片描述

说到这里是不是显示不出?因为我留了一个坑,哈哈哈!哈哈哈!,我之前眼睛找瞎都没有找到

到此为止的结果就是
在这里插入图片描述
我百度了好久,发现没有一个博主出现了类似的错误的,在泪奔~~~ 我调试了超级久。
好了吧,就不买关子了:答案就是在PayController中result赋值那里是错误的:
result=null接收的类型应该是String,而不是 AlipayTradePagePayResponse,对应的抛出异常那里的 result=alipayClient.pageExecute(alipayRequest);也要改成 result = alipayClient.pageExecute(alipayRequest).getBody();
最后修改我就截个图吧,怕你们还是不会改
在这里插入图片描述

总结

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值