当前位置: 首页 > news >正文

微信支付宝支付实现 (基于Elegent-pay框架) - 2025/7/29

首先你需要有个商户号, 劝退...

微信和支付宝支付的流程大致相同

image

用户支付成功后

image

  • 微信支付官网:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml

  • 支付宝支付官网:https://opendocs.alipay.com/open/194/106078?ref=api

支付框架 : https://gitee.com/myelegent/elegent-pay

准备工作

1.在项目中引入依赖:(按需引入)

<!--微信支付-->
<dependency><groupId>cn.elegent.pay</groupId><artifactId>elegent-pay-wxpay</artifactId><version>1.0.0</version>
</dependency>
<!--支付宝支付-->
<dependency><groupId>cn.elegent.pay</groupId><artifactId>elegent-pay-alipay</artifactId><version>1.0.0</version>
</dependency>

2.在项目配置文件添加配置:(按需配置)

elegent:pay:wxpay:mchId: 1561414331appId: wx6592a2db3f85ed25appSecret: d9a9ff00a633cd7353a8925119063b01mchSerialNo: 25FBDE3EFD31B03A4377EB9A4A47C517969E6620apiV3Key: CZBK51236435wxpay435434323FFDuv3alipay:appId: 2021003141676135callback:domain: https://2d3ac179.r5.cpolar.topwatch: truecycle: 10

wxpay(微信支付)配置说明

(1)mchId: 商户号

(2)appId: APP编号

(3)appSecret: app密钥

(4)mchSerialNo : 商户证书序列号

(5)apiV3Key : v3版本密钥

alipay(支付宝)配置说明

(1)appId:APP编号

callback(回调通知)配置说明

(1)domain:工程域名根目录。如果在本地调试,建议使用内网穿透工具生成此地址。

(2)watch:是否开启回调监察。如果开启,将根据用户给出的本地未支付订单记录进行支付状态查询,如果已支付则自动进行回调处理。缺省值为false。

(3)cycle: 回调监察周期,单位为秒。缺省值为10。

3.添加微信私钥和支付宝公钥、私钥

在resources目录下创建wxpay_private.key,用户存储微信私钥

在resources目录下创建alipay_private.key,用户存储支付宝私钥

在resources目录下创建alipay_public.key,用户存储支付宝公钥

Controller层代码

