java对接支付宝支付--电脑网站支付

news/2025/2/28 7:34:51/
  1. pom导包
            <!--        支付宝--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>${alipay.version}</version></dependency><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.11.66.ALL</version><scope>compile</scope></dependency>
  2. yaml配置,这些参数都是自己申请时给的参数
    ali:#应用ID ,APPIDappId: protocol: https#接口加密encryptKey: encryptType: #应用私钥 RSA2私钥merchantPrivateKey: #支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。alipayPublicKey: #应用公钥keyappPublicKey: # 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数 用来支付宝回调notifyUrl: # 支付完成后需要跳转的页面地址returnUrl: # 签名方式signType: RSA2# 字符编码格式charset: utf-8# 支付宝网关gatewayUrl: https://openapi.alipay.com/gateway.do
  3. 请求参数

  4. 根据自己的业务需求,一般都是往订单表里去更新数据
    首先:获取订单编号和需要支付的金额,带着参数去发起支付请求
        @Overridepublic ResultInfo<?> postOrder(PayParam payParam){Orders orders = new Orders();orders.setClasscode(payParam.getCode)  //订单编号,唯一.setPayAmount(payParam.getPayAmount()); //支付金额this.save(orders);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date now = new Date();Date afterDate = new Date(now .getTime() + 900000);//支付超时时间15分钟//发起支付 参数全是stringString Out_trade_no = orders.getCode; //商户订单号String Subject = "购买服务"; //订单标题String Total_amount = String.valueOf(payParam.getPayAmount()); //支付金额String Product_code = "FAST_INSTANT_TRADE_PAY"; //产品码String time_expire = sdf.format(afterDate); //订单绝对超时时间String result = pay(Out_trade_no,Subject,Total_amount,Product_code,Body,time_expire);return ResultInfo.success(result,"新建成功");}
  5. 封装参数去发起请求,然后调用SDK生成的表单,这个表单是返回给前端用的
        @Value("${ali.appId}")private String alipayAppId;@Value("${ali.signType}")private String signType;@Value("${ali.gatewayUrl}")private String gatewayHost;@Value("${ali.notifyUrl}")private String aliPayNotifyUrl;@Value("${ali.returnUrl}")private String returnUrl;@Value("${ali.encryptKey}")private String encryptKey;@Value("${ali.encryptType}")private String encryptType;@Value("${ali.merchantPrivateKey}")private String merchantPrivateKey;@Value("${ali.alipayPublicKey}")private String alipayPublicKey;@Value("${ali.charset}")private String charset;private final String format = "json";public String pay(String out_trade_no, String subject, String total_amount, String product_code, String time_expire) {AlipayClient alipayClient = new DefaultAlipayClient(gatewayHost, alipayAppId, merchantPrivateKey, format, charset, alipayPublicKey, signType,encryptKey,encryptType);//PC网页支付使用AlipayTradePagePayRequest传参,下面调用的是pageExecute方法AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(returnUrl);alipayRequest.setNotifyUrl(aliPayNotifyUrl);JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", out_trade_no);bizContent.put("total_amount", total_amount);bizContent.put("subject", subject);bizContent.put("product_code", product_code);bizContent.put("time_expire", time_expire);alipayRequest.setBizContent(bizContent.toString());log.info("封装请求支付宝付款参数为:{}", bizContent.toString());// 调用SDK生成表单String result = null;try {result = alipayClient.pageExecute(alipayRequest).getBody();} catch (AlipayApiException e) {log.info("调用失败!!");return result;}log.info("请求支付宝付款返回参数为:{}", result);return result;}
  6. 支付宝回调,回调的接口地址一定是和配置的一样,主要是拿到支付端返回的支付状态,以及交易流水号等等可以更新订单表
    public Object alipayNotify(HttpServletRequest request) {log.info("------------------------------支付宝回调开始----------------------------------------");Map<String, String> params = new HashMap<>();Map requestParams = request.getParameterMap();for (Object o : requestParams.keySet()) {String name = (String) o;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] + ",";}//乱码解决,这段代码在出现乱码时使用。//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}log.info("params = " + params);String tradeStatus = params.get("trade_status");boolean signVerified = "TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus);//失败成功都要更新订单表if (signVerified) {//更新订单boolean byOutTradeNo=ordersService.putOrder(params);AssertUtil.isTrue(!byOutTradeNo, "修改支付宝支付状态失败");log.info("------------------------------支付宝回调结束----------------------------------------");return "success";}return "failure";}

 这样整个代码流程就结束啦
 分享的只是非常简单支付流程,像发票之类的可以根据自己的业务需求

 

 

 


http://www.ppmy.cn/news/705663.html

相关文章

微信V3版本支付下单、查询支付订单状态、订单退款接入正式项目中并引入策略模式实操

开篇介绍&#xff1a; 一、策略模式(Strategy Pattern)的概念 二、应用场景举例 三、角色 ​四、服务端OR客户端生成支付等二维码优缺点分析 五、 多渠道支付对接-策略模式简单工厂模式编码实操 六、查询支付订单状态 七、再看下订单退款实操 开篇介绍&#xff1a; 本文…

网上商城项目(购物车下单、支付)

目录 一、购物车结算前端功能实现 1.购物车页面实现结算功能&#xff0c;主要是拿到传入后台的gids 二、购物车结算后端功能实现 1.跳转订单页后台&#xff0c;主要是拿到订单页展示数据 2.订单页前台展示 三、生成订单 1.结算页的下单前端 2.结算下单后台实现 四、…

微信公众号支付(统一下单、支付结果通知、查询订单)

最近做的项目涉及到微信公众号的支付&#xff0c;翻遍文档和查阅众多资料后&#xff0c;记一下自己整的过程&#xff1a; 1.先看的官方文档&#xff0c;把DEMO下载下来&#xff0c;发现都是要证书的&#xff0c;继续看文档&#xff0c;API列表 2.还是看文档&#xff0c;参数&a…

网上商城系统支付方式如何配置?支付方式有哪些

众所周知&#xff0c;网购平台中的会员支付、商家收款绝大部分是通过第三方支付平台(微信、支付宝、银联...)进行交易&#xff0c;而一款网上商城系统中集成的支付接口也是多样化的&#xff0c;如&#xff1a;支付宝(电脑网站)、支付宝(手机网站)、微信支付(扫码支付)、微信支付…

微信支付常见错误和统一下单错误码详情

微信支付常见错误和统一下单错误码详情 微信支付常见问题描述及解决方法微信调用统一下单接口&#xff0c;当result_codeFAIL时&#xff0c;错误代码及错误描述参考链接&#xff1a; 微信支付常见问题描述及解决方法 序号问题错误描述解决方法1此公众号并没有这些scope的权限&…

三网折扣话费充值接口文档

话费充值接口文档 接口版本&#xff1a;1.0 ―、引言 文档概述 本文档提供话费充值接口规范说明&#xff0c;提供一整套的完整的接入示例(http 接口)供商户参 考&#xff0c;可以帮助商户开发人员快速完成接口开发与联调&#xff0c;实现与话费充值系统的交易互联。 公司官网&a…

【电路原理学习笔记】第2章:电压、电流和电阻:2.1 原子结构

第2章&#xff1a;电压、电流和电阻 2.1 原子结构 元素&#xff1a;不能用化学方法分解成更简单形式的物质称为元素。原子&#xff1a;原子是体现元素特性的最小粒子。原子核&#xff1a;原子核由质子和中子组成&#xff0c;质子带有正电荷&#xff0c;中子呈中性。电子带有负…

vue3+ts+elementui制作精美的课表

使用vue3tselementui 如何制作出精美的课表呢&#xff0c; 最终效果图如下: 直接上代码&#xff1a; 这里直接把封装成一个课表的组件&#xff1a; <script setup lang"ts"> import { ref, watch, onMounted } from "vue"; import IconText from …