springBoot 调用支付宝开发者平台支付接口

环境准备

现在所有的环境都是使用支付宝开发者平台提供的沙箱环境

  1. 访问https://openhome.alipay.com/platform/appDaily.htm?tab=info 手机扫描登录
    填写资料
    在这里插入图片描述

  2. 配置支付密匙详细信息
    显示如下:
    2.1 首先点击 RSA2(SHA256)密钥 设置
    2.2 点击公钥
    在这里插入图片描述
    2.3 根据你的电脑系统下载对应的生成器, 本人如下所示

    在这里插入图片描述
    复制应用公钥保存设置
    在这里插入图片描述
    这样会生成支付宝公钥: 请注意支付宝公钥和应用公钥的区别,两者值不相同,用途也不相同

在这里插入图片描述

此时我们就可以进行支付宝正式开发了。
3. springBoot 配置
3.1 pom引入jar包

      <!-- 支付宝支付 -->
      <dependency>
          <groupId>com.alipay.sdk</groupId>
          <artifactId>alipay-sdk-java</artifactId>
          <version>3.0.0</version>
      </dependency>

3.2 添加配置文件 AliPayConfig

// 应用ID
  public static String APP_ID = "登录网页上的app_id";
// 应用私钥
  public static String MERCHANT_PRIVATE_KEY = "这个就是你软件配置应用公钥上面的应用私钥";
// 应用公钥
  public static String ALIPAY_PUBLIC_KEY = "这个就是你软件生成的应用公钥";
//    支付宝公钥
  public static String ZFB_PUBLIC_ID ="XXXXXXXXXXXXX"
//	异步通知   【稍后会进行解释】
  public static String notify_url = "";

// 支付成功后出现几秒的回调页面
  public static String return_url = "XXXXXXXXXXXXX";

// 签名方式
  public static String SIGN_TYPE = "RSA2";

// 字符编码格式
  public static String CHARSET = "utf-8";

// 支付宝网关  alipaydev 为沙箱网关  这里不用更改
  public static String GATEWAYURL = "https://openapi.alipaydev.com/gateway.do";

3.3 接口编写 【此为方法,接口你可以自定义编写】:

 /**
     * app端订单网页支付
     *
     * @param outTradeNo  订单编号
     * @param totalAmount 订单价格
     * @param subject     商品名称
     */
    @Override
    public String appPagePay(String outTradeNo, Integer totalAmount, String subject) throws Exception {
        AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        /** 同步通知,支付完成后,支付成功页面*/
        alipayRequest.setReturnUrl(AliPayConfig.return_url);
        /** 异步通知,支付完成后,需要进行的异步处理*/
        alipayRequest.setNotifyUrl(AliPayConfig.notify_url);
        /**销售产品码(固定)*/
        String productCode = "QUICK_WAP_WAY";
        /** 进行赋值 */
        AlipayTradeWapPayModel wapPayModel = new AlipayTradeWapPayModel();
        wapPayModel.setOutTradeNo(outTradeNo);
        wapPayModel.setSubject(subject);
        wapPayModel.setTotalAmount(totalAmount.toString());// 支付金额
        wapPayModel.setBody("商品名称");
        wapPayModel.setTimeoutExpress("2m");
        wapPayModel.setProductCode(productCode);
        alipayRequest.setBizModel(wapPayModel);
        /** 格式转换*/
        String result = alipayClients.pageExecute(alipayRequest).getBody().replace('\"', '\'').replace('\n', ' ');
        return result;
    }

其中:

/** 异步通知,支付完成后,需要进行的异步处理*/
        alipayRequest.setNotifyUrl(AliPayConfig.notify_url);

notify_url 意思为当用户支付成功后,支付宝会远程调用你的接口,当然此接口必须是可以外网访问的接口。同时你也要返回给支付宝接口一些数据 否则支付宝会每隔一段时间调用你的接口, 返回的值为七个字符的
所以在上面 AliPayConfig 配置文件中的 notify_url格式为 http:// 外网 + 端口 +接口
return_url 接入如下所示:

    @ApiOperation("异步通知")
    @RequestMapping(value = "/order/getNotifyUrlInfo",method = RequestMethod.POST)
    public String aliPayNotifyUrlInfo(HttpServletRequest request, HttpServletResponse response){
    //调用的Service接口   
        return orderService.getNotifyUrlInfo(request,response);
    }

getNotifyUrlInfo方法详情:

 @Override
    public String getNotifyUrlInfo(HttpServletRequest request, HttpServletResponse response) {
        logger.info("收到支付宝异步回调 start...");
         //接收参数进行校验
            Map<String, String> parameters = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            System.out.println(requestParams.toString());
            for (Map.Entry<String, String[]> entry : requestParams.entrySet()) {
                String key = entry.getKey();
                String[] values = entry.getValue();
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
            }
            parameters.put(key, valueStr);
        }
        //appid
        String appId = request.getParameter("app_id");
        //我们调用appPagePay方法 传入的订单编号
        String merchantOrderNo = request.getParameter("out_trade_no");
//        支付宝交易号
        String tradeNo = request.getParameter("trade_no");
            try {
                //交易状态
                String payState = request.getParameter("trade_status");
//                用户支付金额
                BigDecimal totalAmount = new BigDecimal(request.getParameter("total_amount"));
//                实收金额
                BigDecimal receiptAmount = new BigDecimal(request.getParameter("receipt_amount"));
                logger.info("交易状态:{},支付金额为:{},实付金额为:{}", payState, totalAmount,receiptAmount);
                //验证签名
                boolean signVerified = AlipaySignature.rsaCheckV1(parameters, AliPayConfig.ZFB_PUBLIC_ID , "UTF-8", AliPayConfig.SIGN_TYPE);
//                验签  验证商户id  验证支付宝返回状态
                if (signVerified && AliPayConfig.APP_ID.equals(appId) && "TRADE_SUCCESS".equals(payState)) {
                //你的业务参数    判断成功后给支付宝返回7个字符的success
                   return "success";
                }
            } catch (AlipayApiException e) {
                logger.error(e.getErrMsg());
                throw new RuntimeException("调用支付宝接口发生异常");
            }
        return "";
    }

详细返回参数请参考支付宝开发者平台 https://opendocs.alipay.com/open/203/105286
异步回调接口必须为post
3.4 测试 【将服务部署在外网可访问的服务】
postMan请求支付:
在这里插入图片描述
请求appPagePay方法后如果我们配置的参数【app_id 应用秘钥等无误】那么会返回一个form表单
在这里插入图片描述
使用浏览器打开如下所示:
在这里插入图片描述
点击继续浏览器付款:
在这里插入图片描述
点击支付宝账户登录
在这里插入图片描述
其中账号和密码在如下中:
在这里插入图片描述
输入账号密码,点击支付,输入密码等常见步骤这里不进行详述
3.5 查看控制台支付宝是否异步回调我们的接口

到此我们支付宝支付接口对接入门成功!

4. uni-app 调用支付宝app进行支付
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值