@Autowired
private ElegentPay elegentPay;@PostMapping("/requestPay/{tradeType}/{platform}")public PayResponse requestPay(@RequestBody PayDto payDto, @PathVariable("tradeType") String tradeType, @PathVariable("platform") String platform) {log.info("请求支付{}" , payDto);// 创建订单Order order = orderService.createOrder(payDto, platform);// 创建支付请求PayRequest payRequest = new PayRequest();// 设置订单编号payRequest.setBody(order.getSkuName());// 设置订单金额payRequest.setTotalFee(order.getAmount());// 设置订单号payRequest.setOrderSn(order.getOrderNo());payRequest.setOpenid(order.getOpenId());return elegentPay.requestPay(payRequest, tradeType, platform);}

支付回调代码

@Service
@Slf4j
public class CallBackServiceImpl implements CallBackService {@Autowiredprivate OrderService orderService;@Overridepublic void successPay(String orderSn) {Order order = orderService.getOrderByNo(orderSn);if(order != null) {if (order.getStatus().equals(OrderStatus.ORDER_STATUS_CREATE)) {order.setStatus(OrderStatus.ORDER_STATUS_PAYED); //订单状态  已支付order.setPayStatus(PayStatus.PAY_STATUS_PAYED);//支付状态  成功orderService.updateById(order);//todo 发货}// todo 发货代码}}@Overridepublic void failPay(String orderSn) {log.info("支付失败回调!"+orderSn);}@Overridepublic void successRefund(String orderSn) {log.info("退款成功回调!"+orderSn);Order order = orderService.getOrderByNo(orderSn);if (order != null) {order.setPayStatus(PayStatus.PAY_STATUS_REFUNDIED);// 支付状态:退款成功orderService.updateById(order);}}@Overridepublic void failRefund(String orderSn) {log.info("退款失败回调!"+orderSn);Order order = orderService.getOrderByNo(orderSn);if (order != null) {order.setPayStatus(PayStatus.PAY_STATUS_REFUNDING);// 支付状态:退款中orderService.updateById(order);}}}

接口幂等性

接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。

解决方案

  • 令牌机制实现

image

  • 序列号机制实现

通过sn机制实现接口的幂等性,示意图如下:

image

  • 优雅幂等性框架 https://gitee.com/chuanzhiliubei/elegent-idem

这是一个基于springboot的优雅的幂等性框架。使用这个组件可以让你更轻松、更优雅地在项目中实现接口幂等性处理,让你更专注业务代码的开发。它目前支持令牌和序列号两种检查策略。用户只需要在方法上添加一个注解,即可实现接口幂等性。

使用方法

将代码拉到本地 , install到本地仓库进行使用

详细步骤
image

使用

1)在pom.xml添加依赖

<!--幂等性框架-->
<dependency><groupId>cn.elegent.idem</groupId><artifactId>elegent-idem-core</artifactId><version>1.1.0</version>
</dependency>

(2)在application.yml中添加配置

elegent:pay:wxpay:mchId: 1561414331appId: wxffb3637a228223b8appSecret: 84311df9199ecacdf4f12d27b6b9522dmchSerialNo: 4B3B3DC35414AD50B1B755BAF8DE9CC7CF407606apiV3Key: CZBK51236435wxpay435434323FFDuv3alipay:appId: 2021003141676135callback:domain: http://20dfc451.r8.cpolar.topwatch: truecycle: 10idem:redis:host: 192.168.200.128port: 6379password:

(3)在OrderController的requestPay方法上添加注解

@ElegentIdem(type="sn" ,name="requestId")
@PostMapping("/requestPay/{tradeType}/{platform}")
public PayResponse requestPay(@RequestBody PayDto payDto, @PathVariable("tradeType") String tradeType, @PathVariable("platform") String platform) {//1. 创建订单Order order = orderService.createOrder(payDto, platform);//创建订单//2. 调用支付PayRequest param=new PayRequest();param.setBody(order.getSkuName());//商品名称param.setOrderSn(order.getOrderNo());//订单编号param.setTotalFee(order.getAmount().intValue());//订单金额param.setOpenid(order.getOpenId());//openidreturn elegentPay.requestPay(param, tradeType, platform);
}
http://www.sczhlp.com/news/5494/

相关文章:

  • EI检索第十四届先进材料与工程材料国际会议(ICAMEM 2025)
  • Python 3.14 下载安装教程,一步安装到位,新手也能变编程大师
  • 2460. 对数组执行操作
  • 跑步记录
  • 417——字典序路径 - love
  • 《苏秦以连横说秦》
  • 软工8.4
  • Verilog学习笔记-20250802
  • P8523 [IOI 2021] 位移寄存器 题解
  • 情绪
  • 8-4
  • GraphPad Prism 10 mac+win安装包
  • Flutter plugin开发小知识之:ActivityAware 详解
  • Motion 5 for mac(视频后期特效)v5.10中文版
  • 完整教程:【加解密与C】HASH系列(四)SHA-3
  • 8月4日总结
  • 22222222
  • 关于本人在博客园平台停更的公告
  • 8/4
  • Pwn2Own Automotive 2025 第二日战报:38.5万美元奖金与16个零日漏洞
  • 图分割算法荣获SC21时间检验奖
  • P6246 [IOI 2000] 邮局
  • k8s学习2
  • K8S学习(day1)
  • 单调栈
  • MySQL 常用SQL语句
  • 试卷最后一小问 sillation 造题的几分钟 | CTOI 成立两周年
  • 7-26 小测
  • 第二十一篇
  • 03端口占用:Windows电脑上的端口8080被占用,怎么释放出来?