当前位置:首页 > 上门服务 >

为什么我创建支付宝订单失败(支付宝订单创建失败是怎么回事)

来源:原点资讯(m.360kss.com)时间:2023-11-28 13:26:43作者:YD166手机阅读>>

本文将为大家详细介绍如何在Spring Boot项目中实现微信和支付宝的支付功能。我们将首先对微信和支付宝的支付流程进行简要介绍,然后逐步引导大家完成支付功能的具体实现。

文章内容如下:

  • 支付流程简介
  • 项目环境配置
  • 支付宝支付实现
  • 微信支付实现
  • 总结
支付流程简介

支付流程大致可以分为以下几个步骤:

  1. 用户选择支付方式(微信或支付宝)。
  2. 后端根据用户选择的支付方式,生成支付订单信息,并将订单信息发送给对应的支付平台。
  3. 支付平台生成支付二维码,并返回给后端。
  4. 后端将支付二维码返回给前端。
  5. 用户扫描二维码进行支付。
  6. 支付完成后,支付平台会通知后端支付结果。
  7. 后端根据支付结果更新订单状态。

接下来,我们将分别实现支付宝和微信的支付功能。

项目环境配置

首先,我们需要在Spring Boot项目中引入支付宝和微信支付所需的依赖。在pom.xml文件中添加以下内容:

xml复制代码<dependencies> <!-- 支付宝支付依赖 --> <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.10.30.ALL</version> </dependency> <!-- 微信支付依赖 --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>3.7.0</version> </dependency> </dependencies>

然后,在application.yml文件中添加支付宝和微信支付的配置信息,如下:

yaml复制代码alipay: app-id: your_alipay_app_id private-key: your_alipay_private_key alipay-public-key: your_alipay_public_key server-url: https://openapi.alipay.com/gateway.do charset: utf-8 sign-type: RSA2 notify-url: http://your_domain/alipay/notify wechat: app-id: your_wechat_app_id mch-id: your_wechat_mch_id mch-key: your_wechat_mch_key notify-url: http://your_domain/wechat/notify 支付宝支付实现创建支付宝支付服务类

首先,我们需要创建一个支付宝支付服务类(AlipayService.java)来封装支付宝支付相关的逻辑:

