提交 d396743e authored 作者: hzh's avatar hzh

微信支付模块集成

上级 b27cce0b
...@@ -271,6 +271,13 @@ ...@@ -271,6 +271,13 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 支付 -->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-pay</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-common-pay</artifactId>
<description>
ruoyi-common-pay 支付接口模块
</description>
<dependencies>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-WxPay</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.github.javen205</groupId>
<artifactId>IJPay-Core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
package org.dromara.common.pay.config;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>微信配置 Bean</p>
*
* @author Javen
*/
@Getter
@Setter
@ToString
@Component
@ConfigurationProperties(prefix = "pay.wechat.v3")
public class WechatPayConfiguration {
/**
* 应用编号
*/
private String appId;
/**
* 商户号
*/
private String mchId;
/**
* 商户平台「API安全」中的 APIv3 密钥
*/
private String apiKey3;
/**
* API 证书中的 key.pem
*/
private String keyPath;
/**
* API 证书中的 cert.pem
*/
private String certPath;
/**
* 微信平台证书
*/
private String platformCertPath;
/**
* 应用域名,回调中会使用此参数
*/
private String domain;
/**
* 回调函数的接口路径
*/
private String notify;
}
package org.dromara.common.pay.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-10
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class Amount implements Serializable {
/**
* 订单总金额,单位为分。
*/
private Integer total;
/**
* 用户支付金额,单位为分。
*/
private Integer payer_total;
/**
* CNY:人民币,境内商户号仅支持人民币。
*/
private String currency;
/**
* 用户支付币种
*/
private String payer_currency;
}
package org.dromara.common.pay.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-10
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class GoodsDetail implements Serializable {
/**
* 商品编码。
*/
private String goods_id;
/**
* 用户购买的数量。
*/
private Integer quantity;
/**
* 商品单价,单位为分。
*/
private Integer unit_price;
/**
* 商品优惠金额。
*/
private Integer discount_amount;
/**
* 商品备注信息。
*/
private String goods_remark;
}
package org.dromara.common.pay.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-10
* @desc jsapi 回调参数
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class JsapiNotifyModel implements Serializable {
/**
* 直连商户申请的公众号或移动应用AppID。
*/
private String appid;
/**
* 商户的商户号,由微信支付生成并下发。
*/
private String mchid;
/**
* 商户系统内部订单号,可以是数字、大小写字母_-*的任意组合且在同一个商户号下唯一。
*/
private String out_trade_no;
/**
* 微信支付系统生成的订单号。
*/
private String transaction_id;
/**
* 交易类型,枚举值:
* JSAPI:公众号支付
* NATIVE:扫码支付
* App:App支付
* MICROPAY:付款码支付
* MWEB:H5支付
* FACEPAY:刷脸支付
*/
private String trade_type;
/**
* 交易状态,枚举值:
* SUCCESS:支付成功
* REFUND:转入退款
* NOTPAY:未支付
* CLOSED:已关闭
* REVOKED:已撤销(付款码支付)
* USERPAYING:用户支付中(付款码支付)
* PAYERROR:支付失败(其他原因,如银行返回失败)
*/
private String trade_state;
/**
* 交易状态描述。
*/
private String trade_state_desc;
/**
* 银行类型,采用字符串类型的银行标识。银行标识请参考《银行类型对照表》。
*/
private String bank_type;
/**
* 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。
*/
private String attach;
/**
* 支付完成时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。
*/
private String success_time;
/**
* 银行类型,采用字符串类型的银行标识。银行标识请参考《银行类型对照表》。
*/
private Payer payer;
/**
* 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。
*/
private Amount amount;
/**
* 支付场景信息描述。
*/
private SceneInfo scene_info;
/**
* 优惠功能,享受优惠时返回该字段
*/
private PromotionDetail promotion_detail;
}
package org.dromara.common.pay.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-10
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class Payer implements Serializable {
/**
* 用户在直连商户AppID下的唯一标识。
*/
private String openid;
}
package org.dromara.common.pay.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-10
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class PromotionDetail implements Serializable {
/**
* 券ID。
*/
private String coupon_id;
/**
* 优惠名称。
*/
private String name;
/**
* 优惠范围,枚举值:
* GLOBAL:全场代金券
* SINGLE:单品优惠。
*/
private String scope;
/**
* 优惠类型,枚举值:
* CASH:充值型代金券
* NOCASH:免充值型代金券
*/
private String type;
/**
* 优惠券面额。
*/
private Integer amount;
/**
* 活动ID。
*/
private String stock_id;
/**
* 微信出资,单位为分。
*/
private Integer wechatpay_contribute;
/**
* 商户出资,单位为分。
*/
private Integer merchant_contribute;
/**
* 其他出资,单位为分。
*/
private Integer other_contribute;
/**
* CNY:人民币,境内商户号仅支持人民币
*/
private String currency;
/**
* 单品列表信息
*/
private GoodsDetail goods_detail;
}
package org.dromara.common.pay.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author hzh
* @date 2024-12-10
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Accessors(chain = true)
public class SceneInfo implements Serializable {
/**
* 终端设备号(门店号或收银设备ID)。
*/
private String device_id;
}
package org.dromara.common.pay.service;
import com.ijpay.wxpay.model.v3.UnifiedOrderModel;
import org.dromara.common.pay.domain.JsapiNotifyModel;
/**
* @author wenhe
*/
public interface IWxPayService {
/**
* 微信支付小程序支付
*
* @param model model
* @return 支付结果
* @throws Exception
*/
String jsapi(UnifiedOrderModel model) throws Exception;
/**
* 微信支付查询
* @param outTradeNo 【商户订单号】 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
* @return 支付结果
*/
JsapiNotifyModel query(String outTradeNo);
/**
* 自动获取证书
*
* @param serialNumber serialNumber
* @return 是否成功
* @throws Exception 异常
*/
boolean autoUpdateOrGetCertificate(String serialNumber) throws Exception;
/**
* 支付回调
*
* @param timestamp 时间搓
* @param nonce nonce
* @param serialNo 唯一序列号
* @param signature 签名
* @param result 支付通知密文
* @return 支付通知明文
*/
JsapiNotifyModel notify(String timestamp, String nonce, String serialNo, String signature, String result);
}
org.dromara.common.pay.config.WechatPayConfiguration
org.dromara.common.pay.service.IWxPayService
...@@ -151,4 +151,5 @@ public class RemoteOrderServiceImpl implements RemoteOrderService { ...@@ -151,4 +151,5 @@ public class RemoteOrderServiceImpl implements RemoteOrderService {
return null; return null;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论