java复制代码@Service public class AlipayService { @Value("${alipay.app-id}") private String appId; @Value("${alipay.private-key}") private String privateKey; @Value("${alipay.alipay-public-key}") private String alipayPublicKey; @Value("${alipay.server-url}") private String serverUrl; @Value("${alipay.charset}") private String charset; @Value("${alipay.sign-type}") private String signType; @Value("${alipay.notify-url}") private String notifyUrl; /** * 创建支付宝支付订单 * @param orderId 订单ID * @param amount 支付金额 * @return 支付宝支付二维码链接 * @throws AlipayApiException */ public String createAlipayOrder(String orderId, BigDecimal amount) throws AlipayApiException { // 实例化客户端 AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, "json", charset, alipayPublicKey, signType); // 创建API对应的Request AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); // 设置支付宝支付回调地址 request.setNotifyUrl(notifyUrl); // 设置请求参数 AlipayTradePrecreateModel model = new AlipayTradePrecreateModel(); model.setOutTradeNo(orderId); model.setTotalAmount(amount.toString()); model.setSubject("订单支付"); request.setBizModel(model); // 发起请求,获取支付宝支付二维码链接 AlipayTradePrecreateResponse response = alipayClient.execute(request); // 判断请求是否成功 if (response.isSuccess()) { return response.getQrCode(); } else { throw new AlipayApiException(response.getSubMsg()); } } /** * 处理支付宝支付结果通知 * @param requestParams 支付宝支付结果通知参数 * @return 是否处理成功 */ public boolean handleAlipayNotify(Map<String, String> requestParams) { try { // 验签 boolean signVerified = AlipaySignature.rsaCheckV1(requestParams, alipayPublicKey, charset, signType); if (signVerified) { // 获取支付宝支付结果通知数据 String outTradeNo = requestParams.get("out_trade_no"); // 商户订单号 String tradeNo = requestParams.get("trade_no"); // 支付宝交易号 String tradeStatus = requestParams.get("trade_status"); // 交易状态 // 根据支付结果更新订单状态 if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) { // 更新订单状态为已支付 // updateOrderStatus(outTradeNo, tradeNo, "已支付"); return true; } } } catch (AlipayApiException e) { e.printStackTrace(); } return false; } } 创建支付宝支付控制器类

接下来,我们需要创建一个支付宝支付控制器类(AlipayController.java)来处理前端的支付请求和支付宝支付结果通知:

java复制代码@RestController @RequestMapping("/alipay") public class AlipayController { @Autowired private AlipayService alipayService; /** * 创建支付宝支付订单 * @param orderId 订单ID * @param amount 支付金额 * @return 支付宝支付二维码链接 */ @GetMapping("/createOrder") public String createAlipayOrder(@RequestParam String orderId, @RequestParam BigDecimal amount) { try { String qrCodeUrl = alipayService.createAlipayOrder(orderId, amount); return qrCodeUrl; } catch (AlipayApiException e) { e.printStackTrace(); return "创建支付宝支付订单失败"; } } /** * 支付宝支付结果通知处理 * @param request 请求对象 * @return 支付宝支付结果通知响应 */ @PostMapping("/notify") public String handleAlipayNotify(HttpServletRequest request) { // 获取支付宝支付结果通知参数 Map<String, String> requestParams = new HashMap<>(); Map<String, String[]> parameterMap = request.getParameterMap(); for (String key : parameterMap.keySet()) { requestParams.put(key, StringUtils.join(parameterMap.get(key), ",")); } // 处理支付宝支付结果通知 boolean success = alipayService.handleAlipayNotify(requestParams); if (success) { return "success"; } else { return "failure"; } } }

至此,支付宝支付功能已经实现。用户可以通过请求/alipay/createOrder接口创建支付宝支付订单,然后扫描返回的支付二维码进行支付。支付完成后,支付宝会向/alipay/notify接口发送支付结果通知。

微信支付实现

我们可以先定义一个WechatPayService接口,用于封装微信支付相关的操作:

java复制代码public interface WechatPayService { /** * 统一下单 * * @param order 订单信息 * @return 统一下单结果 * @throws WxPayException 微信支付异常 */ WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest order) throws WxPayException; /** * 查询订单 * * @param transactionId 微信订单号 * @param outTradeNo 商户订单号 * @return 订单查询结果 * @throws WxPayException 微信支付异常 */ WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxPayException; /** * 关闭订单 * * @param outTradeNo 商户订单号 * @return 关闭订单结果 * @throws WxPayException 微信支付异常 */ WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxPayException; /** * 申请退款 * * @param request 退款请求 * @return 退款结果 * @throws WxPayException 微信支付异常 */ WxPayRefundResult refund(WxPayRefundRequest request) throws WxPayException; /** * 查询退款 * * @param transactionId 微信订单号 * @param outTradeNo 商户订单号 * @param outRefundNo 商户退款单号 * @param refundId 微信退款单号 * @return 退款查询结果 * @throws WxPayException 微信支付异常 */ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, String outRefundNo, String refundId) throws WxPayException; /** * 下载对账单 * * @param request 下载对账单请求 * @return 下载对账单结果 * @throws WxPayException 微信支付异常 */ WxPayBillResult downloadBill(WxPayDownloadBillRequest request) throws WxPayException; /** * 通知处理 * * @param xmlData 通知内容 * @return 通知结果 * @throws WxPayException 微信支付异常 */ WxPayNotifyResult parsePayNotifyResult(String xmlData) throws WxPayException; }

然后,我们可以实现这个接口,并在实现类中注入微信支付相关的配置信息:

java复制代码@Service public class WechatPayServiceImpl implements WechatPayService { private final WxPayService wxPayService; @Autowired public WechatPayServiceImpl(WxPayConfig wxPayConfig) { this.wxPayService = new WxPayServiceImpl(); this.wxPayService.setConfig(wxPayConfig); } @Override public WxPayUnifiedOrderResult unifiedOrder(WxPayUnifiedOrderRequest order) throws WxPayException { return wxPayService.unifiedOrder(order); } @Override public WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxPayException { return wxPayService.queryOrder(transactionId, outTradeNo); } @Override public WxPayOrderCloseResult closeOrder(String outTradeNo) throws WxPayException { return wxPayService.closeOrder(outTradeNo); } @Override public WxPayrefundResult refund(WxPayRefundRequest request) throws WxPayException { return wxPayService.refund(request); } @Override public WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, String outRefundNo, String refundId) throws WxPayException { return wxPayService.refundQuery(transactionId, outTradeNo, outRefundNo, refundId); } @Override public WxPayBillResult downloadBill(WxPayDownloadBillRequest request) throws WxPayException { return wxPayService.downloadBill(request); } @Override public WxPayNotifyResult parsePayNotifyResult(String xmlData) throws WxPayException { return wxPayService.parseOrderNotifyResult(xmlData); } }

在实现微信支付接口的时候,我们使用了WxPayService,这是微信支付SDK提供的封装了微信支付相关操作的类。我们通过注入WxPayConfig来配置WxPayService。WxPayConfig中包含了微信支付的相关参数,我们可以在配置文件中配置这些参数,然后通过WxPayConfig来构建WxPayService。


原文链接:https://juejin.cn/post/7251833062619037754

,

栏目热文

支付宝能创建订单吗(支付宝无法创建订单是为啥)

支付宝能创建订单吗(支付宝无法创建订单是为啥)

背景一大早运营报来了一个问题:问题描述:有一个订单客户支付成功了,订单状态却显示过期。预期:客户应该支付不了失效的订单。...

2023-11-28 13:49:23查看全文 >>

液压剪板机换刀怎么换(液压闸式剪板机怎么调刀视频)

液压剪板机换刀怎么换(液压闸式剪板机怎么调刀视频)

了解剪板机机床的人可能知道,机床用的剪板机刀片经过一段时间的使用后会出现损耗的问题,所以每隔一段时间必须更换新刀片或是...

2023-11-28 14:12:57查看全文 >>

液压剪板机调刀教程(液压剪板机上刀怎么调上去)

液压剪板机调刀教程(液压剪板机上刀怎么调上去)

在钣金加工行业中常常会使用到剪板机,看似简单的剪切动作,其实蕴藏了许多的窍门,从刀片间隙的调整步骤到适用不同材质的调整技...

2023-11-28 14:00:04查看全文 >>

液压剪板机怎么调刀图解(液压剪板机怎样调刀)

液压剪板机怎么调刀图解(液压剪板机怎样调刀)

1. 拆下下刀片,逐片清洗干净。 2. 刀片可以四面使用,挑选好的一面贴紧安装好。并检查刀片水平、垂直两个方向的的平直度...

2023-11-28 13:54:21查看全文 >>

为什么支付宝提交不了订单(为什么说支付宝订单不存在)

为什么支付宝提交不了订单(为什么说支付宝订单不存在)

支付宝平台宕机,多地方无法形成交易 昨天(2019年12月5日)下午5时许,有多个地区网友反映,支付宝出现网络故...

2023-11-28 13:29:35查看全文 >>

23岁认干妈有什么仪式(认干妈有什么不好的吗)

23岁认干妈有什么仪式(认干妈有什么不好的吗)

湖北随州:女孩在认干妈仪式上磕头敬茶,干妈回赠礼物引人羡慕:仪式感拉满。你孩子有干妈吗?张小姐和周小姐是一对好闺蜜。两人...

2023-11-28 14:05:37查看全文 >>

拜菩萨为干娘的步骤(拜干娘仪式的正确方法)

拜菩萨为干娘的步骤(拜干娘仪式的正确方法)

明日农历二月十九观音诞,牢记“1拜2忌3做4吃”,为家人祈福纳祥!明天是农历二月十九,是传统的观世音菩萨的生日,观世音菩...

2023-11-28 14:01:51查看全文 >>

认干妈需要什么礼数(认干妈的讲究和禁忌)

认干妈需要什么礼数(认干妈的讲究和禁忌)

罗帮义文 干爹一词在我故乡的山村是褒义词,是孩子的第二个父亲,被认的干爹要像亲儿子一样对待,孩子的嫁娶干爹和亲爹要同坐...

2023-11-28 13:43:46查看全文 >>

20多岁才认干妈怎么相处(三十多岁有认干妈的吗)

20多岁才认干妈怎么相处(三十多岁有认干妈的吗)

想给孩子一个好的成长环境,认干妈有什么讲究,为什么文/子女,是家庭的未来,是父母的心头肉、掌上明珠。每一个父母,都希望给...

2023-11-28 14:05:20查看全文 >>

文档排行